@syntrologie/adapt-nav 2.8.0-canary.581 → 2.8.0-canary.583

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.
package/dist/cdn.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  runtime
3
- } from "./chunk-3BUCMYVF.js";
4
- import "./chunk-4BUCN6YV.js";
3
+ } from "./chunk-XRLPVIXE.js";
4
+ import "./chunk-S7Y4N55F.js";
5
5
 
6
6
  // src/cdn.ts
7
7
  var manifest = {
@@ -4385,6 +4385,202 @@ function n(n2) {
4385
4385
  // ../../sdk-contracts/dist/canvas-context.js
4386
4386
  var canvasRuntimeContext = n("syntrologie:canvas-runtime");
4387
4387
 
4388
+ // ../../sdk-contracts/dist/telemetry-events.js
4389
+ var entry = (e2) => e2;
4390
+ var TELEMETRY_EVENTS = {
4391
+ // --- intervention metrics (April 2026) — wire names unchanged, all plan-scope
4392
+ syntro_config_served: entry({
4393
+ subject: "config",
4394
+ verb: "served",
4395
+ scope: "plan",
4396
+ props: ["tiles", "actions"]
4397
+ }),
4398
+ syntro_intervention_seen: entry({
4399
+ subject: "intervention",
4400
+ verb: "seen",
4401
+ scope: "plan",
4402
+ props: ["intervention_id", "intervention_kind"]
4403
+ }),
4404
+ syntro_intervention_triggered: entry({
4405
+ subject: "intervention",
4406
+ verb: "triggered",
4407
+ scope: "plan",
4408
+ props: ["intervention_id", "intervention_kind"]
4409
+ }),
4410
+ syntro_intervention_interacted: entry({
4411
+ subject: "intervention",
4412
+ verb: "interacted",
4413
+ scope: "plan",
4414
+ props: ["intervention_id", "intervention_kind", "interaction_type"]
4415
+ }),
4416
+ // --- concierge (FEAT-1789150184) ---------------------------------------
4417
+ syntro_concierge_opened: entry({
4418
+ subject: "concierge",
4419
+ verb: "opened",
4420
+ scope: "open",
4421
+ props: ["trigger", "page_path"]
4422
+ // trigger: ConciergeOpenTrigger
4423
+ }),
4424
+ syntro_concierge_closed: entry({
4425
+ subject: "concierge",
4426
+ verb: "closed",
4427
+ scope: "open",
4428
+ props: ["duration_ms", "reason", "messages_sent", "tiles_dismissed", "pages_viewed"]
4429
+ // reason: ConciergeCloseReason
4430
+ }),
4431
+ /**
4432
+ * The shopper asked to leave the canvas by a link. Emitted on intent, before
4433
+ * the host answers, so refused or denied opens are counted too (parity with
4434
+ * syntro_concierge_closed reason navigation).
4435
+ *
4436
+ * On a merchant's own page a link tap closes the canvas, and
4437
+ * `syntro_concierge_closed { reason: 'navigation' }` is the row that
4438
+ * records it. Inside a chat app's card the frame is sandboxed: the canvas
4439
+ * cannot navigate, does not close, and asks the host to open the link
4440
+ * instead, so that close row never fires. This is its counterpart, and it
4441
+ * carries the same `reason` so one query covers both surfaces.
4442
+ */
4443
+ syntro_link_opened: entry({
4444
+ subject: "link",
4445
+ verb: "opened",
4446
+ scope: "open",
4447
+ props: ["kind", "reason"]
4448
+ // kind: LinkOpenKind, reason: ConciergeCloseReason
4449
+ }),
4450
+ syntro_deck_paged: entry({
4451
+ subject: "deck",
4452
+ verb: "paged",
4453
+ scope: "open",
4454
+ props: ["from_index", "to_index", "method"]
4455
+ // method: DeckPageMethod
4456
+ }),
4457
+ syntro_tile_dismissed: entry({
4458
+ subject: "tile",
4459
+ verb: "dismissed",
4460
+ scope: "open",
4461
+ props: ["tile_id", "tile_kind", "visible_ms"]
4462
+ }),
4463
+ // A tile's own data load finished: the network wait between the concierge
4464
+ // mounting a tile and the shopper seeing its content (BUG-1784767817 was a
4465
+ // 30 s reviews hang here). `outcome` is 'ok' | 'error'; `requested` is how
4466
+ // many items the tile asked for, `received` how many came back.
4467
+ syntro_tile_data_received: entry({
4468
+ subject: "tile_data",
4469
+ verb: "received",
4470
+ scope: "open",
4471
+ props: ["tile_id", "tile_kind", "total_ms", "outcome", "requested", "received"]
4472
+ }),
4473
+ // The three chat atoms are OPEN-scope: they carry `surface` / `open_id` and
4474
+ // only make sense inside a concierge open. An INLINE chat bar (no concierge)
4475
+ // still dispatches them on every turn, and the core drops each one and
4476
+ // increments the `telemetry_dropped` health counter. That is EXPECTED on an
4477
+ // inline-chat host page, not a bug — `telemetry_dropped` there mixes "real
4478
+ // defect" with "inline chat has no open scope", so do not alert on it alone.
4479
+ syntro_chat_message_sent: entry({
4480
+ subject: "chat_message",
4481
+ verb: "sent",
4482
+ scope: "open",
4483
+ props: ["turn", "chars", "via"]
4484
+ // via: ChatSendVia
4485
+ }),
4486
+ syntro_chat_reply_received: entry({
4487
+ subject: "chat_reply",
4488
+ verb: "received",
4489
+ scope: "open",
4490
+ // mount_tools: the mount_* tool name of every mount this reply fired, in order (two product cards appear twice).
4491
+ props: ["turn", "ttft_ms", "total_ms", "mounts", "cards", "mount_tools"]
4492
+ }),
4493
+ syntro_chat_interrupted: entry({
4494
+ subject: "chat",
4495
+ verb: "interrupted",
4496
+ scope: "open",
4497
+ props: ["turn", "after_ms"]
4498
+ }),
4499
+ syntro_chat_maximize_toggled: entry({
4500
+ subject: "chat_maximize",
4501
+ verb: "toggled",
4502
+ scope: "open",
4503
+ props: ["maximized"]
4504
+ }),
4505
+ syntro_chat_takeover_triggered: entry({
4506
+ subject: "chat_takeover",
4507
+ verb: "triggered",
4508
+ scope: "open",
4509
+ props: ["turn"]
4510
+ }),
4511
+ // --- search takeover (2026-09-17) ---------------------------------------
4512
+ // All plan-scope: the search interceptor fires before any concierge open
4513
+ // exists. No prop here ever carries query text (SEE the contract test's
4514
+ // no-text-prop rule) — classification/signal_hits are the interceptor's
4515
+ // own derived signals, never the string itself.
4516
+ syntro_search_sent: entry({
4517
+ subject: "search",
4518
+ verb: "sent",
4519
+ scope: "plan",
4520
+ props: ["classification", "word_count", "signal_hits", "entry_point", "platform"]
4521
+ // classification: SearchClassification, entry_point: SearchEntryPoint
4522
+ }),
4523
+ // `ms_to_skeleton` is intentionally the only timing prop: it is always
4524
+ // knowable the instant the surface mounts. `ms_to_first_content` is NOT
4525
+ // declared here (revision 1 defect) because a surface that never painted
4526
+ // content still fires this event, and a required prop it cannot supply
4527
+ // would make TelemetryCore.emit drop exactly the row worth measuring.
4528
+ syntro_search_surface_seen: entry({
4529
+ subject: "search_surface",
4530
+ verb: "seen",
4531
+ scope: "plan",
4532
+ props: ["variant", "classification", "result_count", "ms_to_skeleton"]
4533
+ // variant: SearchVariant, classification: SearchClassification
4534
+ }),
4535
+ syntro_search_result_tapped: entry({
4536
+ subject: "search_result",
4537
+ verb: "tapped",
4538
+ scope: "plan",
4539
+ props: ["variant", "region_id", "module", "position"]
4540
+ // variant: SearchVariant
4541
+ }),
4542
+ syntro_search_followup_sent: entry({
4543
+ subject: "search_followup",
4544
+ verb: "sent",
4545
+ scope: "plan",
4546
+ props: ["delta_kind", "variant"]
4547
+ // delta_kind: SearchDeltaKind, variant: SearchVariant
4548
+ }),
4549
+ // Declares `ms_since_boot` (not a "since surface mounted" timing prop) so a
4550
+ // not-ready fallback the takeover never rendered is still measurable —
4551
+ // revision 1 emitted nothing on this path.
4552
+ syntro_search_native_served: entry({
4553
+ subject: "search_native",
4554
+ verb: "served",
4555
+ scope: "plan",
4556
+ props: ["reason", "platform", "ms_since_boot"]
4557
+ // reason: SearchFallbackReason
4558
+ }),
4559
+ syntro_search_takeover_dismissed: entry({
4560
+ subject: "search_takeover",
4561
+ verb: "dismissed",
4562
+ scope: "plan",
4563
+ props: ["variant", "reason"]
4564
+ // variant: SearchVariant, reason: SearchDismissReason
4565
+ }),
4566
+ // --- chat-app card lifecycle (2026-09-24) --------------------------------
4567
+ // One row per stage a card reached, from `reportCardStage` in
4568
+ // card-lifecycle.ts. Plan scope: most stages happen before a config is
4569
+ // served and none happen inside a concierge open. `stage` is a
4570
+ // CardLifecycleStage; `since_shell_ms` is the card shell's own clock, so a
4571
+ // card's rows order themselves from the first byte of the page. The same
4572
+ // stages reach the connector through the shell's beacon, which is the only
4573
+ // record of a card whose SDK never booted.
4574
+ syntro_card_lifecycle_seen: entry({
4575
+ subject: "card_lifecycle",
4576
+ verb: "seen",
4577
+ scope: "plan",
4578
+ props: ["stage", "since_shell_ms"]
4579
+ // stage: CardLifecycleStage
4580
+ })
4581
+ };
4582
+ var TELEMETRY_EVENT_NAMES = Object.keys(TELEMETRY_EVENTS);
4583
+
4388
4584
  // ../../sdk-contracts/dist/color-scheme.js
4389
4585
  function normalize(value) {
4390
4586
  const scheme = (value || "").trim().toLowerCase();
@@ -4716,187 +4912,6 @@ function renderIcon(emoji, options = {}) {
4716
4912
  return `${PREFIX} width="${size}" height="${size}" stroke="${stroke}">${paths.join("")}</svg>`;
4717
4913
  }
4718
4914
 
4719
- // ../../sdk-contracts/dist/telemetry-events.js
4720
- var entry = (e2) => e2;
4721
- var TELEMETRY_EVENTS = {
4722
- // --- intervention metrics (April 2026) — wire names unchanged, all plan-scope
4723
- syntro_config_served: entry({
4724
- subject: "config",
4725
- verb: "served",
4726
- scope: "plan",
4727
- props: ["tiles", "actions"]
4728
- }),
4729
- syntro_intervention_seen: entry({
4730
- subject: "intervention",
4731
- verb: "seen",
4732
- scope: "plan",
4733
- props: ["intervention_id", "intervention_kind"]
4734
- }),
4735
- syntro_intervention_triggered: entry({
4736
- subject: "intervention",
4737
- verb: "triggered",
4738
- scope: "plan",
4739
- props: ["intervention_id", "intervention_kind"]
4740
- }),
4741
- syntro_intervention_interacted: entry({
4742
- subject: "intervention",
4743
- verb: "interacted",
4744
- scope: "plan",
4745
- props: ["intervention_id", "intervention_kind", "interaction_type"]
4746
- }),
4747
- // --- concierge (FEAT-1789150184) ---------------------------------------
4748
- syntro_concierge_opened: entry({
4749
- subject: "concierge",
4750
- verb: "opened",
4751
- scope: "open",
4752
- props: ["trigger", "page_path"]
4753
- // trigger: ConciergeOpenTrigger
4754
- }),
4755
- syntro_concierge_closed: entry({
4756
- subject: "concierge",
4757
- verb: "closed",
4758
- scope: "open",
4759
- props: ["duration_ms", "reason", "messages_sent", "tiles_dismissed", "pages_viewed"]
4760
- // reason: ConciergeCloseReason
4761
- }),
4762
- /**
4763
- * The shopper asked to leave the canvas by a link. Emitted on intent, before
4764
- * the host answers, so refused or denied opens are counted too (parity with
4765
- * syntro_concierge_closed reason navigation).
4766
- *
4767
- * On a merchant's own page a link tap closes the canvas, and
4768
- * `syntro_concierge_closed { reason: 'navigation' }` is the row that
4769
- * records it. Inside a chat app's card the frame is sandboxed: the canvas
4770
- * cannot navigate, does not close, and asks the host to open the link
4771
- * instead, so that close row never fires. This is its counterpart, and it
4772
- * carries the same `reason` so one query covers both surfaces.
4773
- */
4774
- syntro_link_opened: entry({
4775
- subject: "link",
4776
- verb: "opened",
4777
- scope: "open",
4778
- props: ["kind", "reason"]
4779
- // kind: LinkOpenKind, reason: ConciergeCloseReason
4780
- }),
4781
- syntro_deck_paged: entry({
4782
- subject: "deck",
4783
- verb: "paged",
4784
- scope: "open",
4785
- props: ["from_index", "to_index", "method"]
4786
- // method: DeckPageMethod
4787
- }),
4788
- syntro_tile_dismissed: entry({
4789
- subject: "tile",
4790
- verb: "dismissed",
4791
- scope: "open",
4792
- props: ["tile_id", "tile_kind", "visible_ms"]
4793
- }),
4794
- // A tile's own data load finished: the network wait between the concierge
4795
- // mounting a tile and the shopper seeing its content (BUG-1784767817 was a
4796
- // 30 s reviews hang here). `outcome` is 'ok' | 'error'; `requested` is how
4797
- // many items the tile asked for, `received` how many came back.
4798
- syntro_tile_data_received: entry({
4799
- subject: "tile_data",
4800
- verb: "received",
4801
- scope: "open",
4802
- props: ["tile_id", "tile_kind", "total_ms", "outcome", "requested", "received"]
4803
- }),
4804
- // The three chat atoms are OPEN-scope: they carry `surface` / `open_id` and
4805
- // only make sense inside a concierge open. An INLINE chat bar (no concierge)
4806
- // still dispatches them on every turn, and the core drops each one and
4807
- // increments the `telemetry_dropped` health counter. That is EXPECTED on an
4808
- // inline-chat host page, not a bug — `telemetry_dropped` there mixes "real
4809
- // defect" with "inline chat has no open scope", so do not alert on it alone.
4810
- syntro_chat_message_sent: entry({
4811
- subject: "chat_message",
4812
- verb: "sent",
4813
- scope: "open",
4814
- props: ["turn", "chars", "via"]
4815
- // via: ChatSendVia
4816
- }),
4817
- syntro_chat_reply_received: entry({
4818
- subject: "chat_reply",
4819
- verb: "received",
4820
- scope: "open",
4821
- // mount_tools: the mount_* tool name of every mount this reply fired, in order (two product cards appear twice).
4822
- props: ["turn", "ttft_ms", "total_ms", "mounts", "cards", "mount_tools"]
4823
- }),
4824
- syntro_chat_interrupted: entry({
4825
- subject: "chat",
4826
- verb: "interrupted",
4827
- scope: "open",
4828
- props: ["turn", "after_ms"]
4829
- }),
4830
- syntro_chat_maximize_toggled: entry({
4831
- subject: "chat_maximize",
4832
- verb: "toggled",
4833
- scope: "open",
4834
- props: ["maximized"]
4835
- }),
4836
- syntro_chat_takeover_triggered: entry({
4837
- subject: "chat_takeover",
4838
- verb: "triggered",
4839
- scope: "open",
4840
- props: ["turn"]
4841
- }),
4842
- // --- search takeover (2026-09-17) ---------------------------------------
4843
- // All plan-scope: the search interceptor fires before any concierge open
4844
- // exists. No prop here ever carries query text (SEE the contract test's
4845
- // no-text-prop rule) — classification/signal_hits are the interceptor's
4846
- // own derived signals, never the string itself.
4847
- syntro_search_sent: entry({
4848
- subject: "search",
4849
- verb: "sent",
4850
- scope: "plan",
4851
- props: ["classification", "word_count", "signal_hits", "entry_point", "platform"]
4852
- // classification: SearchClassification, entry_point: SearchEntryPoint
4853
- }),
4854
- // `ms_to_skeleton` is intentionally the only timing prop: it is always
4855
- // knowable the instant the surface mounts. `ms_to_first_content` is NOT
4856
- // declared here (revision 1 defect) because a surface that never painted
4857
- // content still fires this event, and a required prop it cannot supply
4858
- // would make TelemetryCore.emit drop exactly the row worth measuring.
4859
- syntro_search_surface_seen: entry({
4860
- subject: "search_surface",
4861
- verb: "seen",
4862
- scope: "plan",
4863
- props: ["variant", "classification", "result_count", "ms_to_skeleton"]
4864
- // variant: SearchVariant, classification: SearchClassification
4865
- }),
4866
- syntro_search_result_tapped: entry({
4867
- subject: "search_result",
4868
- verb: "tapped",
4869
- scope: "plan",
4870
- props: ["variant", "region_id", "module", "position"]
4871
- // variant: SearchVariant
4872
- }),
4873
- syntro_search_followup_sent: entry({
4874
- subject: "search_followup",
4875
- verb: "sent",
4876
- scope: "plan",
4877
- props: ["delta_kind", "variant"]
4878
- // delta_kind: SearchDeltaKind, variant: SearchVariant
4879
- }),
4880
- // Declares `ms_since_boot` (not a "since surface mounted" timing prop) so a
4881
- // not-ready fallback the takeover never rendered is still measurable —
4882
- // revision 1 emitted nothing on this path.
4883
- syntro_search_native_served: entry({
4884
- subject: "search_native",
4885
- verb: "served",
4886
- scope: "plan",
4887
- props: ["reason", "platform", "ms_since_boot"]
4888
- // reason: SearchFallbackReason
4889
- }),
4890
- syntro_search_takeover_dismissed: entry({
4891
- subject: "search_takeover",
4892
- verb: "dismissed",
4893
- scope: "plan",
4894
- props: ["variant", "reason"]
4895
- // variant: SearchVariant, reason: SearchDismissReason
4896
- })
4897
- };
4898
- var TELEMETRY_EVENT_NAMES = Object.keys(TELEMETRY_EVENTS);
4899
-
4900
4915
  export {
4901
4916
  __commonJS,
4902
4917
  __toESM,
@@ -4943,4 +4958,4 @@ export {
4943
4958
  * SPDX-License-Identifier: BSD-3-Clause
4944
4959
  *)
4945
4960
  */
4946
- //# sourceMappingURL=chunk-4BUCN6YV.js.map
4961
+ //# sourceMappingURL=chunk-S7Y4N55F.js.map