expo-invoke 1.0.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.
Files changed (144) hide show
  1. package/MIGRATION.md +125 -0
  2. package/README.md +942 -0
  3. package/SECURITY.md +35 -0
  4. package/android/build.gradle +42 -0
  5. package/android/src/main/java/expo/modules/invoke/AppActionsHandler.kt +74 -0
  6. package/android/src/main/java/expo/modules/invoke/ExpoInvokeModule.kt +135 -0
  7. package/android/src/main/java/expo/modules/invoke/QuickTileService.kt +63 -0
  8. package/android/src/main/java/expo/modules/invoke/ShortcutsHelper.kt +72 -0
  9. package/build/cli/commands/generate.d.ts +1 -0
  10. package/build/cli/commands/generate.js +119 -0
  11. package/build/cli/commands/generate.js.map +1 -0
  12. package/build/cli/commands/test.d.ts +1 -0
  13. package/build/cli/commands/test.js +53 -0
  14. package/build/cli/commands/test.js.map +1 -0
  15. package/build/cli/commands/validate.d.ts +1 -0
  16. package/build/cli/commands/validate.js +116 -0
  17. package/build/cli/commands/validate.js.map +1 -0
  18. package/build/cli/index.d.ts +2 -0
  19. package/build/cli/index.js +37 -0
  20. package/build/cli/index.js.map +1 -0
  21. package/build/plugin/android/withAndroidInvoke.d.ts +8 -0
  22. package/build/plugin/android/withAndroidInvoke.js +106 -0
  23. package/build/plugin/android/withAndroidInvoke.js.map +1 -0
  24. package/build/plugin/codegen/generateActionsXml.d.ts +2 -0
  25. package/build/plugin/codegen/generateActionsXml.js +69 -0
  26. package/build/plugin/codegen/generateActionsXml.js.map +1 -0
  27. package/build/plugin/codegen/generateShortcutsXml.d.ts +2 -0
  28. package/build/plugin/codegen/generateShortcutsXml.js +45 -0
  29. package/build/plugin/codegen/generateShortcutsXml.js.map +1 -0
  30. package/build/plugin/codegen/generateSwiftIntents.d.ts +2 -0
  31. package/build/plugin/codegen/generateSwiftIntents.js +129 -0
  32. package/build/plugin/codegen/generateSwiftIntents.js.map +1 -0
  33. package/build/plugin/ios/withIOSInvoke.d.ts +9 -0
  34. package/build/plugin/ios/withIOSInvoke.js +83 -0
  35. package/build/plugin/ios/withIOSInvoke.js.map +1 -0
  36. package/build/plugin/src/withInvoke.d.ts +16 -0
  37. package/build/plugin/src/withInvoke.js +13 -0
  38. package/build/plugin/src/withInvoke.js.map +1 -0
  39. package/build/src/components/AddToSiriButton.d.ts +18 -0
  40. package/build/src/components/AddToSiriButton.d.ts.map +1 -0
  41. package/build/src/components/AddToSiriButton.js +35 -0
  42. package/build/src/components/AddToSiriButton.js.map +1 -0
  43. package/build/src/components/InvokeDebugger.d.ts +12 -0
  44. package/build/src/components/InvokeDebugger.d.ts.map +1 -0
  45. package/build/src/components/InvokeDebugger.js +122 -0
  46. package/build/src/components/InvokeDebugger.js.map +1 -0
  47. package/build/src/components/ShortcutChip.d.ts +20 -0
  48. package/build/src/components/ShortcutChip.d.ts.map +1 -0
  49. package/build/src/components/ShortcutChip.js +44 -0
  50. package/build/src/components/ShortcutChip.js.map +1 -0
  51. package/build/src/hooks/useAddToSiri.d.ts +9 -0
  52. package/build/src/hooks/useAddToSiri.d.ts.map +1 -0
  53. package/build/src/hooks/useAddToSiri.js +15 -0
  54. package/build/src/hooks/useAddToSiri.js.map +1 -0
  55. package/build/src/hooks/useDonation.d.ts +26 -0
  56. package/build/src/hooks/useDonation.d.ts.map +1 -0
  57. package/build/src/hooks/useDonation.js +21 -0
  58. package/build/src/hooks/useDonation.js.map +1 -0
  59. package/build/src/hooks/useFocusFilter.d.ts +11 -0
  60. package/build/src/hooks/useFocusFilter.d.ts.map +1 -0
  61. package/build/src/hooks/useFocusFilter.js +24 -0
  62. package/build/src/hooks/useFocusFilter.js.map +1 -0
  63. package/build/src/hooks/useHandoff.d.ts +29 -0
  64. package/build/src/hooks/useHandoff.d.ts.map +1 -0
  65. package/build/src/hooks/useHandoff.js +27 -0
  66. package/build/src/hooks/useHandoff.js.map +1 -0
  67. package/build/src/hooks/useInvoke.d.ts +43 -0
  68. package/build/src/hooks/useInvoke.d.ts.map +1 -0
  69. package/build/src/hooks/useInvoke.js +70 -0
  70. package/build/src/hooks/useInvoke.js.map +1 -0
  71. package/build/src/hooks/useInvokeAnalytics.d.ts +23 -0
  72. package/build/src/hooks/useInvokeAnalytics.d.ts.map +1 -0
  73. package/build/src/hooks/useInvokeAnalytics.js +27 -0
  74. package/build/src/hooks/useInvokeAnalytics.js.map +1 -0
  75. package/build/src/hooks/useInvokeHistory.d.ts +11 -0
  76. package/build/src/hooks/useInvokeHistory.d.ts.map +1 -0
  77. package/build/src/hooks/useInvokeHistory.js +26 -0
  78. package/build/src/hooks/useInvokeHistory.js.map +1 -0
  79. package/build/src/hooks/useInvokeInit.d.ts +16 -0
  80. package/build/src/hooks/useInvokeInit.d.ts.map +1 -0
  81. package/build/src/hooks/useInvokeInit.js +32 -0
  82. package/build/src/hooks/useInvokeInit.js.map +1 -0
  83. package/build/src/hooks/useLiveActivityIntent.d.ts +21 -0
  84. package/build/src/hooks/useLiveActivityIntent.d.ts.map +1 -0
  85. package/build/src/hooks/useLiveActivityIntent.js +9 -0
  86. package/build/src/hooks/useLiveActivityIntent.js.map +1 -0
  87. package/build/src/hooks/useQuickTile.d.ts +23 -0
  88. package/build/src/hooks/useQuickTile.d.ts.map +1 -0
  89. package/build/src/hooks/useQuickTile.js +15 -0
  90. package/build/src/hooks/useQuickTile.js.map +1 -0
  91. package/build/src/hooks/useShortcuts.d.ts +25 -0
  92. package/build/src/hooks/useShortcuts.d.ts.map +1 -0
  93. package/build/src/hooks/useShortcuts.js +23 -0
  94. package/build/src/hooks/useShortcuts.js.map +1 -0
  95. package/build/src/hooks/useSpotlight.d.ts +23 -0
  96. package/build/src/hooks/useSpotlight.d.ts.map +1 -0
  97. package/build/src/hooks/useSpotlight.js +13 -0
  98. package/build/src/hooks/useSpotlight.js.map +1 -0
  99. package/build/src/hooks/useWidgetData.d.ts +20 -0
  100. package/build/src/hooks/useWidgetData.d.ts.map +1 -0
  101. package/build/src/hooks/useWidgetData.js +12 -0
  102. package/build/src/hooks/useWidgetData.js.map +1 -0
  103. package/build/src/index.d.ts +32 -0
  104. package/build/src/index.d.ts.map +1 -0
  105. package/build/src/index.js +27 -0
  106. package/build/src/index.js.map +1 -0
  107. package/build/src/module.d.ts +25 -0
  108. package/build/src/module.d.ts.map +1 -0
  109. package/build/src/module.js +102 -0
  110. package/build/src/module.js.map +1 -0
  111. package/build/src/types/index.d.ts +156 -0
  112. package/build/src/types/index.d.ts.map +1 -0
  113. package/build/src/types/index.js +4 -0
  114. package/build/src/types/index.js.map +1 -0
  115. package/build/src/utils/actionStore.d.ts +6 -0
  116. package/build/src/utils/actionStore.d.ts.map +1 -0
  117. package/build/src/utils/actionStore.js +32 -0
  118. package/build/src/utils/actionStore.js.map +1 -0
  119. package/build/src/utils/analytics.d.ts +12 -0
  120. package/build/src/utils/analytics.d.ts.map +1 -0
  121. package/build/src/utils/analytics.js +29 -0
  122. package/build/src/utils/analytics.js.map +1 -0
  123. package/build/src/utils/testing.d.ts +39 -0
  124. package/build/src/utils/testing.d.ts.map +1 -0
  125. package/build/src/utils/testing.js +58 -0
  126. package/build/src/utils/testing.js.map +1 -0
  127. package/build/src/utils/validation.d.ts +11 -0
  128. package/build/src/utils/validation.d.ts.map +1 -0
  129. package/build/src/utils/validation.js +128 -0
  130. package/build/src/utils/validation.js.map +1 -0
  131. package/expo-module.config.json +9 -0
  132. package/ios/Focus/FocusFilterManager.swift +19 -0
  133. package/ios/Intents/BaseInvokeIntent.swift +42 -0
  134. package/ios/Intents/HandoffManager.swift +49 -0
  135. package/ios/Intents/InvokeActionStore.swift +21 -0
  136. package/ios/Intents/InvokeParameterTypes.swift +142 -0
  137. package/ios/LiveActivity/LiveActivityIntentBridge.swift +44 -0
  138. package/ios/Module/ExpoInvokeModule.swift +170 -0
  139. package/ios/Notifications/NotificationActionHandler.swift +80 -0
  140. package/ios/Shortcuts/DonationManager.swift +44 -0
  141. package/ios/Shortcuts/ShortcutsManager.swift +32 -0
  142. package/ios/Shortcuts/SpotlightManager.swift +48 -0
  143. package/ios/Widget/WidgetManager.swift +19 -0
  144. package/package.json +111 -0
@@ -0,0 +1,25 @@
1
+ import { type EventSubscription } from 'expo-modules-core';
2
+ import type { ResolvedIntent, DonationInput, ShortcutDefinition, SpotlightItem, WidgetDataValue, InvokeConfig } from './types';
3
+ export declare function configure(config: InvokeConfig): void;
4
+ export declare function getInitialIntent(): ResolvedIntent | null;
5
+ export declare function addIntentListener(listener: (intent: ResolvedIntent) => void): EventSubscription;
6
+ export declare function donateAction(input: DonationInput): void;
7
+ export declare function deleteAction(intentId: string): void;
8
+ export declare function deleteAllActions(): void;
9
+ export declare function setDynamicShortcuts(shortcuts: ShortcutDefinition[]): void;
10
+ export declare function getDynamicShortcuts(): ShortcutDefinition[];
11
+ export declare function clearDynamicShortcuts(): void;
12
+ export declare function indexSpotlightItems(items: SpotlightItem[]): void;
13
+ export declare function deindexSpotlightItems(ids: string[]): void;
14
+ export declare function setWidgetData(key: string, value: WidgetDataValue | Record<string, WidgetDataValue>): void;
15
+ export declare function getWidgetData(key: string): WidgetDataValue | Record<string, WidgetDataValue> | null;
16
+ export type QuickTileState = 'active' | 'inactive' | 'unavailable';
17
+ export declare function updateQuickTile(state: QuickTileState, label: string): void;
18
+ export declare function advertiseHandoff(intentId: string, params?: Record<string, unknown>): void;
19
+ export declare function stopHandoff(): void;
20
+ export declare function setLiveActivityIntent(activityId: string, intentId: string): void;
21
+ export declare function addIntentToSiri(intentId: string): void;
22
+ /** Specific modes require iOS 16+ FocusFilterIntent integration. Without it, any active focus returns 'focused'. */
23
+ export type FocusMode = 'work' | 'personal' | 'sleep' | 'do_not_disturb' | 'driving' | 'focused' | null;
24
+ export declare function getFocusMode(): FocusMode;
25
+ //# sourceMappingURL=module.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../src/module.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,iBAAiB,EACvB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EACV,cAAc,EACd,aAAa,EACb,kBAAkB,EAClB,aAAa,EACb,eAAe,EACf,YAAY,EACb,MAAM,SAAS,CAAC;AA0CjB,wBAAgB,SAAS,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAEpD;AAID,wBAAgB,gBAAgB,IAAI,cAAc,GAAG,IAAI,CAIxD;AAED,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,IAAI,GACzC,iBAAiB,CAQnB;AAID,wBAAgB,YAAY,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAEvD;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAEnD;AAED,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC;AAID,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,kBAAkB,EAAE,GAAG,IAAI,CAEzE;AAED,wBAAgB,mBAAmB,IAAI,kBAAkB,EAAE,CAK1D;AAED,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C;AAID,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,IAAI,CAEhE;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,CAEzD;AAID,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GAAG,IAAI,CAEzG;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GAAG,IAAI,CAKnG;AAID,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,UAAU,GAAG,aAAa,CAAC;AAEnE,wBAAgB,eAAe,CAAC,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAE1E;AAID,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,IAAI,CAE7F;AAED,wBAAgB,WAAW,IAAI,IAAI,CAElC;AAID,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAEhF;AAID,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAEtD;AAID,oHAAoH;AACpH,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,UAAU,GAAG,OAAO,GAAG,gBAAgB,GAAG,SAAS,GAAG,SAAS,GAAG,IAAI,CAAC;AAExG,wBAAgB,YAAY,IAAI,SAAS,CAGxC"}
@@ -0,0 +1,102 @@
1
+ import { requireOptionalNativeModule, EventEmitter, } from 'expo-modules-core';
2
+ const NativeModule = requireOptionalNativeModule('ExpoInvoke');
3
+ const emitter = NativeModule
4
+ ? new EventEmitter(NativeModule)
5
+ : null;
6
+ // ─── Config ───────────────────────────────────────────────────────────────────
7
+ export function configure(config) {
8
+ NativeModule === null || NativeModule === void 0 ? void 0 : NativeModule.configure(JSON.stringify(config));
9
+ }
10
+ // ─── Core ─────────────────────────────────────────────────────────────────────
11
+ export function getInitialIntent() {
12
+ const raw = NativeModule === null || NativeModule === void 0 ? void 0 : NativeModule.getInitialIntent();
13
+ if (!raw)
14
+ return null;
15
+ try {
16
+ return typeof raw === 'string' ? JSON.parse(raw) : raw;
17
+ }
18
+ catch {
19
+ return null;
20
+ }
21
+ }
22
+ export function addIntentListener(listener) {
23
+ if (!emitter)
24
+ return { remove: () => { } };
25
+ return emitter.addListener('onIntent', (raw) => {
26
+ try {
27
+ const intent = typeof raw === 'string' ? JSON.parse(raw) : raw;
28
+ listener(intent);
29
+ }
30
+ catch { /* malformed — ignore */ }
31
+ });
32
+ }
33
+ // ─── Donations ────────────────────────────────────────────────────────────────
34
+ export function donateAction(input) {
35
+ NativeModule === null || NativeModule === void 0 ? void 0 : NativeModule.donateAction(JSON.stringify(input));
36
+ }
37
+ export function deleteAction(intentId) {
38
+ NativeModule === null || NativeModule === void 0 ? void 0 : NativeModule.deleteAction(intentId);
39
+ }
40
+ export function deleteAllActions() {
41
+ NativeModule === null || NativeModule === void 0 ? void 0 : NativeModule.deleteAllActions();
42
+ }
43
+ // ─── Dynamic shortcuts ────────────────────────────────────────────────────────
44
+ export function setDynamicShortcuts(shortcuts) {
45
+ NativeModule === null || NativeModule === void 0 ? void 0 : NativeModule.setDynamicShortcuts(JSON.stringify(shortcuts));
46
+ }
47
+ export function getDynamicShortcuts() {
48
+ try {
49
+ const raw = NativeModule === null || NativeModule === void 0 ? void 0 : NativeModule.getDynamicShortcuts();
50
+ return raw ? JSON.parse(raw) : [];
51
+ }
52
+ catch {
53
+ return [];
54
+ }
55
+ }
56
+ export function clearDynamicShortcuts() {
57
+ NativeModule === null || NativeModule === void 0 ? void 0 : NativeModule.clearDynamicShortcuts();
58
+ }
59
+ // ─── Spotlight ────────────────────────────────────────────────────────────────
60
+ export function indexSpotlightItems(items) {
61
+ NativeModule === null || NativeModule === void 0 ? void 0 : NativeModule.indexSpotlightItems(JSON.stringify(items));
62
+ }
63
+ export function deindexSpotlightItems(ids) {
64
+ NativeModule === null || NativeModule === void 0 ? void 0 : NativeModule.deindexSpotlightItems(ids);
65
+ }
66
+ // ─── Widget data ──────────────────────────────────────────────────────────────
67
+ export function setWidgetData(key, value) {
68
+ NativeModule === null || NativeModule === void 0 ? void 0 : NativeModule.setWidgetData(key, JSON.stringify(value));
69
+ }
70
+ export function getWidgetData(key) {
71
+ try {
72
+ const raw = NativeModule === null || NativeModule === void 0 ? void 0 : NativeModule.getWidgetData(key);
73
+ return raw ? JSON.parse(raw) : null;
74
+ }
75
+ catch {
76
+ return null;
77
+ }
78
+ }
79
+ export function updateQuickTile(state, label) {
80
+ NativeModule === null || NativeModule === void 0 ? void 0 : NativeModule.updateQuickTile(state, label);
81
+ }
82
+ // ─── Handoff (iOS) ────────────────────────────────────────────────────────────
83
+ export function advertiseHandoff(intentId, params = {}) {
84
+ NativeModule === null || NativeModule === void 0 ? void 0 : NativeModule.advertiseHandoff(intentId, JSON.stringify(params));
85
+ }
86
+ export function stopHandoff() {
87
+ NativeModule === null || NativeModule === void 0 ? void 0 : NativeModule.stopHandoff();
88
+ }
89
+ // ─── Live Activity intent (iOS) ───────────────────────────────────────────────
90
+ export function setLiveActivityIntent(activityId, intentId) {
91
+ NativeModule === null || NativeModule === void 0 ? void 0 : NativeModule.setLiveActivityIntent(activityId, intentId);
92
+ }
93
+ // ─── Add to Siri (iOS) ────────────────────────────────────────────────────────
94
+ export function addIntentToSiri(intentId) {
95
+ NativeModule === null || NativeModule === void 0 ? void 0 : NativeModule.addIntentToSiri(intentId);
96
+ }
97
+ export function getFocusMode() {
98
+ var _a;
99
+ const raw = NativeModule === null || NativeModule === void 0 ? void 0 : NativeModule.getFocusMode();
100
+ return (_a = raw) !== null && _a !== void 0 ? _a : null;
101
+ }
102
+ //# sourceMappingURL=module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module.js","sourceRoot":"","sources":["../../src/module.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,156 @@
1
+ export type InvokeSource = 'siri' | 'google' | 'shortcut' | 'widget' | 'live_activity' | 'notification' | 'notification_tap' | 'nfc' | 'qr' | 'deep_link' | 'spotlight' | 'share' | 'carplay' | 'android_auto' | 'watch' | 'control_center' | 'quick_tile' | 'automation' | 'handoff' | 'unknown';
2
+ export interface LocationParameter {
3
+ latitude: number;
4
+ longitude: number;
5
+ /** Resolved place name, e.g. "Accra Mall, East Legon" */
6
+ name?: string;
7
+ }
8
+ export interface PersonParameter {
9
+ displayName?: string;
10
+ phoneNumber?: string;
11
+ emailAddress?: string;
12
+ contactIdentifier?: string;
13
+ }
14
+ export interface EnumOption {
15
+ id: string;
16
+ title: string;
17
+ subtitle?: string;
18
+ icon?: string;
19
+ }
20
+ export type ParameterType = {
21
+ type: 'text';
22
+ placeholder?: string;
23
+ } | {
24
+ type: 'location';
25
+ } | {
26
+ type: 'number';
27
+ min?: number;
28
+ max?: number;
29
+ unit?: string;
30
+ } | {
31
+ type: 'enum';
32
+ options: EnumOption[];
33
+ } | {
34
+ type: 'date';
35
+ } | {
36
+ type: 'boolean';
37
+ } | {
38
+ type: 'array';
39
+ itemType: 'text' | 'location' | 'number';
40
+ } | {
41
+ type: 'person';
42
+ };
43
+ export type IntentParameter = ParameterType & {
44
+ /** Key used in parameters map */
45
+ name: string;
46
+ /** Shown to Siri / Google when asking user */
47
+ title: string;
48
+ optional?: boolean;
49
+ };
50
+ export type ParameterValue = string | number | boolean | LocationParameter | PersonParameter | string[] | number[] | LocationParameter[] | null;
51
+ export interface IntentDefinition {
52
+ /** Stable identifier — used everywhere */
53
+ id: string;
54
+ title: string;
55
+ description?: string;
56
+ /** Siri / Google voice phrases. Use ${applicationName} for app name. */
57
+ phrases: string[];
58
+ /** Short label for menus and shortcuts chips */
59
+ shortTitle?: string;
60
+ /** SF Symbol (iOS) / Material icon name (Android) */
61
+ icon?: string;
62
+ parameters?: IntentParameter[];
63
+ /** Ask user to confirm before running */
64
+ requiresConfirmation?: boolean;
65
+ /** Text Siri reads aloud after running. Use ${paramName} for substitution. */
66
+ spokenResponse?: string;
67
+ /** Open the app when this intent fires (default: true) */
68
+ openAppWhenRun?: boolean;
69
+ /** CarPlay/Android Auto support */
70
+ supportsCarPlay?: boolean;
71
+ /** watchOS/Wear OS companion support */
72
+ supportsWatch?: boolean;
73
+ /** Control Center tile support (iOS 18+) */
74
+ supportsControlCenter?: boolean;
75
+ /** Android Quick Settings tile */
76
+ supportsQuickTile?: boolean;
77
+ /** Deep link URL patterns that map to this intent */
78
+ deepLinkPatterns?: string[];
79
+ /** Which Live Activity tapping this intent fires */
80
+ liveActivityIntent?: string;
81
+ /** Intent TTL in seconds (default: 30) */
82
+ ttl?: number;
83
+ }
84
+ export interface WidgetAction {
85
+ label: string;
86
+ intentId: string;
87
+ icon?: string;
88
+ }
89
+ export type WidgetSize = 'small' | 'medium' | 'large' | 'extraLarge' | 'accessory';
90
+ export interface WidgetDefinition {
91
+ id: string;
92
+ title: string;
93
+ description?: string;
94
+ sizes: WidgetSize[];
95
+ actions: WidgetAction[];
96
+ /** Background color (hex) */
97
+ backgroundColor?: string;
98
+ }
99
+ export interface NotificationActionDefinition {
100
+ id: string;
101
+ title: string;
102
+ intentId: string;
103
+ /** Show destructive (red) style — for Cancel, Delete, etc. */
104
+ destructive?: boolean;
105
+ /** Keep notification visible after tapping */
106
+ foreground?: boolean;
107
+ }
108
+ export interface NotificationCategoryDefinition {
109
+ categoryId: string;
110
+ actions: NotificationActionDefinition[];
111
+ /** Intent fired when user taps the notification body (not a button) */
112
+ tapIntent?: string;
113
+ }
114
+ export interface ResolvedIntent {
115
+ intentId: string;
116
+ source: InvokeSource;
117
+ timestamp: number;
118
+ parameters: Record<string, ParameterValue>;
119
+ /** Raw deep link URL if source === 'deep_link' | 'nfc' | 'qr' */
120
+ rawUrl?: string;
121
+ }
122
+ export interface DonationInput {
123
+ intentId: string;
124
+ parameters?: Record<string, ParameterValue>;
125
+ title?: string;
126
+ phrase?: string;
127
+ }
128
+ export interface ShortcutDefinition {
129
+ id: string;
130
+ title: string;
131
+ subtitle?: string;
132
+ icon?: string;
133
+ intentId: string;
134
+ parameters?: Record<string, ParameterValue>;
135
+ }
136
+ export interface SpotlightItem {
137
+ /** Unique identifier for this content item */
138
+ id: string;
139
+ title: string;
140
+ description?: string;
141
+ thumbnailUrl?: string;
142
+ /** Intent to fire when this item is tapped in Spotlight */
143
+ intentId?: string;
144
+ intentParameters?: Record<string, ParameterValue>;
145
+ keywords?: string[];
146
+ }
147
+ export type WidgetDataValue = string | number | boolean | null;
148
+ export interface InvokeConfig {
149
+ intents: IntentDefinition[];
150
+ widgets?: WidgetDefinition[];
151
+ notificationActions?: NotificationCategoryDefinition[];
152
+ /** Remote URL to fetch intent definitions — enables OTA updates */
153
+ remoteConfigUrl?: string;
154
+ /** Log level for debugging */
155
+ logLevel?: 'none' | 'error' | 'warn' | 'debug';
156
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,YAAY,GACpB,MAAM,GACN,QAAQ,GACR,UAAU,GACV,QAAQ,GACR,eAAe,GACf,cAAc,GACd,kBAAkB,GAClB,KAAK,GACL,IAAI,GACJ,WAAW,GACX,WAAW,GACX,OAAO,GACP,SAAS,GACT,cAAc,GACd,OAAO,GACP,gBAAgB,GAChB,YAAY,GACZ,YAAY,GACZ,SAAS,GACT,SAAS,CAAC;AAId,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,yDAAyD;IACzD,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,aAAa,GACrB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,GACtC;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,GACpB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAC7D;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,UAAU,EAAE,CAAA;CAAE,GACvC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,GAAG,QAAQ,CAAA;CAAE,GAC3D;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC;AAEvB,MAAM,MAAM,eAAe,GAAG,aAAa,GAAG;IAC5C,iCAAiC;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,8CAA8C;IAC9C,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,cAAc,GACtB,MAAM,GACN,MAAM,GACN,OAAO,GACP,iBAAiB,GACjB,eAAe,GACf,MAAM,EAAE,GACR,MAAM,EAAE,GACR,iBAAiB,EAAE,GACnB,IAAI,CAAC;AAIT,MAAM,WAAW,gBAAgB;IAC/B,0CAA0C;IAC1C,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wEAAwE;IACxE,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,gDAAgD;IAChD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qDAAqD;IACrD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,eAAe,EAAE,CAAC;IAC/B,yCAAyC;IACzC,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,8EAA8E;IAC9E,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,0DAA0D;IAC1D,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,mCAAmC;IACnC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,wCAAwC;IACxC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,4CAA4C;IAC5C,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,kCAAkC;IAClC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,qDAAqD;IACrD,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,oDAAoD;IACpD,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,0CAA0C;IAC1C,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAID,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,YAAY,GAAG,WAAW,CAAC;AAEnF,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,6BAA6B;IAC7B,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAID,MAAM,WAAW,4BAA4B;IAC3C,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,8DAA8D;IAC9D,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,8CAA8C;IAC9C,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,8BAA8B;IAC7C,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,4BAA4B,EAAE,CAAC;IACxC,uEAAuE;IACvE,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAID,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,YAAY,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAC3C,iEAAiE;IACjE,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAID,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAID,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;CAC7C;AAID,MAAM,WAAW,aAAa;IAC5B,8CAA8C;IAC9C,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAClD,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAID,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;AAI/D,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B,OAAO,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC7B,mBAAmB,CAAC,EAAE,8BAA8B,EAAE,CAAC;IACvD,mEAAmE;IACnE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC;CAChD"}
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ // ─── Surfaces ─────────────────────────────────────────────────────────────────
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":";AAAA,iFAAiF"}
@@ -0,0 +1,6 @@
1
+ import type { ResolvedIntent } from '../types';
2
+ export declare function storePendingIntent(intent: ResolvedIntent): void;
3
+ export declare function consumePendingIntent(): ResolvedIntent | null;
4
+ export declare function peekPendingIntent(): ResolvedIntent | null;
5
+ export declare function clearPendingIntent(): void;
6
+ //# sourceMappingURL=actionStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actionStore.d.ts","sourceRoot":"","sources":["../../../src/utils/actionStore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAY/C,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,CAK/D;AAED,wBAAgB,oBAAoB,IAAI,cAAc,GAAG,IAAI,CAU5D;AAED,wBAAgB,iBAAiB,IAAI,cAAc,GAAG,IAAI,CAEzD;AAED,wBAAgB,kBAAkB,IAAI,IAAI,CAEzC"}
@@ -0,0 +1,32 @@
1
+ const DEFAULT_TTL_MS = 30000;
2
+ let _pending = null;
3
+ const _listeners = [];
4
+ export function storePendingIntent(intent) {
5
+ _pending = intent;
6
+ for (const listener of _listeners) {
7
+ try {
8
+ listener(intent);
9
+ }
10
+ catch { /* ignore */ }
11
+ }
12
+ }
13
+ export function consumePendingIntent() {
14
+ var _a;
15
+ if (!_pending)
16
+ return null;
17
+ const ttl = (_a = _pending._ttlMs) !== null && _a !== void 0 ? _a : DEFAULT_TTL_MS;
18
+ if (Date.now() - _pending.timestamp > ttl) {
19
+ _pending = null;
20
+ return null;
21
+ }
22
+ const intent = _pending;
23
+ _pending = null;
24
+ return intent;
25
+ }
26
+ export function peekPendingIntent() {
27
+ return _pending;
28
+ }
29
+ export function clearPendingIntent() {
30
+ _pending = null;
31
+ }
32
+ //# sourceMappingURL=actionStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actionStore.js","sourceRoot":"","sources":["../../../src/utils/actionStore.ts"],"names":[],"mappings":"AAEA,MAAM,cAAc,GAAG,KAAM,CAAC;AAO9B,IAAI,QAAQ,GAAwB,IAAI,CAAC;AACzC,MAAM,UAAU,GAA4C,EAAE,CAAC;AAE/D,MAAM,UAAU,kBAAkB,CAAC,MAAsB;IACvD,QAAQ,GAAG,MAAM,CAAC;IAClB,KAAK,MAAM,QAAQ,IAAI,UAAU,EAAE,CAAC;QAClC,IAAI,CAAC;YAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IAClD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB;;IAClC,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3B,MAAM,GAAG,GAAG,MAAA,QAAQ,CAAC,MAAM,mCAAI,cAAc,CAAC;IAC9C,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC,SAAS,GAAG,GAAG,EAAE,CAAC;QAC1C,QAAQ,GAAG,IAAI,CAAC;QAChB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,MAAM,GAAmB,QAAQ,CAAC;IACxC,QAAQ,GAAG,IAAI,CAAC;IAChB,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,QAAQ,GAAG,IAAI,CAAC;AAClB,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { ResolvedIntent, InvokeSource } from '../types';
2
+ interface AnalyticsRecord {
3
+ fired: Record<string, number>;
4
+ donated: Record<string, number>;
5
+ bySource: Partial<Record<InvokeSource, number>>;
6
+ }
7
+ export declare function trackFired(intent: ResolvedIntent): void;
8
+ export declare function trackDonated(intentId: string): void;
9
+ export declare function getAnalytics(): Readonly<AnalyticsRecord>;
10
+ export declare function onIntentFired(listener: (intent: ResolvedIntent) => void): () => void;
11
+ export {};
12
+ //# sourceMappingURL=analytics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics.d.ts","sourceRoot":"","sources":["../../../src/utils/analytics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAE7D,UAAU,eAAe;IACvB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC;CACjD;AAKD,wBAAgB,UAAU,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,CAMvD;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAEnD;AAED,wBAAgB,YAAY,IAAI,QAAQ,CAAC,eAAe,CAAC,CAExD;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,IAAI,GAAG,MAAM,IAAI,CAMpF"}
@@ -0,0 +1,29 @@
1
+ const _record = { fired: {}, donated: {}, bySource: {} };
2
+ const _globalListeners = [];
3
+ export function trackFired(intent) {
4
+ var _a, _b;
5
+ _record.fired[intent.intentId] = ((_a = _record.fired[intent.intentId]) !== null && _a !== void 0 ? _a : 0) + 1;
6
+ _record.bySource[intent.source] = ((_b = _record.bySource[intent.source]) !== null && _b !== void 0 ? _b : 0) + 1;
7
+ for (const l of _globalListeners) {
8
+ try {
9
+ l(intent);
10
+ }
11
+ catch { /* ignore */ }
12
+ }
13
+ }
14
+ export function trackDonated(intentId) {
15
+ var _a;
16
+ _record.donated[intentId] = ((_a = _record.donated[intentId]) !== null && _a !== void 0 ? _a : 0) + 1;
17
+ }
18
+ export function getAnalytics() {
19
+ return _record;
20
+ }
21
+ export function onIntentFired(listener) {
22
+ _globalListeners.push(listener);
23
+ return () => {
24
+ const idx = _globalListeners.indexOf(listener);
25
+ if (idx !== -1)
26
+ _globalListeners.splice(idx, 1);
27
+ };
28
+ }
29
+ //# sourceMappingURL=analytics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics.js","sourceRoot":"","sources":["../../../src/utils/analytics.ts"],"names":[],"mappings":"AAQA,MAAM,OAAO,GAAoB,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;AAC1E,MAAM,gBAAgB,GAA4C,EAAE,CAAC;AAErE,MAAM,UAAU,UAAU,CAAC,MAAsB;;IAC/C,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAA,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,mCAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IAC3E,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,MAAA,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,mCAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IAC7E,KAAK,MAAM,CAAC,IAAI,gBAAgB,EAAE,CAAC;QACjC,IAAI,CAAC;YAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IAC3C,CAAC;AACH,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,QAAgB;;IAC3C,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAA,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,mCAAI,CAAC,CAAC,GAAG,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,QAA0C;IACtE,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAChC,OAAO,GAAG,EAAE;QACV,MAAM,GAAG,GAAG,gBAAgB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC/C,IAAI,GAAG,KAAK,CAAC,CAAC;YAAE,gBAAgB,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IAClD,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,39 @@
1
+ import type { ResolvedIntent, InvokeSource, ParameterValue } from '../types';
2
+ /**
3
+ * Simulate an intent firing in tests.
4
+ * Feeds directly into the actionStore so useInvoke() picks it up.
5
+ *
6
+ * @example
7
+ * mockInvoke({ intentId: 'create_errand', source: 'siri' });
8
+ * // useInvoke() will fire on next render
9
+ */
10
+ export declare function mockInvoke(input: {
11
+ intentId: string;
12
+ source?: InvokeSource;
13
+ parameters?: Record<string, ParameterValue>;
14
+ rawUrl?: string;
15
+ }): ResolvedIntent;
16
+ /**
17
+ * Simulate a cold start (app was closed, intent was stored before JS loaded).
18
+ * Sets a slightly past timestamp to pass TTL checks.
19
+ */
20
+ export declare function simulateColdStart(input: {
21
+ intentId: string;
22
+ source?: InvokeSource;
23
+ parameters?: Record<string, ParameterValue>;
24
+ ageMs?: number;
25
+ }): ResolvedIntent;
26
+ /**
27
+ * Simulate a warm start (app was backgrounded, intent fired while running).
28
+ * Dispatches via the event emitter path.
29
+ */
30
+ export declare function simulateWarmStart(input: {
31
+ intentId: string;
32
+ source?: InvokeSource;
33
+ parameters?: Record<string, ParameterValue>;
34
+ }): ResolvedIntent;
35
+ /**
36
+ * Create a typed mock intent object for assertions.
37
+ */
38
+ export declare function createMockIntent(input: Partial<ResolvedIntent>): ResolvedIntent;
39
+ //# sourceMappingURL=testing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../../../src/utils/testing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAG7E;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,cAAc,CAUjB;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE;IACvC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,cAAc,CASjB;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE;IACvC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;CAC7C,GAAG,cAAc,CAEjB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,cAAc,CAQ/E"}
@@ -0,0 +1,58 @@
1
+ import { storePendingIntent } from './actionStore';
2
+ /**
3
+ * Simulate an intent firing in tests.
4
+ * Feeds directly into the actionStore so useInvoke() picks it up.
5
+ *
6
+ * @example
7
+ * mockInvoke({ intentId: 'create_errand', source: 'siri' });
8
+ * // useInvoke() will fire on next render
9
+ */
10
+ export function mockInvoke(input) {
11
+ var _a, _b;
12
+ const intent = {
13
+ intentId: input.intentId,
14
+ source: (_a = input.source) !== null && _a !== void 0 ? _a : 'siri',
15
+ timestamp: Date.now(),
16
+ parameters: (_b = input.parameters) !== null && _b !== void 0 ? _b : {},
17
+ rawUrl: input.rawUrl,
18
+ };
19
+ storePendingIntent(intent);
20
+ return intent;
21
+ }
22
+ /**
23
+ * Simulate a cold start (app was closed, intent was stored before JS loaded).
24
+ * Sets a slightly past timestamp to pass TTL checks.
25
+ */
26
+ export function simulateColdStart(input) {
27
+ var _a, _b, _c;
28
+ const intent = {
29
+ intentId: input.intentId,
30
+ source: (_a = input.source) !== null && _a !== void 0 ? _a : 'siri',
31
+ timestamp: Date.now() - ((_b = input.ageMs) !== null && _b !== void 0 ? _b : 100),
32
+ parameters: (_c = input.parameters) !== null && _c !== void 0 ? _c : {},
33
+ };
34
+ storePendingIntent(intent);
35
+ return intent;
36
+ }
37
+ /**
38
+ * Simulate a warm start (app was backgrounded, intent fired while running).
39
+ * Dispatches via the event emitter path.
40
+ */
41
+ export function simulateWarmStart(input) {
42
+ var _a;
43
+ return mockInvoke({ ...input, source: (_a = input.source) !== null && _a !== void 0 ? _a : 'siri' });
44
+ }
45
+ /**
46
+ * Create a typed mock intent object for assertions.
47
+ */
48
+ export function createMockIntent(input) {
49
+ var _a, _b, _c, _d;
50
+ return {
51
+ intentId: (_a = input.intentId) !== null && _a !== void 0 ? _a : 'mock_intent',
52
+ source: (_b = input.source) !== null && _b !== void 0 ? _b : 'siri',
53
+ timestamp: (_c = input.timestamp) !== null && _c !== void 0 ? _c : Date.now(),
54
+ parameters: (_d = input.parameters) !== null && _d !== void 0 ? _d : {},
55
+ rawUrl: input.rawUrl,
56
+ };
57
+ }
58
+ //# sourceMappingURL=testing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testing.js","sourceRoot":"","sources":["../../../src/utils/testing.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEnD;;;;;;;GAOG;AACH,MAAM,UAAU,UAAU,CAAC,KAK1B;;IACC,MAAM,MAAM,GAAmB;QAC7B,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,MAAM,EAAE,MAAA,KAAK,CAAC,MAAM,mCAAI,MAAM;QAC9B,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,UAAU,EAAE,MAAA,KAAK,CAAC,UAAU,mCAAI,EAAE;QAClC,MAAM,EAAE,KAAK,CAAC,MAAM;KACrB,CAAC;IACF,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC3B,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAKjC;;IACC,MAAM,MAAM,GAAmB;QAC7B,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,MAAM,EAAE,MAAA,KAAK,CAAC,MAAM,mCAAI,MAAM;QAC9B,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,MAAA,KAAK,CAAC,KAAK,mCAAI,GAAG,CAAC;QAC5C,UAAU,EAAE,MAAA,KAAK,CAAC,UAAU,mCAAI,EAAE;KACnC,CAAC;IACF,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC3B,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAIjC;;IACC,OAAO,UAAU,CAAC,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,MAAA,KAAK,CAAC,MAAM,mCAAI,MAAM,EAAE,CAAC,CAAC;AAClE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAA8B;;IAC7D,OAAO;QACL,QAAQ,EAAE,MAAA,KAAK,CAAC,QAAQ,mCAAI,aAAa;QACzC,MAAM,EAAE,MAAA,KAAK,CAAC,MAAM,mCAAI,MAAM;QAC9B,SAAS,EAAE,MAAA,KAAK,CAAC,SAAS,mCAAI,IAAI,CAAC,GAAG,EAAE;QACxC,UAAU,EAAE,MAAA,KAAK,CAAC,UAAU,mCAAI,EAAE;QAClC,MAAM,EAAE,KAAK,CAAC,MAAM;KACrB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { InvokeConfig } from '../types';
2
+ export interface ValidationError {
3
+ field: string;
4
+ message: string;
5
+ }
6
+ export interface ValidationResult {
7
+ valid: boolean;
8
+ errors: ValidationError[];
9
+ warnings: ValidationError[];
10
+ }
11
+ export declare function validateConfig(config: InvokeConfig): ValidationResult;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../src/utils/validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAoB,MAAM,UAAU,CAAC;AAE/D,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,QAAQ,EAAE,eAAe,EAAE,CAAC;CAC7B;AAgFD,wBAAgB,cAAc,CAAC,MAAM,EAAE,YAAY,GAAG,gBAAgB,CA0DrE"}