@syntrologie/adapt-chatbot 2.8.0-canary.621 → 2.8.0-canary.623

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 (36) hide show
  1. package/dist/AdaptiveChatBar.js +2 -2
  2. package/dist/AdaptiveChatTrail.js +2 -2
  3. package/dist/AdaptiveChipsStrip.js +2 -2
  4. package/dist/ChatAssistantLit.js +3 -3
  5. package/dist/ChatTransport.d.ts +10 -2
  6. package/dist/ChatTransport.d.ts.map +1 -1
  7. package/dist/{chunk-HV52LYST.js → chunk-7U5IUZFB.js} +2 -2
  8. package/dist/{chunk-VIRIVP7H.js → chunk-AUDMWXVZ.js} +79 -18
  9. package/dist/chunk-AUDMWXVZ.js.map +7 -0
  10. package/dist/{chunk-HD2NXGYO.js → chunk-NA6NGAEC.js} +3 -3
  11. package/dist/{chunk-4V5L7IRV.js → chunk-RTPSG3PY.js} +55 -5
  12. package/dist/{chunk-4V5L7IRV.js.map → chunk-RTPSG3PY.js.map} +2 -2
  13. package/dist/{chunk-UFTSEIQP.js → chunk-UTRDR2PJ.js} +2 -2
  14. package/dist/consent.d.ts +8 -0
  15. package/dist/consent.d.ts.map +1 -0
  16. package/dist/consent.test.d.ts +2 -0
  17. package/dist/consent.test.d.ts.map +1 -0
  18. package/dist/element-session.js +2 -2
  19. package/dist/elements/ElementInstanceStore.d.ts +4 -2
  20. package/dist/elements/ElementInstanceStore.d.ts.map +1 -1
  21. package/dist/elements/ElementSessionController.d.ts.map +1 -1
  22. package/dist/elements/ElementTypeHandler.d.ts +5 -1
  23. package/dist/elements/ElementTypeHandler.d.ts.map +1 -1
  24. package/dist/elements/TileHandler.d.ts +2 -2
  25. package/dist/elements/TileHandler.d.ts.map +1 -1
  26. package/dist/elements/tileLifecycleProps.d.ts +2 -1
  27. package/dist/elements/tileLifecycleProps.d.ts.map +1 -1
  28. package/dist/hostAgentController.d.ts.map +1 -1
  29. package/dist/runtime.js +111 -28
  30. package/dist/runtime.js.map +3 -3
  31. package/dist/schema.js +2 -2
  32. package/package.json +1 -1
  33. package/dist/chunk-VIRIVP7H.js.map +0 -7
  34. /package/dist/{chunk-HV52LYST.js.map → chunk-7U5IUZFB.js.map} +0 -0
  35. /package/dist/{chunk-HD2NXGYO.js.map → chunk-NA6NGAEC.js.map} +0 -0
  36. /package/dist/{chunk-UFTSEIQP.js.map → chunk-UTRDR2PJ.js.map} +0 -0
@@ -2,9 +2,9 @@ import {
2
2
  AdaptiveChatBar
3
3
  } from "./chunk-T6VEDUXD.js";
4
4
  import "./chunk-EWPPVPJ4.js";
5
- import "./chunk-UFTSEIQP.js";
5
+ import "./chunk-UTRDR2PJ.js";
6
6
  import "./chunk-YFZCMLV6.js";
7
- import "./chunk-4V5L7IRV.js";
7
+ import "./chunk-RTPSG3PY.js";
8
8
  import "./chunk-LY5AGXVD.js";
9
9
  export {
10
10
  AdaptiveChatBar
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  AdaptiveChatTrail,
3
3
  looksLikeSerializedModelResponse
4
- } from "./chunk-UFTSEIQP.js";
4
+ } from "./chunk-UTRDR2PJ.js";
5
5
  import "./chunk-YFZCMLV6.js";
6
- import "./chunk-4V5L7IRV.js";
6
+ import "./chunk-RTPSG3PY.js";
7
7
  import "./chunk-LY5AGXVD.js";
8
8
  export {
9
9
  AdaptiveChatTrail,
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  AdaptiveChipsStrip,
3
3
  SuggestionChipSchema
4
- } from "./chunk-HV52LYST.js";
5
- import "./chunk-4V5L7IRV.js";
4
+ } from "./chunk-7U5IUZFB.js";
5
+ import "./chunk-RTPSG3PY.js";
6
6
  import "./chunk-LY5AGXVD.js";
7
7
  export {
8
8
  AdaptiveChipsStrip,
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  ChatAssistantLitMountable,
3
3
  renderFallbackHtml
4
- } from "./chunk-HD2NXGYO.js";
5
- import "./chunk-VIRIVP7H.js";
4
+ } from "./chunk-NA6NGAEC.js";
5
+ import "./chunk-AUDMWXVZ.js";
6
6
  import "./chunk-EWPPVPJ4.js";
7
7
  import "./chunk-YFZCMLV6.js";
8
- import "./chunk-4V5L7IRV.js";
8
+ import "./chunk-RTPSG3PY.js";
9
9
  import "./chunk-LY5AGXVD.js";
10
10
  export {
11
11
  ChatAssistantLitMountable,
@@ -257,8 +257,14 @@ export declare class ChatTransport {
257
257
  private _runTurn;
258
258
  private _runStartedAt;
259
259
  private _firstDeltaAt;
260
- private _runMounts;
261
- private _runCards;
260
+ /** The user message id of this run: the `turn_id` on both chat events. */
261
+ private _runTurnId;
262
+ /** Every element instance this run mounted, by instance id. A tool call's mount also arrives as an envelope; the id makes it one. */
263
+ private _runMountedIds;
264
+ /** The subset of those whose template or widget is a card. */
265
+ private _runCardIds;
266
+ /** When the first mount envelope of this run arrived, for `first_tile_ms`. */
267
+ private _firstTileAt;
262
268
  /** The mount_* tool of every mount this run fired, in order — which surfaces
263
269
  * the concierge chose (a carousel on one turn, separate cards on another). */
264
270
  private _runMountTools;
@@ -403,6 +409,8 @@ export declare class ChatTransport {
403
409
  * envelope spread over it. Shallow merge; per-send wins per top-level key.
404
410
  */
405
411
  private _resolveForwardedProps;
412
+ /** Count each mounted instance once per run, and time the first one. */
413
+ private _countMounts;
406
414
  private _wireSession;
407
415
  private _forwardUserMessage;
408
416
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"ChatTransport.d.ts","sourceRoot":"","sources":["../src/ChatTransport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AAeH,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAGpE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAWpD;;;;GAIG;AACH,MAAM,WAAW,qBAAqB;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,mFAAmF;IACnF,UAAU,EAAE,MAAM,CAAC;IACnB,gDAAgD;IAChD,OAAO,EAAE,oBAAoB,CAAC;IAC9B,qEAAqE;IACrE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC1B;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,qBAAqB,CAAC;IACjC;;;;;;;;OAQG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,MAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC,CAAC;IACvF;;;;;;;;;;;;;;OAcG;IACH,iBAAiB,CAAC,EAAE,CAAC,SAAS,EAAE,eAAe,EAAE,KAAK,IAAI,CAAC;IAC3D,gFAAgF;IAChF,iBAAiB,CAAC,EAAE,CAAC,QAAQ,EAAE,gBAAgB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAClE;;;;;;;OAOG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;iFAE6E;IAC7E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,OAAQ,CAAC;AAE1C,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,gBAAgB,GAAG,iBAAiB,CAAC;IAC7C,QAAQ,EAAE,qBAAqB,CAAC;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iBAAiB,EAAE,OAAO,GAAG,IAAI,CAAC;IAClC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,EAAE,eAAe,KAAK,IAAI,CAAC;AA6DlE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAiC5D;AAsBD,qBAAa,aAAa;IACxB,OAAO,CAAC,OAAO,CAAoC;IACnD,OAAO,CAAC,OAAO,CAA+B;IAC9C,OAAO,CAAC,KAAK,CAA8B;IAC3C,OAAO,CAAC,eAAe,CAA6B;IACpD,OAAO,CAAC,iBAAiB,CAA6B;IACtD,OAAO,CAAC,sBAAsB,CAA6B;IAC3D,OAAO,CAAC,uBAAuB,CAA6B;IAC5D,OAAO,CAAC,gBAAgB,CAAiC;IACzD,iFAAiF;IACjF,OAAO,CAAC,0BAA0B,CAAuB;IACzD;;;;kFAI8E;IAC9E,OAAO,CAAC,yBAAyB,CAAqB;IACtD,yCAAyC;IACzC,OAAO,CAAC,kBAAkB,CAAwB;IAClD,8DAA8D;IAC9D,OAAO,CAAC,kBAAkB,CAAK;IAC/B,4EAA4E;IAC5E,OAAO,CAAC,aAAa,CAAS;IAC9B,+CAA+C;IAC/C,OAAO,CAAC,iBAAiB,CAAS;IAClC;;;;;;;;;OASG;IACH,OAAO,CAAC,eAAe,CAAuB;IAC9C;;;;;;;;OAQG;IACH,OAAO,CAAC,sBAAsB,CAAwC;IACtE,4DAA4D;IAC5D,OAAO,CAAC,mBAAmB,CAA8C;IACzE,6EAA6E;IAC7E,OAAO,CAAC,mBAAmB,CAA+C;IAC1E;;;;;;OAMG;IACH,OAAO,CAAC,iBAAiB,CAA6B;IACtD,+EAA+E;IAC/E,OAAO,CAAC,iBAAiB,CAKT;IAChB,OAAO,CAAC,kBAAkB,CAA+B;IACzD;;;;;OAKG;IACH,OAAO,CAAC,YAAY,CAAkD;IACtE,OAAO,CAAC,aAAa,CAAK;IAC1B,wEAAwE;IACxE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAe;IACpC,0GAA0G;IAC1G,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,SAAS,CAAK;IACtB;mFAC+E;IAC/E,OAAO,CAAC,cAAc,CAAgB;IACtC;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,0BAA0B,CAAK;gBAE3B,IAAI,GAAE;QAAE,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;KAAO;IAI7C,mGAAmG;IACnG,OAAO,CAAC,WAAW;IAWnB;;;;OAIG;IACH,SAAS,CAAC,MAAM,EAAE,mBAAmB,GAAG,IAAI;IAwB5C,yEAAyE;IACzE,OAAO,CAAC,MAAM;IAId,qFAAqF;IACrF,IAAI,YAAY,IAAI,OAAO,CAE1B;IAED,qCAAqC;IACrC,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED;;;;;OAKG;IACH,UAAU,CAAC,QAAQ,EAAE,gBAAgB,GAAG,MAAM,IAAI;IAOlD;;;;;OAKG;IACH,aAAa,CAAC,OAAO,EAAE;QACrB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACrB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;KAC3B,GAAG,IAAI;IAIR;;;;;OAKG;IACH,mBAAmB,CAAC,OAAO,EAAE;QAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACrB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAC1B,SAAS,CAAC,EAAE,OAAO,CAAC;KACrB,GAAG,IAAI;IAWR;;;OAGG;IACH,yBAAyB,IAAI,IAAI;IAMjC;;;;;OAKG;IACH,uBAAuB,IAAI,MAAM,GAAG,IAAI;IAIxC;;;;;OAKG;IACH,OAAO,CAAC,WAAW;IAuCnB;;;;;OAKG;IACH,KAAK,IAAI,IAAI;IAkBb,4EAA4E;IAC5E,OAAO,CAAC,mBAAmB,CAAgC;IAE3D,uDAAuD;IACvD,OAAO,CAAC,uBAAuB,CAAQ;IAEvC;;;;;;;;;;OAUG;IACG,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC;IAoKzC,iBAAiB,IAAI,IAAI;IAMzB,OAAO,CAAC,mBAAmB;IAO3B;;;;;;;;OAQG;IACH,OAAO,CAAC,mBAAmB;IAwB3B,OAAO,CAAC,kBAAkB;IAO1B;;;;;;;OAOG;IACH,OAAO,CAAC,iBAAiB;IA0CzB;;;;OAIG;IACH,OAAO,CAAC,eAAe;IA4BvB;;;;;;OAMG;IACH,OAAO,CAAC,sBAAsB;IAQ9B,OAAO,CAAC,YAAY;YAwCN,mBAAmB;IA6BjC;;;;OAIG;YACW,gBAAgB;IA8K9B;;;;;OAKG;YACW,8BAA8B;IAW5C;;;;;OAKG;IACH,OAAO,CAAC,mBAAmB;IAS3B;;;;;;OAMG;IACH,OAAO,CAAC,uBAAuB;IAe/B,mEAAmE;IACnE,OAAO,CAAC,kBAAkB;IAwB1B,wDAAwD;IACxD,OAAO,CAAC,kBAAkB;IAiB1B,OAAO,CAAC,iBAAiB;CAyU1B;AAED;;;;GAIG;AACH,eAAO,MAAM,aAAa,eAA+C,CAAC"}
1
+ {"version":3,"file":"ChatTransport.d.ts","sourceRoot":"","sources":["../src/ChatTransport.ts"],"names":[],"mappings":"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"}
@@ -3,7 +3,7 @@ import {
3
3
  NotifyZ,
4
4
  TriggerWhenZ,
5
5
  external_exports
6
- } from "./chunk-4V5L7IRV.js";
6
+ } from "./chunk-RTPSG3PY.js";
7
7
 
8
8
  // src/AdaptiveChipsStrip.ts
9
9
  import { html, LitElement, nothing } from "lit";
@@ -638,4 +638,4 @@ export {
638
638
  SuggestionChipSchema,
639
639
  AdaptiveChipsStrip
640
640
  };
641
- //# sourceMappingURL=chunk-HV52LYST.js.map
641
+ //# sourceMappingURL=chunk-7U5IUZFB.js.map
@@ -1,20 +1,24 @@
1
1
  import {
2
+ TELEMETRY_DOM_EVENT,
2
3
  TILE_MOUNTED_EVENT,
3
4
  TILE_PATCHED_EVENT,
4
5
  TILE_REPLAY_REQUEST_EVENT,
5
6
  TILE_UNMOUNTED_EVENT,
6
7
  parseTileLayout
7
- } from "./chunk-4V5L7IRV.js";
8
+ } from "./chunk-RTPSG3PY.js";
8
9
 
9
10
  // src/elements/tileLifecycleProps.ts
10
- function tileMountProps(instance2, widget) {
11
+ function tileMountProps(instance2, widget, opts) {
11
12
  const layout = parseTileLayout(instance2.layout);
13
+ const turnId = opts?.live ? instance2.mounted_by?.turn_id : void 0;
12
14
  return {
13
15
  slot: instance2.placement.slot,
14
16
  instance_id: instance2.instance_id,
15
17
  widget,
16
18
  props: instance2.content ?? {},
17
- ...layout ? { layout } : {}
19
+ ...layout ? { layout } : {},
20
+ ...opts?.live ? { live: true } : {},
21
+ ...turnId ? { turn_id: turnId } : {}
18
22
  };
19
23
  }
20
24
 
@@ -66,6 +70,12 @@ var ElementInstanceStore = class {
66
70
  this._logger = options.logger ?? console;
67
71
  this._subscribeReplayRequests();
68
72
  }
73
+ /** `publish` as a closure that calls the method on the bus (EventBus.publish reads `this`). */
74
+ _boundPublish() {
75
+ const events = this._events;
76
+ if (typeof events?.publish !== "function") return void 0;
77
+ return (name, props) => events.publish(name, props);
78
+ }
69
79
  /**
70
80
  * Listen for `element.compositional_replay_request` from container
71
81
  * widgets and re-publish `element.compositional_append` for every
@@ -77,7 +87,7 @@ var ElementInstanceStore = class {
77
87
  */
78
88
  _subscribeReplayRequests() {
79
89
  const subscribe = this._events?.subscribe;
80
- const publish = this._events?.publish;
90
+ const publish = this._boundPublish();
81
91
  if (!subscribe || !publish) return;
82
92
  this._unsubscribeReplay = subscribe(
83
93
  {
@@ -206,7 +216,7 @@ var ElementInstanceStore = class {
206
216
  recreate(instanceId) {
207
217
  if (this._disposed) return;
208
218
  const instance2 = this._instances.get(instanceId);
209
- const publish = this._events?.publish;
219
+ const publish = this._boundPublish();
210
220
  if (!instance2 || instance2.element_type !== "tile" || instance2.placement.type !== "slot" || !publish) {
211
221
  return;
212
222
  }
@@ -274,7 +284,7 @@ var ElementInstanceStore = class {
274
284
  */
275
285
  _broadcastActive() {
276
286
  if (this._disposed) return;
277
- const publish = this._events?.publish;
287
+ const publish = this._boundPublish();
278
288
  if (!publish) return;
279
289
  this._replayTiles(publish);
280
290
  const itemTileIds = /* @__PURE__ */ new Set();
@@ -293,19 +303,19 @@ var ElementInstanceStore = class {
293
303
  * version-checked (mount: must not conflict with existing instance;
294
304
  * patch: resulting_version must be > current; unmount: idempotent).
295
305
  */
296
- async apply(mutations) {
297
- await this.applyWithReport(mutations);
306
+ async apply(mutations, opts) {
307
+ await this._applyWithReport(mutations, false, opts?.live === true);
298
308
  }
299
309
  async applyWithReport(mutations) {
300
310
  return this._applyWithReport(mutations, false);
301
311
  }
302
- async _applyWithReport(mutations, authoritative) {
312
+ async _applyWithReport(mutations, authoritative, live = false) {
303
313
  const rejectedInstanceIds = [];
304
314
  for (const mutation of mutations) {
305
315
  if (this._disposed) return { ok: false, rejectedInstanceIds };
306
316
  const id = (mutation?.op === "mount" ? mutation.instance?.instance_id : mutation?.instance_id) ?? "<invalid>";
307
317
  try {
308
- if (!await this._applyOne(mutation, authoritative)) rejectedInstanceIds.push(id);
318
+ if (!await this._applyOne(mutation, authoritative, live)) rejectedInstanceIds.push(id);
309
319
  } catch {
310
320
  rejectedInstanceIds.push(id);
311
321
  this._logger.error("elements: mutation failed", { instance_id: id });
@@ -442,7 +452,7 @@ var ElementInstanceStore = class {
442
452
  await this.apply(unmounts);
443
453
  }
444
454
  }
445
- async _applyOne(mutation, authoritative = false) {
455
+ async _applyOne(mutation, authoritative = false, live = false) {
446
456
  if (mutation.op === "mount") {
447
457
  const existing = this._instances.get(mutation.instance.instance_id);
448
458
  if (existing && existing.version >= mutation.instance.version) {
@@ -459,7 +469,7 @@ var ElementInstanceStore = class {
459
469
  const isAppliedImperative = mutation.instance.state === "applied" && handler.lifecycle === "imperative";
460
470
  if (isActiveStateful || isAppliedImperative) {
461
471
  this._instances.set(mutation.instance.instance_id, mutation.instance);
462
- const applied = await this._mount(handler, mutation.instance);
472
+ const applied = await this._mount(handler, mutation.instance, live);
463
473
  if (this._disposed) return false;
464
474
  if (!applied) {
465
475
  if (existing) {
@@ -543,7 +553,7 @@ var ElementInstanceStore = class {
543
553
  }
544
554
  return false;
545
555
  }
546
- async _mount(handler, instance2) {
556
+ async _mount(handler, instance2, live = false) {
547
557
  try {
548
558
  const validation = handler.validate(instance2, this._ctx());
549
559
  if (!validation.accepted) {
@@ -554,7 +564,7 @@ var ElementInstanceStore = class {
554
564
  });
555
565
  return false;
556
566
  }
557
- await handler.mount(instance2, this._ctx());
567
+ await handler.mount(instance2, this._ctx(), live ? { live: true } : void 0);
558
568
  } catch (err) {
559
569
  this._logger.warn("elements: handler.mount threw", {
560
570
  instance_id: instance2.instance_id,
@@ -605,10 +615,10 @@ var TileHandler = class {
605
615
  }
606
616
  return { accepted: true };
607
617
  }
608
- async mount(instance2, ctx) {
618
+ async mount(instance2, ctx, opts) {
609
619
  if (!ctx.events) return;
610
620
  const placement = instance2.placement;
611
- const props = tileMountProps({ ...instance2, placement }, this._widgetFor(instance2));
621
+ const props = tileMountProps({ ...instance2, placement }, this._widgetFor(instance2), opts);
612
622
  ctx.events.publish(TILE_MOUNTED_EVENT, props);
613
623
  }
614
624
  async patch(instance2, ctx) {
@@ -789,6 +799,16 @@ function frame(value) {
789
799
  return new Set(value.mounted_elements.map((item) => item.instance_id)).size === value.mounted_elements.length;
790
800
  }
791
801
  var APPLIED_HISTORY = 32;
802
+ var CART_ADDED_EVENT = "chatbot.product_card.add_to_cart.succeeded";
803
+ function shownProductIds(content) {
804
+ if (!record(content)) return [];
805
+ const ids = [];
806
+ if (record(content.product)) ids.push(content.product.id);
807
+ if (Array.isArray(content.products)) {
808
+ for (const item of content.products) if (record(item)) ids.push(item.id);
809
+ }
810
+ return ids.filter((id) => typeof id === "string");
811
+ }
792
812
  function createElementSessionController(options) {
793
813
  const templates = createTemplateWidgetResolver();
794
814
  templates.refresh(options.templates);
@@ -802,6 +822,37 @@ function createElementSessionController(options) {
802
822
  let pending = Promise.resolve();
803
823
  let lastAppliedResultId;
804
824
  const appliedResultIds = /* @__PURE__ */ new Set();
825
+ const liveInstanceIds = [];
826
+ function reportCartAdd(productId) {
827
+ if (typeof document === "undefined" || typeof productId !== "string") return;
828
+ let match;
829
+ for (let i = liveInstanceIds.length - 1; i >= 0 && !match; i--) {
830
+ const instance2 = store.getInstance(liveInstanceIds[i]);
831
+ if (instance2?.state === "active" && shownProductIds(instance2.content).includes(productId))
832
+ match = instance2;
833
+ }
834
+ document.dispatchEvent(
835
+ new CustomEvent(TELEMETRY_DOM_EVENT, {
836
+ detail: {
837
+ name: "syntro_tile_cart_added",
838
+ props: {
839
+ tile_id: match?.instance_id ?? null,
840
+ turn_id: match?.mounted_by?.turn_id ?? null,
841
+ product: productId
842
+ }
843
+ },
844
+ bubbles: true,
845
+ composed: true
846
+ })
847
+ );
848
+ }
849
+ if (!options.events.subscribe) {
850
+ console.warn("[syntro] no event bus subscribe: cart adds from chat tiles will not be reported");
851
+ }
852
+ const stopCartWatch = options.events.subscribe?.(
853
+ { names: [CART_ADDED_EVENT] },
854
+ (event) => reportCartAdd(event.props?.product_id)
855
+ );
805
856
  function enqueue(operation) {
806
857
  const next = pending.then(operation);
807
858
  pending = next.then(
@@ -841,7 +892,15 @@ function createElementSessionController(options) {
841
892
  },
842
893
  applyLegacyEnvelope(envelope) {
843
894
  return enqueue(async () => {
844
- if (!disposed) await store.apply(envelope.mutations);
895
+ if (disposed) return;
896
+ await store.apply(envelope.mutations, { live: true });
897
+ for (const mutation of envelope.mutations) {
898
+ if (mutation.op === "patch") continue;
899
+ const id = mutation.op === "mount" ? mutation.instance.instance_id : mutation.instance_id;
900
+ const at = liveInstanceIds.indexOf(id);
901
+ if (at >= 0) liveInstanceIds.splice(at, 1);
902
+ if (mutation.op === "mount") liveInstanceIds.push(id);
903
+ }
845
904
  });
846
905
  },
847
906
  hydrateLegacy(instances, expiresAt) {
@@ -881,6 +940,8 @@ function createElementSessionController(options) {
881
940
  disposed = true;
882
941
  generation++;
883
942
  for (const cleanup of cleanups) cleanup();
943
+ stopCartWatch?.();
944
+ liveInstanceIds.length = 0;
884
945
  store.dispose(true);
885
946
  templates.refresh(void 0);
886
947
  }
@@ -895,4 +956,4 @@ export {
895
956
  createTemplateWidgetResolver,
896
957
  createElementSessionController
897
958
  };
898
- //# sourceMappingURL=chunk-VIRIVP7H.js.map
959
+ //# sourceMappingURL=chunk-AUDMWXVZ.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/elements/tileLifecycleProps.ts", "../src/elements/ElementInstanceStore.ts", "../src/elements/TileHandler.ts", "../src/elements/ActionHandler.ts", "../src/elements/ItemHandler.ts", "../src/elements/createElementStore.ts", "../src/elements/ElementSessionController.ts"],
4
+ "sourcesContent": ["import { parseTileLayout, type TileLifecycleMountProps } from '@syntrologie/sdk-contracts';\nimport type { ElementMountOptions } from './ElementTypeHandler';\nimport type { MountedElement, SlotPlacement } from './types';\n\n/**\n * The one builder for an `element.tile_mounted` / `element.tile_patched`\n * payload. The runtime rebuilds a tile from the LATEST event for its id, so\n * every site that publishes one (the handler's mount and patch, the store's\n * replays) must send the same fields: a replay built by hand dropped the\n * agent's placement plan and ungrouped the tiles it had just placed.\n */\nexport function tileMountProps(\n instance: MountedElement & { placement: SlotPlacement },\n widget: string,\n opts?: ElementMountOptions\n): TileLifecycleMountProps {\n const layout = parseTileLayout(instance.layout);\n // A live mount tells the canvas which chat turn produced the tile. Every\n // other build (patch, replay, restore) stays silent about both.\n const turnId = opts?.live ? instance.mounted_by?.turn_id : undefined;\n return {\n slot: instance.placement.slot,\n instance_id: instance.instance_id,\n widget,\n props: (instance.content ?? {}) as Record<string, unknown>,\n ...(layout ? { layout } : {}),\n ...(opts?.live ? { live: true } : {}),\n ...(turnId ? { turn_id: turnId } : {}),\n };\n}\n", "/**\n * Type-neutral store for LLM-authored UI element instances \u2014 Phase 6.\n *\n * On SDK boot:\n * 1. Caller fetches `/api/adaptive/mounted_elements` (see `fetcher.ts`).\n * 2. Calls `store.hydrate(response.mounted_elements)`.\n * 3. The store iterates each instance, looks up its handler, and\n * either mounts (stateful) or skips (imperative already-applied).\n *\n * During chat turns:\n * - AGUI `syntro.element.mutation` envelopes arrive via\n * `AgUiTransport.onA2UIEvent`. The transport caller decodes the\n * envelope and invokes `store.apply(envelope.mutations)`.\n *\n * Concurrency / dedup:\n * - Per-instance `version` is the dedup key. A mutation whose version\n * is `<= currentVersion` is treated as already-applied and silently\n * dropped \u2014 handles the SSE-during-boot-fetch race per the design\n * doc (the live mutation might arrive before the boot snapshot does,\n * and the snapshot is then a no-op).\n * - The store is single-threaded by Node/browser convention; no\n * cross-tab sync in v1.\n *\n * The store delegates all DOM work to per-type handlers\n * (`ElementTypeHandler`). It owns the registry, the in-memory state,\n * and the dispatch logic.\n */\n\nimport {\n TILE_MOUNTED_EVENT,\n TILE_REPLAY_REQUEST_EVENT,\n TILE_UNMOUNTED_EVENT,\n} from '@syntrologie/sdk-contracts';\n\nimport type { ActionEngine } from '../types';\nimport type {\n ElementHandlerContext,\n ElementMountOptions,\n ElementTypeHandler,\n} from './ElementTypeHandler';\nimport { tileMountProps } from './tileLifecycleProps';\nimport type { ElementMutation, MountedElement } from './types';\n\nconst COMPOSITIONAL_REPLAY_REQUEST_EVENT = 'element.compositional_replay_request';\nconst COMPOSITIONAL_APPEND_EVENT = 'element.compositional_append';\n\n/**\n * Slot name reserved for tiles the backend wants rendered INLINE IN THE\n * CHAT TRAIL (in the conversation flow, like a rich message) rather than\n * in the canvas deck. The reco carousel uses this: the deck tile mounts\n * BEHIND the open chat panel, so the visitor never sees it. The backend\n * owns the placement decision \u2014 `adaptive_agent.py` emits\n * `SlotPlacement(slot=\"chat-inline\")` for the reco mount. On the chat\n * side these tiles:\n * - surface via {@link ElementInstanceStore.listInlineWidgets} so the\n * trail can mount the widget element inline; and\n * - are SUPPRESSED from {@link ElementInstanceStore.listTileReceipts}\n * (a receipt chip would be a redundant, weaker affordance for a\n * widget already visible in the trail).\n * Every other slot keeps its existing deck + receipt-chip behavior.\n */\nexport const CHAT_INLINE_SLOT = 'chat-inline';\n\n/** One inline-rendered widget for the chat trail \u2014 a `chat-inline` tile. */\nexport interface InlineWidget {\n instanceId: string;\n /** Custom-element tag to mount (e.g. `syntro-product-reco-carousel`). */\n tag: string;\n /** Payload assigned to the mounted element as ONE `props` object property\n * (`el.props = props` \u2014 the standard tile-widget mount contract; never\n * spread as individual per-key properties). */\n props: Record<string, unknown>;\n /** `mounted_by.turn_id` \u2014 lets the chat trail restore the widget to its\n * original transcript position after a reload. */\n turnId?: string;\n /** `tool_call_id` of the mount call \u2014 pins the restored widget to the exact\n * transcript message hosting that call; `turnId` is the coarser fallback. */\n toolCallId?: string;\n}\n\nexport interface ElementInstanceStoreOptions {\n actions: ActionEngine;\n /** Runtime's event bus. ItemHandler publishes\n * `element.compositional_append` events here so container widgets\n * (chips strip, FAQ accordion, nav tips) can subscribe and inject\n * LLM-authored items into their compositional-actions lists.\n *\n * When `subscribe` is also provided, the store listens for\n * `element.compositional_replay_request` events. A container widget\n * publishes this event with its `tile_id` whenever it subscribes\n * (e.g. on first mount AND on SPA-navigation remount); the store\n * responds by re-publishing `element.compositional_append` for every\n * matching item still in its in-memory map. This is what makes\n * LLM-authored items persist across navigations within the page\n * session \u2014 the store survives chat-bar unmount/remount, container\n * widgets re-pull on each fresh mount.\n */\n events?: {\n publish: (name: string, props?: Record<string, unknown>) => void;\n /**\n * Overloaded to match the runtime SDK's `EventBus.subscribe`:\n * pass `{names:[...]}` to filter, or a callback to receive every\n * event. The store uses the filtered form so it doesn't fan\n * unrelated traffic (PostHog autocapture, every action lifecycle\n * event) into a string-compare on each delivery.\n */\n subscribe?: {\n (\n filter: { names?: string[] },\n handler: (event: { name: string; props?: Record<string, unknown> }) => void\n ): () => void;\n (handler: (event: { name: string; props?: Record<string, unknown> }) => void): () => void;\n };\n };\n handlers?: ElementTypeHandler[];\n /** Override the logger \u2014 used by tests to capture log output. */\n logger?: Pick<Console, 'info' | 'warn' | 'error'>;\n /**\n * Optional template\u2192widget resolver used by the rehydrate replay.\n * Without this, replayed tile mounts emit ``widget: template_id``,\n * which only works when the admin's template ids match the widget\n * registry (e.g. ``adaptive-faq:accordion``). When an admin uses a\n * friendly id like ``product-card`` mapping to widget\n * ``adaptive-product:card``, the rehydrate path needs the resolver\n * to match the live mount path.\n *\n * Same shape as ``TileHandler``'s resolver \u2014 pass the same function\n * to both so live mounts and replays agree on the widget id.\n */\n resolveTileWidget?: (templateId: string) => string | undefined;\n}\n\nexport interface ApplyReport {\n ok: boolean;\n rejectedInstanceIds: string[];\n}\n\n/** First non-empty string among the candidates. */\nfunction firstText(...candidates: unknown[]): string | undefined {\n for (const c of candidates) if (typeof c === 'string' && c.trim()) return c.trim();\n return undefined;\n}\n\n/**\n * The receipt chip's label, read from what the tile SHOWS: a product's name,\n * the tile's title or heading, an untitled FAQ's first question, an untitled\n * comparison or carousel named as a set. Never the template id, prettified or not: a\n * title-less canvas-faq mount once read \"Canvas Faq\" to a live iGlow visitor\n * (2026-10-13). When the content names nothing, a neutral word stands in.\n */\nfunction receiptTitle(raw: unknown): string {\n const c = (raw ?? {}) as {\n product?: { name?: unknown };\n title?: unknown;\n heading?: unknown; // comparisons/reco carry `heading`, not `title`\n questions?: Array<{ question?: unknown }>;\n actions?: Array<{ config?: { question?: unknown } }>;\n items?: Array<{ name?: unknown }>;\n products?: Array<{ name?: unknown }>;\n };\n const list = <T>(v: T[] | undefined): T[] => (Array.isArray(v) ? v : []);\n return (\n firstText(\n c.product?.name,\n c.title,\n c.heading,\n ...list(c.questions).map((q) => q?.question),\n ...list(c.actions).map((a) => a?.config?.question),\n setTitle(list(c.products), ' vs '),\n setTitle(list(c.items), null)\n ) ?? 'Details'\n );\n}\n\n/**\n * A multi-item tile is labelled as a set, never as one of its products: a\n * chip reading \"Emface\" looks like a single-product card but brings back a\n * whole carousel. Two items joined by `pair` (\"Botox vs Jeuveau\"), otherwise\n * \"First + N more\"; one item is just its name.\n */\nfunction setTitle(entries: Array<{ name?: unknown }>, pair: string | null): string | undefined {\n const names = entries\n .map((e) => e?.name)\n .filter((n): n is string => typeof n === 'string' && n.trim().length > 0)\n .map((n) => n.trim());\n if (names.length === 0) return undefined;\n if (names.length === 1) return names[0];\n if (names.length === 2 && pair) return `${names[0]}${pair}${names[1]}`;\n return `${names[0]} + ${names.length - 1} more`;\n}\n\nexport class ElementInstanceStore {\n private readonly _actions: ActionEngine;\n private readonly _events: ElementInstanceStoreOptions['events'];\n private readonly _handlers: Map<string, ElementTypeHandler>;\n private readonly _instances: Map<string, MountedElement> = new Map();\n private readonly _logger: Pick<Console, 'info' | 'warn' | 'error'>;\n private readonly _resolveTileWidget?: (templateId: string) => string | undefined;\n /** Active TTL timeout \u2014 replaced on each call to `scheduleClientTtl`. */\n private _ttlTimer: ReturnType<typeof setTimeout> | null = null;\n private _unsubscribeReplay?: () => void;\n private _disposed = false;\n private _disposing = false;\n /** Instance IDs the client has dismissed. Persists across canvas remounts\n * so a dismissed tile never silently reappears on replay/broadcast. */\n private readonly _dismissedIds: Set<string> = new Set();\n\n constructor(options: ElementInstanceStoreOptions) {\n this._actions = options.actions;\n this._events = options.events;\n this._resolveTileWidget = options.resolveTileWidget;\n this._handlers = new Map();\n for (const handler of options.handlers ?? []) {\n this._handlers.set(handler.typeName, handler);\n }\n this._logger = options.logger ?? console;\n this._subscribeReplayRequests();\n }\n\n /** `publish` as a closure that calls the method on the bus (EventBus.publish reads `this`). */\n private _boundPublish(): ((name: string, props?: Record<string, unknown>) => void) | undefined {\n const events = this._events;\n if (typeof events?.publish !== 'function') return undefined;\n return (name, props) => events.publish(name, props);\n }\n\n /**\n * Listen for `element.compositional_replay_request` from container\n * widgets and re-publish `element.compositional_append` for every\n * matching item still tracked in `_instances`. This keeps LLM-authored\n * items visible across SPA navigations: the store is a module-level\n * singleton that survives chat-bar unmount/remount, so when a fresh\n * chips-strip mounts and subscribes, asking for a replay re-populates\n * its chip array.\n */\n private _subscribeReplayRequests(): void {\n const subscribe = this._events?.subscribe;\n const publish = this._boundPublish();\n if (!subscribe || !publish) return;\n this._unsubscribeReplay = subscribe(\n {\n names: [\n COMPOSITIONAL_REPLAY_REQUEST_EVENT,\n TILE_REPLAY_REQUEST_EVENT,\n TILE_UNMOUNTED_EVENT,\n ],\n },\n (event) => {\n if (this._disposed) return;\n if (event.name === TILE_UNMOUNTED_EVENT) {\n // Client dismiss: keep the instance + content, mark it dismissed so\n // replay/broadcast skip it (fixes the zombie-tile reappearance bug).\n const id = String(event.props?.instance_id ?? '');\n if (id) this._dismissedIds.add(id);\n return;\n }\n if (event.name === COMPOSITIONAL_REPLAY_REQUEST_EVENT) {\n const tileId = String(event.props?.tile_id ?? '');\n if (!tileId) return;\n this._replayItems(tileId, publish);\n return;\n }\n if (event.name === TILE_REPLAY_REQUEST_EVENT) {\n // SmartCanvasElementLit asks for every active LLM-authored tile\n // so it can merge them into its `_tiles` array on (re)mount.\n this._replayTiles(publish);\n return;\n }\n }\n );\n }\n\n private _replayItems(\n tileId: string,\n publish: (name: string, props?: Record<string, unknown>) => void\n ): void {\n for (const instance of this._instances.values()) {\n if (this._disposed) return;\n if (instance.element_type !== 'item') continue;\n if (instance.placement.type !== 'parent_tile') continue;\n if (instance.placement.tile_id !== tileId) continue;\n if (instance.state !== 'active') continue;\n publish(COMPOSITIONAL_APPEND_EVENT, {\n tile_id: tileId,\n instance_id: instance.instance_id,\n item: instance.content,\n position: instance.placement.position,\n });\n }\n }\n\n private _replayTiles(publish: (name: string, props?: Record<string, unknown>) => void): void {\n for (const instance of this._instances.values()) {\n if (this._disposed) return;\n if (instance.element_type !== 'tile') continue;\n if (instance.placement.type !== 'slot') continue;\n if (instance.state !== 'active') continue;\n if (this._dismissedIds.has(instance.instance_id)) continue;\n const props = tileMountProps(\n { ...instance, placement: instance.placement },\n this._resolveTileWidget?.(instance.template_id) ?? instance.template_id\n );\n publish(TILE_MOUNTED_EVENT, props as unknown as Record<string, unknown>);\n }\n }\n\n registerHandler(handler: ElementTypeHandler): void {\n this._handlers.set(handler.typeName, handler);\n }\n\n isDismissed(instanceId: string): boolean {\n return this._dismissedIds.has(instanceId);\n }\n\n getDismissedIds(): ReadonlySet<string> {\n return this._dismissedIds;\n }\n\n /** Store-driven receipt source for the chat trail (one per active slot-tile). */\n listTileReceipts(): Array<\n | {\n kind: 'tile';\n instanceId: string;\n title: string;\n dismissed: boolean;\n turnId?: string;\n toolCallId?: string;\n imageUrl?: string;\n }\n | { kind: 'alert'; instanceId: string; title: string; turnId?: string; toolCallId?: string }\n > {\n const out: Array<\n | {\n kind: 'tile';\n instanceId: string;\n title: string;\n dismissed: boolean;\n turnId?: string;\n toolCallId?: string;\n imageUrl?: string;\n }\n | { kind: 'alert'; instanceId: string; title: string; turnId?: string; toolCallId?: string }\n > = [];\n for (const inst of this._instances.values()) {\n if (inst.element_type !== 'tile' || inst.placement.type !== 'slot') continue;\n if (inst.state !== 'active') continue; // reverted/expired \u2192 no chip\n // chat-inline tiles are rendered inline in the trail (see\n // listInlineWidgets) \u2014 a receipt chip would be a redundant, weaker\n // affordance for something already visible in the conversation.\n if (inst.placement.slot === CHAT_INLINE_SLOT) continue;\n const title = receiptTitle(inst.content);\n // COI-037: the chip's leading visual is a tiny product thumbnail when\n // the mount carries one \u2014 the decorative stack glyph read as a BROKEN\n // image next to a product name (2026-07-24 tester screenshots). One\n // extraction per mount shape: product card \u2192 product.image.src; reco\n // carousel \u2192 first item's image_url; comparison \u2192 first product's image.\n const imgContent = inst.content as {\n product?: { image?: { src?: unknown } };\n products?: Array<{ image?: { src?: unknown } }>;\n items?: Array<{ image_url?: unknown }>;\n };\n const imageCandidate =\n imgContent?.product?.image?.src ??\n imgContent?.items?.[0]?.image_url ??\n imgContent?.products?.[0]?.image?.src;\n const imageUrl =\n typeof imageCandidate === 'string' && imageCandidate.trim() ? imageCandidate : undefined;\n // Alert-slot tiles are nudges \u2192 a distinct, navigating chat chip (kind:'alert').\n // Everything else is a recallable deck tile (kind:'tile') with dismiss state.\n if (inst.placement.slot === 'alert') {\n out.push({\n kind: 'alert',\n instanceId: inst.instance_id,\n title,\n turnId: inst.mounted_by?.turn_id,\n toolCallId: inst.tool_call_id ?? undefined,\n });\n } else {\n out.push({\n kind: 'tile',\n instanceId: inst.instance_id,\n title,\n dismissed: this._dismissedIds.has(inst.instance_id),\n turnId: inst.mounted_by?.turn_id,\n toolCallId: inst.tool_call_id ?? undefined,\n ...(imageUrl ? { imageUrl } : {}),\n });\n }\n }\n return out;\n }\n\n /**\n * Store-driven inline-widget source for the chat trail \u2014 one entry per\n * active `chat-inline` slot-tile. The trail mounts each entry's widget\n * element (by tag name, via `document.createElement`) inline in the\n * conversation flow. Distinct from {@link listTileReceipts}: those are\n * chips that recall a deck tile; these ARE the rendered widget.\n */\n listInlineWidgets(): InlineWidget[] {\n const out: InlineWidget[] = [];\n for (const inst of this._instances.values()) {\n if (inst.element_type !== 'tile' || inst.placement.type !== 'slot') continue;\n if (inst.placement.slot !== CHAT_INLINE_SLOT) continue;\n if (inst.state !== 'active') continue; // reverted/expired \u2192 not rendered\n if (this._dismissedIds.has(inst.instance_id)) continue;\n out.push({\n instanceId: inst.instance_id,\n tag: this._resolveTileWidget?.(inst.template_id) ?? inst.template_id,\n props: (inst.content ?? {}) as Record<string, unknown>,\n turnId: inst.mounted_by?.turn_id,\n toolCallId: inst.tool_call_id ?? undefined,\n });\n }\n return out;\n }\n\n /** Clear a client dismissal and re-publish the tile's mount from retained content. */\n recreate(instanceId: string): void {\n if (this._disposed) return;\n const instance = this._instances.get(instanceId);\n const publish = this._boundPublish();\n if (\n !instance ||\n instance.element_type !== 'tile' ||\n instance.placement.type !== 'slot' ||\n !publish\n ) {\n return;\n }\n this._dismissedIds.delete(instanceId);\n const props = tileMountProps(\n { ...instance, placement: instance.placement },\n this._resolveTileWidget?.(instance.template_id) ?? instance.template_id\n );\n publish(TILE_MOUNTED_EVENT, props as unknown as Record<string, unknown>);\n }\n\n /**\n * Apply the server-provided boot snapshot. For each instance:\n * - stateful: validated + mounted via the type handler;\n * - imperative + already-applied: recorded only (no DOM action);\n * - any: tracked in the in-memory map for future patches.\n *\n * Safe to call once on SDK init. Calling again would re-mount\n * stateful instances; callers should not.\n */\n async hydrate(snapshot: MountedElement[]): Promise<void> {\n await this._hydrateWithReport(snapshot);\n }\n\n private async _hydrateWithReport(\n snapshot: MountedElement[],\n reconcile = false\n ): Promise<ApplyReport> {\n const rejectedInstanceIds: string[] = [];\n for (const instance of snapshot) {\n if (this._disposed) return { ok: false, rejectedInstanceIds };\n // Version-dedup against newer live state. Mirrors _applyOne's\n // guard so the apply-before-hydrate race (live mutation lands\n // first, slow boot snapshot resolves after) is genuinely a\n // no-op as the class header promises \u2014 without this, a stale\n // snapshot would clobber the in-memory version and re-render\n // older content. See test\n // \"hydrate honors version dedup when newer state already applied\".\n const existing = this._instances.get(instance.instance_id);\n if (\n existing &&\n (existing.version > instance.version ||\n (existing.version === instance.version &&\n (!reconcile || existing.state === instance.state)))\n ) {\n continue;\n }\n if (reconcile && existing?.state !== 'active')\n this._dismissedIds.delete(instance.instance_id);\n const handler = this._handlers.get(instance.element_type);\n if (!handler) {\n rejectedInstanceIds.push(instance.instance_id);\n this._logger.warn('elements: hydrate skipped \u2014 unknown element_type', {\n element_type: instance.element_type,\n instance_id: instance.instance_id,\n });\n continue;\n }\n this._instances.set(instance.instance_id, instance);\n if (handler.lifecycle === 'imperative') {\n // Don't re-fire scroll/navigate on page reload.\n continue;\n }\n if (instance.state !== 'active') {\n // Reverted / expired / applied stateful \u2014 record only.\n continue;\n }\n if (!(await this._mount(handler, instance))) {\n rejectedInstanceIds.push(instance.instance_id);\n if (!this._disposed) {\n if (existing) this._instances.set(instance.instance_id, existing);\n else this._instances.delete(instance.instance_id);\n }\n }\n }\n // Belt-and-suspenders: after every per-instance handler.mount() has\n // run, publish one more pass for each active LLM-authored tile/item\n // so any subscriber that was wired between the per-handler publishes\n // (or any handler that skipped publish for any reason) still ends\n // up with the right state. Receivers dedup by `instance_id` so the\n // double-emit is idempotent.\n //\n // Items also rely on a per-tile_id replay request (the container\n // widget publishes the request on its own mount), so the explicit\n // replay sweep is the boot-time backstop and the request-driven\n // replay is the SPA-nav backstop.\n this._broadcastActive();\n return { ok: !this._disposed && rejectedInstanceIds.length === 0, rejectedInstanceIds };\n }\n\n /**\n * Re-publish `element.tile_mounted` / `element.compositional_append`\n * for every active LLM-authored instance in the store. Idempotent \u2014\n * receivers key by `instance_id` (tiles) or by widget identity\n * (items via tile_id filter).\n */\n private _broadcastActive(): void {\n if (this._disposed) return;\n const publish = this._boundPublish();\n if (!publish) return;\n this._replayTiles(publish);\n // Items: group by tile_id so each receiver's filter still matches.\n const itemTileIds = new Set<string>();\n for (const instance of this._instances.values()) {\n if (instance.element_type !== 'item') continue;\n if (instance.placement.type !== 'parent_tile') continue;\n if (instance.state !== 'active') continue;\n itemTileIds.add(instance.placement.tile_id);\n }\n for (const tileId of itemTileIds) {\n this._replayItems(tileId, publish);\n }\n }\n\n /**\n * Apply a batch of mutations, atomically per-batch. Each mutation is\n * version-checked (mount: must not conflict with existing instance;\n * patch: resulting_version must be > current; unmount: idempotent).\n */\n async apply(mutations: ElementMutation[], opts?: ElementMountOptions): Promise<void> {\n await this._applyWithReport(mutations, false, opts?.live === true);\n }\n\n async applyWithReport(mutations: ElementMutation[]): Promise<ApplyReport> {\n return this._applyWithReport(mutations, false);\n }\n\n private async _applyWithReport(\n mutations: ElementMutation[],\n authoritative: boolean,\n live = false\n ): Promise<ApplyReport> {\n const rejectedInstanceIds: string[] = [];\n for (const mutation of mutations) {\n if (this._disposed) return { ok: false, rejectedInstanceIds };\n const id =\n (mutation?.op === 'mount' ? mutation.instance?.instance_id : mutation?.instance_id) ??\n '<invalid>';\n try {\n if (!(await this._applyOne(mutation, authoritative, live))) rejectedInstanceIds.push(id);\n } catch {\n rejectedInstanceIds.push(id);\n // Mutations are independent \u2014 one failing should not abort the\n // rest. Log loudly so the failure surfaces.\n this._logger.error('elements: mutation failed', { instance_id: id });\n }\n }\n return { ok: !this._disposed && rejectedInstanceIds.length === 0, rejectedInstanceIds };\n }\n\n /** Read-only snapshot of currently-known instances. */\n getInstances(): MountedElement[] {\n return Array.from(this._instances.values());\n }\n\n getInstance(instance_id: string): MountedElement | undefined {\n return this._instances.get(instance_id);\n }\n\n /** Replace a host-provided complete UI snapshot; never replay imperative actions. */\n async reconcileSnapshot(snapshot: MountedElement[]): Promise<ApplyReport> {\n const rejected = new Set<string>();\n if (this._disposed) return { ok: false, rejectedInstanceIds: [] };\n const active = snapshot.filter(\n (instance) => instance.state === 'active' && instance.element_type !== 'action'\n );\n const ids = new Set(active.map((instance) => instance.instance_id));\n for (const instance of this._instances.values()) {\n if (this._disposed) return { ok: false, rejectedInstanceIds: [...rejected] };\n if (ids.has(instance.instance_id)) continue;\n if (instance.state === 'active') {\n const report = await this.applyWithReport([\n { op: 'unmount', instance_id: instance.instance_id },\n ]);\n if (!report.ok) {\n rejected.add(instance.instance_id);\n continue;\n }\n }\n if (this._disposed) return { ok: false, rejectedInstanceIds: [...rejected] };\n this._instances.delete(instance.instance_id);\n this._dismissedIds.delete(instance.instance_id);\n }\n // Existing containers deduplicate append events. New content must travel\n // through patch so an already-visible FAQ/chip receives its new version.\n for (const instance of active) {\n if (this._disposed) return { ok: false, rejectedInstanceIds: [...rejected] };\n const existing = this._instances.get(instance.instance_id);\n if (!existing || existing.state !== 'active' || existing.version === instance.version)\n continue;\n // A failed delta may have advanced individual instances without advancing\n // the view revision. Only authoritative reconciliation may roll those back.\n const report = await this._applyWithReport(\n [\n {\n op: 'patch',\n instance_id: instance.instance_id,\n patches: [],\n expected_version: existing.version,\n resulting_version: instance.version,\n resulting_content: instance.content,\n },\n ],\n true\n );\n for (const id of report.rejectedInstanceIds) rejected.add(id);\n }\n const report = await this._hydrateWithReport(\n active.filter((instance) => !rejected.has(instance.instance_id)),\n true\n );\n for (const id of report.rejectedInstanceIds) rejected.add(id);\n return { ok: report.ok && rejected.size === 0, rejectedInstanceIds: [...rejected] };\n }\n\n /** Release page-lifetime listeners and timers; queued work becomes inert. */\n dispose(unmount = false): void {\n if (this._disposed || this._disposing) return;\n this._disposing = true;\n if (unmount) {\n for (const instance of this._instances.values()) {\n const handler = this._handlers.get(instance.element_type);\n if (instance.state === 'active' && handler?.lifecycle !== 'imperative') {\n void handler?.unmount(instance, this._ctx()).catch(() => {});\n }\n }\n }\n this._disposed = true;\n this._disposing = false;\n this._unsubscribeReplay?.();\n this._unsubscribeReplay = undefined;\n if (this._ttlTimer !== null) clearTimeout(this._ttlTimer);\n this._ttlTimer = null;\n this._instances.clear();\n this._dismissedIds.clear();\n }\n\n /**\n * Schedule a client-side TTL that unmounts every active stateful\n * instance when the server-side session expires. Replaces any\n * previously-scheduled TTL.\n *\n * Avoids the orphan-window where session-expired tiles linger on the\n * page until manual refresh \u2014 the server forgets at the 24h mark and\n * the SDK tears down concurrently. Re-schedule on each boot fetch /\n * mutation event that carries a refreshed `session_expires_at`.\n *\n * Pass `null` to clear the existing timer without scheduling a new one.\n * Pass a past timestamp to trigger cleanup immediately.\n */\n scheduleClientTtl(session_expires_at: string | null): void {\n if (this._disposed) return;\n if (this._ttlTimer !== null) {\n clearTimeout(this._ttlTimer);\n this._ttlTimer = null;\n }\n if (session_expires_at === null) return;\n\n const expiryMs = Date.parse(session_expires_at);\n if (Number.isNaN(expiryMs)) {\n this._logger.warn('elements: invalid session_expires_at', { session_expires_at });\n return;\n }\n const delay = Math.max(0, expiryMs - Date.now());\n this._ttlTimer = setTimeout(() => {\n this._ttlTimer = null;\n void this._handleSessionExpiry();\n }, delay);\n }\n\n // -------------------------------------------------------------------\n // Internals\n // -------------------------------------------------------------------\n\n private async _handleSessionExpiry(): Promise<void> {\n // Tear down every active stateful instance \u2014 server has already\n // forgotten this session so no further mutations can arrive.\n const unmounts: ElementMutation[] = [];\n for (const instance of this._instances.values()) {\n if (instance.state !== 'active') continue;\n const handler = this._handlers.get(instance.element_type);\n if (!handler || handler.lifecycle === 'imperative') continue;\n unmounts.push({ op: 'unmount', instance_id: instance.instance_id });\n }\n if (unmounts.length > 0) {\n this._logger.info('elements: client TTL fired \u2014 unmounting active instances', {\n count: unmounts.length,\n });\n await this.apply(unmounts);\n }\n }\n\n private async _applyOne(\n mutation: ElementMutation,\n authoritative = false,\n live = false\n ): Promise<boolean> {\n if (mutation.op === 'mount') {\n const existing = this._instances.get(mutation.instance.instance_id);\n if (existing && existing.version >= mutation.instance.version) {\n // Already applied (likely the boot snapshot beat the SSE event).\n return true;\n }\n const handler = this._handlers.get(mutation.instance.element_type);\n if (!handler) {\n this._logger.warn('elements: mount dropped \u2014 unknown element_type', {\n element_type: mutation.instance.element_type,\n });\n return false;\n }\n // Active stateful mounts and applied imperative mounts both fire\n // the handler; everything else is a record-only entry (matches\n // hydrate()'s rules).\n const isActiveStateful =\n mutation.instance.state === 'active' && handler.lifecycle !== 'imperative';\n const isAppliedImperative =\n mutation.instance.state === 'applied' && handler.lifecycle === 'imperative';\n if (isActiveStateful || isAppliedImperative) {\n // Commit to the map BEFORE firing the handler \u2014 mirrors hydrate()'s\n // set-before-mount ordering. handler.mount() publishes TILE_MOUNTED\n // SYNCHRONOUSLY, and a subscriber invoked from inside that publish\n // (the chat-bar's inline-widget refresh reads listInlineWidgets())\n // must see this instance. With set-AFTER-mount, that read returned\n // empty and no later event re-fired, so a live chat-inline carousel\n // never reached the trail. If the mount is rejected or throws, roll\n // the map back to its prior entry so a rejected/throwing mount does\n // not leave the map advanced \u2014 the version-dedup guard above would\n // otherwise drop the corrective re-send at the same version.\n this._instances.set(mutation.instance.instance_id, mutation.instance);\n const applied = await this._mount(handler, mutation.instance, live);\n if (this._disposed) return false;\n if (!applied) {\n if (existing) {\n this._instances.set(mutation.instance.instance_id, existing);\n } else {\n this._instances.delete(mutation.instance.instance_id);\n }\n }\n return applied;\n }\n this._instances.set(mutation.instance.instance_id, mutation.instance);\n return true;\n }\n\n if (mutation.op === 'patch') {\n const existing = this._instances.get(mutation.instance_id);\n if (!existing) {\n this._logger.warn('elements: patch dropped \u2014 unknown instance', {\n instance_id: mutation.instance_id,\n });\n return false;\n }\n // BUG-1783567300: a malformed envelope (backend wire drift \u2014 the\n // deployed backend spent months sending patches WITHOUT\n // resulting_content/resulting_version) must be dropped LOUDLY, never\n // committed. Committing `content: undefined` re-rendered the patched\n // tile as a blank white card; `undefined <= version` is false, so the\n // stale guard alone can't catch it.\n if (\n typeof mutation.resulting_version !== 'number' ||\n mutation.resulting_content == null ||\n typeof mutation.resulting_content !== 'object'\n ) {\n this._logger.warn('elements: patch dropped \u2014 malformed envelope (missing resulting_*)', {\n instance_id: mutation.instance_id,\n });\n return false;\n }\n if (!authoritative && mutation.resulting_version <= existing.version) {\n // Stale patch \u2014 already applied or older than current.\n return true;\n }\n const patched: MountedElement = {\n ...existing,\n content: mutation.resulting_content,\n version: mutation.resulting_version,\n };\n const handler = this._handlers.get(patched.element_type);\n if (handler) {\n const validation = handler.validate(patched, this._ctx());\n if (!validation.accepted) {\n // Critical: do NOT commit to _instances here. The version-dedup\n // guard above would otherwise drop a corrective re-send at the\n // same version, leaving the map permanently divergent from the\n // DOM.\n this._logger.warn('elements: patch validation failed', {\n instance_id: mutation.instance_id,\n reason: validation.reason,\n });\n return false;\n }\n try {\n await handler.patch(patched, this._ctx());\n } catch (err) {\n // Same reasoning as validation failure \u2014 a throwing handler\n // must not leave _instances advanced ahead of the DOM.\n this._logger.warn('elements: handler.patch threw', {\n instance_id: mutation.instance_id,\n err,\n });\n return false;\n }\n }\n if (this._disposed) return false;\n this._instances.set(mutation.instance_id, patched);\n return true;\n }\n\n if (mutation.op === 'unmount') {\n const existing = this._instances.get(mutation.instance_id);\n if (!existing) {\n // Idempotent \u2014 never-knew-it or already unmounted is fine.\n return true;\n }\n const reverted: MountedElement = { ...existing, state: 'reverted' };\n this._instances.set(mutation.instance_id, reverted);\n const handler = this._handlers.get(existing.element_type);\n if (handler) {\n try {\n await handler.unmount(reverted, this._ctx());\n } catch (err) {\n // Keep the pre-handler commit for synchronous event subscribers, but\n // restore the prior state if cleanup fails so projections remain\n // aligned with the still-mounted DOM and a retry remains meaningful.\n if (!this._disposed) this._instances.set(mutation.instance_id, existing);\n this._logger.warn('elements: handler.unmount threw', {\n instance_id: mutation.instance_id,\n err,\n });\n return false;\n }\n }\n return !this._disposed;\n }\n return false;\n }\n\n private async _mount(\n handler: ElementTypeHandler,\n instance: MountedElement,\n live = false\n ): Promise<boolean> {\n try {\n const validation = handler.validate(instance, this._ctx());\n if (!validation.accepted) {\n this._logger.warn('elements: mount validation failed', {\n instance_id: instance.instance_id,\n reason: validation.reason,\n detail: validation.detail,\n });\n return false;\n }\n await handler.mount(instance, this._ctx(), live ? { live: true } : undefined);\n } catch (err) {\n // Mirror the patch branch \u2014 a throwing handler must not leave the\n // map advanced ahead of the DOM, otherwise the dedup guard drops\n // corrective re-sends.\n this._logger.warn('elements: handler.mount threw', {\n instance_id: instance.instance_id,\n err,\n });\n return false;\n }\n return !this._disposed;\n }\n\n private _ctx(): ElementHandlerContext {\n return {\n actions: this._actions,\n events: this._events && {\n publish: (name, props) => {\n if (!this._disposed) this._events?.publish(name, props);\n },\n },\n };\n }\n}\n", "/**\n * Tile element handler \u2014 translates `slot`-placed mount/patch/unmount\n * mutations into pub/sub events that the runtime SDK subscribes to.\n *\n * The runtime SDK's `SmartCanvasElementLit` already routes config-driven\n * tiles to inline slots via `tile.slot === slotName`. LLM-authored tiles\n * use the same path: we publish a TileConfig-shaped envelope and the\n * runtime merges it into its tile array, then existing routing renders\n * it inside the slot's `<syntro-tile-stack>` alongside any config tiles.\n *\n * Why pub/sub instead of `core:mountWidget` via ActionEngine?\n *\n * - `Surfaces.mount` is exclusive per slot \u2014 a second LLM tile to the\n * same slot would displace the first.\n * - `Surfaces` only knows built-in slot names; inline slots resolve\n * anchors via SyntroInlineSlot, not via Surfaces.\n * - Tiles need the SyntroTileCard chrome (chromeless handling, theme\n * overrides, dismiss control) that `core:mountWidget` skips.\n *\n * Container widgets stay dumb: the runtime owns one tile array per slot\n * and renders it the same way regardless of provenance. Subscribers\n * filter on `slot === this.name`.\n *\n * Event names + payload types live in `@syntrologie/sdk-contracts` so\n * both packages share the contract. Renaming a field there is a TS\n * error here and in the runtime subscriber \u2014 no silent drift.\n */\n\nimport {\n TILE_MOUNTED_EVENT,\n TILE_PATCHED_EVENT,\n TILE_UNMOUNTED_EVENT,\n type TileLifecycleUnmountProps,\n} from '@syntrologie/sdk-contracts';\n\nimport type {\n ElementHandlerContext,\n ElementMountOptions,\n ElementTypeHandler,\n ValidateResult,\n} from './ElementTypeHandler';\nimport { tileMountProps } from './tileLifecycleProps';\nimport type { MountedElement, SlotPlacement } from './types';\n\nexport {\n TILE_MOUNTED_EVENT,\n TILE_PATCHED_EVENT,\n TILE_UNMOUNTED_EVENT,\n} from '@syntrologie/sdk-contracts';\n\n/**\n * Optional template\u2192widget resolver. ``uiTemplates`` declares both\n * the LLM-facing ``id`` (e.g. ``\"product-card\"``) and the runtime\n * widget the chrome should render (e.g. ``\"adaptive-product:card\"``).\n * Without this resolver, the handler falls back to ``template_id`` as\n * the widget id \u2014 which only works when the admin chose ids matching\n * the widget registry, and silently mounts to \"Widget not available\"\n * when they don't.\n */\nexport type TileTemplateWidgetResolver = (templateId: string) => string | undefined;\n\nexport class TileHandler implements ElementTypeHandler {\n readonly typeName = 'tile' as const;\n readonly lifecycle = 'stateful' as const;\n\n constructor(private readonly resolveWidget?: TileTemplateWidgetResolver) {}\n\n private _widgetFor(instance: MountedElement): string {\n return this.resolveWidget?.(instance.template_id) ?? instance.template_id;\n }\n\n validate(instance: MountedElement, _ctx: ElementHandlerContext): ValidateResult {\n if (instance.element_type !== 'tile') {\n return { accepted: false, reason: 'wrong_element_type', detail: instance.element_type };\n }\n if (instance.placement.type !== 'slot') {\n return {\n accepted: false,\n reason: 'tile_requires_slot_placement',\n detail: `got placement.type=${instance.placement.type}`,\n };\n }\n if (typeof instance.template_id !== 'string' || instance.template_id.length === 0) {\n return { accepted: false, reason: 'missing_template_id' };\n }\n // When a resolver is configured, the template_id MUST resolve to a known\n // widget. Falling back to the raw template_id as a widget id (see\n // `_widgetFor`) mounts to a widget the registry will never have, which\n // renders as a permanently blank card in the canvas deck (the sc-mount\n // body stays empty). Reject loudly instead so the mount never enters the\n // tile pipeline \u2014 matching the repo's \"fail loudly, no silent defaults\"\n // rule \u2014 which surfaces the unknown template_id back to the caller.\n if (this.resolveWidget && this.resolveWidget(instance.template_id) === undefined) {\n return { accepted: false, reason: 'unknown_template_id', detail: instance.template_id };\n }\n return { accepted: true };\n }\n\n async mount(\n instance: MountedElement,\n ctx: ElementHandlerContext,\n opts?: ElementMountOptions\n ): Promise<void> {\n if (!ctx.events) return;\n const placement = instance.placement as SlotPlacement;\n const props = tileMountProps({ ...instance, placement }, this._widgetFor(instance), opts);\n ctx.events.publish(TILE_MOUNTED_EVENT, props as unknown as Record<string, unknown>);\n }\n\n async patch(instance: MountedElement, ctx: ElementHandlerContext): Promise<void> {\n if (!ctx.events) return;\n const placement = instance.placement as SlotPlacement;\n const props = tileMountProps({ ...instance, placement }, this._widgetFor(instance));\n ctx.events.publish(TILE_PATCHED_EVENT, props as unknown as Record<string, unknown>);\n }\n\n async unmount(instance: MountedElement, ctx: ElementHandlerContext): Promise<void> {\n if (!ctx.events) return;\n const placement = instance.placement as SlotPlacement;\n const props: TileLifecycleUnmountProps = {\n slot: placement.slot,\n instance_id: instance.instance_id,\n };\n ctx.events.publish(TILE_UNMOUNTED_EVENT, props as unknown as Record<string, unknown>);\n }\n}\n", "/**\n * Action element handler \u2014 dispatches an ActionStep through\n * `ActionEngine.applyBatch`.\n *\n * The `content` field of an action `MountedElement` carries the action's\n * params; the executor `kind` comes from the template (which the SDK\n * doesn't have locally yet \u2014 for v1 the template's `kind` is encoded\n * into `content.__kind`, set by the backend tool). When proper\n * template loading lands on the SDK side, this handler resolves the\n * kind from the loaded template instead.\n *\n * **Imperative actions never re-fire on boot.** The `lifecycle` field\n * here is `imperative` \u2014 `ElementInstanceStore` skips boot rehydrate\n * for imperative instances with `state === 'applied'`. The backend\n * record exists for audit; replaying a scroll/navigate on every page\n * load would be visibly wrong.\n *\n * Stateful actions (e.g. `content:insertHtml`, `content:setText`,\n * `content:addClass` once Phase 7's renderer lands) ARE re-applied on\n * boot. v1 supports the imperative shape; stateful action handling\n * waits on the Portable Text renderer.\n */\n\nimport type { ActionStep } from '../types';\nimport type {\n ElementHandlerContext,\n ElementTypeHandler,\n ValidateResult,\n} from './ElementTypeHandler';\nimport type { MountedElement } from './types';\n\nexport class ActionHandler implements ElementTypeHandler {\n readonly typeName = 'action' as const;\n // v1: only imperative actions are wired. Stateful content-mutation\n // actions arrive with Phase 7 (Portable Text renderer).\n readonly lifecycle = 'imperative' as const;\n\n validate(instance: MountedElement, _ctx: ElementHandlerContext): ValidateResult {\n if (instance.element_type !== 'action') {\n return { accepted: false, reason: 'wrong_element_type' };\n }\n const kind = (instance.content as { __kind?: unknown }).__kind;\n if (typeof kind !== 'string' || kind.length === 0) {\n return { accepted: false, reason: 'missing_action_kind' };\n }\n return { accepted: true };\n }\n\n async mount(instance: MountedElement, ctx: ElementHandlerContext): Promise<void> {\n const action = this._actionFromInstance(instance);\n await ctx.actions.applyBatch([action]);\n }\n\n async patch(_instance: MountedElement, _ctx: ElementHandlerContext): Promise<void> {\n // Stateful actions re-apply on patch. Imperative actions don't\n // support patch (the backend rejects), but if one slips through\n // we treat it as a no-op rather than crash.\n }\n\n async unmount(_instance: MountedElement, _ctx: ElementHandlerContext): Promise<void> {\n // Imperative actions can't be unmounted \u2014 the scroll/navigate\n // already happened. The store calls this for completeness; no-op is\n // correct. Stateful actions (Phase 7) will need real reverter logic.\n }\n\n private _actionFromInstance(instance: MountedElement): ActionStep {\n const { __kind, ...params } = instance.content as { __kind: string } & Record<string, unknown>;\n // Selector-targeted templates (e.g. `content:setText`) declare their\n // anchor via the template's `allowed_targets`, which lands on the\n // mounted instance as `placement: {type: \"selector\", selector, position}`.\n // The runtime executors expect a full `AnchorId` object on the\n // action params, so translate placement \u2192 anchorId here. Imperative\n // navigation actions use `placement: {type: \"none\"}` and skip this.\n const placement = instance.placement;\n const anchorOverride: Partial<Record<string, unknown>> =\n placement.type === 'selector'\n ? { anchorId: { selector: placement.selector, route: '**' } }\n : {};\n // Imperative templates (e.g. `navigation:scrollTo`) declare the\n // anchor as a string `EnumField` named `anchorId` in the template\n // fields \u2014 that's the only field shape the agent can author, since\n // EnumField is string-only. The runtime executor still wants an\n // `AnchorId` object (`{selector, route}`), so wrap any string we\n // receive on `anchorId` here. Without this wrap the executor's\n // `resolveAnchor` returns null on a non-object and silently\n // refuses to scroll. `route: '**'` matches every page \u2014 the\n // agent's enum already enumerates the legal selectors, so the\n // route check would be redundant.\n if (typeof params.anchorId === 'string') {\n params.anchorId = { selector: params.anchorId, route: '**' };\n }\n return {\n kind: __kind,\n ...params,\n ...anchorOverride,\n label: `action:${instance.template_id}:${instance.instance_id}`,\n } as unknown as ActionStep;\n }\n}\n", "/**\n * Item element handler \u2014 translates `parent_tile`-placed mount/patch/\n * unmount mutations into pub/sub events that container widgets subscribe\n * to.\n *\n * Container widgets (chips strip, FAQ accordion, nav tips) declare\n * themselves participants by implementing the `CompositionalContainer`\n * contract and subscribing to `runtime.events` with\n * `element.compositional_append` / `element.compositional_patch` /\n * `element.compositional_remove`. Each container filters by\n * `props.tile_id === this.tileId`.\n *\n * Why pub/sub rather than DOM lookup? The runtime's event bus is\n * domain-agnostic and already exists. Container widgets that aren't\n * mounted yet (slow inline-slot wrapper hydration) miss the event,\n * but the next subscribe-then-replay pass at container mount time picks\n * up the durable session state from the LLM's `mounted_elements`. No\n * DOM crawling, no MutationObserver wiring, no ordering assumption.\n *\n * The handler is dumb: it forwards the wire `content` as the `item`\n * payload. The backend wrote that content as a fully-formed\n * compositional-item envelope (`{kind, config: {id, title, payload}}`)\n * so the receiving container can append it verbatim.\n */\n\nimport type {\n ElementHandlerContext,\n ElementTypeHandler,\n ValidateResult,\n} from './ElementTypeHandler';\nimport type { MountedElement, ParentTilePlacement } from './types';\n\n/** Event names. Kept as module constants so subscribers can import them\n * instead of memorizing strings. */\nexport const COMPOSITIONAL_APPEND_EVENT = 'element.compositional_append';\nexport const COMPOSITIONAL_PATCH_EVENT = 'element.compositional_patch';\nexport const COMPOSITIONAL_REMOVE_EVENT = 'element.compositional_remove';\n\nexport interface CompositionalAppendEvent {\n /** Parent tile id from the mount's placement. Receivers filter on this. */\n tile_id: string;\n /** Unique id of the mounted item \u2014 the receiving container should also\n * set this on the item's DOM as `data-syntro-element-id`. */\n instance_id: string;\n /** Wire shape constructed by the backend \u2014 `{kind, config: {\u2026}}`. */\n item: Record<string, unknown>;\n /** Insertion position \u2014 receivers honor this when appending. */\n position: 'append' | 'prepend';\n}\n\nexport interface CompositionalPatchEvent {\n tile_id: string;\n instance_id: string;\n item: Record<string, unknown>;\n}\n\nexport interface CompositionalRemoveEvent {\n tile_id: string;\n instance_id: string;\n}\n\nexport class ItemHandler implements ElementTypeHandler {\n readonly typeName = 'item' as const;\n readonly lifecycle = 'stateful' as const;\n\n validate(instance: MountedElement, _ctx: ElementHandlerContext): ValidateResult {\n if (instance.element_type !== 'item') {\n return {\n accepted: false,\n reason: 'wrong_element_type',\n detail: instance.element_type,\n };\n }\n if (instance.placement.type !== 'parent_tile') {\n return {\n accepted: false,\n reason: 'item_requires_parent_tile_placement',\n detail: `got placement.type=${instance.placement.type}`,\n };\n }\n if (typeof instance.template_id !== 'string' || instance.template_id.length === 0) {\n return { accepted: false, reason: 'missing_template_id' };\n }\n return { accepted: true };\n }\n\n async mount(instance: MountedElement, ctx: ElementHandlerContext): Promise<void> {\n if (!ctx.events) return; // no bus \u2192 no-op, validate already passed\n const placement = instance.placement as ParentTilePlacement;\n ctx.events.publish(COMPOSITIONAL_APPEND_EVENT, {\n tile_id: placement.tile_id,\n instance_id: instance.instance_id,\n item: instance.content,\n position: placement.position,\n } satisfies CompositionalAppendEvent as unknown as Record<string, unknown>);\n }\n\n async patch(instance: MountedElement, ctx: ElementHandlerContext): Promise<void> {\n if (!ctx.events) return;\n const placement = instance.placement as ParentTilePlacement;\n ctx.events.publish(COMPOSITIONAL_PATCH_EVENT, {\n tile_id: placement.tile_id,\n instance_id: instance.instance_id,\n item: instance.content,\n } satisfies CompositionalPatchEvent as unknown as Record<string, unknown>);\n }\n\n async unmount(instance: MountedElement, ctx: ElementHandlerContext): Promise<void> {\n if (!ctx.events) return;\n const placement = instance.placement as ParentTilePlacement;\n ctx.events.publish(COMPOSITIONAL_REMOVE_EVENT, {\n tile_id: placement.tile_id,\n instance_id: instance.instance_id,\n } satisfies CompositionalRemoveEvent as unknown as Record<string, unknown>);\n }\n}\n", "import type { ChatbotWidgetRuntime } from '../types';\nimport { ActionHandler } from './ActionHandler';\nimport { ElementInstanceStore } from './ElementInstanceStore';\nimport { ItemHandler } from './ItemHandler';\nimport { TileHandler, type TileTemplateWidgetResolver } from './TileHandler';\n\n/** Independent template state shared by live mounts and replay in one surface. */\nexport function createTemplateWidgetResolver() {\n const widgets = new Map<string, string>();\n return {\n resolve: (templateId: string): string | undefined => widgets.get(templateId),\n refresh(uiTemplates: Record<string, unknown> | undefined): void {\n widgets.clear();\n // Backend-originated recommendation tiles are valid without an admin alias.\n widgets.set('syntro-product-reco-carousel', 'syntro-product-reco-carousel');\n const tiles = uiTemplates?.tiles;\n if (!Array.isArray(tiles)) return;\n for (const template of tiles) {\n if (\n typeof template?.id === 'string' &&\n template.id &&\n typeof template?.widget === 'string' &&\n template.widget\n ) {\n widgets.set(template.id, template.widget);\n }\n }\n },\n };\n}\n\n/** UI-free store construction; the owning surface controls its lifetime. */\nexport function createElementStore(\n runtime: Pick<ChatbotWidgetRuntime, 'actions' | 'events'>,\n resolveTileWidget: TileTemplateWidgetResolver\n): ElementInstanceStore {\n return new ElementInstanceStore({\n actions: runtime.actions,\n events: {\n publish: runtime.events.publish.bind(runtime.events),\n subscribe: runtime.events.subscribe?.bind(runtime.events),\n },\n handlers: [new TileHandler(resolveTileWidget), new ActionHandler(), new ItemHandler()],\n resolveTileWidget,\n });\n}\n", "import type { SnapshotFrame } from '@syntrologie/runtime-contracts';\nimport { TELEMETRY_DOM_EVENT, type TelemetryDomDetail } from '@syntrologie/sdk-contracts';\nimport type { ChatbotWidgetRuntime } from '../types';\nimport { createElementStore, createTemplateWidgetResolver } from './createElementStore';\nimport type { ElementInstanceStore } from './ElementInstanceStore';\nimport type { MountedElement, MountedElementsResponse, MutationEnvelope } from './types';\n\nexport type ApplyOutcome =\n | { status: 'applied' | 'duplicate'; resultId: string }\n | { status: 'rejected'; reason: 'invalid' | 'wrong_scope' | 'disposed' | 'projection_failed' };\n\nexport interface ElementSessionController {\n configureTemplates(templates: Record<string, unknown> | undefined): void;\n acceptHostFrame(payload: unknown): Promise<ApplyOutcome>;\n applyLegacyEnvelope(envelope: MutationEnvelope): Promise<void>;\n hydrateLegacy(instances: MountedElement[], expiresAt: string | null): Promise<void>;\n dispose(): Promise<void>;\n}\n\nexport interface ElementSessionOptions extends Pick<ChatbotWidgetRuntime, 'actions' | 'events'> {\n templates?: Record<string, unknown>;\n /** The older standalone assistant accepted template IDs as widget IDs. */\n legacyTemplateFallback?: boolean;\n /** The one conversation this owner renders. A frame for any other is refused. */\n hostScope?: { sessionRef: string };\n}\n\n/** Compatibility accessors belong to this owner, never a module-wide store. */\nexport interface OwnedElementSession extends ElementSessionController {\n readonly store: ElementInstanceStore;\n resolveTileWidget(templateId: string): string | undefined;\n whenIdle(): Promise<void>;\n hydrateOnce(load: () => Promise<MountedElementsResponse | null>): void;\n listen(target: EventTarget, name: string, listener: EventListener): () => void;\n}\n\nfunction record(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\nfunction text(value: unknown): value is string {\n return typeof value === 'string' && value.trim().length > 0;\n}\nfunction integer(value: unknown): value is number {\n return typeof value === 'number' && Number.isSafeInteger(value) && value >= 0;\n}\nfunction expiry(value: unknown): value is string | null {\n return value === null || (typeof value === 'string' && Number.isFinite(Date.parse(value)));\n}\n\n/** Validate boundary inputs against generated contracts before any action runs. */\nfunction instance(value: unknown): value is MountedElement {\n if (\n !record(value) ||\n !text(value.instance_id) ||\n !text(value.template_id) ||\n !record(value.content) ||\n !record(value.placement) ||\n !record(value.mounted_by) ||\n !text(value.mounted_by.agent_id) ||\n !text(value.mounted_by.turn_id) ||\n typeof value.mounted_at !== 'string' ||\n !Number.isFinite(Date.parse(value.mounted_at)) ||\n !integer(value.version) ||\n value.version < 1 ||\n typeof value.state !== 'string' ||\n !['active', 'applied', 'reverted', 'expired'].includes(value.state)\n )\n return false;\n if (value.element_type === 'tile')\n return value.placement.type === 'slot' && text(value.placement.slot);\n if (value.element_type === 'item')\n return (\n value.placement.type === 'parent_tile' &&\n text(value.placement.tile_id) &&\n typeof value.placement.position === 'string' &&\n ['append', 'prepend'].includes(value.placement.position)\n );\n if (value.element_type !== 'action') return false;\n return (\n value.placement.type === 'none' ||\n (value.placement.type === 'selector' &&\n text(value.placement.selector) &&\n typeof value.placement.position === 'string' &&\n ['beforebegin', 'afterbegin', 'beforeend', 'afterend', 'replace', 'modify'].includes(\n value.placement.position\n ))\n );\n}\n\nfunction frame(value: unknown): value is SnapshotFrame & { mounted_elements: MountedElement[] } {\n if (\n !record(value) ||\n value.schema_version !== 'v1' ||\n value.kind !== 'snapshot' ||\n !text(value.session_ref) ||\n !text(value.result_id) ||\n !expiry(value.session_expires_at) ||\n !Array.isArray(value.mounted_elements) ||\n !value.mounted_elements.every(instance)\n )\n return false;\n return (\n new Set(value.mounted_elements.map((item) => item.instance_id)).size ===\n value.mounted_elements.length\n );\n}\n\n/**\n * How many applied turn ids this owner remembers.\n *\n * A host replays the tool results it still holds whenever the card remounts,\n * and it does not promise an order, so an id has to stay refused after newer\n * ones have landed. 32 covers any replay window a host actually has; past\n * that the oldest is forgotten, and a turn that far back is one no host is\n * still holding.\n */\nconst APPLIED_HISTORY = 32;\n\nconst CART_ADDED_EVENT = 'chatbot.product_card.add_to_cart.succeeded';\n\n/** The product ids a mounted tile shows: a card's `product`, a comparison's `products`. */\nfunction shownProductIds(content: unknown): string[] {\n if (!record(content)) return [];\n const ids: unknown[] = [];\n if (record(content.product)) ids.push(content.product.id);\n if (Array.isArray(content.products)) {\n for (const item of content.products) if (record(item)) ids.push(item.id);\n }\n return ids.filter((id): id is string => typeof id === 'string');\n}\n\n/** The UI-independent owner for ordered projection, replay and teardown. */\nexport function createElementSessionController(\n options: ElementSessionOptions\n): OwnedElementSession {\n const templates = createTemplateWidgetResolver();\n templates.refresh(options.templates);\n const resolveTileWidget = (id: string): string | undefined =>\n templates.resolve(id) ??\n (options.legacyTemplateFallback && !options.hostScope ? id : undefined);\n const store = createElementStore(options, resolveTileWidget);\n const cleanups = new Set<() => void>();\n const scope = options.hostScope;\n let generation = 0;\n let disposed = false;\n let hydrated = false;\n let pending: Promise<void> = Promise.resolve();\n let lastAppliedResultId: string | undefined;\n /** Every result id this owner has applied, newest last, capped. */\n const appliedResultIds = new Set<string>();\n /**\n * Instance ids mounted down the live reply stream, oldest first. A restore\n * or snapshot never lands here, so a cart add is only ever credited to a\n * tile the shopper was shown by a reply this session.\n */\n const liveInstanceIds: string[] = [];\n\n /**\n * The card publishes only `product_id`, which is the `product.id` its mounted\n * content carries (handles are stripped before the widget). The newest live\n * instance showing that product gets the credit; none leaves both ids null.\n */\n function reportCartAdd(productId: unknown): void {\n if (typeof document === 'undefined' || typeof productId !== 'string') return;\n let match: MountedElement | undefined;\n for (let i = liveInstanceIds.length - 1; i >= 0 && !match; i--) {\n const instance = store.getInstance(liveInstanceIds[i]);\n if (instance?.state === 'active' && shownProductIds(instance.content).includes(productId))\n match = instance;\n }\n document.dispatchEvent(\n new CustomEvent<TelemetryDomDetail>(TELEMETRY_DOM_EVENT, {\n detail: {\n name: 'syntro_tile_cart_added',\n props: {\n tile_id: match?.instance_id ?? null,\n turn_id: match?.mounted_by?.turn_id ?? null,\n product: productId,\n },\n },\n bubbles: true,\n composed: true,\n })\n );\n }\n if (!options.events.subscribe) {\n console.warn('[syntro] no event bus subscribe: cart adds from chat tiles will not be reported');\n }\n const stopCartWatch = options.events.subscribe?.({ names: [CART_ADDED_EVENT] }, (event) =>\n reportCartAdd(event.props?.product_id)\n );\n\n function enqueue<T>(operation: () => Promise<T>): Promise<T> {\n const next = pending.then(operation);\n pending = next.then(\n () => {},\n () => {}\n );\n return next;\n }\n const rejected = (\n reason: Extract<ApplyOutcome, { status: 'rejected' }>['reason']\n ): ApplyOutcome => ({ status: 'rejected', reason });\n\n return {\n store,\n resolveTileWidget,\n whenIdle: () => pending,\n configureTemplates(next) {\n if (!disposed) templates.refresh(next);\n },\n acceptHostFrame(payload) {\n return enqueue(async () => {\n if (disposed) return rejected('disposed');\n if (!frame(payload)) return rejected('invalid');\n if (!scope || payload.session_ref !== scope.sessionRef) return rejected('wrong_scope');\n // The whole of the dedup. A frame is a complete snapshot, so a turn\n // this owner has already applied has nothing left to say: not the one\n // on screen arriving a second time down the other delivery channel,\n // and not an older one the host re-pushes after a newer turn landed,\n // which would otherwise roll the card back or empty it.\n if (payload.result_id === lastAppliedResultId || appliedResultIds.has(payload.result_id))\n return { status: 'duplicate', resultId: payload.result_id };\n const report = await store.reconcileSnapshot(payload.mounted_elements);\n if (disposed) return rejected('disposed');\n // Nothing to recover from and nothing to ask for: the next snapshot\n // the host delivers is already the whole truth.\n if (!report.ok) return rejected('projection_failed');\n lastAppliedResultId = payload.result_id;\n appliedResultIds.add(payload.result_id);\n if (appliedResultIds.size > APPLIED_HISTORY) {\n appliedResultIds.delete(appliedResultIds.values().next().value as string);\n }\n store.scheduleClientTtl(payload.session_expires_at);\n return { status: 'applied', resultId: payload.result_id };\n });\n },\n applyLegacyEnvelope(envelope) {\n return enqueue(async () => {\n if (disposed) return;\n await store.apply(envelope.mutations, { live: true });\n for (const mutation of envelope.mutations) {\n if (mutation.op === 'patch') continue;\n const id = mutation.op === 'mount' ? mutation.instance.instance_id : mutation.instance_id;\n const at = liveInstanceIds.indexOf(id);\n if (at >= 0) liveInstanceIds.splice(at, 1);\n if (mutation.op === 'mount') liveInstanceIds.push(id);\n }\n });\n },\n hydrateLegacy(instances, expiresAt) {\n return enqueue(async () => {\n if (disposed) return;\n await store.hydrate(instances);\n if (!disposed) store.scheduleClientTtl(expiresAt);\n });\n },\n hydrateOnce(load) {\n if (hydrated || disposed) return;\n hydrated = true;\n const started = generation;\n void load()\n .then((response) => {\n if (disposed || started !== generation || !response) return;\n return enqueue(async () => {\n if (disposed || started !== generation) return;\n await store.hydrate(response.mounted_elements);\n if (!disposed) store.scheduleClientTtl(response.session_expires_at);\n });\n })\n .catch(() => {});\n },\n listen(target, name, listener) {\n if (disposed) return () => {};\n target.addEventListener(name, listener);\n const remove = () => {\n target.removeEventListener(name, listener);\n cleanups.delete(remove);\n };\n cleanups.add(remove);\n return remove;\n },\n dispose() {\n if (!disposed) {\n disposed = true;\n generation++;\n for (const cleanup of cleanups) cleanup();\n stopCartWatch?.();\n liveInstanceIds.length = 0;\n store.dispose(true);\n templates.refresh(undefined);\n }\n return pending;\n },\n };\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["instance", "instance", "report", "instance", "instance", "COMPOSITIONAL_APPEND_EVENT", "instance", "instance"]
7
+ }
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  createElementSessionController
3
- } from "./chunk-VIRIVP7H.js";
3
+ } from "./chunk-AUDMWXVZ.js";
4
4
  import {
5
5
  external_exports,
6
6
  stripMountPlumbing
7
- } from "./chunk-4V5L7IRV.js";
7
+ } from "./chunk-RTPSG3PY.js";
8
8
  import {
9
9
  __export
10
10
  } from "./chunk-LY5AGXVD.js";
@@ -8442,4 +8442,4 @@ fast-json-patch/module/duplex.mjs:
8442
8442
  * MIT license
8443
8443
  *)
8444
8444
  */
8445
- //# sourceMappingURL=chunk-HD2NXGYO.js.map
8445
+ //# sourceMappingURL=chunk-NA6NGAEC.js.map