@wireai/activation 0.8.0 → 0.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/AGENTS.md +29 -5
  2. package/CHANGELOG.md +202 -6
  3. package/README.md +105 -10
  4. package/dist/analytics/index.d.mts +6 -6
  5. package/dist/analytics/index.d.ts +6 -6
  6. package/dist/analytics/index.js +447 -49
  7. package/dist/analytics/index.js.map +1 -1
  8. package/dist/analytics/index.mjs +447 -49
  9. package/dist/analytics/index.mjs.map +1 -1
  10. package/dist/coachmarks/index.d.mts +2 -2
  11. package/dist/coachmarks/index.d.ts +2 -2
  12. package/dist/coachmarks/index.js.map +1 -1
  13. package/dist/coachmarks/index.mjs.map +1 -1
  14. package/dist/{currentSession-f7LWcdWG.d.ts → currentSession-61dcm3V-.d.ts} +10 -2
  15. package/dist/{currentSession-d9CrBxwe.d.mts → currentSession-Bs2JfTJ8.d.mts} +10 -2
  16. package/dist/{decision-BzbiKwk3.d.mts → decision-Bl_M2y3r.d.mts} +1 -1
  17. package/dist/{decision-plDEOCkt.d.ts → decision-Cau5KmP6.d.ts} +1 -1
  18. package/dist/index.d.mts +558 -15
  19. package/dist/index.d.ts +558 -15
  20. package/dist/index.js +1144 -375
  21. package/dist/index.js.map +1 -1
  22. package/dist/index.mjs +969 -207
  23. package/dist/index.mjs.map +1 -1
  24. package/dist/questionnaire/index.d.mts +69 -23
  25. package/dist/questionnaire/index.d.ts +69 -23
  26. package/dist/questionnaire/index.js +643 -172
  27. package/dist/questionnaire/index.js.map +1 -1
  28. package/dist/questionnaire/index.mjs +608 -137
  29. package/dist/questionnaire/index.mjs.map +1 -1
  30. package/dist/reviews/index.d.mts +24 -12
  31. package/dist/reviews/index.d.ts +24 -12
  32. package/dist/reviews/index.js +507 -173
  33. package/dist/reviews/index.js.map +1 -1
  34. package/dist/reviews/index.mjs +462 -129
  35. package/dist/reviews/index.mjs.map +1 -1
  36. package/dist/showcase/index.d.mts +2 -2
  37. package/dist/showcase/index.d.ts +2 -2
  38. package/dist/showcase/index.js.map +1 -1
  39. package/dist/showcase/index.mjs.map +1 -1
  40. package/dist/transport-B31G0Cib.d.ts +128 -0
  41. package/dist/transport-Bzb-bcB2.d.mts +128 -0
  42. package/dist/{types-GL_hQ0TN.d.mts → types-BcmagF6K.d.mts} +1 -1
  43. package/dist/{types-GL_hQ0TN.d.ts → types-BcmagF6K.d.ts} +1 -1
  44. package/dist/{types-BhpXJGlg.d.ts → types-Buj9Lw9t.d.ts} +15 -3
  45. package/dist/{types-CMuOexw0.d.mts → types-CKFhyrMu.d.mts} +1 -1
  46. package/dist/{types-CMuOexw0.d.ts → types-CKFhyrMu.d.ts} +1 -1
  47. package/dist/{types-A6pTxIZV.d.mts → types-CNUqMK0D.d.mts} +15 -3
  48. package/metro/index.d.ts +18 -1
  49. package/metro/index.js +80 -0
  50. package/package.json +9 -1
  51. package/src/WireOnboarding.tsx +4 -0
  52. package/src/analytics/currentSession.ts +1 -1
  53. package/src/cards/CardGridSelectCard.tsx +253 -0
  54. package/src/cards/ChipSelectCard.tsx +1 -1
  55. package/src/cards/SelectionCard.tsx +15 -19
  56. package/src/cards/index.ts +13 -1
  57. package/src/cards/optionSchema.ts +65 -0
  58. package/src/coachmarks/types.ts +1 -1
  59. package/src/components/CardHandoff.tsx +39 -7
  60. package/src/components/DoneCheck.tsx +94 -0
  61. package/src/components/ModalPaneHost.tsx +141 -0
  62. package/src/components/StepDots.tsx +112 -0
  63. package/src/device/appVersion.ts +29 -8
  64. package/src/device/deviceModel.ts +21 -8
  65. package/src/features/cache.ts +1 -1
  66. package/src/haptics/expo-haptics.d.ts +31 -0
  67. package/src/haptics/haptics.ts +58 -0
  68. package/src/icons/IconRegistry.tsx +53 -0
  69. package/src/icons/WireIcon.tsx +85 -0
  70. package/src/icons/expoIcons.ts +165 -0
  71. package/src/icons/index.ts +18 -0
  72. package/src/icons/vocabulary.ts +154 -0
  73. package/src/index.ts +20 -0
  74. package/src/questionnaire/QuestionnaireGate.tsx +315 -164
  75. package/src/questionnaire/decision.ts +4 -2
  76. package/src/questionnaire/index.ts +3 -2
  77. package/src/questionnaire/steps.ts +261 -0
  78. package/src/questionnaire/types.ts +33 -12
  79. package/src/reviews/ReviewGate.tsx +250 -152
  80. package/src/reviews/index.ts +7 -3
  81. package/src/reviews/transport.ts +119 -3
  82. package/src/reviews/types.ts +13 -0
  83. package/src/session/persistedSession.ts +1 -1
  84. package/src/session-analytics/lifecycle.ts +1 -1
  85. package/src/session-analytics/useSessionStart.ts +2 -2
  86. package/src/showcase/FeatureShowcase.tsx +1 -1
  87. package/src/showcase/showcaseColors.ts +1 -1
  88. package/src/theme/mergeThemeOver.ts +27 -0
  89. package/src/types.ts +8 -0
  90. package/dist/transport-BeO_Brcu.d.mts +0 -40
  91. package/dist/transport-DLpd1v5_.d.ts +0 -40
package/dist/index.d.mts CHANGED
@@ -1,13 +1,14 @@
1
1
  import * as React from 'react';
2
2
  import React__default, { ReactNode } from 'react';
3
- import { o as WireOnboardingProps, p as WireOnboardingConfig, O as OnboardingResult, S as StepValidator, q as OnboardingEvent, u as OnboardingCopy, a as ClientEventTarget, D as DeviceContext, C as ClientEvent, e as EnvelopeSource } from './currentSession-d9CrBxwe.mjs';
4
- export { A as AnalyticsEvent, b as ClientEventType, v as DeviceFormFactor, w as EXTRA_KEY_PREFIX, x as OnboardingProgress, R as RESERVED_USER_CONTEXT_KEYS, y as ResolveUserContextOptions, z as ResolvedUserContext, g as WIRE_ONBOARDING_EVENTS, h as WireOnboardingEventName, W as WireUserContext, B as collectDeviceContext, k as getCurrentSessionId, F as hashEmailFnv1a, G as isWireScalar, m as makeSessionId, H as namespaceExtra, r as reportClientEvent, l as reportClientEvents, n as resetCurrentSessionId, I as resolveUserContext, s as setCurrentSessionId, t as toAnalyticsEvent } from './currentSession-d9CrBxwe.mjs';
3
+ import { o as WireOnboardingProps, p as WireOnboardingConfig, O as OnboardingResult, S as StepValidator, q as OnboardingEvent, u as OnboardingCopy, a as ClientEventTarget, D as DeviceContext, C as ClientEvent, e as EnvelopeSource } from './currentSession-Bs2JfTJ8.mjs';
4
+ export { A as AnalyticsEvent, b as ClientEventType, v as DeviceFormFactor, w as EXTRA_KEY_PREFIX, x as OnboardingProgress, R as RESERVED_USER_CONTEXT_KEYS, y as ResolveUserContextOptions, z as ResolvedUserContext, g as WIRE_ONBOARDING_EVENTS, h as WireOnboardingEventName, W as WireUserContext, B as collectDeviceContext, k as getCurrentSessionId, F as hashEmailFnv1a, G as isWireScalar, m as makeSessionId, H as namespaceExtra, r as reportClientEvent, l as reportClientEvents, n as resetCurrentSessionId, I as resolveUserContext, s as setCurrentSessionId, t as toAnalyticsEvent } from './currentSession-Bs2JfTJ8.mjs';
5
5
  import { O as OnboardingTheme } from './types-BKfpdZzX.mjs';
6
6
  export { a as OnboardingButtonStyle, b as OnboardingColors, c as OnboardingFonts, d as OnboardingRadius, e as OnboardingSpacing } from './types-BKfpdZzX.mjs';
7
7
  export { C as CenteredModal, a as CenteredModalHandle, b as CenteredModalProps } from './CenteredModal-C3qQBHsA.mjs';
8
8
  import { WireAIComponent, Message, WireAIResponse } from 'wireai-rn';
9
- import { a as WireFeaturesConfig, W as WireFeatures, b as WireOnboardingStorage } from './types-CMuOexw0.mjs';
10
- export { D as DEFAULT_SESSION_TTL_MS, L as LoadedSession, O as OnboardingMode, c as clearPersistedSession, l as loadPersistedSession, p as peekPersistedSession, s as savePersistedSession, d as sessionStorageKey } from './types-CMuOexw0.mjs';
9
+ import { a as WireFeaturesConfig, W as WireFeatures, b as WireOnboardingStorage } from './types-CKFhyrMu.mjs';
10
+ export { D as DEFAULT_SESSION_TTL_MS, L as LoadedSession, O as OnboardingMode, c as clearPersistedSession, l as loadPersistedSession, p as peekPersistedSession, s as savePersistedSession, d as sessionStorageKey } from './types-CKFhyrMu.mjs';
11
+ import { z } from 'zod';
11
12
  import 'react-native';
12
13
 
13
14
  /**
@@ -346,6 +347,16 @@ declare const Button: React__default.NamedExoticComponent<ButtonProps>;
346
347
  * - "fade": loaders — enter/exit as a plain 120ms fade so the "thinking"
347
348
  * state hands off to the first card without a hard cut.
348
349
  *
350
+ * `direction` mirrors the whole slide for BACK navigation, so a step the user
351
+ * returns to comes back from the side it left toward. Spatial consistency: if
352
+ * "next" pushes left, "back" must pull right, or the stack loses its geography.
353
+ *
354
+ * `layout` picks how the moving surface is sized. "fill" (default) is the
355
+ * full-screen flow, where the pane owns the viewport. "auto" is for a pane
356
+ * inside an auto-height container (the CenteredModal card): `flex: 1` there
357
+ * resolves to a ZERO-height child under Yoga — flex-basis 0 with no free space
358
+ * to grow into — so the in-flow layer must size to its own content instead.
359
+ *
349
360
  * Reduce motion: every handoff becomes a 120ms crossfade, no translate/scale.
350
361
  * All values run on the native driver (transform/opacity only); in-flight
351
362
  * animations are stopped when superseded and on unmount.
@@ -356,11 +367,19 @@ declare const Button: React__default.NamedExoticComponent<ButtonProps>;
356
367
  */
357
368
 
358
369
  type CardHandoffVariant = "slide" | "spring" | "fade";
370
+ /** Which way the stack is moving. "backward" mirrors the slide (see the header note). */
371
+ type CardHandoffDirection = "forward" | "backward";
372
+ /** How the moving surface is sized. "auto" = a pane in an auto-height container. */
373
+ type CardHandoffLayout = "fill" | "auto";
359
374
  type CardHandoffProps = {
360
375
  /** Identity of the current child (e.g. the message id). A change runs the handoff. */
361
376
  transitionKey: string;
362
377
  /** How the CURRENT child enters (and, snapshotted, how it will later exit). */
363
378
  variant?: CardHandoffVariant;
379
+ /** Travel direction of THIS transition. Default "forward". */
380
+ direction?: CardHandoffDirection;
381
+ /** Sizing mode. Default "fill" (the full-screen flow). */
382
+ layout?: CardHandoffLayout;
364
383
  children: React__default.ReactNode;
365
384
  };
366
385
  declare const CardHandoff: React__default.NamedExoticComponent<CardHandoffProps>;
@@ -535,12 +554,51 @@ declare const TextInputCard: WireAIComponent;
535
554
 
536
555
  declare const SelectionCard: WireAIComponent;
537
556
 
557
+ declare const CardGridSelectCard: WireAIComponent;
558
+
538
559
  declare const StatusCard: WireAIComponent;
539
560
 
540
561
  declare const NumberStepperCard: WireAIComponent;
541
562
 
542
563
  declare const InterstitialCard: WireAIComponent;
543
564
 
565
+ /**
566
+ * The shared option shape for the choice cards (SelectionCard, CardGridSelectCard).
567
+ *
568
+ * ── BACK-COMPAT, IN BOTH DIRECTIONS (the hard gate) ──────────────────────────────────────
569
+ *
570
+ * NEW option → OLD kit: `z.object` STRIPS unknown keys, and the SDK renderer mounts
571
+ * `parsed.data` (not the raw props — see wireai-rn `renderer/ComponentRenderer.tsx`). So a
572
+ * client on kit 0.7.x that receives `{value, label, icon}` silently drops `icon` and renders
573
+ * the plain row it always did. No throw, no fallback card. This is what makes it safe to teach
574
+ * the server `icon` before every host has re-pinned — and it MUST stay true, so never make
575
+ * this schema `.strict()`.
576
+ *
577
+ * OLD option → NEW kit: the `preprocess` still coerces a bare `"Spring"` into
578
+ * `{value:"Spring", label:"Spring"}`, exactly as before. A bare string and a bare
579
+ * `{value,label}` both keep working untouched.
580
+ *
581
+ * `icon` is a plain `z.string()`, NOT a z.enum of the vocabulary. Deliberate: an unknown name
582
+ * must degrade to no icon (WireIcon does that), never fail validation. If it were an enum, one
583
+ * hallucinated or newer-than-this-client icon name would turn the whole card into a
584
+ * LLM_SCHEMA_ERROR and cost the user their question — a catastrophic trade for a decoration.
585
+ */
586
+
587
+ declare const optionObjectSchema: z.ZodObject<{
588
+ value: z.ZodString;
589
+ label: z.ZodString;
590
+ icon: z.ZodOptional<z.ZodString>;
591
+ }, "strip", z.ZodTypeAny, {
592
+ label: string;
593
+ value: string;
594
+ icon?: string | undefined;
595
+ }, {
596
+ label: string;
597
+ value: string;
598
+ icon?: string | undefined;
599
+ }>;
600
+ type CardOption = z.infer<typeof optionObjectSchema>;
601
+
544
602
  /**
545
603
  * onboardingComponents — the constrained set of themed cards the kit registers
546
604
  * with the SDK. The backend's `allowed_components` must be a subset of these
@@ -549,6 +607,473 @@ declare const InterstitialCard: WireAIComponent;
549
607
 
550
608
  declare const onboardingComponents: WireAIComponent[];
551
609
 
610
+ /**
611
+ * The Wire icon VOCABULARY — the stable, semantic contract between the AI and the kit.
612
+ *
613
+ * The model emits a plain semantic string (`"instagram"`, `"friend"`, `"wedding"`), never a
614
+ * raw icon-library glyph name. That indirection is the whole point:
615
+ *
616
+ * • The model is never coupled to a library version. `@expo/vector-icons` renaming a glyph,
617
+ * or a host swapping the library out for brand SVGs, changes THIS map — not the prompt,
618
+ * not the server, and not a single stored answer.
619
+ * • A host can override any name with its own artwork (see `IconRegistry`), so brand icons
620
+ * need no kit change.
621
+ * • An unknown name degrades to no icon (see `WireIcon`), which is why the vocabulary can
622
+ * grow without a coordinated kit+server release.
623
+ *
624
+ * `WIRE_ICON_NAMES` is exported so the server/AI side can be taught the list verbatim — paste
625
+ * it into the prompt as the allowed `icon` values. Keep names SEMANTIC (what the option means)
626
+ * rather than visual (what the glyph looks like): the model reasons about meaning.
627
+ *
628
+ * Every glyph below was verified to exist in the `@expo/vector-icons` 15.0.3 glyphmaps that
629
+ * both live host apps already ship. MaterialCommunityIcons is the default family (the broadest
630
+ * single set); Ionicons covers the few brand logos MCI lacks (TikTok, Discord).
631
+ */
632
+ /** The icon families this kit resolves out of `@expo/vector-icons`. Both are root exports. */
633
+ type WireIconFamily = "MaterialCommunityIcons" | "Ionicons";
634
+ /** One vocabulary entry: the concrete glyph a semantic name resolves to. */
635
+ interface WireIconGlyph {
636
+ family: WireIconFamily;
637
+ /** The library's own glyph name — an INTERNAL detail. The AI never sees or emits this. */
638
+ name: string;
639
+ }
640
+ /**
641
+ * The semantic name → concrete glyph map. Grouped by the onboarding questions these actually
642
+ * serve: acquisition channels ("where did you hear about us"), intent/occasion ("what brings
643
+ * you here"), and a general-purpose set for everything else.
644
+ */
645
+ declare const WIRE_ICON_GLYPHS: {
646
+ readonly instagram: {
647
+ readonly family: "MaterialCommunityIcons";
648
+ readonly name: "instagram";
649
+ };
650
+ readonly tiktok: {
651
+ readonly family: "Ionicons";
652
+ readonly name: "logo-tiktok";
653
+ };
654
+ readonly youtube: {
655
+ readonly family: "MaterialCommunityIcons";
656
+ readonly name: "youtube";
657
+ };
658
+ readonly facebook: {
659
+ readonly family: "MaterialCommunityIcons";
660
+ readonly name: "facebook";
661
+ };
662
+ readonly twitter: {
663
+ readonly family: "MaterialCommunityIcons";
664
+ readonly name: "twitter";
665
+ };
666
+ readonly reddit: {
667
+ readonly family: "MaterialCommunityIcons";
668
+ readonly name: "reddit";
669
+ };
670
+ readonly linkedin: {
671
+ readonly family: "MaterialCommunityIcons";
672
+ readonly name: "linkedin";
673
+ };
674
+ readonly discord: {
675
+ readonly family: "Ionicons";
676
+ readonly name: "logo-discord";
677
+ };
678
+ readonly whatsapp: {
679
+ readonly family: "MaterialCommunityIcons";
680
+ readonly name: "whatsapp";
681
+ };
682
+ readonly twitch: {
683
+ readonly family: "MaterialCommunityIcons";
684
+ readonly name: "twitch";
685
+ };
686
+ readonly snapchat: {
687
+ readonly family: "MaterialCommunityIcons";
688
+ readonly name: "snapchat";
689
+ };
690
+ readonly pinterest: {
691
+ readonly family: "MaterialCommunityIcons";
692
+ readonly name: "pinterest";
693
+ };
694
+ readonly google: {
695
+ readonly family: "MaterialCommunityIcons";
696
+ readonly name: "google";
697
+ };
698
+ readonly search: {
699
+ readonly family: "MaterialCommunityIcons";
700
+ readonly name: "magnify";
701
+ };
702
+ readonly friend: {
703
+ readonly family: "MaterialCommunityIcons";
704
+ readonly name: "account-heart";
705
+ };
706
+ readonly podcast: {
707
+ readonly family: "MaterialCommunityIcons";
708
+ readonly name: "podcast";
709
+ };
710
+ readonly blog: {
711
+ readonly family: "MaterialCommunityIcons";
712
+ readonly name: "post";
713
+ };
714
+ readonly newsletter: {
715
+ readonly family: "MaterialCommunityIcons";
716
+ readonly name: "email-outline";
717
+ };
718
+ readonly news: {
719
+ readonly family: "MaterialCommunityIcons";
720
+ readonly name: "newspaper";
721
+ };
722
+ readonly "app-store": {
723
+ readonly family: "MaterialCommunityIcons";
724
+ readonly name: "apple";
725
+ };
726
+ readonly ad: {
727
+ readonly family: "MaterialCommunityIcons";
728
+ readonly name: "bullhorn";
729
+ };
730
+ readonly wedding: {
731
+ readonly family: "MaterialCommunityIcons";
732
+ readonly name: "ring";
733
+ };
734
+ readonly birthday: {
735
+ readonly family: "MaterialCommunityIcons";
736
+ readonly name: "cake-variant";
737
+ };
738
+ readonly baby: {
739
+ readonly family: "MaterialCommunityIcons";
740
+ readonly name: "baby-carriage";
741
+ };
742
+ readonly travel: {
743
+ readonly family: "MaterialCommunityIcons";
744
+ readonly name: "airplane";
745
+ };
746
+ readonly work: {
747
+ readonly family: "MaterialCommunityIcons";
748
+ readonly name: "briefcase";
749
+ };
750
+ readonly celebration: {
751
+ readonly family: "MaterialCommunityIcons";
752
+ readonly name: "party-popper";
753
+ };
754
+ readonly store: {
755
+ readonly family: "MaterialCommunityIcons";
756
+ readonly name: "storefront";
757
+ };
758
+ readonly school: {
759
+ readonly family: "MaterialCommunityIcons";
760
+ readonly name: "school";
761
+ };
762
+ readonly team: {
763
+ readonly family: "MaterialCommunityIcons";
764
+ readonly name: "account-multiple";
765
+ };
766
+ readonly growth: {
767
+ readonly family: "MaterialCommunityIcons";
768
+ readonly name: "trending-up";
769
+ };
770
+ readonly sparkle: {
771
+ readonly family: "MaterialCommunityIcons";
772
+ readonly name: "star-four-points";
773
+ };
774
+ readonly heart: {
775
+ readonly family: "MaterialCommunityIcons";
776
+ readonly name: "heart";
777
+ };
778
+ readonly star: {
779
+ readonly family: "MaterialCommunityIcons";
780
+ readonly name: "star";
781
+ };
782
+ readonly fire: {
783
+ readonly family: "MaterialCommunityIcons";
784
+ readonly name: "fire";
785
+ };
786
+ readonly target: {
787
+ readonly family: "MaterialCommunityIcons";
788
+ readonly name: "target";
789
+ };
790
+ readonly trophy: {
791
+ readonly family: "MaterialCommunityIcons";
792
+ readonly name: "trophy";
793
+ };
794
+ readonly rocket: {
795
+ readonly family: "MaterialCommunityIcons";
796
+ readonly name: "rocket-launch";
797
+ };
798
+ readonly clock: {
799
+ readonly family: "MaterialCommunityIcons";
800
+ readonly name: "clock-outline";
801
+ };
802
+ readonly calendar: {
803
+ readonly family: "MaterialCommunityIcons";
804
+ readonly name: "calendar-star";
805
+ };
806
+ readonly camera: {
807
+ readonly family: "MaterialCommunityIcons";
808
+ readonly name: "camera";
809
+ };
810
+ readonly image: {
811
+ readonly family: "MaterialCommunityIcons";
812
+ readonly name: "image";
813
+ };
814
+ readonly video: {
815
+ readonly family: "MaterialCommunityIcons";
816
+ readonly name: "video";
817
+ };
818
+ readonly mic: {
819
+ readonly family: "MaterialCommunityIcons";
820
+ readonly name: "microphone";
821
+ };
822
+ readonly music: {
823
+ readonly family: "MaterialCommunityIcons";
824
+ readonly name: "music";
825
+ };
826
+ readonly book: {
827
+ readonly family: "MaterialCommunityIcons";
828
+ readonly name: "book-open-variant";
829
+ };
830
+ readonly food: {
831
+ readonly family: "MaterialCommunityIcons";
832
+ readonly name: "silverware-fork-knife";
833
+ };
834
+ readonly coffee: {
835
+ readonly family: "MaterialCommunityIcons";
836
+ readonly name: "coffee";
837
+ };
838
+ readonly fitness: {
839
+ readonly family: "MaterialCommunityIcons";
840
+ readonly name: "dumbbell";
841
+ };
842
+ readonly health: {
843
+ readonly family: "MaterialCommunityIcons";
844
+ readonly name: "heart-pulse";
845
+ };
846
+ readonly meditation: {
847
+ readonly family: "MaterialCommunityIcons";
848
+ readonly name: "meditation";
849
+ };
850
+ readonly sleep: {
851
+ readonly family: "MaterialCommunityIcons";
852
+ readonly name: "sleep";
853
+ };
854
+ readonly brain: {
855
+ readonly family: "MaterialCommunityIcons";
856
+ readonly name: "brain";
857
+ };
858
+ readonly idea: {
859
+ readonly family: "MaterialCommunityIcons";
860
+ readonly name: "lightbulb-on";
861
+ };
862
+ readonly money: {
863
+ readonly family: "MaterialCommunityIcons";
864
+ readonly name: "cash";
865
+ };
866
+ readonly shopping: {
867
+ readonly family: "MaterialCommunityIcons";
868
+ readonly name: "cart";
869
+ };
870
+ readonly gift: {
871
+ readonly family: "MaterialCommunityIcons";
872
+ readonly name: "gift";
873
+ };
874
+ readonly home: {
875
+ readonly family: "MaterialCommunityIcons";
876
+ readonly name: "home";
877
+ };
878
+ readonly car: {
879
+ readonly family: "MaterialCommunityIcons";
880
+ readonly name: "car";
881
+ };
882
+ readonly pet: {
883
+ readonly family: "MaterialCommunityIcons";
884
+ readonly name: "paw";
885
+ };
886
+ readonly plant: {
887
+ readonly family: "MaterialCommunityIcons";
888
+ readonly name: "sprout";
889
+ };
890
+ readonly sun: {
891
+ readonly family: "MaterialCommunityIcons";
892
+ readonly name: "white-balance-sunny";
893
+ };
894
+ readonly moon: {
895
+ readonly family: "MaterialCommunityIcons";
896
+ readonly name: "weather-night";
897
+ };
898
+ readonly globe: {
899
+ readonly family: "MaterialCommunityIcons";
900
+ readonly name: "earth";
901
+ };
902
+ readonly "map-pin": {
903
+ readonly family: "MaterialCommunityIcons";
904
+ readonly name: "map-marker";
905
+ };
906
+ readonly compass: {
907
+ readonly family: "MaterialCommunityIcons";
908
+ readonly name: "compass";
909
+ };
910
+ readonly flag: {
911
+ readonly family: "MaterialCommunityIcons";
912
+ readonly name: "flag";
913
+ };
914
+ readonly bookmark: {
915
+ readonly family: "MaterialCommunityIcons";
916
+ readonly name: "bookmark";
917
+ };
918
+ readonly bell: {
919
+ readonly family: "MaterialCommunityIcons";
920
+ readonly name: "bell";
921
+ };
922
+ readonly mail: {
923
+ readonly family: "MaterialCommunityIcons";
924
+ readonly name: "email";
925
+ };
926
+ readonly phone: {
927
+ readonly family: "MaterialCommunityIcons";
928
+ readonly name: "phone";
929
+ };
930
+ readonly chat: {
931
+ readonly family: "MaterialCommunityIcons";
932
+ readonly name: "chat";
933
+ };
934
+ readonly user: {
935
+ readonly family: "MaterialCommunityIcons";
936
+ readonly name: "account";
937
+ };
938
+ readonly users: {
939
+ readonly family: "MaterialCommunityIcons";
940
+ readonly name: "account-group";
941
+ };
942
+ readonly settings: {
943
+ readonly family: "MaterialCommunityIcons";
944
+ readonly name: "cog";
945
+ };
946
+ readonly tools: {
947
+ readonly family: "MaterialCommunityIcons";
948
+ readonly name: "tools";
949
+ };
950
+ readonly puzzle: {
951
+ readonly family: "MaterialCommunityIcons";
952
+ readonly name: "puzzle";
953
+ };
954
+ readonly chart: {
955
+ readonly family: "MaterialCommunityIcons";
956
+ readonly name: "chart-line";
957
+ };
958
+ readonly shield: {
959
+ readonly family: "MaterialCommunityIcons";
960
+ readonly name: "shield-check";
961
+ };
962
+ readonly lock: {
963
+ readonly family: "MaterialCommunityIcons";
964
+ readonly name: "lock";
965
+ };
966
+ readonly cloud: {
967
+ readonly family: "MaterialCommunityIcons";
968
+ readonly name: "cloud";
969
+ };
970
+ readonly pencil: {
971
+ readonly family: "MaterialCommunityIcons";
972
+ readonly name: "pencil";
973
+ };
974
+ readonly check: {
975
+ readonly family: "MaterialCommunityIcons";
976
+ readonly name: "check-circle";
977
+ };
978
+ readonly plus: {
979
+ readonly family: "MaterialCommunityIcons";
980
+ readonly name: "plus-circle";
981
+ };
982
+ readonly question: {
983
+ readonly family: "MaterialCommunityIcons";
984
+ readonly name: "help-circle";
985
+ };
986
+ readonly other: {
987
+ readonly family: "MaterialCommunityIcons";
988
+ readonly name: "dots-horizontal-circle";
989
+ };
990
+ };
991
+ /** A name in the vocabulary. The card schemas accept any string and degrade — see `WireIcon`. */
992
+ type WireIconName = keyof typeof WIRE_ICON_GLYPHS;
993
+ /**
994
+ * Every semantic name, as a plain array — the list to paste into the server/AI prompt as the
995
+ * allowed `icon` values. Sorted for a stable, diffable prompt.
996
+ */
997
+ declare const WIRE_ICON_NAMES: readonly string[];
998
+ /**
999
+ * Look up a semantic name. Returns undefined for anything outside the vocabulary.
1000
+ *
1001
+ * The OWN-property check is load-bearing, not defensive noise: the name comes from an LLM, and
1002
+ * a plain object lookup answers `"toString"` / `"constructor"` / `"valueOf"` with an inherited
1003
+ * `Object.prototype` member. That would hand back a function where a `{family, name}` is
1004
+ * expected — a non-glyph masquerading as one. Caught by the vocabulary canary.
1005
+ */
1006
+ declare const lookupIconGlyph: (name: string | undefined) => WireIconGlyph | undefined;
1007
+
1008
+ /** A `require`-like resolver. Injectable in tests; production uses the guarded literal require. */
1009
+ type OptionalRequire$2 = (moduleName: string) => unknown;
1010
+
1011
+ /**
1012
+ * WireIcon — render one semantic icon name, or nothing at all.
1013
+ *
1014
+ * RESOLUTION ORDER (each step falls through to the next, never throws):
1015
+ * 1. the host `icons` registry — brand artwork, zero kit deps (IconRegistry.tsx)
1016
+ * 2. `@expo/vector-icons` — if the optional peer resolves (expoIcons.ts)
1017
+ * 3. NOTHING — render null
1018
+ *
1019
+ * Step 3 is a FEATURE, not a failure mode. The AI emits icon names from a vocabulary that will
1020
+ * keep growing, against production apps that ship on their own schedule (new store builds only,
1021
+ * never OTA, so they cannot be force-updated). So an unknown, misspelled, hallucinated, or
1022
+ * simply newer-than-this-client name MUST be a no-op: no crash, no broken-glyph tofu box, and
1023
+ * no layout shift. Returning `null` (rather than a spacer or a placeholder) is what gives the
1024
+ * last property — a row with an unresolvable icon lays out EXACTLY like a row with no icon,
1025
+ * because the parent's flex `gap` adds no space for a null child.
1026
+ *
1027
+ * An icon is always DECORATIVE: the label carries the meaning, so the icon is hidden from
1028
+ * assistive tech and never becomes the accessible name of its option.
1029
+ */
1030
+
1031
+ type WireIconProps = {
1032
+ /** A semantic name from the vocabulary (see vocabulary.ts). Unknown → renders nothing. */
1033
+ name?: string;
1034
+ /** Glyph size in px. */
1035
+ size?: number;
1036
+ /** Glyph color. Callers pass a THEME token — never a raw hex. */
1037
+ color?: string;
1038
+ /** Injectable resolver. TEST-ONLY seam; production uses the guarded runtime require. */
1039
+ requireModule?: OptionalRequire$2;
1040
+ };
1041
+ declare const WireIcon: React__default.NamedExoticComponent<WireIconProps>;
1042
+
1043
+ /**
1044
+ * Icon registry — the host's escape hatch, and the FIRST step of icon resolution.
1045
+ *
1046
+ * Deliberately the same shape and philosophy as the `illustrations` registry
1047
+ * (components/Illustration.tsx): name → ReactNode, held in context, so an app can ship brand
1048
+ * SVG / Lottie / Image nodes the kit never imports. Here it means a host can:
1049
+ *
1050
+ * • override any vocabulary name with its own brand mark (`{ instagram: <MyIgGlyph/> }`), or
1051
+ * • supply icons WITHOUT installing `@expo/vector-icons` at all, or
1052
+ * • extend the vocabulary with names of its own — the AI emits `"my-thing"`, the host renders
1053
+ * it, and the kit needs no release.
1054
+ *
1055
+ * <WireOnboarding icons={{ instagram: <BrandIg/> }} ... />
1056
+ *
1057
+ * A name the registry doesn't have falls through to `@expo/vector-icons`, then to no icon at
1058
+ * all. See `WireIcon`.
1059
+ */
1060
+
1061
+ type WireIconRegistry = Record<string, React__default.ReactNode>;
1062
+ type IconRegistryProviderProps = {
1063
+ registry?: WireIconRegistry;
1064
+ children: React__default.ReactNode;
1065
+ };
1066
+ declare const IconRegistryProvider: React__default.FC<IconRegistryProviderProps>;
1067
+ /**
1068
+ * Look up a host-supplied icon node by name. Returns undefined if absent.
1069
+ *
1070
+ * The OWN-property check matters here for the same reason it does in `vocabulary.ts`: the name
1071
+ * is LLM-authored, and a bare `registry[name]` answers `"toString"` with an inherited function
1072
+ * — which is truthy, so it would be handed to React as a child and blow up the card. An icon
1073
+ * name must never be able to do that.
1074
+ */
1075
+ declare const useHostIcon: (name?: string) => React__default.ReactNode | undefined;
1076
+
552
1077
  /**
553
1078
  * OnboardingFlow — the inner engine. Mirrors the proven production-app usage of the SDK
554
1079
  * (useWireAIThread + useWireAIAction + ComponentRenderer) and layers on the kit's
@@ -733,7 +1258,7 @@ declare const featuresEqual: (a: WireFeatures, b: WireFeatures) => boolean;
733
1258
  * A cache younger than this is "fresh"; older is "stale" (still served on a fetch error).
734
1259
  */
735
1260
  declare const DEFAULT_FEATURES_TTL_MS = 300000;
736
- /** Storage key for a tenant's cached flags, e.g. `wireai:features:myelino`. */
1261
+ /** Storage key for a tenant's cached flags, e.g. `wireai:features:acme`. */
737
1262
  declare const featuresCacheKey: (appId?: string) => string;
738
1263
  /** A cached flags entry: the resolved flags + the epoch-ms they were fetched. */
739
1264
  interface CachedFeatures {
@@ -837,10 +1362,20 @@ declare const attributionMetadata: (a: OnboardingAttribution) => {
837
1362
  * so the breakdown works out of the box. An explicit `config.appVersion` always WINS over this.
838
1363
  *
839
1364
  * WHY it adds NO dependency (the kit's hard rule): `expo-constants` / `expo-application` are read
840
- * through a GUARDED, VARIABLE-specifier `require`. Passing a variable (not a string literal) keeps
841
- * Metro/esbuild from statically resolving the module, so a host that does NOT have it installed
842
- * (e.g. bare React Native) never fails to bundle the require simply throws at runtime and is
843
- * swallowed. Nothing is added to `package.json`; nothing is forced on the host.
1365
+ * through a GUARDED require with a STRING-LITERAL specifier, inside a try/catch. Both halves are
1366
+ * required: the literal is what lets Metro COLLECT the dep, and the try/catch is what marks it
1367
+ * OPTIONAL, so an absent module becomes a `null` dependencyMap entry whose require throws "Cannot
1368
+ * find module" straight into the catch. (`withWireOnboarding` in metro/index.js adds a stub-to-
1369
+ * empty-module safety net for hosts that disable Metro's `allowOptionalDependencies`.) Nothing is
1370
+ * added to `package.json`; nothing is forced on the host.
1371
+ *
1372
+ * The specifier MUST stay a literal. A variable specifier (`const req = require; req(name)`) is not
1373
+ * "lazier" — it is broken: Metro collects dependencies statically, so a variable collects NOTHING,
1374
+ * the module never enters the bundle, and the aliased `require` is Metro's own numeric-id-keyed
1375
+ * `metroRequire`, which can never resolve a package-name string. That shape is why this function
1376
+ * returned `undefined` on every host despite `expo-constants` being installed, which silently
1377
+ * emptied the `by_app_version` breakdown this module exists to fill. See icons/expoIcons.ts for
1378
+ * the full autopsy, and reviews/storeReview.ts for the literal-specifier counter-example.
844
1379
  *
845
1380
  * PRIVACY: an app version string is not PII and identifies no user or device, so surfacing it
846
1381
  * changes no App Privacy / Data Safety declaration (same guarantee as the rest of deviceContext).
@@ -867,10 +1402,18 @@ declare const detectAppVersion: (requireModule?: OptionalRequire$1) => string |
867
1402
  * on Android straight from `Platform.constants.Model` (e.g. "SM-G991B"), but iOS `Platform.constants`
868
1403
  * exposes NO model — only `osVersion` / `interfaceIdiom`. So the analytics `by_model` breakdown was
869
1404
  * Android-only. This module fills the iOS gap with the SAME zero-dependency technique the kit already
870
- * uses for `appVersion` (see device/appVersion.ts): a GUARDED, VARIABLE-specifier `require` of the
871
- * common Expo `expo-device` module. If the host has it, iOS gets a model out of the box; if not, the
872
- * require simply throws and is swallowed and iOS `model` stays omitted nothing is forced, nothing
873
- * is added to `package.json`, and a host without `expo-device` never fails to bundle.
1405
+ * uses for `appVersion` (see device/appVersion.ts): a GUARDED, STRING-LITERAL `require` of the common
1406
+ * Expo `expo-device` module, inside a try/catch the literal is what lets Metro COLLECT the dep and
1407
+ * the try/catch is what marks it OPTIONAL, so an absent module degrades instead of failing the build.
1408
+ * (`withWireOnboarding` in metro/index.js adds a stub-to-empty-module safety net for hosts that
1409
+ * disable Metro's `allowOptionalDependencies`.) If the host has it, iOS gets a model out of the box;
1410
+ * if not, the read yields `undefined` and iOS `model` stays omitted — nothing is forced, and nothing
1411
+ * is added to `package.json`.
1412
+ *
1413
+ * The specifier MUST stay a literal. A variable specifier (`const req = require; req(name)`) collects
1414
+ * NOTHING under Metro's static dependency collector, so the module never enters the bundle and the
1415
+ * aliased `require` — really Metro's numeric-id-keyed `metroRequire` — can never resolve a package
1416
+ * name. See icons/expoIcons.ts for the full autopsy.
874
1417
  *
875
1418
  * WHY it is NOT PII: `expo-device`'s `modelName` ("iPhone 14 Pro") and `modelId` ("iPhone15,2") are a
876
1419
  * device CLASS shared by millions of units — the same privacy category as the Android `Model` the kit
@@ -1091,7 +1634,7 @@ declare const useSessionStart: (config: SessionStartConfig | undefined, options?
1091
1634
  /** The canonical event name for the first-ever app open. Same `app.*` namespace as
1092
1635
  * {@link SESSION_STARTED_EVENT}; a trigger keys off this exact string. */
1093
1636
  declare const FIRST_OPEN_EVENT: "app.first_open";
1094
- /** Storage key for the once-ever first-open flag, e.g. `wireai:first_open:myelino`. Mirrors the
1637
+ /** Storage key for the once-ever first-open flag, e.g. `wireai:first_open:acme`. Mirrors the
1095
1638
  * `wireai:<concern>:<appId>` namespacing of {@link sessionStorageKey}. */
1096
1639
  declare const firstOpenStorageKey: (appId: string) => string;
1097
1640
  /** Test-only: forget the first-open latch so a unit test starts from a clean process state. */
@@ -1196,4 +1739,4 @@ interface UseLifecycleEventsOptions {
1196
1739
  */
1197
1740
  declare const useLifecycleEvents: (config: LifecycleConfig | undefined, options?: UseLifecycleEventsOptions) => void;
1198
1741
 
1199
- export { AUTO_DEVICE_ID_PREFIX, AnimatedSparkle, BACKGROUND_SESSION_MS, type CachedFeatures, CardHandoff, type CardHandoffProps, type CardHandoffVariant, ChipSelectCard, ClientEvent, ClientEventTarget, CompletionView, DEFAULT_FEATURES_TTL_MS, DemoOnboarding, type DemoOnboardingProps, DeviceContext, DoneBlock, ErrorBlock, FIRST_OPEN_EVENT, type IdentifyOnboardingOptions, IllustrationProvider, type IllustrationRegistry, InterstitialCard, type LifecycleConfig, type LifecycleEventInput, LoadingBlock, LoadingScreen, NumberStepperCard, type OnboardingAttribution, Button as OnboardingButton, OnboardingCopy, OnboardingEvent, type OnboardingFlagOptions, OnboardingFlow, OnboardingResult, OnboardingScaffold, OnboardingTheme, OnboardingThemeProvider, type ReportFirstOpenOptions, type ReportSessionStartOptions, type ResolveFeaturesOptions, SESSION_STARTED_EVENT, SelectionCard, type SessionStartConfig, StatusCard, StepProgress, StepValidator, TextInputCard, type ThemeFromBrandInput, USER_ID_MAX_LENGTH, type UseLifecycleEventsOptions, type UseSessionStartOptions, type WireConfigOverrides, WireFeatures, WireFeaturesConfig, WireFeaturesProvider, type WireFeaturesProviderProps, type WireLifecycleOptions, WireOnboarding, WireOnboardingConfig, WireOnboardingProps, WireOnboardingStorage, attributionMetadata, defaultIllustrations, defaultOnboardingTheme, defaultWireFeatures, deriveAnswers, detectAppVersion, detectNativeModel, deviceIdStorageKey, featuresCacheKey, featuresEqual, fetchWireFeatures, firstOpenStorageKey, identifyOnboarding, isFeaturesFresh, isOnboardingEnabled, mergeTheme, mintDeviceId, motionSpec, onboardingComponents, parseWireFeatures, readCachedFeatures, readProgress, reportFirstOpen, reportSessionStart, resetFirstOpenLatch, resetSessionStartGuard, sanitizeUserId, themeFromBrand, useIllustration, useLifecycleEvents, useOnboardingTheme, useReducedMotion, useResolvedFeatures, useSessionStart, useWireFeatures, useWireFeaturesContext, wireConfigFromEnv, wireLifecycleEvents, writeCachedFeatures };
1742
+ export { AUTO_DEVICE_ID_PREFIX, AnimatedSparkle, BACKGROUND_SESSION_MS, type CachedFeatures, CardGridSelectCard, CardHandoff, type CardHandoffProps, type CardHandoffVariant, type CardOption, ChipSelectCard, ClientEvent, ClientEventTarget, CompletionView, DEFAULT_FEATURES_TTL_MS, DemoOnboarding, type DemoOnboardingProps, DeviceContext, DoneBlock, ErrorBlock, FIRST_OPEN_EVENT, IconRegistryProvider, type IdentifyOnboardingOptions, IllustrationProvider, type IllustrationRegistry, InterstitialCard, type LifecycleConfig, type LifecycleEventInput, LoadingBlock, LoadingScreen, NumberStepperCard, type OnboardingAttribution, Button as OnboardingButton, OnboardingCopy, OnboardingEvent, type OnboardingFlagOptions, OnboardingFlow, OnboardingResult, OnboardingScaffold, OnboardingTheme, OnboardingThemeProvider, type ReportFirstOpenOptions, type ReportSessionStartOptions, type ResolveFeaturesOptions, SESSION_STARTED_EVENT, SelectionCard, type SessionStartConfig, StatusCard, StepProgress, StepValidator, TextInputCard, type ThemeFromBrandInput, USER_ID_MAX_LENGTH, type UseLifecycleEventsOptions, type UseSessionStartOptions, WIRE_ICON_GLYPHS, WIRE_ICON_NAMES, type WireConfigOverrides, WireFeatures, WireFeaturesConfig, WireFeaturesProvider, type WireFeaturesProviderProps, WireIcon, type WireIconFamily, type WireIconGlyph, type WireIconName, type WireIconProps, type WireIconRegistry, type WireLifecycleOptions, WireOnboarding, WireOnboardingConfig, WireOnboardingProps, WireOnboardingStorage, attributionMetadata, defaultIllustrations, defaultOnboardingTheme, defaultWireFeatures, deriveAnswers, detectAppVersion, detectNativeModel, deviceIdStorageKey, featuresCacheKey, featuresEqual, fetchWireFeatures, firstOpenStorageKey, identifyOnboarding, isFeaturesFresh, isOnboardingEnabled, lookupIconGlyph, mergeTheme, mintDeviceId, motionSpec, onboardingComponents, parseWireFeatures, readCachedFeatures, readProgress, reportFirstOpen, reportSessionStart, resetFirstOpenLatch, resetSessionStartGuard, sanitizeUserId, themeFromBrand, useHostIcon, useIllustration, useLifecycleEvents, useOnboardingTheme, useReducedMotion, useResolvedFeatures, useSessionStart, useWireFeatures, useWireFeaturesContext, wireConfigFromEnv, wireLifecycleEvents, writeCachedFeatures };