@iann29/rastro 0.10.9 → 0.11.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 (180) hide show
  1. package/README.md +8 -0
  2. package/agent/integration.md +45 -0
  3. package/agent/manifest.json +4 -4
  4. package/dist/client/federation.d.ts +82 -9
  5. package/dist/client/federation.d.ts.map +1 -1
  6. package/dist/client/federation.js +40 -2
  7. package/dist/client/federation.js.map +1 -1
  8. package/dist/client/index.d.ts +465 -8
  9. package/dist/client/index.d.ts.map +1 -1
  10. package/dist/client/index.js +259 -7
  11. package/dist/client/index.js.map +1 -1
  12. package/dist/component/_generated/api.d.ts +10 -0
  13. package/dist/component/_generated/api.d.ts.map +1 -1
  14. package/dist/component/_generated/api.js.map +1 -1
  15. package/dist/component/_generated/component.d.ts +274 -21
  16. package/dist/component/_generated/component.d.ts.map +1 -1
  17. package/dist/component/_generated/server.d.ts +2 -0
  18. package/dist/component/_generated/server.d.ts.map +1 -1
  19. package/dist/component/_generated/server.js.map +1 -1
  20. package/dist/component/constants.d.ts +31 -0
  21. package/dist/component/constants.d.ts.map +1 -1
  22. package/dist/component/constants.js +31 -0
  23. package/dist/component/constants.js.map +1 -1
  24. package/dist/component/convex.config.d.ts +2 -0
  25. package/dist/component/convex.config.js +7 -0
  26. package/dist/component/convex.config.js.map +1 -1
  27. package/dist/component/errors.d.ts +1 -1
  28. package/dist/component/errors.d.ts.map +1 -1
  29. package/dist/component/errors.js.map +1 -1
  30. package/dist/component/http.d.ts.map +1 -1
  31. package/dist/component/http.js +64 -0
  32. package/dist/component/http.js.map +1 -1
  33. package/dist/component/leadAdsValidators.d.ts +1106 -0
  34. package/dist/component/leadAdsValidators.d.ts.map +1 -0
  35. package/dist/component/leadAdsValidators.js +311 -0
  36. package/dist/component/leadAdsValidators.js.map +1 -0
  37. package/dist/component/leadFormRules.d.ts +60 -0
  38. package/dist/component/leadFormRules.d.ts.map +1 -0
  39. package/dist/component/leadFormRules.js +140 -0
  40. package/dist/component/leadFormRules.js.map +1 -0
  41. package/dist/component/leadFormStore.d.ts +16 -0
  42. package/dist/component/leadFormStore.d.ts.map +1 -0
  43. package/dist/component/leadFormStore.js +92 -0
  44. package/dist/component/leadFormStore.js.map +1 -0
  45. package/dist/component/leadgenToken.d.ts +56 -0
  46. package/dist/component/leadgenToken.d.ts.map +1 -0
  47. package/dist/component/leadgenToken.js +262 -0
  48. package/dist/component/leadgenToken.js.map +1 -0
  49. package/dist/component/leads.d.ts +76 -7
  50. package/dist/component/leads.d.ts.map +1 -1
  51. package/dist/component/leads.js +112 -78
  52. package/dist/component/leads.js.map +1 -1
  53. package/dist/component/meta.d.ts.map +1 -1
  54. package/dist/component/meta.js +21 -1
  55. package/dist/component/meta.js.map +1 -1
  56. package/dist/component/metaFake.d.ts +44 -0
  57. package/dist/component/metaFake.d.ts.map +1 -1
  58. package/dist/component/metaFake.js +400 -1
  59. package/dist/component/metaFake.js.map +1 -1
  60. package/dist/component/metaGraph.d.ts +91 -0
  61. package/dist/component/metaGraph.d.ts.map +1 -1
  62. package/dist/component/metaGraph.js +217 -0
  63. package/dist/component/metaGraph.js.map +1 -1
  64. package/dist/component/metaLeads.d.ts +683 -0
  65. package/dist/component/metaLeads.d.ts.map +1 -0
  66. package/dist/component/metaLeads.js +2639 -0
  67. package/dist/component/metaLeads.js.map +1 -0
  68. package/dist/component/schema.d.ts +420 -5
  69. package/dist/component/schema.d.ts.map +1 -1
  70. package/dist/component/schema.js +176 -1
  71. package/dist/component/schema.js.map +1 -1
  72. package/dist/component/validators.d.ts +235 -11
  73. package/dist/component/validators.d.ts.map +1 -1
  74. package/dist/component/validators.js +14 -1
  75. package/dist/component/validators.js.map +1 -1
  76. package/dist/tracker/generated.d.ts +5 -5
  77. package/dist/tracker/generated.d.ts.map +1 -1
  78. package/dist/tracker/generated.js +5 -5
  79. package/dist/tracker/generated.js.map +1 -1
  80. package/dist/ui/campaigns/CampaignsView.d.ts +5 -1
  81. package/dist/ui/campaigns/CampaignsView.d.ts.map +1 -1
  82. package/dist/ui/campaigns/CampaignsView.js.map +1 -1
  83. package/dist/ui/campaigns/Drawer.d.ts.map +1 -1
  84. package/dist/ui/campaigns/Drawer.js +8 -26
  85. package/dist/ui/campaigns/Drawer.js.map +1 -1
  86. package/dist/ui/campaigns/labels.d.ts +29 -1
  87. package/dist/ui/campaigns/labels.d.ts.map +1 -1
  88. package/dist/ui/campaigns/labels.js +77 -2
  89. package/dist/ui/campaigns/labels.js.map +1 -1
  90. package/dist/ui/campaigns/model.js +2 -2
  91. package/dist/ui/campaigns/model.js.map +1 -1
  92. package/dist/ui/forms/FirstContact.d.ts +19 -0
  93. package/dist/ui/forms/FirstContact.d.ts.map +1 -0
  94. package/dist/ui/forms/FirstContact.js +81 -0
  95. package/dist/ui/forms/FirstContact.js.map +1 -0
  96. package/dist/ui/forms/FormLead.d.ts +28 -0
  97. package/dist/ui/forms/FormLead.d.ts.map +1 -0
  98. package/dist/ui/forms/FormLead.js +199 -0
  99. package/dist/ui/forms/FormLead.js.map +1 -0
  100. package/dist/ui/forms/FormRulesDrawer.d.ts +49 -0
  101. package/dist/ui/forms/FormRulesDrawer.d.ts.map +1 -0
  102. package/dist/ui/forms/FormRulesDrawer.js +149 -0
  103. package/dist/ui/forms/FormRulesDrawer.js.map +1 -0
  104. package/dist/ui/forms/FormsView.d.ts +10 -0
  105. package/dist/ui/forms/FormsView.d.ts.map +1 -0
  106. package/dist/ui/forms/FormsView.js +227 -0
  107. package/dist/ui/forms/FormsView.js.map +1 -0
  108. package/dist/ui/forms/Icons.d.ts +46 -0
  109. package/dist/ui/forms/Icons.d.ts.map +1 -0
  110. package/dist/ui/forms/Icons.js +45 -0
  111. package/dist/ui/forms/Icons.js.map +1 -0
  112. package/dist/ui/forms/RuleRow.d.ts +37 -0
  113. package/dist/ui/forms/RuleRow.d.ts.map +1 -0
  114. package/dist/ui/forms/RuleRow.js +80 -0
  115. package/dist/ui/forms/RuleRow.js.map +1 -0
  116. package/dist/ui/forms/WhatsAppButtonGuide.d.ts +33 -0
  117. package/dist/ui/forms/WhatsAppButtonGuide.d.ts.map +1 -0
  118. package/dist/ui/forms/WhatsAppButtonGuide.js +90 -0
  119. package/dist/ui/forms/WhatsAppButtonGuide.js.map +1 -0
  120. package/dist/ui/forms/index.d.ts +11 -0
  121. package/dist/ui/forms/index.d.ts.map +1 -0
  122. package/dist/ui/forms/index.js +7 -0
  123. package/dist/ui/forms/index.js.map +1 -0
  124. package/dist/ui/forms/journey.d.ts +19 -0
  125. package/dist/ui/forms/journey.d.ts.map +1 -0
  126. package/dist/ui/forms/journey.js +54 -0
  127. package/dist/ui/forms/journey.js.map +1 -0
  128. package/dist/ui/forms/model.d.ts +243 -0
  129. package/dist/ui/forms/model.d.ts.map +1 -0
  130. package/dist/ui/forms/model.js +564 -0
  131. package/dist/ui/forms/model.js.map +1 -0
  132. package/dist/ui/forms/sample.d.ts +36 -0
  133. package/dist/ui/forms/sample.d.ts.map +1 -0
  134. package/dist/ui/forms/sample.js +448 -0
  135. package/dist/ui/forms/sample.js.map +1 -0
  136. package/dist/ui/forms/types.d.ts +472 -0
  137. package/dist/ui/forms/types.d.ts.map +1 -0
  138. package/dist/ui/forms/types.js +2 -0
  139. package/dist/ui/forms/types.js.map +1 -0
  140. package/dist/ui/index.d.ts +2 -0
  141. package/dist/ui/index.d.ts.map +1 -1
  142. package/dist/ui/index.js +4 -0
  143. package/dist/ui/index.js.map +1 -1
  144. package/dist/ui/integrations/Overlay.d.ts +3 -1
  145. package/dist/ui/integrations/Overlay.d.ts.map +1 -1
  146. package/dist/ui/integrations/Overlay.js +2 -2
  147. package/dist/ui/integrations/Overlay.js.map +1 -1
  148. package/dist/ui/portfolio/PortfolioView.d.ts +4 -1
  149. package/dist/ui/portfolio/PortfolioView.d.ts.map +1 -1
  150. package/dist/ui/portfolio/PortfolioView.js.map +1 -1
  151. package/dist/ui/sample.d.ts +3 -1
  152. package/dist/ui/sample.d.ts.map +1 -1
  153. package/dist/ui/sample.js +2 -0
  154. package/dist/ui/sample.js.map +1 -1
  155. package/dist/ui/seed.d.ts +1 -1
  156. package/dist/ui/ui.css +2305 -0
  157. package/docs/federation.md +19 -0
  158. package/docs/meta-ads.md +723 -7
  159. package/docs/upgrading.md +70 -0
  160. package/llms.txt +1 -0
  161. package/package.json +1 -1
  162. package/src/component/_generated/api.ts +10 -0
  163. package/src/component/_generated/component.ts +290 -20
  164. package/src/component/_generated/server.ts +2 -0
  165. package/src/component/constants.ts +33 -0
  166. package/src/component/convex.config.ts +7 -0
  167. package/src/component/errors.ts +3 -1
  168. package/src/component/http.ts +75 -0
  169. package/src/component/leadAdsValidators.ts +376 -0
  170. package/src/component/leadFormRules.ts +202 -0
  171. package/src/component/leadFormStore.ts +129 -0
  172. package/src/component/leadgenToken.ts +348 -0
  173. package/src/component/leads.ts +136 -84
  174. package/src/component/meta.ts +21 -1
  175. package/src/component/metaFake.ts +485 -1
  176. package/src/component/metaGraph.ts +327 -0
  177. package/src/component/metaLeads.ts +3111 -0
  178. package/src/component/schema.ts +197 -1
  179. package/src/component/validators.ts +17 -1
  180. package/src/tracker/generated.ts +5 -5
@@ -0,0 +1,1106 @@
1
+ import { type Infer } from "convex/values";
2
+ /** One option of a choice question, as Meta lists it. */
3
+ export declare const metaFormOptionValidator: import("convex/values").VObject<{
4
+ key: string;
5
+ value: string;
6
+ }, {
7
+ key: import("convex/values").VString<string, "required">;
8
+ value: import("convex/values").VString<string, "required">;
9
+ }, "required", "key" | "value">;
10
+ /** One question of an instant form. `options` only on choice questions. */
11
+ export declare const metaFormQuestionValidator: import("convex/values").VObject<{
12
+ key: string;
13
+ label: string;
14
+ options?: {
15
+ key: string;
16
+ value: string;
17
+ }[] | undefined;
18
+ type: string;
19
+ }, {
20
+ key: import("convex/values").VString<string, "required">;
21
+ label: import("convex/values").VString<string, "required">;
22
+ /** Meta's type: `FULL_NAME`, `EMAIL`, `PHONE`, `CUSTOM`… */
23
+ type: import("convex/values").VString<string, "required">;
24
+ options: import("convex/values").VArray<{
25
+ key: string;
26
+ value: string;
27
+ }[] | undefined, import("convex/values").VObject<{
28
+ key: string;
29
+ value: string;
30
+ }, {
31
+ key: import("convex/values").VString<string, "required">;
32
+ value: import("convex/values").VString<string, "required">;
33
+ }, "required", "key" | "value">, "optional">;
34
+ }, "required", "key" | "label" | "options" | "type">;
35
+ /** Where a rule sends a lead: a board column, or the discard with a reason. */
36
+ export declare const formRuleTargetValidator: import("convex/values").VUnion<{
37
+ column: string;
38
+ } | {
39
+ discard: string;
40
+ }, [import("convex/values").VObject<{
41
+ column: string;
42
+ }, {
43
+ column: import("convex/values").VString<string, "required">;
44
+ }, "required", "column">, import("convex/values").VObject<{
45
+ discard: string;
46
+ }, {
47
+ discard: import("convex/values").VString<string, "required">;
48
+ }, "required", "discard">], "required", "column" | "discard">;
49
+ /** One rule: an answer to a choice question decides where the lead goes. */
50
+ export declare const formRuleValidator: import("convex/values").VObject<{
51
+ answers: string[];
52
+ questionKey: string;
53
+ to: {
54
+ column: string;
55
+ } | {
56
+ discard: string;
57
+ };
58
+ }, {
59
+ questionKey: import("convex/values").VString<string, "required">;
60
+ /** Option keys (or values) of the question; any of them matches. */
61
+ answers: import("convex/values").VArray<string[], import("convex/values").VString<string, "required">, "required">;
62
+ to: import("convex/values").VUnion<{
63
+ column: string;
64
+ } | {
65
+ discard: string;
66
+ }, [import("convex/values").VObject<{
67
+ column: string;
68
+ }, {
69
+ column: import("convex/values").VString<string, "required">;
70
+ }, "required", "column">, import("convex/values").VObject<{
71
+ discard: string;
72
+ }, {
73
+ discard: import("convex/values").VString<string, "required">;
74
+ }, "required", "discard">], "required", "column" | "discard">;
75
+ }, "required", "answers" | "questionKey" | "to" | "to.column" | "to.discard">;
76
+ /** The brakes on an automatic first message (the host's own sender). */
77
+ export declare const firstContactBrakesValidator: import("convex/values").VObject<{
78
+ businessHoursOnly: boolean;
79
+ maxPerHour: number;
80
+ waitMinutes: number;
81
+ }, {
82
+ waitMinutes: import("convex/values").VFloat64<number, "required">;
83
+ maxPerHour: import("convex/values").VFloat64<number, "required">;
84
+ businessHoursOnly: import("convex/values").VBoolean<boolean, "required">;
85
+ }, "required", "businessHoursOnly" | "maxPerHour" | "waitMinutes">;
86
+ /**
87
+ * How the host makes the first contact. `lead_starts`: the form's end screen
88
+ * has the WhatsApp button and the lead writes first (recommended);
89
+ * `one_click`: a person sends the suggested `text`; `automatic`: a scheduled
90
+ * send under `brakes`, which the host keeps off unless the business accepted
91
+ * the risk.
92
+ */
93
+ export declare const firstContactValidator: import("convex/values").VObject<{
94
+ brakes?: {
95
+ businessHoursOnly: boolean;
96
+ maxPerHour: number;
97
+ waitMinutes: number;
98
+ } | undefined;
99
+ mode: "automatic" | "lead_starts" | "one_click";
100
+ text?: string | undefined;
101
+ }, {
102
+ mode: import("convex/values").VUnion<"automatic" | "lead_starts" | "one_click", [import("convex/values").VLiteral<"lead_starts", "required">, import("convex/values").VLiteral<"one_click", "required">, import("convex/values").VLiteral<"automatic", "required">], "required", never>;
103
+ text: import("convex/values").VString<string | undefined, "optional">;
104
+ brakes: import("convex/values").VObject<{
105
+ businessHoursOnly: boolean;
106
+ maxPerHour: number;
107
+ waitMinutes: number;
108
+ } | undefined, {
109
+ waitMinutes: import("convex/values").VFloat64<number, "required">;
110
+ maxPerHour: import("convex/values").VFloat64<number, "required">;
111
+ businessHoursOnly: import("convex/values").VBoolean<boolean, "required">;
112
+ }, "optional", "businessHoursOnly" | "maxPerHour" | "waitMinutes">;
113
+ }, "required", "brakes" | "brakes.businessHoursOnly" | "brakes.maxPerHour" | "brakes.waitMinutes" | "mode" | "text">;
114
+ /**
115
+ * What the rules decided for a lead: a column (`null` is the host's own
116
+ * entry, when no rule matched and the form names no entry column), or the
117
+ * discard with its reason.
118
+ */
119
+ export declare const formLeadDecisionValidator: import("convex/values").VUnion<{
120
+ column: string | null;
121
+ } | {
122
+ discard: string;
123
+ }, [import("convex/values").VObject<{
124
+ column: string | null;
125
+ }, {
126
+ column: import("convex/values").VUnion<string | null, [import("convex/values").VString<string, "required">, import("convex/values").VNull<null, "required">], "required", never>;
127
+ }, "required", "column">, import("convex/values").VObject<{
128
+ discard: string;
129
+ }, {
130
+ discard: import("convex/values").VString<string, "required">;
131
+ }, "required", "discard">], "required", "column" | "discard">;
132
+ /**
133
+ * How a form lead came in: Meta's webhook, forwarded by the dashboard the
134
+ * moment Meta announced it, or the reconciliation every 15 minutes.
135
+ */
136
+ export declare const formLeadViaValidator: import("convex/values").VUnion<"reconcile" | "webhook", [import("convex/values").VLiteral<"webhook", "required">, import("convex/values").VLiteral<"reconcile", "required">], "required", never>;
137
+ /** A choice answer as stored: the question and the option keys picked. */
138
+ export declare const formChoiceAnswerValidator: import("convex/values").VObject<{
139
+ answers: string[];
140
+ questionKey: string;
141
+ }, {
142
+ questionKey: import("convex/values").VString<string, "required">;
143
+ answers: import("convex/values").VArray<string[], import("convex/values").VString<string, "required">, "required">;
144
+ }, "required", "answers" | "questionKey">;
145
+ /** Where a form lead came from: the Page, the form and the ad. */
146
+ export declare const formLeadOriginValidator: import("convex/values").VObject<{
147
+ adId: string | null;
148
+ adName: string | null;
149
+ adsetId: string | null;
150
+ adsetName: string | null;
151
+ campaignId: string | null;
152
+ campaignName: string | null;
153
+ formId: string;
154
+ formName: string | null;
155
+ isOrganic: boolean;
156
+ pageId: string;
157
+ pageName: string | null;
158
+ platform: string | null;
159
+ }, {
160
+ pageId: import("convex/values").VString<string, "required">;
161
+ pageName: import("convex/values").VUnion<string | null, [import("convex/values").VString<string, "required">, import("convex/values").VNull<null, "required">], "required", never>;
162
+ formId: import("convex/values").VString<string, "required">;
163
+ formName: import("convex/values").VUnion<string | null, [import("convex/values").VString<string, "required">, import("convex/values").VNull<null, "required">], "required", never>;
164
+ adId: import("convex/values").VUnion<string | null, [import("convex/values").VString<string, "required">, import("convex/values").VNull<null, "required">], "required", never>;
165
+ adName: import("convex/values").VUnion<string | null, [import("convex/values").VString<string, "required">, import("convex/values").VNull<null, "required">], "required", never>;
166
+ adsetId: import("convex/values").VUnion<string | null, [import("convex/values").VString<string, "required">, import("convex/values").VNull<null, "required">], "required", never>;
167
+ adsetName: import("convex/values").VUnion<string | null, [import("convex/values").VString<string, "required">, import("convex/values").VNull<null, "required">], "required", never>;
168
+ campaignId: import("convex/values").VUnion<string | null, [import("convex/values").VString<string, "required">, import("convex/values").VNull<null, "required">], "required", never>;
169
+ campaignName: import("convex/values").VUnion<string | null, [import("convex/values").VString<string, "required">, import("convex/values").VNull<null, "required">], "required", never>;
170
+ /** `fb` or `ig`, as Meta says where the form was filled. */
171
+ platform: import("convex/values").VUnion<string | null, [import("convex/values").VString<string, "required">, import("convex/values").VNull<null, "required">], "required", never>;
172
+ isOrganic: import("convex/values").VBoolean<boolean, "required">;
173
+ }, "required", "adId" | "adName" | "adsetId" | "adsetName" | "campaignId" | "campaignName" | "formId" | "formName" | "isOrganic" | "pageId" | "pageName" | "platform">;
174
+ /** A choice answer with the labels the form shows. */
175
+ export declare const formLabeledAnswerValidator: import("convex/values").VObject<{
176
+ label: string;
177
+ questionKey: string;
178
+ values: string[];
179
+ }, {
180
+ questionKey: import("convex/values").VString<string, "required">;
181
+ label: import("convex/values").VString<string, "required">;
182
+ values: import("convex/values").VArray<string[], import("convex/values").VString<string, "required">, "required">;
183
+ }, "required", "label" | "questionKey" | "values">;
184
+ /**
185
+ * What the component hands the host's form lead handler (an internal
186
+ * mutation registered with `setFormLeadHandler`). `contact` and
187
+ * `freeAnswers` come from Meta in memory and are never stored by Rastro; the
188
+ * host owns the person from here. The handler must be idempotent on
189
+ * `leadgenId`.
190
+ */
191
+ export declare const formLeadPayloadValidator: import("convex/values").VObject<{
192
+ answers: {
193
+ label: string;
194
+ questionKey: string;
195
+ values: string[];
196
+ }[];
197
+ contact: {
198
+ email: string | null;
199
+ name: string | null;
200
+ phone: string | null;
201
+ };
202
+ decision: {
203
+ column: string | null;
204
+ } | {
205
+ discard: string;
206
+ };
207
+ firstContact: {
208
+ brakes?: {
209
+ businessHoursOnly: boolean;
210
+ maxPerHour: number;
211
+ waitMinutes: number;
212
+ } | undefined;
213
+ mode: "automatic" | "lead_starts" | "one_click";
214
+ text?: string | undefined;
215
+ };
216
+ freeAnswers: {
217
+ label: string;
218
+ questionKey: string;
219
+ value: string;
220
+ }[];
221
+ leadId: string;
222
+ leadKey: string;
223
+ leadgenId: string;
224
+ origin: {
225
+ adId: string | null;
226
+ adName: string | null;
227
+ adsetId: string | null;
228
+ adsetName: string | null;
229
+ campaignId: string | null;
230
+ campaignName: string | null;
231
+ formId: string;
232
+ formName: string | null;
233
+ isOrganic: boolean;
234
+ pageId: string;
235
+ pageName: string | null;
236
+ platform: string | null;
237
+ };
238
+ receivedAt: number;
239
+ ruleIndex: number | null;
240
+ rulePath: number[];
241
+ siteId: string;
242
+ }, {
243
+ siteId: import("convex/values").VString<string, "required">;
244
+ /** Rastro's lead; `leadKey` is what `setLeadStage` takes for it. */
245
+ leadId: import("convex/values").VString<string, "required">;
246
+ leadKey: import("convex/values").VString<string, "required">;
247
+ leadgenId: import("convex/values").VString<string, "required">;
248
+ /** When the lead submitted the form (Meta's `created_time`). */
249
+ receivedAt: import("convex/values").VFloat64<number, "required">;
250
+ contact: import("convex/values").VObject<{
251
+ email: string | null;
252
+ name: string | null;
253
+ phone: string | null;
254
+ }, {
255
+ name: import("convex/values").VUnion<string | null, [import("convex/values").VString<string, "required">, import("convex/values").VNull<null, "required">], "required", never>;
256
+ /** As the lead typed it, usually with the country code (`+55…`). */
257
+ phone: import("convex/values").VUnion<string | null, [import("convex/values").VString<string, "required">, import("convex/values").VNull<null, "required">], "required", never>;
258
+ email: import("convex/values").VUnion<string | null, [import("convex/values").VString<string, "required">, import("convex/values").VNull<null, "required">], "required", never>;
259
+ }, "required", "email" | "name" | "phone">;
260
+ /** Answers typed freely (and any personal field besides the contact). */
261
+ freeAnswers: import("convex/values").VArray<{
262
+ label: string;
263
+ questionKey: string;
264
+ value: string;
265
+ }[], import("convex/values").VObject<{
266
+ label: string;
267
+ questionKey: string;
268
+ value: string;
269
+ }, {
270
+ questionKey: import("convex/values").VString<string, "required">;
271
+ label: import("convex/values").VString<string, "required">;
272
+ value: import("convex/values").VString<string, "required">;
273
+ }, "required", "label" | "questionKey" | "value">, "required">;
274
+ /** The choice answers, with the labels the form shows. */
275
+ answers: import("convex/values").VArray<{
276
+ label: string;
277
+ questionKey: string;
278
+ values: string[];
279
+ }[], import("convex/values").VObject<{
280
+ label: string;
281
+ questionKey: string;
282
+ values: string[];
283
+ }, {
284
+ questionKey: import("convex/values").VString<string, "required">;
285
+ label: import("convex/values").VString<string, "required">;
286
+ values: import("convex/values").VArray<string[], import("convex/values").VString<string, "required">, "required">;
287
+ }, "required", "label" | "questionKey" | "values">, "required">;
288
+ decision: import("convex/values").VUnion<{
289
+ column: string | null;
290
+ } | {
291
+ discard: string;
292
+ }, [import("convex/values").VObject<{
293
+ column: string | null;
294
+ }, {
295
+ column: import("convex/values").VUnion<string | null, [import("convex/values").VString<string, "required">, import("convex/values").VNull<null, "required">], "required", never>;
296
+ }, "required", "column">, import("convex/values").VObject<{
297
+ discard: string;
298
+ }, {
299
+ discard: import("convex/values").VString<string, "required">;
300
+ }, "required", "discard">], "required", "column" | "discard">;
301
+ /** The rule indexes evaluated, in order; the last one decided if any did. */
302
+ rulePath: import("convex/values").VArray<number[], import("convex/values").VFloat64<number, "required">, "required">;
303
+ /** The rule that decided, or null when none matched. */
304
+ ruleIndex: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
305
+ origin: import("convex/values").VObject<{
306
+ adId: string | null;
307
+ adName: string | null;
308
+ adsetId: string | null;
309
+ adsetName: string | null;
310
+ campaignId: string | null;
311
+ campaignName: string | null;
312
+ formId: string;
313
+ formName: string | null;
314
+ isOrganic: boolean;
315
+ pageId: string;
316
+ pageName: string | null;
317
+ platform: string | null;
318
+ }, {
319
+ pageId: import("convex/values").VString<string, "required">;
320
+ pageName: import("convex/values").VUnion<string | null, [import("convex/values").VString<string, "required">, import("convex/values").VNull<null, "required">], "required", never>;
321
+ formId: import("convex/values").VString<string, "required">;
322
+ formName: import("convex/values").VUnion<string | null, [import("convex/values").VString<string, "required">, import("convex/values").VNull<null, "required">], "required", never>;
323
+ adId: import("convex/values").VUnion<string | null, [import("convex/values").VString<string, "required">, import("convex/values").VNull<null, "required">], "required", never>;
324
+ adName: import("convex/values").VUnion<string | null, [import("convex/values").VString<string, "required">, import("convex/values").VNull<null, "required">], "required", never>;
325
+ adsetId: import("convex/values").VUnion<string | null, [import("convex/values").VString<string, "required">, import("convex/values").VNull<null, "required">], "required", never>;
326
+ adsetName: import("convex/values").VUnion<string | null, [import("convex/values").VString<string, "required">, import("convex/values").VNull<null, "required">], "required", never>;
327
+ campaignId: import("convex/values").VUnion<string | null, [import("convex/values").VString<string, "required">, import("convex/values").VNull<null, "required">], "required", never>;
328
+ campaignName: import("convex/values").VUnion<string | null, [import("convex/values").VString<string, "required">, import("convex/values").VNull<null, "required">], "required", never>;
329
+ /** `fb` or `ig`, as Meta says where the form was filled. */
330
+ platform: import("convex/values").VUnion<string | null, [import("convex/values").VString<string, "required">, import("convex/values").VNull<null, "required">], "required", never>;
331
+ isOrganic: import("convex/values").VBoolean<boolean, "required">;
332
+ }, "required", "adId" | "adName" | "adsetId" | "adsetName" | "campaignId" | "campaignName" | "formId" | "formName" | "isOrganic" | "pageId" | "pageName" | "platform">;
333
+ firstContact: import("convex/values").VObject<{
334
+ brakes?: {
335
+ businessHoursOnly: boolean;
336
+ maxPerHour: number;
337
+ waitMinutes: number;
338
+ } | undefined;
339
+ mode: "automatic" | "lead_starts" | "one_click";
340
+ text?: string | undefined;
341
+ }, {
342
+ mode: import("convex/values").VUnion<"automatic" | "lead_starts" | "one_click", [import("convex/values").VLiteral<"lead_starts", "required">, import("convex/values").VLiteral<"one_click", "required">, import("convex/values").VLiteral<"automatic", "required">], "required", never>;
343
+ text: import("convex/values").VString<string | undefined, "optional">;
344
+ brakes: import("convex/values").VObject<{
345
+ businessHoursOnly: boolean;
346
+ maxPerHour: number;
347
+ waitMinutes: number;
348
+ } | undefined, {
349
+ waitMinutes: import("convex/values").VFloat64<number, "required">;
350
+ maxPerHour: import("convex/values").VFloat64<number, "required">;
351
+ businessHoursOnly: import("convex/values").VBoolean<boolean, "required">;
352
+ }, "optional", "businessHoursOnly" | "maxPerHour" | "waitMinutes">;
353
+ }, "required", "brakes" | "brakes.businessHoursOnly" | "brakes.maxPerHour" | "brakes.waitMinutes" | "mode" | "text">;
354
+ }, "required", "answers" | "contact" | "contact.email" | "contact.name" | "contact.phone" | "decision" | "decision.column" | "decision.discard" | "firstContact" | "firstContact.brakes" | "firstContact.brakes.businessHoursOnly" | "firstContact.brakes.maxPerHour" | "firstContact.brakes.waitMinutes" | "firstContact.mode" | "firstContact.text" | "freeAnswers" | "leadId" | "leadKey" | "leadgenId" | "origin" | "origin.adId" | "origin.adName" | "origin.adsetId" | "origin.adsetName" | "origin.campaignId" | "origin.campaignName" | "origin.formId" | "origin.formName" | "origin.isOrganic" | "origin.pageId" | "origin.pageName" | "origin.platform" | "receivedAt" | "ruleIndex" | "rulePath" | "siteId">;
355
+ /**
356
+ * What stops or slows a linked Page, as a code a screen maps to its own text
357
+ * (decision D6). Only `META_TOKEN_INVALID` and `META_PERMISSION_MISSING` are
358
+ * fixed by reconnecting Meta (the second also covers a Page the login no
359
+ * longer lists). `HANDLER_MISSING`, `HANDLER_FAILED` and `HANDLER_GAVE_UP`
360
+ * are the host's (no form lead handler; it throws and the lead is read again;
361
+ * it threw too often and the lead was skipped for good); `SECRETS_KEY_MISSING`
362
+ * is the host's env.
363
+ * `META_TRUNCATED`, `META_RATE_LIMITED`, `META_UNAVAILABLE` and `RUN_TIMEOUT`
364
+ * pass by themselves: the next run goes on.
365
+ */
366
+ export declare const META_PAGE_ERROR_CODES: readonly ["META_TOKEN_INVALID", "META_PERMISSION_MISSING", "HANDLER_MISSING", "HANDLER_FAILED", "HANDLER_GAVE_UP", "SECRETS_KEY_MISSING", "META_TRUNCATED", "META_RATE_LIMITED", "META_UNAVAILABLE", "RUN_TIMEOUT"];
367
+ export type MetaPageErrorCode = (typeof META_PAGE_ERROR_CODES)[number];
368
+ export declare const metaPageErrorCodeValidator: import("convex/values").VUnion<"HANDLER_FAILED" | "HANDLER_GAVE_UP" | "HANDLER_MISSING" | "META_PERMISSION_MISSING" | "META_RATE_LIMITED" | "META_TOKEN_INVALID" | "META_TRUNCATED" | "META_UNAVAILABLE" | "RUN_TIMEOUT" | "SECRETS_KEY_MISSING", [import("convex/values").VLiteral<"META_TOKEN_INVALID", "required">, import("convex/values").VLiteral<"META_PERMISSION_MISSING", "required">, import("convex/values").VLiteral<"HANDLER_MISSING", "required">, import("convex/values").VLiteral<"HANDLER_FAILED", "required">, import("convex/values").VLiteral<"HANDLER_GAVE_UP", "required">, import("convex/values").VLiteral<"SECRETS_KEY_MISSING", "required">, import("convex/values").VLiteral<"META_TRUNCATED", "required">, import("convex/values").VLiteral<"META_RATE_LIMITED", "required">, import("convex/values").VLiteral<"META_UNAVAILABLE", "required">, import("convex/values").VLiteral<"RUN_TIMEOUT", "required">], "required", never>;
369
+ /** What `metaLinkedPages` answers the control plane (decision D1). */
370
+ export declare const linkedPagesValidator: import("convex/values").VObject<{
371
+ audience: string | null;
372
+ handlerReady: boolean;
373
+ issuer: string;
374
+ leadgenReady: boolean;
375
+ pages: {
376
+ pageId: string;
377
+ siteId: string;
378
+ }[];
379
+ }, {
380
+ pages: import("convex/values").VArray<{
381
+ pageId: string;
382
+ siteId: string;
383
+ }[], import("convex/values").VObject<{
384
+ pageId: string;
385
+ siteId: string;
386
+ }, {
387
+ pageId: import("convex/values").VString<string, "required">;
388
+ siteId: import("convex/values").VString<string, "required">;
389
+ }, "required", "pageId" | "siteId">, "required">;
390
+ /**
391
+ * The component has `RASTRO_FEDERATION_AUDIENCE`: its leadgen route can
392
+ * verify a forward. False, every forward would answer `503`.
393
+ */
394
+ leadgenReady: import("convex/values").VBoolean<boolean, "required">;
395
+ /** The issuer the leadgen route verifies forwards against. */
396
+ issuer: import("convex/values").VString<string, "required">;
397
+ /**
398
+ * The audience the leadgen route expects (`RASTRO_FEDERATION_AUDIENCE`,
399
+ * without a trailing slash), or null when it has none.
400
+ */
401
+ audience: import("convex/values").VUnion<string | null, [import("convex/values").VString<string, "required">, import("convex/values").VNull<null, "required">], "required", never>;
402
+ /**
403
+ * The host registered its form lead handler (the Lead Ads opt-in). False,
404
+ * the component reads no Pages: the list stays empty until it does, and
405
+ * reconnecting Meta changes nothing.
406
+ */
407
+ handlerReady: import("convex/values").VBoolean<boolean, "required">;
408
+ }, "required", "audience" | "handlerReady" | "issuer" | "leadgenReady" | "pages">;
409
+ /** A Page an owner's Meta connection lists, as a screen shows it. */
410
+ export declare const metaPageValidator: import("convex/values").VObject<{
411
+ handlerReady: boolean;
412
+ lastError: "HANDLER_FAILED" | "HANDLER_GAVE_UP" | "HANDLER_MISSING" | "META_PERMISSION_MISSING" | "META_RATE_LIMITED" | "META_TOKEN_INVALID" | "META_TRUNCATED" | "META_UNAVAILABLE" | "RUN_TIMEOUT" | "SECRETS_KEY_MISSING" | null;
413
+ leadsAllowed: boolean;
414
+ linkedOutsideScope?: boolean | undefined;
415
+ linkedSiteId: string | null;
416
+ name: string;
417
+ own: boolean | null;
418
+ pageId: string;
419
+ subscribedAt: number | null;
420
+ tasks: string[];
421
+ }, {
422
+ pageId: import("convex/values").VString<string, "required">;
423
+ name: import("convex/values").VString<string, "required">;
424
+ tasks: import("convex/values").VArray<string[], import("convex/values").VString<string, "required">, "required">;
425
+ /** Meta granted `leads_retrieval` for the Page to this login. */
426
+ leadsAllowed: import("convex/values").VBoolean<boolean, "required">;
427
+ /** The site the Page feeds, whoever linked it; null when free. */
428
+ linkedSiteId: import("convex/values").VUnion<string | null, [import("convex/values").VString<string, "required">, import("convex/values").VNull<null, "required">], "required", never>;
429
+ /** Federated reads only: linked to a site outside the caller's grant. */
430
+ linkedOutsideScope: import("convex/values").VBoolean<boolean | undefined, "optional">;
431
+ /** Whether this owner linked it; null while the Page is free. */
432
+ own: import("convex/values").VUnion<boolean | null, [import("convex/values").VBoolean<boolean, "required">, import("convex/values").VNull<null, "required">], "required", never>;
433
+ subscribedAt: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
434
+ /**
435
+ * What stops or slows the Page, as a code (`META_PAGE_ERROR_CODES`): Meta
436
+ * refused its token or lead access, or, for a Page this owner linked, the
437
+ * host's handler or the last reconciliation. Null when nothing does.
438
+ */
439
+ lastError: import("convex/values").VUnion<"HANDLER_FAILED" | "HANDLER_GAVE_UP" | "HANDLER_MISSING" | "META_PERMISSION_MISSING" | "META_RATE_LIMITED" | "META_TOKEN_INVALID" | "META_TRUNCATED" | "META_UNAVAILABLE" | "RUN_TIMEOUT" | "SECRETS_KEY_MISSING" | null, [import("convex/values").VUnion<"HANDLER_FAILED" | "HANDLER_GAVE_UP" | "HANDLER_MISSING" | "META_PERMISSION_MISSING" | "META_RATE_LIMITED" | "META_TOKEN_INVALID" | "META_TRUNCATED" | "META_UNAVAILABLE" | "RUN_TIMEOUT" | "SECRETS_KEY_MISSING", [import("convex/values").VLiteral<"META_TOKEN_INVALID", "required">, import("convex/values").VLiteral<"META_PERMISSION_MISSING", "required">, import("convex/values").VLiteral<"HANDLER_MISSING", "required">, import("convex/values").VLiteral<"HANDLER_FAILED", "required">, import("convex/values").VLiteral<"HANDLER_GAVE_UP", "required">, import("convex/values").VLiteral<"SECRETS_KEY_MISSING", "required">, import("convex/values").VLiteral<"META_TRUNCATED", "required">, import("convex/values").VLiteral<"META_RATE_LIMITED", "required">, import("convex/values").VLiteral<"META_UNAVAILABLE", "required">, import("convex/values").VLiteral<"RUN_TIMEOUT", "required">], "required", never>, import("convex/values").VNull<null, "required">], "required", never>;
440
+ /** Whether the host registered its form lead handler (no lead comes in without it). */
441
+ handlerReady: import("convex/values").VBoolean<boolean, "required">;
442
+ }, "required", "handlerReady" | "lastError" | "leadsAllowed" | "linkedOutsideScope" | "linkedSiteId" | "name" | "own" | "pageId" | "subscribedAt" | "tasks">;
443
+ /** One instant form of a Page linked to the site, for the forms screen. */
444
+ export declare const metaFormRowValidator: import("convex/values").VObject<{
445
+ createdTime: number | null;
446
+ daily: number[] | null;
447
+ formId: string;
448
+ lastLeadAt: number | null;
449
+ lastLeadVia: "reconcile" | "webhook" | null;
450
+ leads30d: number | null;
451
+ name: string;
452
+ questions: {
453
+ key: string;
454
+ label: string;
455
+ options?: {
456
+ key: string;
457
+ value: string;
458
+ }[] | undefined;
459
+ type: string;
460
+ }[];
461
+ rules: {
462
+ configured: boolean;
463
+ count: number;
464
+ entryColumn: string | null;
465
+ own?: boolean | undefined;
466
+ };
467
+ status: string;
468
+ syncedAt: number;
469
+ whatsappButton: boolean | null;
470
+ whatsappButtonConfirmed: boolean;
471
+ }, {
472
+ formId: import("convex/values").VString<string, "required">;
473
+ name: import("convex/values").VString<string, "required">;
474
+ /** Meta's status: `ACTIVE`, `ARCHIVED`, `DELETED`, `DRAFT`. */
475
+ status: import("convex/values").VString<string, "required">;
476
+ questions: import("convex/values").VArray<{
477
+ key: string;
478
+ label: string;
479
+ options?: {
480
+ key: string;
481
+ value: string;
482
+ }[] | undefined;
483
+ type: string;
484
+ }[], import("convex/values").VObject<{
485
+ key: string;
486
+ label: string;
487
+ options?: {
488
+ key: string;
489
+ value: string;
490
+ }[] | undefined;
491
+ type: string;
492
+ }, {
493
+ key: import("convex/values").VString<string, "required">;
494
+ label: import("convex/values").VString<string, "required">;
495
+ /** Meta's type: `FULL_NAME`, `EMAIL`, `PHONE`, `CUSTOM`… */
496
+ type: import("convex/values").VString<string, "required">;
497
+ options: import("convex/values").VArray<{
498
+ key: string;
499
+ value: string;
500
+ }[] | undefined, import("convex/values").VObject<{
501
+ key: string;
502
+ value: string;
503
+ }, {
504
+ key: import("convex/values").VString<string, "required">;
505
+ value: import("convex/values").VString<string, "required">;
506
+ }, "required", "key" | "value">, "optional">;
507
+ }, "required", "key" | "label" | "options" | "type">, "required">;
508
+ /** The end screen's WhatsApp button; null when Meta does not say. */
509
+ whatsappButton: import("convex/values").VUnion<boolean | null, [import("convex/values").VBoolean<boolean, "required">, import("convex/values").VNull<null, "required">], "required", never>;
510
+ /** The host marked the button as set by hand ("Já liguei"). */
511
+ whatsappButtonConfirmed: import("convex/values").VBoolean<boolean, "required">;
512
+ createdTime: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
513
+ syncedAt: import("convex/values").VFloat64<number, "required">;
514
+ /** Leads in the 30 UTC days up to `now`; null without `now`. */
515
+ leads30d: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
516
+ /** Those leads per UTC day, oldest first (30 entries); null without `now`. */
517
+ daily: import("convex/values").VUnion<number[] | null, [import("convex/values").VArray<number[], import("convex/values").VFloat64<number, "required">, "required">, import("convex/values").VNull<null, "required">], "required", never>;
518
+ lastLeadAt: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
519
+ /** How that newest lead came in; null when unknown (before 0.11.1). */
520
+ lastLeadVia: import("convex/values").VUnion<"reconcile" | "webhook" | null, [import("convex/values").VUnion<"reconcile" | "webhook", [import("convex/values").VLiteral<"webhook", "required">, import("convex/values").VLiteral<"reconcile", "required">], "required", never>, import("convex/values").VNull<null, "required">], "required", never>;
521
+ rules: import("convex/values").VObject<{
522
+ configured: boolean;
523
+ count: number;
524
+ entryColumn: string | null;
525
+ own?: boolean | undefined;
526
+ }, {
527
+ configured: import("convex/values").VBoolean<boolean, "required">;
528
+ count: import("convex/values").VFloat64<number, "required">;
529
+ entryColumn: import("convex/values").VUnion<string | null, [import("convex/values").VString<string, "required">, import("convex/values").VNull<null, "required">], "required", never>;
530
+ /** With an owner: whether that owner may edit them (not another's). */
531
+ own: import("convex/values").VBoolean<boolean | undefined, "optional">;
532
+ }, "required", "configured" | "count" | "entryColumn" | "own">;
533
+ }, "required", "createdTime" | "daily" | "formId" | "lastLeadAt" | "lastLeadVia" | "leads30d" | "name" | "questions" | "rules" | "rules.configured" | "rules.count" | "rules.entryColumn" | "rules.own" | "status" | "syncedAt" | "whatsappButton" | "whatsappButtonConfirmed">;
534
+ /** The Pages linked to a site, each with its forms. */
535
+ export declare const metaFormsValidator: import("convex/values").VArray<{
536
+ forms: {
537
+ createdTime: number | null;
538
+ daily: number[] | null;
539
+ formId: string;
540
+ lastLeadAt: number | null;
541
+ lastLeadVia: "reconcile" | "webhook" | null;
542
+ leads30d: number | null;
543
+ name: string;
544
+ questions: {
545
+ key: string;
546
+ label: string;
547
+ options?: {
548
+ key: string;
549
+ value: string;
550
+ }[] | undefined;
551
+ type: string;
552
+ }[];
553
+ rules: {
554
+ configured: boolean;
555
+ count: number;
556
+ entryColumn: string | null;
557
+ own?: boolean | undefined;
558
+ };
559
+ status: string;
560
+ syncedAt: number;
561
+ whatsappButton: boolean | null;
562
+ whatsappButtonConfirmed: boolean;
563
+ }[];
564
+ handlerReady: boolean;
565
+ lastError: "HANDLER_FAILED" | "HANDLER_GAVE_UP" | "HANDLER_MISSING" | "META_PERMISSION_MISSING" | "META_RATE_LIMITED" | "META_TOKEN_INVALID" | "META_TRUNCATED" | "META_UNAVAILABLE" | "RUN_TIMEOUT" | "SECRETS_KEY_MISSING" | null;
566
+ lastLeadAt: number | null;
567
+ lastReconcileAt: number | null;
568
+ leadsAllowed: boolean;
569
+ own?: boolean | undefined;
570
+ pageId: string;
571
+ pageName: string;
572
+ subscribedAt: number | null;
573
+ }[], import("convex/values").VObject<{
574
+ forms: {
575
+ createdTime: number | null;
576
+ daily: number[] | null;
577
+ formId: string;
578
+ lastLeadAt: number | null;
579
+ lastLeadVia: "reconcile" | "webhook" | null;
580
+ leads30d: number | null;
581
+ name: string;
582
+ questions: {
583
+ key: string;
584
+ label: string;
585
+ options?: {
586
+ key: string;
587
+ value: string;
588
+ }[] | undefined;
589
+ type: string;
590
+ }[];
591
+ rules: {
592
+ configured: boolean;
593
+ count: number;
594
+ entryColumn: string | null;
595
+ own?: boolean | undefined;
596
+ };
597
+ status: string;
598
+ syncedAt: number;
599
+ whatsappButton: boolean | null;
600
+ whatsappButtonConfirmed: boolean;
601
+ }[];
602
+ handlerReady: boolean;
603
+ lastError: "HANDLER_FAILED" | "HANDLER_GAVE_UP" | "HANDLER_MISSING" | "META_PERMISSION_MISSING" | "META_RATE_LIMITED" | "META_TOKEN_INVALID" | "META_TRUNCATED" | "META_UNAVAILABLE" | "RUN_TIMEOUT" | "SECRETS_KEY_MISSING" | null;
604
+ lastLeadAt: number | null;
605
+ lastReconcileAt: number | null;
606
+ leadsAllowed: boolean;
607
+ own?: boolean | undefined;
608
+ pageId: string;
609
+ pageName: string;
610
+ subscribedAt: number | null;
611
+ }, {
612
+ pageId: import("convex/values").VString<string, "required">;
613
+ pageName: import("convex/values").VString<string, "required">;
614
+ leadsAllowed: import("convex/values").VBoolean<boolean, "required">;
615
+ subscribedAt: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
616
+ lastReconcileAt: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
617
+ lastLeadAt: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
618
+ /** As on `metaPages`: a code of `META_PAGE_ERROR_CODES`, or null. */
619
+ lastError: import("convex/values").VUnion<"HANDLER_FAILED" | "HANDLER_GAVE_UP" | "HANDLER_MISSING" | "META_PERMISSION_MISSING" | "META_RATE_LIMITED" | "META_TOKEN_INVALID" | "META_TRUNCATED" | "META_UNAVAILABLE" | "RUN_TIMEOUT" | "SECRETS_KEY_MISSING" | null, [import("convex/values").VUnion<"HANDLER_FAILED" | "HANDLER_GAVE_UP" | "HANDLER_MISSING" | "META_PERMISSION_MISSING" | "META_RATE_LIMITED" | "META_TOKEN_INVALID" | "META_TRUNCATED" | "META_UNAVAILABLE" | "RUN_TIMEOUT" | "SECRETS_KEY_MISSING", [import("convex/values").VLiteral<"META_TOKEN_INVALID", "required">, import("convex/values").VLiteral<"META_PERMISSION_MISSING", "required">, import("convex/values").VLiteral<"HANDLER_MISSING", "required">, import("convex/values").VLiteral<"HANDLER_FAILED", "required">, import("convex/values").VLiteral<"HANDLER_GAVE_UP", "required">, import("convex/values").VLiteral<"SECRETS_KEY_MISSING", "required">, import("convex/values").VLiteral<"META_TRUNCATED", "required">, import("convex/values").VLiteral<"META_RATE_LIMITED", "required">, import("convex/values").VLiteral<"META_UNAVAILABLE", "required">, import("convex/values").VLiteral<"RUN_TIMEOUT", "required">], "required", never>, import("convex/values").VNull<null, "required">], "required", never>;
620
+ /** With an owner: whether that owner linked the Page. */
621
+ own: import("convex/values").VBoolean<boolean | undefined, "optional">;
622
+ /** Whether the host registered its form lead handler. */
623
+ handlerReady: import("convex/values").VBoolean<boolean, "required">;
624
+ forms: import("convex/values").VArray<{
625
+ createdTime: number | null;
626
+ daily: number[] | null;
627
+ formId: string;
628
+ lastLeadAt: number | null;
629
+ lastLeadVia: "reconcile" | "webhook" | null;
630
+ leads30d: number | null;
631
+ name: string;
632
+ questions: {
633
+ key: string;
634
+ label: string;
635
+ options?: {
636
+ key: string;
637
+ value: string;
638
+ }[] | undefined;
639
+ type: string;
640
+ }[];
641
+ rules: {
642
+ configured: boolean;
643
+ count: number;
644
+ entryColumn: string | null;
645
+ own?: boolean | undefined;
646
+ };
647
+ status: string;
648
+ syncedAt: number;
649
+ whatsappButton: boolean | null;
650
+ whatsappButtonConfirmed: boolean;
651
+ }[], import("convex/values").VObject<{
652
+ createdTime: number | null;
653
+ daily: number[] | null;
654
+ formId: string;
655
+ lastLeadAt: number | null;
656
+ lastLeadVia: "reconcile" | "webhook" | null;
657
+ leads30d: number | null;
658
+ name: string;
659
+ questions: {
660
+ key: string;
661
+ label: string;
662
+ options?: {
663
+ key: string;
664
+ value: string;
665
+ }[] | undefined;
666
+ type: string;
667
+ }[];
668
+ rules: {
669
+ configured: boolean;
670
+ count: number;
671
+ entryColumn: string | null;
672
+ own?: boolean | undefined;
673
+ };
674
+ status: string;
675
+ syncedAt: number;
676
+ whatsappButton: boolean | null;
677
+ whatsappButtonConfirmed: boolean;
678
+ }, {
679
+ formId: import("convex/values").VString<string, "required">;
680
+ name: import("convex/values").VString<string, "required">;
681
+ /** Meta's status: `ACTIVE`, `ARCHIVED`, `DELETED`, `DRAFT`. */
682
+ status: import("convex/values").VString<string, "required">;
683
+ questions: import("convex/values").VArray<{
684
+ key: string;
685
+ label: string;
686
+ options?: {
687
+ key: string;
688
+ value: string;
689
+ }[] | undefined;
690
+ type: string;
691
+ }[], import("convex/values").VObject<{
692
+ key: string;
693
+ label: string;
694
+ options?: {
695
+ key: string;
696
+ value: string;
697
+ }[] | undefined;
698
+ type: string;
699
+ }, {
700
+ key: import("convex/values").VString<string, "required">;
701
+ label: import("convex/values").VString<string, "required">;
702
+ /** Meta's type: `FULL_NAME`, `EMAIL`, `PHONE`, `CUSTOM`… */
703
+ type: import("convex/values").VString<string, "required">;
704
+ options: import("convex/values").VArray<{
705
+ key: string;
706
+ value: string;
707
+ }[] | undefined, import("convex/values").VObject<{
708
+ key: string;
709
+ value: string;
710
+ }, {
711
+ key: import("convex/values").VString<string, "required">;
712
+ value: import("convex/values").VString<string, "required">;
713
+ }, "required", "key" | "value">, "optional">;
714
+ }, "required", "key" | "label" | "options" | "type">, "required">;
715
+ /** The end screen's WhatsApp button; null when Meta does not say. */
716
+ whatsappButton: import("convex/values").VUnion<boolean | null, [import("convex/values").VBoolean<boolean, "required">, import("convex/values").VNull<null, "required">], "required", never>;
717
+ /** The host marked the button as set by hand ("Já liguei"). */
718
+ whatsappButtonConfirmed: import("convex/values").VBoolean<boolean, "required">;
719
+ createdTime: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
720
+ syncedAt: import("convex/values").VFloat64<number, "required">;
721
+ /** Leads in the 30 UTC days up to `now`; null without `now`. */
722
+ leads30d: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
723
+ /** Those leads per UTC day, oldest first (30 entries); null without `now`. */
724
+ daily: import("convex/values").VUnion<number[] | null, [import("convex/values").VArray<number[], import("convex/values").VFloat64<number, "required">, "required">, import("convex/values").VNull<null, "required">], "required", never>;
725
+ lastLeadAt: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
726
+ /** How that newest lead came in; null when unknown (before 0.11.1). */
727
+ lastLeadVia: import("convex/values").VUnion<"reconcile" | "webhook" | null, [import("convex/values").VUnion<"reconcile" | "webhook", [import("convex/values").VLiteral<"webhook", "required">, import("convex/values").VLiteral<"reconcile", "required">], "required", never>, import("convex/values").VNull<null, "required">], "required", never>;
728
+ rules: import("convex/values").VObject<{
729
+ configured: boolean;
730
+ count: number;
731
+ entryColumn: string | null;
732
+ own?: boolean | undefined;
733
+ }, {
734
+ configured: import("convex/values").VBoolean<boolean, "required">;
735
+ count: import("convex/values").VFloat64<number, "required">;
736
+ entryColumn: import("convex/values").VUnion<string | null, [import("convex/values").VString<string, "required">, import("convex/values").VNull<null, "required">], "required", never>;
737
+ /** With an owner: whether that owner may edit them (not another's). */
738
+ own: import("convex/values").VBoolean<boolean | undefined, "optional">;
739
+ }, "required", "configured" | "count" | "entryColumn" | "own">;
740
+ }, "required", "createdTime" | "daily" | "formId" | "lastLeadAt" | "lastLeadVia" | "leads30d" | "name" | "questions" | "rules" | "rules.configured" | "rules.count" | "rules.entryColumn" | "rules.own" | "status" | "syncedAt" | "whatsappButton" | "whatsappButtonConfirmed">, "required">;
741
+ }, "required", "forms" | "handlerReady" | "lastError" | "lastLeadAt" | "lastReconcileAt" | "leadsAllowed" | "own" | "pageId" | "pageName" | "subscribedAt">, "required">;
742
+ /** A form's rules as the drawer edits them, each with its monthly count. */
743
+ export declare const formRulesValidator: import("convex/values").VObject<{
744
+ configured: boolean;
745
+ entryColumn: string | null;
746
+ firstContact: {
747
+ brakes?: {
748
+ businessHoursOnly: boolean;
749
+ maxPerHour: number;
750
+ waitMinutes: number;
751
+ } | undefined;
752
+ mode: "automatic" | "lead_starts" | "one_click";
753
+ text?: string | undefined;
754
+ };
755
+ formId: string;
756
+ own?: boolean | undefined;
757
+ rules: {
758
+ answers: string[];
759
+ monthCount: number | null;
760
+ questionKey: string;
761
+ to: {
762
+ column: string;
763
+ } | {
764
+ discard: string;
765
+ };
766
+ }[];
767
+ siteId: string;
768
+ updatedAt: number | null;
769
+ whatsappButtonConfirmed: boolean;
770
+ }, {
771
+ siteId: import("convex/values").VString<string, "required">;
772
+ formId: import("convex/values").VString<string, "required">;
773
+ configured: import("convex/values").VBoolean<boolean, "required">;
774
+ entryColumn: import("convex/values").VUnion<string | null, [import("convex/values").VString<string, "required">, import("convex/values").VNull<null, "required">], "required", never>;
775
+ rules: import("convex/values").VArray<{
776
+ answers: string[];
777
+ monthCount: number | null;
778
+ questionKey: string;
779
+ to: {
780
+ column: string;
781
+ } | {
782
+ discard: string;
783
+ };
784
+ }[], import("convex/values").VObject<{
785
+ answers: string[];
786
+ monthCount: number | null;
787
+ questionKey: string;
788
+ to: {
789
+ column: string;
790
+ } | {
791
+ discard: string;
792
+ };
793
+ }, {
794
+ questionKey: import("convex/values").VString<string, "required">;
795
+ /** Option keys (or values) of the question; any of them matches. */
796
+ answers: import("convex/values").VArray<string[], import("convex/values").VString<string, "required">, "required">;
797
+ to: import("convex/values").VUnion<{
798
+ column: string;
799
+ } | {
800
+ discard: string;
801
+ }, [import("convex/values").VObject<{
802
+ column: string;
803
+ }, {
804
+ column: import("convex/values").VString<string, "required">;
805
+ }, "required", "column">, import("convex/values").VObject<{
806
+ discard: string;
807
+ }, {
808
+ discard: import("convex/values").VString<string, "required">;
809
+ }, "required", "discard">], "required", "column" | "discard">;
810
+ /** Leads this rule decided in the 30 days up to `now`; null without. */
811
+ monthCount: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
812
+ }, "required", "answers" | "monthCount" | "questionKey" | "to" | "to.column" | "to.discard">, "required">;
813
+ firstContact: import("convex/values").VObject<{
814
+ brakes?: {
815
+ businessHoursOnly: boolean;
816
+ maxPerHour: number;
817
+ waitMinutes: number;
818
+ } | undefined;
819
+ mode: "automatic" | "lead_starts" | "one_click";
820
+ text?: string | undefined;
821
+ }, {
822
+ mode: import("convex/values").VUnion<"automatic" | "lead_starts" | "one_click", [import("convex/values").VLiteral<"lead_starts", "required">, import("convex/values").VLiteral<"one_click", "required">, import("convex/values").VLiteral<"automatic", "required">], "required", never>;
823
+ text: import("convex/values").VString<string | undefined, "optional">;
824
+ brakes: import("convex/values").VObject<{
825
+ businessHoursOnly: boolean;
826
+ maxPerHour: number;
827
+ waitMinutes: number;
828
+ } | undefined, {
829
+ waitMinutes: import("convex/values").VFloat64<number, "required">;
830
+ maxPerHour: import("convex/values").VFloat64<number, "required">;
831
+ businessHoursOnly: import("convex/values").VBoolean<boolean, "required">;
832
+ }, "optional", "businessHoursOnly" | "maxPerHour" | "waitMinutes">;
833
+ }, "required", "brakes" | "brakes.businessHoursOnly" | "brakes.maxPerHour" | "brakes.waitMinutes" | "mode" | "text">;
834
+ whatsappButtonConfirmed: import("convex/values").VBoolean<boolean, "required">;
835
+ updatedAt: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
836
+ /** With an owner: whether that owner may edit them (not another's). */
837
+ own: import("convex/values").VBoolean<boolean | undefined, "optional">;
838
+ }, "required", "configured" | "entryColumn" | "firstContact" | "firstContact.brakes" | "firstContact.brakes.businessHoursOnly" | "firstContact.brakes.maxPerHour" | "firstContact.brakes.waitMinutes" | "firstContact.mode" | "firstContact.text" | "formId" | "own" | "rules" | "siteId" | "updatedAt" | "whatsappButtonConfirmed">;
839
+ /** The last 30 days' leads of a form under a draft of its rules. */
840
+ export declare const formRulesSimulationValidator: import("convex/values").VObject<{
841
+ columns: {
842
+ column: string;
843
+ leads: number;
844
+ }[];
845
+ discarded: {
846
+ leads: number;
847
+ reason: string;
848
+ }[];
849
+ entry: number;
850
+ partial: boolean;
851
+ rules: number[];
852
+ total: number;
853
+ }, {
854
+ total: import("convex/values").VFloat64<number, "required">;
855
+ /**
856
+ * Leads no rule matched: they go to the entry. Unlike `formsReport`'s
857
+ * `entry`, this counts them whether or not the draft names an entry column.
858
+ */
859
+ entry: import("convex/values").VFloat64<number, "required">;
860
+ /** Per draft rule, in order: the leads it would decide. */
861
+ rules: import("convex/values").VArray<number[], import("convex/values").VFloat64<number, "required">, "required">;
862
+ /**
863
+ * Leads per column the draft sends them to. With an `entryColumn`, its row
864
+ * already holds the `entry` leads: add `entry` only when no row names it.
865
+ */
866
+ columns: import("convex/values").VArray<{
867
+ column: string;
868
+ leads: number;
869
+ }[], import("convex/values").VObject<{
870
+ column: string;
871
+ leads: number;
872
+ }, {
873
+ column: import("convex/values").VString<string, "required">;
874
+ leads: import("convex/values").VFloat64<number, "required">;
875
+ }, "required", "column" | "leads">, "required">;
876
+ discarded: import("convex/values").VArray<{
877
+ leads: number;
878
+ reason: string;
879
+ }[], import("convex/values").VObject<{
880
+ leads: number;
881
+ reason: string;
882
+ }, {
883
+ reason: import("convex/values").VString<string, "required">;
884
+ leads: import("convex/values").VFloat64<number, "required">;
885
+ }, "required", "leads" | "reason">, "required">;
886
+ /** A read cap was hit: the figures cover the newest leads only. */
887
+ partial: import("convex/values").VBoolean<boolean, "required">;
888
+ }, "required", "columns" | "discarded" | "entry" | "partial" | "rules" | "total">;
889
+ /**
890
+ * Per form: its leads in the range and where the rules sent them. One row per
891
+ * (siteId, formId): a Page moved from one site to another inside the range
892
+ * has a row for each, so key rows by both. The range is whole UTC days:
893
+ * `from` floors to its day and `to` takes in the UTC day it falls on.
894
+ */
895
+ export declare const formsReportValidator: import("convex/values").VObject<{
896
+ forms: {
897
+ columns: {
898
+ column: string;
899
+ leads: number;
900
+ }[];
901
+ discarded: {
902
+ leads: number;
903
+ reason: string;
904
+ }[];
905
+ entry: number;
906
+ formId: string;
907
+ leads: number;
908
+ name: string | null;
909
+ pageId: string;
910
+ qualified: number;
911
+ returned: number;
912
+ revenueCents: number;
913
+ siteId: string;
914
+ won: number;
915
+ }[];
916
+ partial: boolean;
917
+ }, {
918
+ forms: import("convex/values").VArray<{
919
+ columns: {
920
+ column: string;
921
+ leads: number;
922
+ }[];
923
+ discarded: {
924
+ leads: number;
925
+ reason: string;
926
+ }[];
927
+ entry: number;
928
+ formId: string;
929
+ leads: number;
930
+ name: string | null;
931
+ pageId: string;
932
+ qualified: number;
933
+ returned: number;
934
+ revenueCents: number;
935
+ siteId: string;
936
+ won: number;
937
+ }[], import("convex/values").VObject<{
938
+ columns: {
939
+ column: string;
940
+ leads: number;
941
+ }[];
942
+ discarded: {
943
+ leads: number;
944
+ reason: string;
945
+ }[];
946
+ entry: number;
947
+ formId: string;
948
+ leads: number;
949
+ name: string | null;
950
+ pageId: string;
951
+ qualified: number;
952
+ returned: number;
953
+ revenueCents: number;
954
+ siteId: string;
955
+ won: number;
956
+ }, {
957
+ leads: import("convex/values").VFloat64<number, "required">;
958
+ qualified: import("convex/values").VFloat64<number, "required">;
959
+ won: import("convex/values").VFloat64<number, "required">;
960
+ revenueCents: import("convex/values").VFloat64<number, "required">;
961
+ siteId: import("convex/values").VString<string, "required">;
962
+ pageId: import("convex/values").VString<string, "required">;
963
+ formId: import("convex/values").VString<string, "required">;
964
+ name: import("convex/values").VUnion<string | null, [import("convex/values").VString<string, "required">, import("convex/values").VNull<null, "required">], "required", never>;
965
+ /** Leads a rule (or the entry column) sent to each column. */
966
+ columns: import("convex/values").VArray<{
967
+ column: string;
968
+ leads: number;
969
+ }[], import("convex/values").VObject<{
970
+ column: string;
971
+ leads: number;
972
+ }, {
973
+ column: import("convex/values").VString<string, "required">;
974
+ leads: import("convex/values").VFloat64<number, "required">;
975
+ }, "required", "column" | "leads">, "required">;
976
+ /** Leads that went to the host's own entry (no column named). */
977
+ entry: import("convex/values").VFloat64<number, "required">;
978
+ discarded: import("convex/values").VArray<{
979
+ leads: number;
980
+ reason: string;
981
+ }[], import("convex/values").VObject<{
982
+ leads: number;
983
+ reason: string;
984
+ }, {
985
+ reason: import("convex/values").VString<string, "required">;
986
+ leads: import("convex/values").VFloat64<number, "required">;
987
+ }, "required", "leads" | "reason">, "required">;
988
+ /** Discarded leads someone sent back to the funnel. */
989
+ returned: import("convex/values").VFloat64<number, "required">;
990
+ }, "required", "columns" | "discarded" | "entry" | "formId" | "leads" | "name" | "pageId" | "qualified" | "returned" | "revenueCents" | "siteId" | "won">, "required">;
991
+ /** A read cap was hit: the decision counts are a lower bound. */
992
+ partial: import("convex/values").VBoolean<boolean, "required">;
993
+ }, "required", "forms" | "partial">;
994
+ /** A form lead as the journey shows it: answers, origin and the path. */
995
+ export declare const formLeadDetailValidator: import("convex/values").VObject<{
996
+ answers: {
997
+ label: string;
998
+ questionKey: string;
999
+ values: string[];
1000
+ }[];
1001
+ decision: {
1002
+ column: string | null;
1003
+ } | {
1004
+ discard: string;
1005
+ };
1006
+ leadgenId: string;
1007
+ origin: {
1008
+ adId: string | null;
1009
+ adName: string | null;
1010
+ adsetId: string | null;
1011
+ adsetName: string | null;
1012
+ campaignId: string | null;
1013
+ campaignName: string | null;
1014
+ formId: string;
1015
+ formName: string | null;
1016
+ isOrganic: boolean;
1017
+ pageId: string;
1018
+ pageName: string | null;
1019
+ platform: string | null;
1020
+ };
1021
+ receivedAt: number;
1022
+ returned: {
1023
+ at: number;
1024
+ reason: string;
1025
+ } | null;
1026
+ ruleIndex: number | null;
1027
+ rulePath: number[];
1028
+ }, {
1029
+ leadgenId: import("convex/values").VString<string, "required">;
1030
+ receivedAt: import("convex/values").VFloat64<number, "required">;
1031
+ origin: import("convex/values").VObject<{
1032
+ adId: string | null;
1033
+ adName: string | null;
1034
+ adsetId: string | null;
1035
+ adsetName: string | null;
1036
+ campaignId: string | null;
1037
+ campaignName: string | null;
1038
+ formId: string;
1039
+ formName: string | null;
1040
+ isOrganic: boolean;
1041
+ pageId: string;
1042
+ pageName: string | null;
1043
+ platform: string | null;
1044
+ }, {
1045
+ pageId: import("convex/values").VString<string, "required">;
1046
+ pageName: import("convex/values").VUnion<string | null, [import("convex/values").VString<string, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1047
+ formId: import("convex/values").VString<string, "required">;
1048
+ formName: import("convex/values").VUnion<string | null, [import("convex/values").VString<string, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1049
+ adId: import("convex/values").VUnion<string | null, [import("convex/values").VString<string, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1050
+ adName: import("convex/values").VUnion<string | null, [import("convex/values").VString<string, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1051
+ adsetId: import("convex/values").VUnion<string | null, [import("convex/values").VString<string, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1052
+ adsetName: import("convex/values").VUnion<string | null, [import("convex/values").VString<string, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1053
+ campaignId: import("convex/values").VUnion<string | null, [import("convex/values").VString<string, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1054
+ campaignName: import("convex/values").VUnion<string | null, [import("convex/values").VString<string, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1055
+ /** `fb` or `ig`, as Meta says where the form was filled. */
1056
+ platform: import("convex/values").VUnion<string | null, [import("convex/values").VString<string, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1057
+ isOrganic: import("convex/values").VBoolean<boolean, "required">;
1058
+ }, "required", "adId" | "adName" | "adsetId" | "adsetName" | "campaignId" | "campaignName" | "formId" | "formName" | "isOrganic" | "pageId" | "pageName" | "platform">;
1059
+ answers: import("convex/values").VArray<{
1060
+ label: string;
1061
+ questionKey: string;
1062
+ values: string[];
1063
+ }[], import("convex/values").VObject<{
1064
+ label: string;
1065
+ questionKey: string;
1066
+ values: string[];
1067
+ }, {
1068
+ questionKey: import("convex/values").VString<string, "required">;
1069
+ label: import("convex/values").VString<string, "required">;
1070
+ values: import("convex/values").VArray<string[], import("convex/values").VString<string, "required">, "required">;
1071
+ }, "required", "label" | "questionKey" | "values">, "required">;
1072
+ decision: import("convex/values").VUnion<{
1073
+ column: string | null;
1074
+ } | {
1075
+ discard: string;
1076
+ }, [import("convex/values").VObject<{
1077
+ column: string | null;
1078
+ }, {
1079
+ column: import("convex/values").VUnion<string | null, [import("convex/values").VString<string, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1080
+ }, "required", "column">, import("convex/values").VObject<{
1081
+ discard: string;
1082
+ }, {
1083
+ discard: import("convex/values").VString<string, "required">;
1084
+ }, "required", "discard">], "required", "column" | "discard">;
1085
+ rulePath: import("convex/values").VArray<number[], import("convex/values").VFloat64<number, "required">, "required">;
1086
+ ruleIndex: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1087
+ /** When a discarded lead was sent back, and the reason it had. */
1088
+ returned: import("convex/values").VUnion<{
1089
+ at: number;
1090
+ reason: string;
1091
+ } | null, [import("convex/values").VObject<{
1092
+ at: number;
1093
+ reason: string;
1094
+ }, {
1095
+ at: import("convex/values").VFloat64<number, "required">;
1096
+ reason: import("convex/values").VString<string, "required">;
1097
+ }, "required", "at" | "reason">, import("convex/values").VNull<null, "required">], "required", "at" | "reason">;
1098
+ }, "required", "answers" | "decision" | "decision.column" | "decision.discard" | "leadgenId" | "origin" | "origin.adId" | "origin.adName" | "origin.adsetId" | "origin.adsetName" | "origin.campaignId" | "origin.campaignName" | "origin.formId" | "origin.formName" | "origin.isOrganic" | "origin.pageId" | "origin.pageName" | "origin.platform" | "receivedAt" | "returned" | "returned.at" | "returned.reason" | "ruleIndex" | "rulePath">;
1099
+ export type FormRule = Infer<typeof formRuleValidator>;
1100
+ export type FormRuleTarget = Infer<typeof formRuleTargetValidator>;
1101
+ export type FirstContact = Infer<typeof firstContactValidator>;
1102
+ export type FormLeadDecision = Infer<typeof formLeadDecisionValidator>;
1103
+ export type FormLeadPayload = Infer<typeof formLeadPayloadValidator>;
1104
+ export type MetaFormQuestion = Infer<typeof metaFormQuestionValidator>;
1105
+ export type FormChoiceAnswer = Infer<typeof formChoiceAnswerValidator>;
1106
+ //# sourceMappingURL=leadAdsValidators.d.ts.map