@wireai/activation 0.7.0 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +29 -5
- package/CHANGELOG.md +198 -6
- package/README.md +105 -10
- package/dist/analytics/index.d.mts +12 -8
- package/dist/analytics/index.d.ts +12 -8
- package/dist/analytics/index.js +525 -55
- package/dist/analytics/index.js.map +1 -1
- package/dist/analytics/index.mjs +525 -55
- package/dist/analytics/index.mjs.map +1 -1
- package/dist/coachmarks/index.d.mts +2 -2
- package/dist/coachmarks/index.d.ts +2 -2
- package/dist/coachmarks/index.js.map +1 -1
- package/dist/coachmarks/index.mjs.map +1 -1
- package/dist/{currentSession-CxnP7gAa.d.ts → currentSession-61dcm3V-.d.ts} +19 -3
- package/dist/{currentSession-BJBB7i4-.d.mts → currentSession-Bs2JfTJ8.d.mts} +19 -3
- package/dist/{decision-BzbiKwk3.d.mts → decision-Bl_M2y3r.d.mts} +1 -1
- package/dist/{decision-plDEOCkt.d.ts → decision-Cau5KmP6.d.ts} +1 -1
- package/dist/index.d.mts +620 -13
- package/dist/index.d.ts +620 -13
- package/dist/index.js +1194 -369
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1015 -201
- package/dist/index.mjs.map +1 -1
- package/dist/questionnaire/index.d.mts +69 -23
- package/dist/questionnaire/index.d.ts +69 -23
- package/dist/questionnaire/index.js +643 -172
- package/dist/questionnaire/index.js.map +1 -1
- package/dist/questionnaire/index.mjs +608 -137
- package/dist/questionnaire/index.mjs.map +1 -1
- package/dist/reviews/index.d.mts +24 -12
- package/dist/reviews/index.d.ts +24 -12
- package/dist/reviews/index.js +507 -173
- package/dist/reviews/index.js.map +1 -1
- package/dist/reviews/index.mjs +462 -129
- package/dist/reviews/index.mjs.map +1 -1
- package/dist/showcase/index.d.mts +2 -2
- package/dist/showcase/index.d.ts +2 -2
- package/dist/showcase/index.js.map +1 -1
- package/dist/showcase/index.mjs.map +1 -1
- package/dist/transport-DzU-TqZz.d.ts +86 -0
- package/dist/transport-f5VVB5hH.d.mts +86 -0
- package/dist/{types-GL_hQ0TN.d.mts → types-BcmagF6K.d.mts} +1 -1
- package/dist/{types-GL_hQ0TN.d.ts → types-BcmagF6K.d.ts} +1 -1
- package/dist/{types-BhpXJGlg.d.ts → types-Buj9Lw9t.d.ts} +15 -3
- package/dist/{types-CMuOexw0.d.mts → types-CKFhyrMu.d.mts} +1 -1
- package/dist/{types-CMuOexw0.d.ts → types-CKFhyrMu.d.ts} +1 -1
- package/dist/{types-A6pTxIZV.d.mts → types-CNUqMK0D.d.mts} +15 -3
- package/metro/index.d.ts +18 -1
- package/metro/index.js +80 -0
- package/package.json +9 -1
- package/src/WireOnboarding.tsx +4 -0
- package/src/analytics/analyticsFacade.ts +55 -10
- package/src/analytics/currentSession.ts +1 -1
- package/src/cards/CardGridSelectCard.tsx +253 -0
- package/src/cards/ChipSelectCard.tsx +1 -1
- package/src/cards/SelectionCard.tsx +15 -19
- package/src/cards/index.ts +13 -1
- package/src/cards/optionSchema.ts +65 -0
- package/src/coachmarks/types.ts +1 -1
- package/src/components/CardHandoff.tsx +39 -7
- package/src/components/DoneCheck.tsx +94 -0
- package/src/components/ModalPaneHost.tsx +141 -0
- package/src/components/StepDots.tsx +112 -0
- package/src/context/deviceId.ts +43 -0
- package/src/device/appVersion.ts +29 -8
- package/src/device/deviceContext.ts +14 -1
- package/src/device/deviceModel.ts +106 -0
- package/src/features/cache.ts +1 -1
- package/src/haptics/expo-haptics.d.ts +31 -0
- package/src/haptics/haptics.ts +58 -0
- package/src/icons/IconRegistry.tsx +53 -0
- package/src/icons/WireIcon.tsx +85 -0
- package/src/icons/expoIcons.ts +165 -0
- package/src/icons/index.ts +18 -0
- package/src/icons/vocabulary.ts +154 -0
- package/src/index.ts +22 -0
- package/src/questionnaire/QuestionnaireGate.tsx +315 -164
- package/src/questionnaire/decision.ts +4 -2
- package/src/questionnaire/index.ts +3 -2
- package/src/questionnaire/steps.ts +261 -0
- package/src/questionnaire/types.ts +33 -12
- package/src/reviews/ReviewGate.tsx +250 -152
- package/src/reviews/index.ts +7 -3
- package/src/reviews/transport.ts +77 -3
- package/src/reviews/types.ts +13 -0
- package/src/session/persistedSession.ts +1 -1
- package/src/session-analytics/lifecycle.ts +1 -1
- package/src/session-analytics/useSessionStart.ts +2 -2
- package/src/showcase/FeatureShowcase.tsx +1 -1
- package/src/showcase/showcaseColors.ts +1 -1
- package/src/theme/mergeThemeOver.ts +27 -0
- package/src/types.ts +8 -0
- package/dist/transport-BeO_Brcu.d.mts +0 -40
- package/dist/transport-DLpd1v5_.d.ts +0 -40
package/dist/index.d.ts
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-
|
|
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-
|
|
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-61dcm3V-.js';
|
|
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-61dcm3V-.js';
|
|
5
5
|
import { O as OnboardingTheme } from './types-BKfpdZzX.js';
|
|
6
6
|
export { a as OnboardingButtonStyle, b as OnboardingColors, c as OnboardingFonts, d as OnboardingRadius, e as OnboardingSpacing } from './types-BKfpdZzX.js';
|
|
7
7
|
export { C as CenteredModal, a as CenteredModalHandle, b as CenteredModalProps } from './CenteredModal-Cdgns6--.js';
|
|
8
8
|
import { WireAIComponent, Message, WireAIResponse } from 'wireai-rn';
|
|
9
|
-
import { a as WireFeaturesConfig, W as WireFeatures, b as WireOnboardingStorage } from './types-
|
|
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-
|
|
9
|
+
import { a as WireFeaturesConfig, W as WireFeatures, b as WireOnboardingStorage } from './types-CKFhyrMu.js';
|
|
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.js';
|
|
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:
|
|
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
|
|
841
|
-
*
|
|
842
|
-
*
|
|
843
|
-
*
|
|
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).
|
|
@@ -849,7 +1384,7 @@ declare const attributionMetadata: (a: OnboardingAttribution) => {
|
|
|
849
1384
|
* Analytics must never be able to break onboarding.
|
|
850
1385
|
*/
|
|
851
1386
|
/** A `require`-like resolver. Injectable in tests; production uses the guarded runtime require. */
|
|
852
|
-
type OptionalRequire = (moduleName: string) => unknown;
|
|
1387
|
+
type OptionalRequire$1 = (moduleName: string) => unknown;
|
|
853
1388
|
/**
|
|
854
1389
|
* Detect the host app version, preferring `expo-constants` (`expoConfig.version`, then
|
|
855
1390
|
* `nativeAppVersion`) and finally `expo-application` (`nativeApplicationVersion`). Returns the
|
|
@@ -858,7 +1393,48 @@ type OptionalRequire = (moduleName: string) => unknown;
|
|
|
858
1393
|
* `requireModule` is injectable so tests can exercise the "found" path without the native modules;
|
|
859
1394
|
* production defaults to the guarded runtime require above.
|
|
860
1395
|
*/
|
|
861
|
-
declare const detectAppVersion: (requireModule?: OptionalRequire) => string | undefined;
|
|
1396
|
+
declare const detectAppVersion: (requireModule?: OptionalRequire$1) => string | undefined;
|
|
1397
|
+
|
|
1398
|
+
/**
|
|
1399
|
+
* deviceModel — best-effort, DEPENDENCY-FREE detection of the device MODEL on iOS.
|
|
1400
|
+
*
|
|
1401
|
+
* WHY this exists (the asymmetry it closes): `collectDeviceContext` already reports `device.model`
|
|
1402
|
+
* on Android straight from `Platform.constants.Model` (e.g. "SM-G991B"), but iOS `Platform.constants`
|
|
1403
|
+
* exposes NO model — only `osVersion` / `interfaceIdiom`. So the analytics `by_model` breakdown was
|
|
1404
|
+
* Android-only. This module fills the iOS gap with the SAME zero-dependency technique the kit already
|
|
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.
|
|
1417
|
+
*
|
|
1418
|
+
* WHY it is NOT PII: `expo-device`'s `modelName` ("iPhone 14 Pro") and `modelId` ("iPhone15,2") are a
|
|
1419
|
+
* device CLASS shared by millions of units — the same privacy category as the Android `Model` the kit
|
|
1420
|
+
* already sends. It is NOT a unique device id / IDFA / fingerprint, so surfacing it changes no App
|
|
1421
|
+
* Privacy / Data Safety declaration (identical guarantee to the rest of deviceContext). It deliberately
|
|
1422
|
+
* does NOT read `expo-device`'s `deviceName` (that is the user-set name, e.g. "Malik's iPhone", and IS
|
|
1423
|
+
* personal data).
|
|
1424
|
+
*
|
|
1425
|
+
* NEVER THROWS: every read is guarded; a missing/odd value yields `undefined`, never an exception.
|
|
1426
|
+
*/
|
|
1427
|
+
/** A `require`-like resolver. Injectable in tests; production uses the guarded runtime require. */
|
|
1428
|
+
type OptionalRequire = (moduleName: string) => unknown;
|
|
1429
|
+
/**
|
|
1430
|
+
* Detect the device model via `expo-device`, preferring the human-readable `modelName`
|
|
1431
|
+
* ("iPhone 14 Pro") and falling back to the identifier `modelId` ("iPhone15,2"). Returns the first
|
|
1432
|
+
* real string, or `undefined` when `expo-device` is absent. Pure and never throws.
|
|
1433
|
+
*
|
|
1434
|
+
* `requireModule` is injectable so tests can exercise the "found" path without the native module;
|
|
1435
|
+
* production defaults to the guarded runtime require above.
|
|
1436
|
+
*/
|
|
1437
|
+
declare const detectNativeModel: (requireModule?: OptionalRequire) => string | undefined;
|
|
862
1438
|
|
|
863
1439
|
/** Max accepted user-id length. Longer strings are truncated (never rejected). Keep in sync
|
|
864
1440
|
* with the server's `USER_ID_MAX_LENGTH` (analytics/events.py). */
|
|
@@ -906,6 +1482,37 @@ type IdentifyOnboardingOptions = {
|
|
|
906
1482
|
*/
|
|
907
1483
|
declare const identifyOnboarding: (opts: IdentifyOnboardingOptions) => Promise<boolean>;
|
|
908
1484
|
|
|
1485
|
+
/**
|
|
1486
|
+
* deviceId — mint a stable, NON-PII, per-install device id the kit owns when the host supplies
|
|
1487
|
+
* none. This is the headline of "device fully automatic": the analytics façade auto-mints ONE id,
|
|
1488
|
+
* persists it via the host's `storage` abstraction, and reuses it on every subsequent open — so
|
|
1489
|
+
* `user_context.device_key` is ALWAYS present and the server's review/questionnaire gating +
|
|
1490
|
+
* A/B stickiness (both key on `device_key`) work out of the box, with zero host wiring.
|
|
1491
|
+
*
|
|
1492
|
+
* WHY it is NOT PII and adds NO dependency (the kit's hard rules):
|
|
1493
|
+
* The id is a random token generated from `Date.now()` + `Math.random()` — it carries NO hardware
|
|
1494
|
+
* identifier, NO IDFA/GAID, NO fingerprint. It is a first-party per-install correlation key, the
|
|
1495
|
+
* same privacy category as a first-party cookie: it groups a single install's sessions and cannot
|
|
1496
|
+
* identify a person or be joined across apps. There is NO `uuid` (or any) dependency — a
|
|
1497
|
+
* time+random scheme is sufficient because the id is minted ONCE and then persisted, so global
|
|
1498
|
+
* uniqueness across the fleet is not required (a per-install collision is astronomically unlikely
|
|
1499
|
+
* and inconsequential — worst case two installs share a bucket).
|
|
1500
|
+
*
|
|
1501
|
+
* A host that wants its OWN device id still wins: pass `WireUserContext.deviceKey` and the kit uses
|
|
1502
|
+
* that verbatim and never mints/persists an auto id.
|
|
1503
|
+
*/
|
|
1504
|
+
/** Prefix so an auto-minted id is visibly the kit's (distinguishable from a host-supplied `deviceKey`). */
|
|
1505
|
+
declare const AUTO_DEVICE_ID_PREFIX = "wdev_";
|
|
1506
|
+
/** The storage key the façade persists the auto-minted id under (namespaced per `appId`). */
|
|
1507
|
+
declare const deviceIdStorageKey: (appId?: string) => string;
|
|
1508
|
+
/**
|
|
1509
|
+
* Mint a fresh per-install device id. Dependency-free (`Date.now()` + `Math.random()`), never
|
|
1510
|
+
* throws, and returns a NEW value on every call — the façade mints ONCE and persists, so this is
|
|
1511
|
+
* called at most once per install (then the persisted value is reused). Two random chunks plus the
|
|
1512
|
+
* timestamp keep the token wide enough that a per-install collision is not a practical concern.
|
|
1513
|
+
*/
|
|
1514
|
+
declare const mintDeviceId: () => string;
|
|
1515
|
+
|
|
909
1516
|
/** The canonical event name for an app-open. A trigger keys off this exact string. */
|
|
910
1517
|
declare const SESSION_STARTED_EVENT: "app.session_started";
|
|
911
1518
|
/** Options for {@link reportSessionStart}. Everything except `target` is optional so a pre-auth
|
|
@@ -1027,7 +1634,7 @@ declare const useSessionStart: (config: SessionStartConfig | undefined, options?
|
|
|
1027
1634
|
/** The canonical event name for the first-ever app open. Same `app.*` namespace as
|
|
1028
1635
|
* {@link SESSION_STARTED_EVENT}; a trigger keys off this exact string. */
|
|
1029
1636
|
declare const FIRST_OPEN_EVENT: "app.first_open";
|
|
1030
|
-
/** Storage key for the once-ever first-open flag, e.g. `wireai:first_open:
|
|
1637
|
+
/** Storage key for the once-ever first-open flag, e.g. `wireai:first_open:acme`. Mirrors the
|
|
1031
1638
|
* `wireai:<concern>:<appId>` namespacing of {@link sessionStorageKey}. */
|
|
1032
1639
|
declare const firstOpenStorageKey: (appId: string) => string;
|
|
1033
1640
|
/** Test-only: forget the first-open latch so a unit test starts from a clean process state. */
|
|
@@ -1132,4 +1739,4 @@ interface UseLifecycleEventsOptions {
|
|
|
1132
1739
|
*/
|
|
1133
1740
|
declare const useLifecycleEvents: (config: LifecycleConfig | undefined, options?: UseLifecycleEventsOptions) => void;
|
|
1134
1741
|
|
|
1135
|
-
export { 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, featuresCacheKey, featuresEqual, fetchWireFeatures, firstOpenStorageKey, identifyOnboarding, isFeaturesFresh, isOnboardingEnabled, mergeTheme, 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 };
|