@getrheo/rheo-skill 1.0.1 → 2.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.
@@ -4089,8 +4089,6 @@ var parseHyperlinkHref = (raw) => {
4089
4089
  };
4090
4090
 
4091
4091
  // ../contracts/src/constants/index.ts
4092
- var ENVIRONMENTS = ["test", "live"];
4093
- var ROLES = ["owner", "editor"];
4094
4092
  var FIELD_CLASSIFICATIONS = ["safe", "sensitive"];
4095
4093
  var MEDIA_TYPES = ["image", "font", "lottie", "video"];
4096
4094
  var MAX_IMAGE_BYTES = 5 * 1024 * 1024;
@@ -6407,87 +6405,7 @@ var AttributionProviderSignalResponseSchema = external_exports.object({
6407
6405
  lastSeenAt: external_exports.string().nullable()
6408
6406
  });
6409
6407
 
6410
- // ../contracts/src/canvasEditorGates.ts
6411
- var CanvasEditorGatesResolvedSchema = external_exports.object({
6412
- lottie: external_exports.boolean(),
6413
- oauthLogin: external_exports.boolean(),
6414
- oauthProviderPreset: external_exports.boolean(),
6415
- oauthProviderCustom: external_exports.boolean(),
6416
- emailPasswordAuth: external_exports.boolean(),
6417
- emailPasswordField: external_exports.boolean(),
6418
- emailPasswordSubmit: external_exports.boolean(),
6419
- requestOsPermission: external_exports.boolean()
6420
- });
6421
- var ALL_TRUE = {
6422
- lottie: true,
6423
- oauthLogin: true,
6424
- oauthProviderPreset: true,
6425
- oauthProviderCustom: true,
6426
- emailPasswordAuth: true,
6427
- emailPasswordField: true,
6428
- emailPasswordSubmit: true,
6429
- requestOsPermission: true
6430
- };
6431
- var CanvasEditorGatesPatchSchema = external_exports.object({
6432
- lottie: external_exports.boolean().optional(),
6433
- oauthLogin: external_exports.boolean().optional(),
6434
- oauthProviderPreset: external_exports.boolean().optional(),
6435
- oauthProviderCustom: external_exports.boolean().optional(),
6436
- emailPasswordAuth: external_exports.boolean().optional(),
6437
- emailPasswordField: external_exports.boolean().optional(),
6438
- emailPasswordSubmit: external_exports.boolean().optional(),
6439
- requestOsPermission: external_exports.boolean().optional()
6440
- }).strict();
6441
- var parseCanvasEditorGates = (raw) => {
6442
- if (raw == null) return { ...ALL_TRUE };
6443
- const parsed = CanvasEditorGatesPatchSchema.safeParse(raw);
6444
- if (!parsed.success) return { ...ALL_TRUE };
6445
- return { ...ALL_TRUE, ...parsed.data };
6446
- };
6447
- var layerViolationMessage = (screenId, layerId, label) => `Screen "${screenId}": ${label} (layer "${layerId}") is disabled for this app in canvas editor settings.`;
6448
- var buttonOsPermissionMessage = (screenId, layerId) => `Screen "${screenId}": request OS permission button actions are disabled for this app (layer "${layerId}").`;
6449
- var collectCanvasGateViolations = (manifest, gates) => {
6450
- const issues = [];
6451
- for (const screen of manifest.screens) {
6452
- walkScreenLayers(screen, (l) => {
6453
- if ((l.kind === "lottie" || l.kind === "video") && !gates.lottie) {
6454
- issues.push(
6455
- layerViolationMessage(
6456
- screen.id,
6457
- l.id,
6458
- l.kind === "video" ? "Video layers" : "Lottie layers"
6459
- )
6460
- );
6461
- }
6462
- if (l.kind === "oauth_login" && !gates.oauthLogin) {
6463
- issues.push(layerViolationMessage(screen.id, l.id, "OAuth login layers"));
6464
- }
6465
- if (l.kind === "oauth_provider") {
6466
- if (l.variant === "preset" && !gates.oauthProviderPreset) {
6467
- issues.push(layerViolationMessage(screen.id, l.id, "OAuth provider (preset) layers"));
6468
- }
6469
- if (l.variant === "custom" && !gates.oauthProviderCustom) {
6470
- issues.push(layerViolationMessage(screen.id, l.id, "OAuth provider (custom) layers"));
6471
- }
6472
- }
6473
- if (l.kind === "email_password_auth" && !gates.emailPasswordAuth) {
6474
- issues.push(layerViolationMessage(screen.id, l.id, "Email/password auth layers"));
6475
- }
6476
- if (l.kind === "email_password_field" && !gates.emailPasswordField) {
6477
- issues.push(layerViolationMessage(screen.id, l.id, "Email/password field layers"));
6478
- }
6479
- if (l.kind === "email_password_submit" && !gates.emailPasswordSubmit) {
6480
- issues.push(layerViolationMessage(screen.id, l.id, "Email/password submit layers"));
6481
- }
6482
- if (l.kind === "button" && l.action.kind === "request_os_permission" && !gates.requestOsPermission) {
6483
- issues.push(buttonOsPermissionMessage(screen.id, l.id));
6484
- }
6485
- });
6486
- }
6487
- return issues;
6488
- };
6489
-
6490
- // ../contracts/src/dashboard/appBranding.ts
6408
+ // ../contracts/src/branding.ts
6491
6409
  var HEX = /^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/;
6492
6410
  var BrandColorSchema = external_exports.object({
6493
6411
  id: external_exports.string().uuid(),
@@ -6538,1233 +6456,6 @@ var BrandingSchema = external_exports.object({
6538
6456
  gradientPresets: external_exports.array(BrandGradientSchema),
6539
6457
  fontFamilies: external_exports.array(FontFamilySchema)
6540
6458
  });
6541
- var StoreListingInputSchema = external_exports.object({
6542
- platform: external_exports.enum(["ios", "android"]),
6543
- applicationId: external_exports.string().trim().min(1).max(200)
6544
- });
6545
- var StoreListingLookupResponseSchema = external_exports.object({
6546
- found: external_exports.boolean(),
6547
- platform: external_exports.enum(["ios", "android"]),
6548
- applicationId: external_exports.string(),
6549
- name: external_exports.string().optional(),
6550
- iconUrl: external_exports.string().url().optional()
6551
- });
6552
- var AppSchema = external_exports.object({
6553
- id: external_exports.string().uuid(),
6554
- orgId: external_exports.string().uuid(),
6555
- name: external_exports.string().min(1).max(100),
6556
- branding: BrandingSchema.optional(),
6557
- /** Resolved flags; all true when unset in storage. */
6558
- canvasEditorGates: CanvasEditorGatesResolvedSchema,
6559
- /** Resolved per-provider integration toggles + settings. */
6560
- integrations: ResolvedAppIntegrationsSchema,
6561
- archivedAt: external_exports.string().datetime().nullable().optional(),
6562
- createdAt: external_exports.string().datetime()
6563
- });
6564
- var CreateAppRequestSchema = external_exports.object({
6565
- name: external_exports.string().min(1).max(100),
6566
- /** When set, the server resolves artwork from the store after the app row exists. */
6567
- storeListing: StoreListingInputSchema.optional()
6568
- });
6569
- var UpdateAppRequestSchema = external_exports.object({
6570
- name: external_exports.string().min(1).max(100).optional(),
6571
- /** Full replace for the JSON column when set; omit to leave unchanged. */
6572
- canvasEditorGates: CanvasEditorGatesResolvedSchema.optional(),
6573
- /** Per-provider integration toggles + settings. Full replace semantics when set. */
6574
- integrations: AppIntegrationsSchema.optional()
6575
- });
6576
- var UpdateAppBrandingRequestSchema = external_exports.object({
6577
- branding: BrandingSchema
6578
- });
6579
- var DeleteAppRequestSchema = external_exports.object({
6580
- /** User must type the app's exact name to confirm destructive deletion. */
6581
- confirmName: external_exports.string().min(1)
6582
- });
6583
- var DeleteAppResponseSchema = external_exports.object({
6584
- mode: external_exports.enum(["hard", "soft"]),
6585
- reason: external_exports.enum(["has_events", "clickhouse_unavailable"]).optional()
6586
- });
6587
- var PublishableKeySchema = external_exports.object({
6588
- id: external_exports.string().uuid(),
6589
- environment: external_exports.enum(ENVIRONMENTS),
6590
- /**
6591
- * Full publishable key. Always returned to dashboard users since publishable
6592
- * keys are non-secret and meant to ship in mobile clients.
6593
- */
6594
- plaintext: external_exports.string(),
6595
- prefix: external_exports.string(),
6596
- lastFour: external_exports.string(),
6597
- revokedAt: external_exports.string().datetime().nullable().optional(),
6598
- createdAt: external_exports.string().datetime()
6599
- });
6600
- var CreateAppResponseSchema = external_exports.object({
6601
- app: AppSchema,
6602
- keys: external_exports.array(PublishableKeySchema)
6603
- });
6604
-
6605
- // ../contracts/src/dashboard/tags.ts
6606
- var DASHBOARD_MAX_TAGS = 20;
6607
- var DASHBOARD_MAX_TAG_LEN = 64;
6608
- var normalizeDashboardTags = (raw) => {
6609
- const out = [];
6610
- const seen = /* @__PURE__ */ new Set();
6611
- for (const s of raw) {
6612
- const t = s.trim().toLowerCase();
6613
- if (t.length === 0 || t.length > DASHBOARD_MAX_TAG_LEN) continue;
6614
- if (seen.has(t)) continue;
6615
- seen.add(t);
6616
- out.push(t);
6617
- if (out.length >= DASHBOARD_MAX_TAGS) break;
6618
- }
6619
- return out;
6620
- };
6621
- var TagsSchema = external_exports.array(external_exports.string()).max(DASHBOARD_MAX_TAGS).superRefine((arr, ctx) => {
6622
- arr.forEach((s, i) => {
6623
- const t = s.trim().toLowerCase();
6624
- if (t.length > DASHBOARD_MAX_TAG_LEN) {
6625
- ctx.addIssue({
6626
- code: external_exports.ZodIssueCode.custom,
6627
- message: `Tag exceeds ${DASHBOARD_MAX_TAG_LEN} characters`,
6628
- path: [i]
6629
- });
6630
- }
6631
- });
6632
- }).transform((arr) => normalizeDashboardTags(arr));
6633
- var TagsSchemaOptional = TagsSchema.optional();
6634
-
6635
- // ../contracts/src/flowTemplates.ts
6636
- var FLOW_TEMPLATE_IDS = [
6637
- "stories",
6638
- "language_learning",
6639
- "fitness",
6640
- "win_back",
6641
- "feedback",
6642
- "word_learning",
6643
- "journal_onboarding"
6644
- ];
6645
- var FlowTemplateIdSchema = external_exports.enum(FLOW_TEMPLATE_IDS);
6646
-
6647
- // ../contracts/src/dashboard/flows.ts
6648
- var FlowStatusSchema = external_exports.enum(["draft", "published_test", "published_live"]);
6649
- var FlowPreviewSchema = external_exports.object({
6650
- nodes: external_exports.array(
6651
- external_exports.object({
6652
- id: external_exports.string(),
6653
- x: external_exports.number(),
6654
- y: external_exports.number(),
6655
- isEntry: external_exports.boolean().optional()
6656
- })
6657
- ),
6658
- edges: external_exports.array(
6659
- external_exports.object({
6660
- source: external_exports.string(),
6661
- target: external_exports.string(),
6662
- branching: external_exports.boolean().optional()
6663
- })
6664
- )
6665
- });
6666
- var FlowSummarySchema = external_exports.object({
6667
- id: external_exports.string().uuid(),
6668
- appId: external_exports.string().uuid(),
6669
- name: external_exports.string().min(1),
6670
- status: FlowStatusSchema,
6671
- archivedAt: external_exports.string().datetime().nullable().optional(),
6672
- updatedAt: external_exports.string().datetime(),
6673
- createdAt: external_exports.string().datetime(),
6674
- /** Dashboard user who created the flow (null for legacy rows). */
6675
- createdByUserId: external_exports.string().uuid().nullable().optional(),
6676
- /** Number of published immutable versions (each publish appends one). */
6677
- versionCount: external_exports.number().int().nonnegative(),
6678
- screenCount: external_exports.number().int().nonnegative().optional(),
6679
- preview: FlowPreviewSchema.optional(),
6680
- tags: external_exports.array(external_exports.string())
6681
- });
6682
- var CREATE_FLOW_AI_PROMPT_MAX = 8e3;
6683
- var AiFlowPromptSchema = external_exports.string().trim().min(1).max(CREATE_FLOW_AI_PROMPT_MAX);
6684
- var CreateFlowRequestSchema = external_exports.object({
6685
- name: external_exports.string().min(1).max(100),
6686
- tags: TagsSchemaOptional,
6687
- /** When set, seeds the draft with a multi-screen onboarding manifest. Omit for a blank flow. */
6688
- flowTemplateId: FlowTemplateIdSchema.optional(),
6689
- /** When set, starts multi-step AI expansion after seeding a blank manifest. Mutually exclusive with `flowTemplateId`. */
6690
- aiPrompt: AiFlowPromptSchema.optional(),
6691
- /** Imported manifest JSON from the rheo skill flow-import workflow. Mutually exclusive with template and AI generation. */
6692
- importManifest: external_exports.unknown().optional()
6693
- }).superRefine((data, ctx) => {
6694
- const selected = [data.flowTemplateId, data.aiPrompt, data.importManifest].filter(
6695
- (v) => v !== void 0
6696
- );
6697
- if (selected.length > 1) {
6698
- ctx.addIssue({
6699
- code: external_exports.ZodIssueCode.custom,
6700
- message: "Pick only one start mode: catalog template, Generate with AI, or Import manifest.",
6701
- path: ["importManifest"]
6702
- });
6703
- }
6704
- });
6705
- var FlowAiGenerationRunStatusSchema = external_exports.enum([
6706
- "queued",
6707
- "running",
6708
- "completed",
6709
- "failed"
6710
- ]);
6711
- var FlowAiGenerationRunStatusResponseSchema = external_exports.object({
6712
- id: external_exports.string().uuid(),
6713
- flowId: external_exports.string().uuid(),
6714
- status: FlowAiGenerationRunStatusSchema,
6715
- stepIndex: external_exports.number().int().nonnegative(),
6716
- lastError: external_exports.string().nullable().optional()
6717
- });
6718
- var StartAiFlowGenerationRequestSchema = external_exports.object({
6719
- aiPrompt: AiFlowPromptSchema
6720
- });
6721
- var RHEO_AGENT_IMAGE_MIME_TYPES = ["image/png", "image/jpeg", "image/webp"];
6722
- var RHEO_AGENT_MAX_IMAGE_ATTACHMENTS = 4;
6723
- var estimateBase64DecodedBytes = (dataBase64) => {
6724
- const len = dataBase64.length;
6725
- const padding = dataBase64.endsWith("==") ? 2 : dataBase64.endsWith("=") ? 1 : 0;
6726
- return Math.max(0, Math.floor(len * 3 / 4) - padding);
6727
- };
6728
- var RheoAgentImageAttachmentSchema = external_exports.object({
6729
- mimeType: external_exports.enum(RHEO_AGENT_IMAGE_MIME_TYPES),
6730
- dataBase64: external_exports.string().min(1)
6731
- }).superRefine((attachment, ctx) => {
6732
- const bytes = estimateBase64DecodedBytes(attachment.dataBase64);
6733
- if (bytes > MAX_IMAGE_BYTES) {
6734
- ctx.addIssue({
6735
- code: external_exports.ZodIssueCode.custom,
6736
- message: "Image exceeds 5 MB limit"
6737
- });
6738
- }
6739
- });
6740
- var RheoAgentMessageSchema = external_exports.object({
6741
- role: external_exports.enum(["user", "assistant"]),
6742
- content: external_exports.string(),
6743
- attachments: external_exports.array(RheoAgentImageAttachmentSchema).max(RHEO_AGENT_MAX_IMAGE_ATTACHMENTS).optional()
6744
- }).superRefine((message, ctx) => {
6745
- if (message.role === "assistant" && message.attachments?.length) {
6746
- ctx.addIssue({
6747
- code: external_exports.ZodIssueCode.custom,
6748
- message: "Assistant messages cannot include attachments"
6749
- });
6750
- }
6751
- if (message.role === "user" && !message.content.trim() && !(message.attachments && message.attachments.length > 0)) {
6752
- ctx.addIssue({
6753
- code: external_exports.ZodIssueCode.custom,
6754
- message: "User message must include text or at least one image"
6755
- });
6756
- }
6757
- });
6758
- var RheoAgentSelectionSchema = external_exports.object({
6759
- screenId: external_exports.string().optional(),
6760
- screenIds: external_exports.array(external_exports.string()).min(1).optional(),
6761
- layerId: external_exports.string().optional(),
6762
- decisionId: external_exports.string().optional(),
6763
- decisionIds: external_exports.array(external_exports.string()).min(1).optional(),
6764
- externalSurfaceId: external_exports.string().optional()
6765
- }).optional();
6766
- var RheoAgentChatRequestSchema = external_exports.object({
6767
- messages: external_exports.array(RheoAgentMessageSchema).min(1),
6768
- selection: RheoAgentSelectionSchema
6769
- });
6770
- var RheoAgentTextDeltaEventSchema = external_exports.object({
6771
- type: external_exports.literal("text-delta"),
6772
- delta: external_exports.string()
6773
- });
6774
- var RheoAgentApplyingManifestEventSchema = external_exports.object({
6775
- type: external_exports.literal("applying-manifest")
6776
- });
6777
- var RheoAgentManifestEventSchema = external_exports.object({
6778
- type: external_exports.literal("manifest"),
6779
- manifest: FlowManifestSchema
6780
- });
6781
- var RheoAgentErrorEventSchema = external_exports.object({
6782
- type: external_exports.literal("error"),
6783
- message: external_exports.string()
6784
- });
6785
- var RheoAgentDoneEventSchema = external_exports.object({
6786
- type: external_exports.literal("done"),
6787
- ok: external_exports.boolean()
6788
- });
6789
- var RheoAgentAttemptEventSchema = external_exports.object({
6790
- type: external_exports.literal("attempt"),
6791
- /** 1-based attempt index shown in the builder debug UI. */
6792
- attempt: external_exports.number().int().min(1),
6793
- maxAttempts: external_exports.number().int().min(1),
6794
- phase: external_exports.enum(["stream", "repair"])
6795
- });
6796
- var RheoAgentStreamEventSchema = external_exports.discriminatedUnion("type", [
6797
- RheoAgentTextDeltaEventSchema,
6798
- RheoAgentApplyingManifestEventSchema,
6799
- RheoAgentManifestEventSchema,
6800
- RheoAgentErrorEventSchema,
6801
- RheoAgentDoneEventSchema,
6802
- RheoAgentAttemptEventSchema
6803
- ]);
6804
- var CreateFlowResponseSchema = external_exports.object({
6805
- flow: FlowSummarySchema,
6806
- /** Present when `CreateFlowRequest` included `aiPrompt`. */
6807
- generationRunId: external_exports.string().uuid().optional()
6808
- });
6809
- var UpdateFlowRequestSchema = external_exports.object({
6810
- name: external_exports.string().min(1).max(100).optional(),
6811
- tags: TagsSchema.optional()
6812
- }).refine((o) => o.name !== void 0 || o.tags !== void 0, {
6813
- message: "Provide at least one of name or tags"
6814
- });
6815
- var DuplicateFlowRequestSchema = external_exports.object({
6816
- name: external_exports.string().min(1).max(100).optional(),
6817
- targetAppId: external_exports.string().uuid().optional()
6818
- });
6819
- var FlowDraftSchema = external_exports.object({
6820
- flowId: external_exports.string().uuid(),
6821
- name: external_exports.string().min(1),
6822
- tags: external_exports.array(external_exports.string()),
6823
- manifest: FlowManifestSchema,
6824
- autosaveVersion: external_exports.number().int().nonnegative(),
6825
- updatedAt: external_exports.string().datetime()
6826
- });
6827
- var AutosaveDraftRequestSchema = external_exports.object({
6828
- manifest: FlowManifestSchema,
6829
- autosaveVersion: external_exports.number().int().nonnegative()
6830
- });
6831
- var AutosaveDraftResponseSchema = external_exports.object({
6832
- flowId: external_exports.string().uuid(),
6833
- autosaveVersion: external_exports.number().int().nonnegative(),
6834
- updatedAt: external_exports.string().datetime()
6835
- });
6836
- var PublishRequestSchema = external_exports.object({
6837
- label: external_exports.string().trim().max(120).optional()
6838
- });
6839
- var PublishValidationErrorSchema = external_exports.object({
6840
- stepId: external_exports.string().nullable().optional(),
6841
- path: external_exports.array(external_exports.union([external_exports.string(), external_exports.number()])).optional(),
6842
- message: external_exports.string(),
6843
- code: external_exports.string()
6844
- });
6845
- var FlowVersionSchema = external_exports.object({
6846
- id: external_exports.string().uuid(),
6847
- flowId: external_exports.string().uuid(),
6848
- versionNumber: external_exports.number().int().positive(),
6849
- label: external_exports.string().nullable().optional(),
6850
- createdAt: external_exports.string().datetime(),
6851
- publishedByUserId: external_exports.string().uuid().nullable().optional()
6852
- });
6853
- var FlowVersionWithManifestSchema = FlowVersionSchema.extend({
6854
- manifest: FlowManifestSchema
6855
- });
6856
- var PublishResponseSchema = external_exports.object({
6857
- version: FlowVersionSchema
6858
- });
6859
- var ListVersionsResponseSchema = external_exports.object({
6860
- items: external_exports.array(FlowVersionSchema)
6861
- });
6862
-
6863
- // ../contracts/src/dashboard/channels.ts
6864
- var ChannelAssignmentKindSchema = external_exports.enum(["direct", "experiment"]);
6865
- var ChannelDirectAssignmentSchema = external_exports.object({
6866
- kind: external_exports.literal("direct"),
6867
- flowId: external_exports.string().uuid(),
6868
- versionId: external_exports.string().uuid()
6869
- });
6870
- var ChannelExperimentAssignmentSchema = external_exports.object({
6871
- kind: external_exports.literal("experiment"),
6872
- experimentId: external_exports.string().uuid()
6873
- });
6874
- var ChannelAssignmentRequestSchema = external_exports.discriminatedUnion("kind", [
6875
- ChannelDirectAssignmentSchema,
6876
- ChannelExperimentAssignmentSchema
6877
- ]);
6878
- var ChannelSchema = external_exports.object({
6879
- id: external_exports.string().uuid(),
6880
- publicId: external_exports.string(),
6881
- appId: external_exports.string().uuid(),
6882
- environment: external_exports.enum(ENVIRONMENTS),
6883
- name: external_exports.string(),
6884
- archivedAt: external_exports.string().datetime().nullable(),
6885
- createdAt: external_exports.string().datetime(),
6886
- assignmentKind: ChannelAssignmentKindSchema.nullable(),
6887
- assignmentVersion: external_exports.number().int().nonnegative(),
6888
- assignmentUpdatedAt: external_exports.string().datetime().nullable(),
6889
- pinned: external_exports.object({
6890
- flowId: external_exports.string().uuid(),
6891
- flowName: external_exports.string(),
6892
- versionId: external_exports.string().uuid(),
6893
- versionNumber: external_exports.number().int().positive(),
6894
- versionLabel: external_exports.string().nullable().optional()
6895
- }).nullable(),
6896
- experimentId: external_exports.string().uuid().nullable()
6897
- });
6898
- var ListChannelsResponseSchema = external_exports.object({
6899
- items: external_exports.array(ChannelSchema)
6900
- });
6901
- var CreateChannelRequestSchema = external_exports.object({
6902
- name: external_exports.string().min(1).max(64),
6903
- environment: external_exports.enum(ENVIRONMENTS)
6904
- });
6905
- var RenameChannelRequestSchema = external_exports.object({
6906
- name: external_exports.string().min(1).max(64)
6907
- });
6908
- var ArchiveChannelRequestSchema = external_exports.object({
6909
- confirmName: external_exports.string().min(1)
6910
- });
6911
- var UnarchiveChannelResponseSchema = external_exports.object({
6912
- channel: ChannelSchema,
6913
- restored: external_exports.boolean(),
6914
- restoreWarning: external_exports.string().nullable()
6915
- });
6916
-
6917
- // ../contracts/src/dashboard/channelHistory.ts
6918
- var ChannelEventTypeSchema = external_exports.enum([
6919
- "channel_created",
6920
- "channel_renamed",
6921
- "channel_archived",
6922
- "channel_unarchived",
6923
- "direct_pinned",
6924
- "experiment_assigned",
6925
- "assignment_cleared",
6926
- "experiment_stopped_repinned",
6927
- "experiment_winner_promoted",
6928
- "rollout_requested",
6929
- "rollout_rejected",
6930
- "rollout_cancelled"
6931
- ]);
6932
- var ChannelHistoryFlowVersionSnapshotSchema = external_exports.object({
6933
- flowId: external_exports.string().uuid(),
6934
- flowName: external_exports.string(),
6935
- versionId: external_exports.string().uuid(),
6936
- versionNumber: external_exports.number().int().positive(),
6937
- versionLabel: external_exports.string().nullable().optional()
6938
- });
6939
- var ChannelHistoryExperimentSnapshotSchema = external_exports.object({
6940
- experimentId: external_exports.string().uuid(),
6941
- experimentName: external_exports.string(),
6942
- variantCount: external_exports.number().int().nonnegative().optional()
6943
- });
6944
- var ChannelHistoryPreviousAssignmentSchema = external_exports.object({
6945
- kind: external_exports.enum(["direct", "experiment"]).nullable(),
6946
- pinned: ChannelHistoryFlowVersionSnapshotSchema.nullable().optional(),
6947
- experiment: ChannelHistoryExperimentSnapshotSchema.nullable().optional()
6948
- });
6949
- var ChannelCreatedPayloadSchema = external_exports.object({
6950
- type: external_exports.literal("channel_created"),
6951
- environment: external_exports.enum(ENVIRONMENTS),
6952
- name: external_exports.string()
6953
- });
6954
- var ChannelRenamedPayloadSchema = external_exports.object({
6955
- type: external_exports.literal("channel_renamed"),
6956
- previousName: external_exports.string(),
6957
- newName: external_exports.string()
6958
- });
6959
- var ChannelArchivedPayloadSchema = external_exports.object({
6960
- type: external_exports.literal("channel_archived"),
6961
- name: external_exports.string()
6962
- });
6963
- var ChannelUnarchivedPayloadSchema = external_exports.object({
6964
- type: external_exports.literal("channel_unarchived"),
6965
- assignmentRestored: external_exports.boolean(),
6966
- restoreWarning: external_exports.string().nullable(),
6967
- assignmentCleared: external_exports.boolean().optional()
6968
- });
6969
- var DirectPinnedPayloadSchema = external_exports.object({
6970
- type: external_exports.literal("direct_pinned"),
6971
- flowId: external_exports.string().uuid(),
6972
- flowName: external_exports.string(),
6973
- versionId: external_exports.string().uuid(),
6974
- versionNumber: external_exports.number().int().positive(),
6975
- versionLabel: external_exports.string().nullable().optional(),
6976
- source: external_exports.enum(["direct", "rollout"]),
6977
- rolloutRequestId: external_exports.string().uuid().optional(),
6978
- previous: ChannelHistoryPreviousAssignmentSchema.optional()
6979
- });
6980
- var ExperimentAssignedPayloadSchema = external_exports.object({
6981
- type: external_exports.literal("experiment_assigned"),
6982
- experimentId: external_exports.string().uuid(),
6983
- experimentName: external_exports.string(),
6984
- variantCount: external_exports.number().int().nonnegative(),
6985
- previous: ChannelHistoryPreviousAssignmentSchema.optional()
6986
- });
6987
- var AssignmentClearedPayloadSchema = external_exports.object({
6988
- type: external_exports.literal("assignment_cleared"),
6989
- previous: ChannelHistoryPreviousAssignmentSchema,
6990
- reason: external_exports.enum(["manual", "unarchive_restore_failed"]).optional()
6991
- });
6992
- var ExperimentStoppedRepinnedPayloadSchema = external_exports.object({
6993
- type: external_exports.literal("experiment_stopped_repinned"),
6994
- experimentId: external_exports.string().uuid(),
6995
- experimentName: external_exports.string(),
6996
- pinned: ChannelHistoryFlowVersionSnapshotSchema
6997
- });
6998
- var ExperimentWinnerPromotedPayloadSchema = external_exports.object({
6999
- type: external_exports.literal("experiment_winner_promoted"),
7000
- experimentId: external_exports.string().uuid(),
7001
- experimentName: external_exports.string(),
7002
- pinned: ChannelHistoryFlowVersionSnapshotSchema,
7003
- wasPendingDecision: external_exports.boolean()
7004
- });
7005
- var RolloutFlowPayloadSchema = external_exports.object({
7006
- type: external_exports.enum(["rollout_requested", "rollout_rejected", "rollout_cancelled"]),
7007
- rolloutRequestId: external_exports.string().uuid(),
7008
- flow: ChannelHistoryFlowVersionSnapshotSchema
7009
- });
7010
- var ChannelEventPayloadSchema = external_exports.discriminatedUnion("type", [
7011
- ChannelCreatedPayloadSchema,
7012
- ChannelRenamedPayloadSchema,
7013
- ChannelArchivedPayloadSchema,
7014
- ChannelUnarchivedPayloadSchema,
7015
- DirectPinnedPayloadSchema,
7016
- ExperimentAssignedPayloadSchema,
7017
- AssignmentClearedPayloadSchema,
7018
- ExperimentStoppedRepinnedPayloadSchema,
7019
- ExperimentWinnerPromotedPayloadSchema,
7020
- RolloutFlowPayloadSchema
7021
- ]);
7022
- var ChannelEventSchema = external_exports.object({
7023
- id: external_exports.string().uuid(),
7024
- type: ChannelEventTypeSchema,
7025
- actorUserId: external_exports.string().uuid().nullable(),
7026
- actorLabel: external_exports.string().nullable(),
7027
- occurredAt: external_exports.string().datetime(),
7028
- payload: external_exports.record(external_exports.unknown())
7029
- });
7030
- var ListChannelHistoryResponseSchema = external_exports.object({
7031
- items: external_exports.array(ChannelEventSchema),
7032
- total: external_exports.number().int().nonnegative()
7033
- });
7034
-
7035
- // ../contracts/src/dashboard/rollouts.ts
7036
- var RolloutRequestStatusSchema = external_exports.enum([
7037
- "pending",
7038
- "approved",
7039
- "rejected",
7040
- "cancelled"
7041
- ]);
7042
- var RolloutCommentKindSchema = external_exports.enum(["comment", "system"]);
7043
- var CreateRolloutRequestsBodySchema = external_exports.object({
7044
- appId: external_exports.string().uuid(),
7045
- versionId: external_exports.string().uuid(),
7046
- channelIds: external_exports.array(external_exports.string().uuid()).min(1),
7047
- /** PR-style summary: what changed, why, risk notes (first activity comment). */
7048
- description: external_exports.string().trim().min(1).max(8e3)
7049
- });
7050
- var RolloutPolicyResponseSchema = external_exports.object({
7051
- enabled: external_exports.boolean(),
7052
- environments: external_exports.array(external_exports.enum(ENVIRONMENTS)),
7053
- approverUserIds: external_exports.array(external_exports.string().uuid())
7054
- });
7055
- var PatchRolloutPolicySchema = external_exports.object({
7056
- enabled: external_exports.boolean(),
7057
- environments: external_exports.array(external_exports.enum(ENVIRONMENTS)),
7058
- approverUserIds: external_exports.array(external_exports.string().uuid())
7059
- });
7060
- var RolloutCommentMentionUserSchema = external_exports.object({
7061
- userId: external_exports.string().uuid(),
7062
- label: external_exports.string()
7063
- });
7064
- var RolloutRequestCommentSchema = external_exports.object({
7065
- id: external_exports.string().uuid(),
7066
- authorUserId: external_exports.string().uuid(),
7067
- body: external_exports.string(),
7068
- kind: RolloutCommentKindSchema,
7069
- createdAt: external_exports.string().datetime(),
7070
- mentions: external_exports.array(RolloutCommentMentionUserSchema)
7071
- });
7072
- var RolloutRequestSummarySchema = external_exports.object({
7073
- id: external_exports.string().uuid(),
7074
- orgId: external_exports.string().uuid(),
7075
- channelId: external_exports.string().uuid(),
7076
- channelName: external_exports.string(),
7077
- channelPublicId: external_exports.string(),
7078
- channelEnvironment: external_exports.enum(ENVIRONMENTS),
7079
- appId: external_exports.string().uuid(),
7080
- appName: external_exports.string(),
7081
- flowId: external_exports.string().uuid(),
7082
- flowName: external_exports.string(),
7083
- flowVersionId: external_exports.string().uuid(),
7084
- versionNumber: external_exports.number().int().positive(),
7085
- versionLabel: external_exports.string().nullable().optional(),
7086
- requestedByUserId: external_exports.string().uuid(),
7087
- requestedByEmail: external_exports.string(),
7088
- /** Display: full name, else username, else email. */
7089
- requestedByLabel: external_exports.string(),
7090
- status: RolloutRequestStatusSchema,
7091
- decidedByUserId: external_exports.string().uuid().nullable().optional(),
7092
- decidedAt: external_exports.string().datetime().nullable().optional(),
7093
- createdAt: external_exports.string().datetime()
7094
- });
7095
- var RolloutRequestDetailSchema = RolloutRequestSummarySchema.extend({
7096
- comments: external_exports.array(RolloutRequestCommentSchema)
7097
- });
7098
- var CreateRolloutRequestsResponseSchema = external_exports.object({
7099
- items: external_exports.array(
7100
- external_exports.object({
7101
- id: external_exports.string().uuid(),
7102
- channelId: external_exports.string().uuid()
7103
- })
7104
- )
7105
- });
7106
- var ListRolloutRequestsResponseSchema = external_exports.object({
7107
- items: external_exports.array(RolloutRequestSummarySchema),
7108
- total: external_exports.number().int().nonnegative()
7109
- });
7110
- var RejectRolloutRequestSchema = external_exports.object({
7111
- message: external_exports.string().trim().max(4e3).optional()
7112
- });
7113
- var ApproveRolloutRequestSchema = external_exports.object({
7114
- message: external_exports.string().trim().max(4e3).optional()
7115
- });
7116
- var AddRolloutCommentSchema = external_exports.object({
7117
- body: external_exports.string().trim().min(1).max(8e3),
7118
- mentionedUserIds: external_exports.array(external_exports.string().uuid()).max(20).optional().default([])
7119
- });
7120
- var AddRolloutCommentResponseSchema = external_exports.object({
7121
- comment: RolloutRequestCommentSchema
7122
- });
7123
-
7124
- // ../contracts/src/flowTemplateComments.ts
7125
- var FlowTemplateDefaultCommentSchema = external_exports.object({
7126
- positionX: external_exports.number().finite(),
7127
- positionY: external_exports.number().finite(),
7128
- body: external_exports.string().trim().min(1).max(8e3)
7129
- });
7130
- var FlowCommentThreadSourceSchema = external_exports.enum(["user", "template"]);
7131
-
7132
- // ../contracts/src/dashboard/flowComments.ts
7133
- var FlowCommentFilterSchema = external_exports.enum(["active", "archived", "all"]);
7134
- var CreateFlowCommentThreadRequestSchema = external_exports.object({
7135
- positionX: external_exports.number().finite(),
7136
- positionY: external_exports.number().finite(),
7137
- body: external_exports.string().trim().min(1).max(8e3),
7138
- mentionedUserIds: external_exports.array(external_exports.string().uuid()).max(20).optional().default([]),
7139
- anchorScreenId: ScreenIdSchema.optional(),
7140
- anchorLayerId: LayerIdSchema.optional(),
7141
- anchorDecisionNodeId: DecisionNodeIdSchema.optional(),
7142
- anchorExternalSurfaceNodeId: ExternalSurfaceNodeIdSchema.optional()
7143
- }).refine((d) => !d.anchorLayerId || !!d.anchorScreenId, {
7144
- message: "anchorLayerId requires anchorScreenId",
7145
- path: ["anchorLayerId"]
7146
- }).refine(
7147
- (d) => {
7148
- const n = (d.anchorScreenId ? 1 : 0) + (d.anchorDecisionNodeId ? 1 : 0) + (d.anchorExternalSurfaceNodeId ? 1 : 0);
7149
- return n <= 1;
7150
- },
7151
- {
7152
- message: "only one of anchorScreenId, anchorDecisionNodeId, or anchorExternalSurfaceNodeId",
7153
- path: ["anchorScreenId"]
7154
- }
7155
- );
7156
- var AddFlowCommentMessageRequestSchema = external_exports.object({
7157
- body: external_exports.string().trim().min(1).max(8e3),
7158
- parentMessageId: external_exports.string().uuid().nullable().optional(),
7159
- mentionedUserIds: external_exports.array(external_exports.string().uuid()).max(20).optional().default([])
7160
- });
7161
- var FlowCommentMessageSchema = external_exports.object({
7162
- id: external_exports.string().uuid(),
7163
- threadId: external_exports.string().uuid(),
7164
- authorUserId: external_exports.string().uuid(),
7165
- body: external_exports.string(),
7166
- parentMessageId: external_exports.string().uuid().nullable(),
7167
- createdAt: external_exports.string().datetime(),
7168
- mentions: external_exports.array(RolloutCommentMentionUserSchema)
7169
- });
7170
- var FlowCommentThreadSummarySchema = external_exports.object({
7171
- id: external_exports.string().uuid(),
7172
- flowId: external_exports.string().uuid(),
7173
- positionX: external_exports.number(),
7174
- positionY: external_exports.number(),
7175
- anchorScreenId: external_exports.string().nullable(),
7176
- anchorLayerId: external_exports.string().nullable(),
7177
- anchorDecisionNodeId: external_exports.string().nullable(),
7178
- anchorExternalSurfaceNodeId: external_exports.string().nullable(),
7179
- archivedAt: external_exports.string().datetime().nullable(),
7180
- createdAt: external_exports.string().datetime(),
7181
- createdByUserId: external_exports.string().uuid(),
7182
- source: FlowCommentThreadSourceSchema.optional().default("user"),
7183
- messageCount: external_exports.number().int().nonnegative(),
7184
- previewSnippet: external_exports.string(),
7185
- rootMessageAuthorLabel: external_exports.string(),
7186
- rootMessageCreatedAt: external_exports.string().datetime(),
7187
- rootMessageBody: external_exports.string()
7188
- });
7189
- var ListFlowCommentThreadsResponseSchema = external_exports.object({
7190
- items: external_exports.array(FlowCommentThreadSummarySchema)
7191
- });
7192
- var GetFlowCommentThreadResponseSchema = external_exports.object({
7193
- thread: FlowCommentThreadSummarySchema,
7194
- messages: external_exports.array(FlowCommentMessageSchema)
7195
- });
7196
- var CreateFlowCommentThreadResponseSchema = external_exports.object({
7197
- thread: FlowCommentThreadSummarySchema,
7198
- message: FlowCommentMessageSchema
7199
- });
7200
- var AddFlowCommentMessageResponseSchema = external_exports.object({
7201
- message: FlowCommentMessageSchema
7202
- });
7203
- var ArchiveFlowCommentThreadResponseSchema = external_exports.object({
7204
- thread: FlowCommentThreadSummarySchema
7205
- });
7206
-
7207
- // ../contracts/src/dashboard/media.ts
7208
- var PublicationSchema = external_exports.object({
7209
- id: external_exports.string().uuid(),
7210
- flowId: external_exports.string().uuid(),
7211
- environment: external_exports.enum(ENVIRONMENTS),
7212
- revision: external_exports.number().int().positive(),
7213
- manifest: FlowManifestSchema,
7214
- publishedAt: external_exports.string().datetime(),
7215
- supersededAt: external_exports.string().datetime().nullable().optional()
7216
- });
7217
- var SignUploadRequestSchema = external_exports.object({
7218
- type: MediaTypeSchema,
7219
- contentType: external_exports.string(),
7220
- sizeBytes: external_exports.number().int().positive(),
7221
- filename: external_exports.string().min(1).max(200).optional()
7222
- });
7223
- var SignUploadResponseSchema = external_exports.object({
7224
- assetId: external_exports.string().uuid(),
7225
- uploadUrl: external_exports.string().url(),
7226
- objectKey: external_exports.string(),
7227
- publicUrl: external_exports.string().url(),
7228
- headers: external_exports.record(external_exports.string(), external_exports.string()).optional()
7229
- });
7230
- var ConfirmUploadRequestSchema = external_exports.object({
7231
- assetId: external_exports.string().uuid(),
7232
- name: external_exports.string().max(200).optional()
7233
- });
7234
- var ListMediaResponseSchema = external_exports.object({
7235
- items: external_exports.array(MediaAssetSchema)
7236
- });
7237
- var MediaAssetUsageReferenceSchema = external_exports.object({
7238
- flowId: external_exports.string().uuid(),
7239
- flowName: external_exports.string(),
7240
- appId: external_exports.string().uuid(),
7241
- appName: external_exports.string(),
7242
- inDraft: external_exports.boolean(),
7243
- publishedVersionNumbers: external_exports.array(external_exports.number().int().positive())
7244
- });
7245
- var MediaAssetUsageResponseSchema = external_exports.object({
7246
- references: external_exports.array(MediaAssetUsageReferenceSchema)
7247
- });
7248
- var DeleteMediaAssetResponseSchema = external_exports.object({
7249
- asset: MediaAssetSchema
7250
- });
7251
- var UpdateMediaAssetRequestSchema = external_exports.object({
7252
- nameStem: external_exports.string().trim().min(1).max(200)
7253
- });
7254
- var UpdateMediaAssetResponseSchema = external_exports.object({
7255
- asset: MediaAssetSchema
7256
- });
7257
-
7258
- // ../contracts/src/dashboard/experiments.ts
7259
- var ExperimentStatusSchema = external_exports.enum([
7260
- "draft",
7261
- "running",
7262
- "pending_decision",
7263
- "stopped"
7264
- ]);
7265
- var VariantSchema = external_exports.object({
7266
- id: external_exports.string().uuid(),
7267
- experimentId: external_exports.string().uuid(),
7268
- name: external_exports.string().min(1),
7269
- weight: external_exports.number().int().positive(),
7270
- flowId: external_exports.string().uuid().nullable(),
7271
- versionId: external_exports.string().uuid().nullable(),
7272
- /** Convenience read fields populated by list/get endpoints. */
7273
- flowName: external_exports.string().nullable().optional(),
7274
- versionNumber: external_exports.number().int().positive().nullable().optional(),
7275
- versionLabel: external_exports.string().nullable().optional()
7276
- });
7277
- var ExperimentEndedReasonSchema = external_exports.enum([
7278
- "manual",
7279
- "scheduled_resolved"
7280
- ]);
7281
- var ExperimentSchema = external_exports.object({
7282
- id: external_exports.string().uuid(),
7283
- appId: external_exports.string().uuid(),
7284
- /** Internal channel uuid. */
7285
- channelId: external_exports.string().uuid(),
7286
- /** Display name of the channel (denormalized for list views). */
7287
- channelName: external_exports.string(),
7288
- /** Test/live env of the channel — kept for badges and analytics filters. */
7289
- channelEnvironment: external_exports.enum(ENVIRONMENTS),
7290
- name: external_exports.string(),
7291
- status: ExperimentStatusSchema,
7292
- variants: external_exports.array(VariantSchema),
7293
- startedAt: external_exports.string().datetime().nullable().optional(),
7294
- stoppedAt: external_exports.string().datetime().nullable().optional(),
7295
- endsAt: external_exports.string().datetime().nullable().optional(),
7296
- endedReason: ExperimentEndedReasonSchema.nullable().optional(),
7297
- archivedAt: external_exports.string().datetime().nullable().optional(),
7298
- createdAt: external_exports.string().datetime(),
7299
- /** Dashboard user who created the experiment (null for legacy rows). */
7300
- createdByUserId: external_exports.string().uuid().nullable().optional(),
7301
- /** Display: full name, else @username, else email; null when unknown. */
7302
- createdByLabel: external_exports.string().nullable().optional(),
7303
- tags: external_exports.array(external_exports.string()),
7304
- /** Power-analysis inputs; nulls → dashboard defaults for sample accumulation. */
7305
- statsDesignBaselineCvr: external_exports.number().nullable().optional(),
7306
- statsDesignMdePp: external_exports.number().nullable().optional(),
7307
- statsDesignAlpha: external_exports.number().nullable().optional(),
7308
- statsDesignPower: external_exports.number().nullable().optional()
7309
- });
7310
- var EXPERIMENT_STATS_DESIGN_DEFAULTS = {
7311
- statsDesignBaselineCvr: 0.342,
7312
- statsDesignMdePp: 3,
7313
- statsDesignAlpha: 0.05,
7314
- statsDesignPower: 0.8
7315
- };
7316
- var ExperimentStatsDesignInputSchema = external_exports.object({
7317
- statsDesignBaselineCvr: external_exports.number().min(1e-6).max(0.999999),
7318
- statsDesignMdePp: external_exports.number().min(0.01).max(50),
7319
- statsDesignAlpha: external_exports.number().min(1e-3).max(0.5),
7320
- statsDesignPower: external_exports.number().min(0.5).max(0.999)
7321
- });
7322
- var CreateExperimentRequestSchema = external_exports.object({
7323
- channelId: external_exports.string().uuid(),
7324
- name: external_exports.string().min(1),
7325
- /** Required auto-stop. Hour granularity is enforced server-side. */
7326
- endsAt: external_exports.string().datetime(),
7327
- tags: TagsSchemaOptional,
7328
- statsDesignBaselineCvr: external_exports.number().min(1e-6).max(0.999999).optional(),
7329
- statsDesignMdePp: external_exports.number().min(0.01).max(50).optional(),
7330
- statsDesignAlpha: external_exports.number().min(1e-3).max(0.5).optional(),
7331
- statsDesignPower: external_exports.number().min(0.5).max(0.999).optional()
7332
- });
7333
- var UpdateExperimentRequestSchema = external_exports.object({
7334
- name: external_exports.string().min(1).optional(),
7335
- channelId: external_exports.string().uuid().optional(),
7336
- endsAt: external_exports.string().datetime().optional(),
7337
- tags: TagsSchema.optional(),
7338
- statsDesignBaselineCvr: external_exports.number().min(1e-6).max(0.999999).optional(),
7339
- statsDesignMdePp: external_exports.number().min(0.01).max(50).optional(),
7340
- statsDesignAlpha: external_exports.number().min(1e-3).max(0.5).optional(),
7341
- statsDesignPower: external_exports.number().min(0.5).max(0.999).optional()
7342
- });
7343
- var ExtendExperimentRequestSchema = external_exports.object({
7344
- endsAt: external_exports.string().datetime()
7345
- });
7346
- var StopExperimentRequestSchema = external_exports.discriminatedUnion("kind", [
7347
- external_exports.object({ kind: external_exports.literal("variant"), variantId: external_exports.string().uuid() }),
7348
- external_exports.object({
7349
- kind: external_exports.literal("version"),
7350
- flowId: external_exports.string().uuid(),
7351
- versionId: external_exports.string().uuid()
7352
- })
7353
- ]);
7354
- var CreateVariantRequestSchema = external_exports.object({
7355
- weight: external_exports.number().int().positive(),
7356
- flowId: external_exports.string().uuid().optional(),
7357
- versionId: external_exports.string().uuid().optional()
7358
- });
7359
- var ReorderExperimentVariantsRequestSchema = external_exports.object({
7360
- variantIds: external_exports.array(external_exports.string().uuid()).min(1)
7361
- });
7362
- var UpdateExperimentStatusRequestSchema = external_exports.object({
7363
- status: ExperimentStatusSchema
7364
- });
7365
- var ListExperimentsResponseSchema = external_exports.object({
7366
- items: external_exports.array(ExperimentSchema)
7367
- });
7368
-
7369
- // ../contracts/src/dashboard/experimentStats.ts
7370
- var ExperimentArmStatsSchema = external_exports.object({
7371
- variantId: external_exports.string().uuid(),
7372
- name: external_exports.string(),
7373
- weight: external_exports.number().int().nonnegative(),
7374
- trafficShare: external_exports.number(),
7375
- /** Distinct users with ≥1 `flow_started` in the window. */
7376
- starts: external_exports.number().int().nonnegative(),
7377
- /** Distinct users with ≥1 `flow_completed` in the window. */
7378
- completes: external_exports.number().int().nonnegative(),
7379
- /** Distinct users with ≥1 `flow_abandoned` in the window. */
7380
- abandoningUsers: external_exports.number().int().nonnegative(),
7381
- /** abandoningUsers / starts when starts > 0, else 0. */
7382
- abandonRate: external_exports.number(),
7383
- /** Raw event counts (sessions), for debugging / power users. */
7384
- rawStarts: external_exports.number().int().nonnegative(),
7385
- rawCompletes: external_exports.number().int().nonnegative(),
7386
- /** Distinct-user completion rate (`completes / starts`). JSON field name is historical. */
7387
- conversionRate: external_exports.number(),
7388
- /** Wilson 95% CI bounds. */
7389
- ciLow: external_exports.number(),
7390
- ciHigh: external_exports.number(),
7391
- lift: external_exports.number().nullable(),
7392
- pValue: external_exports.number().nullable(),
7393
- significant: external_exports.boolean().nullable(),
7394
- /** (completion rate − control) in percentage points; null on control. */
7395
- liftAbsolutePp: external_exports.number().nullable(),
7396
- /** 95% CI for absolute completion-rate difference (treatment − control). */
7397
- liftDiffCiLow: external_exports.number().nullable(),
7398
- liftDiffCiHigh: external_exports.number().nullable()
7399
- });
7400
- var ExperimentFunnelStepSchema = external_exports.object({
7401
- stepId: external_exports.string(),
7402
- stepName: external_exports.string().nullable().optional(),
7403
- views: external_exports.number().int().nonnegative(),
7404
- completes: external_exports.number().int().nonnegative(),
7405
- skips: external_exports.number().int().nonnegative(),
7406
- dropoffs: external_exports.number().int().nonnegative()
7407
- });
7408
- var ExperimentAbandonStepRowSchema = external_exports.object({
7409
- variantId: external_exports.string().uuid(),
7410
- stepId: external_exports.string(),
7411
- stepName: external_exports.string().nullable().optional(),
7412
- users: external_exports.number().int().nonnegative()
7413
- });
7414
- var ExperimentSrmSchema = external_exports.object({
7415
- chiSquareStatistic: external_exports.number(),
7416
- pValue: external_exports.number().nullable(),
7417
- /** True when p < 0.01 (observed split unlikely vs configured weights). */
7418
- flagged: external_exports.boolean()
7419
- });
7420
- var ExperimentVariantFunnelSchema = external_exports.object({
7421
- variantId: external_exports.string().uuid(),
7422
- steps: external_exports.array(ExperimentFunnelStepSchema)
7423
- });
7424
- var ExperimentCohortRuleSchema = external_exports.discriminatedUnion("dimension", [
7425
- external_exports.object({ dimension: external_exports.literal("platform"), key: external_exports.string().min(1) }),
7426
- external_exports.object({ dimension: external_exports.literal("locale"), key: external_exports.string().min(1) }),
7427
- external_exports.object({ dimension: external_exports.literal("app_version"), key: external_exports.string().min(1) }),
7428
- external_exports.object({ dimension: external_exports.literal("experiment_variant"), key: external_exports.string().min(1) }),
7429
- external_exports.object({
7430
- dimension: external_exports.literal("custom_property"),
7431
- customKey: external_exports.string().regex(/^[A-Za-z0-9._-]{1,64}$/),
7432
- key: external_exports.string().min(1)
7433
- })
7434
- ]);
7435
- var ExperimentSampleAccumulationSchema = external_exports.object({
7436
- requiredPerArm: external_exports.number(),
7437
- /** ISO range used for accumulation starters (same analytics window as results; cohort filters apply). */
7438
- accumulationRangeStart: external_exports.string().datetime(),
7439
- accumulationRangeEnd: external_exports.string().datetime(),
7440
- comparisons: external_exports.number().int(),
7441
- alphaPerComparison: external_exports.number(),
7442
- familyAlpha: external_exports.number(),
7443
- baselineCvr: external_exports.number(),
7444
- mdePp: external_exports.number(),
7445
- power: external_exports.number(),
7446
- /** Distinct starters in the accumulation window (matches Results table when cohorts match). */
7447
- arms: external_exports.array(
7448
- external_exports.object({
7449
- variantId: external_exports.string().uuid(),
7450
- name: external_exports.string(),
7451
- observedStarters: external_exports.number().int(),
7452
- pctOfRequired: external_exports.number()
7453
- })
7454
- ),
7455
- allArmsAboveThreshold: external_exports.boolean()
7456
- });
7457
- var ExperimentResultsOverviewSchema = external_exports.object({
7458
- winningVariant: external_exports.object({ variantId: external_exports.string().uuid(), name: external_exports.string() }).nullable(),
7459
- /** Sum of distinct starters per arm in the selected stats window. */
7460
- totalSessions: external_exports.number().int().nonnegative(),
7461
- experimentTimelineLabel: external_exports.string().nullable(),
7462
- bestLift: external_exports.object({
7463
- variantId: external_exports.string().uuid(),
7464
- name: external_exports.string(),
7465
- absolutePp: external_exports.number(),
7466
- relativePct: external_exports.number()
7467
- }).nullable(),
7468
- assignmentBalance: external_exports.object({
7469
- pass: external_exports.boolean(),
7470
- pValue: external_exports.number().nullable(),
7471
- chiSquareStatistic: external_exports.number(),
7472
- threshold: external_exports.number()
7473
- }),
7474
- significanceEta: external_exports.object({
7475
- daysElapsedInclusive: external_exports.number().int().nullable(),
7476
- daysPlannedInclusive: external_exports.number().int().nullable(),
7477
- projectedTotalDays: external_exports.number().nullable(),
7478
- /** Positive = fewer days than planned window to reach projected end. */
7479
- aheadOfPlanDays: external_exports.number().nullable()
7480
- }).nullable()
7481
- });
7482
- var ExperimentStatsResponseSchema = external_exports.object({
7483
- rangeStart: external_exports.string().datetime(),
7484
- rangeEnd: external_exports.string().datetime(),
7485
- /** Active composite cohort (AND). Null when unsegmented. */
7486
- cohort: external_exports.array(ExperimentCohortRuleSchema).nullable(),
7487
- srm: ExperimentSrmSchema,
7488
- resultsOverview: ExperimentResultsOverviewSchema,
7489
- arms: external_exports.array(ExperimentArmStatsSchema),
7490
- abandonByStep: external_exports.array(ExperimentAbandonStepRowSchema),
7491
- funnel: external_exports.array(ExperimentVariantFunnelSchema),
7492
- sampleAccumulation: ExperimentSampleAccumulationSchema.optional()
7493
- });
7494
- var ExperimentCvrTimeseriesResponseSchema = external_exports.object({
7495
- keys: external_exports.array(external_exports.string()),
7496
- points: external_exports.array(
7497
- external_exports.object({
7498
- date: external_exports.string(),
7499
- conversionRates: external_exports.array(external_exports.union([external_exports.number(), external_exports.null()]))
7500
- })
7501
- )
7502
- });
7503
-
7504
- // ../contracts/src/dashboard/notifications.ts
7505
- var ExperimentEndedPayloadSchema = external_exports.object({
7506
- appId: external_exports.string().uuid(),
7507
- experimentId: external_exports.string().uuid(),
7508
- experimentName: external_exports.string(),
7509
- channelId: external_exports.string().uuid(),
7510
- channelName: external_exports.string(),
7511
- channelEnvironment: external_exports.enum(ENVIRONMENTS)
7512
- });
7513
- var NotificationKindSchema = external_exports.enum([
7514
- "experiment_ended_pick_winner",
7515
- "rollout_comment_mention",
7516
- "flow_comment_new",
7517
- "flow_comment_mention",
7518
- "flow_comment_reply"
7519
- ]);
7520
- var RolloutCommentMentionPayloadSchema = external_exports.object({
7521
- appId: external_exports.string().uuid(),
7522
- channelId: external_exports.string().uuid(),
7523
- requestId: external_exports.string().uuid(),
7524
- commentId: external_exports.string().uuid(),
7525
- authorUserId: external_exports.string().uuid(),
7526
- authorLabel: external_exports.string(),
7527
- channelName: external_exports.string(),
7528
- flowName: external_exports.string(),
7529
- snippet: external_exports.string()
7530
- });
7531
- var FlowCommentNotificationBasePayloadSchema = external_exports.object({
7532
- appId: external_exports.string().uuid(),
7533
- flowId: external_exports.string().uuid(),
7534
- flowName: external_exports.string(),
7535
- threadId: external_exports.string().uuid(),
7536
- messageId: external_exports.string().uuid(),
7537
- authorUserId: external_exports.string().uuid(),
7538
- authorLabel: external_exports.string(),
7539
- snippet: external_exports.string()
7540
- });
7541
- var FlowCommentNewPayloadSchema = FlowCommentNotificationBasePayloadSchema;
7542
- var FlowCommentMentionPayloadSchema = FlowCommentNotificationBasePayloadSchema;
7543
- var FlowCommentReplyPayloadSchema = FlowCommentNotificationBasePayloadSchema.extend({
7544
- parentMessageId: external_exports.string().uuid()
7545
- });
7546
- var NotificationBaseSchema = external_exports.object({
7547
- id: external_exports.string().uuid(),
7548
- readAt: external_exports.string().datetime().nullable(),
7549
- createdAt: external_exports.string().datetime()
7550
- });
7551
- var NotificationSchema = external_exports.discriminatedUnion("kind", [
7552
- NotificationBaseSchema.extend({
7553
- kind: external_exports.literal("experiment_ended_pick_winner"),
7554
- payload: ExperimentEndedPayloadSchema
7555
- }),
7556
- NotificationBaseSchema.extend({
7557
- kind: external_exports.literal("rollout_comment_mention"),
7558
- payload: RolloutCommentMentionPayloadSchema
7559
- }),
7560
- NotificationBaseSchema.extend({
7561
- kind: external_exports.literal("flow_comment_new"),
7562
- payload: FlowCommentNewPayloadSchema
7563
- }),
7564
- NotificationBaseSchema.extend({
7565
- kind: external_exports.literal("flow_comment_mention"),
7566
- payload: FlowCommentMentionPayloadSchema
7567
- }),
7568
- NotificationBaseSchema.extend({
7569
- kind: external_exports.literal("flow_comment_reply"),
7570
- payload: FlowCommentReplyPayloadSchema
7571
- })
7572
- ]);
7573
-
7574
- // ../contracts/src/workspaceCapabilities.ts
7575
- var WORKSPACE_ROLES = ["owner", "admin", "editor", "viewer"];
7576
- var WORKSPACE_CAPABILITIES = [
7577
- "org:read",
7578
- "billing:manage",
7579
- "workspace:delete",
7580
- "workspace:settings",
7581
- "app:settings",
7582
- "app:manage",
7583
- "member:invite",
7584
- "member:remove",
7585
- "member:role",
7586
- "ownership:transfer",
7587
- "flow:read",
7588
- "flow:edit",
7589
- "flow:publish",
7590
- "channel:read",
7591
- "channel:manage",
7592
- "experiment:read",
7593
- "experiment:manage",
7594
- "media:manage",
7595
- "ai:brand_extract",
7596
- "ai:translate",
7597
- "store:manage",
7598
- "analytics:read",
7599
- "customers:read",
7600
- "notifications:read",
7601
- "notifications:write",
7602
- "apiKey:manage",
7603
- /** Granted at runtime via workspace-access when the member may approve rollouts. */
7604
- "rollout:approve"
7605
- ];
7606
- var OWNER_CAPS = new Set(
7607
- WORKSPACE_CAPABILITIES.filter((c) => c !== "rollout:approve")
7608
- );
7609
- var caps = (...c) => new Set(c);
7610
- var ROLE_CAPABILITIES = {
7611
- admin: caps(
7612
- "org:read",
7613
- "workspace:settings",
7614
- "app:settings",
7615
- "app:manage",
7616
- "member:invite",
7617
- "member:remove",
7618
- "member:role",
7619
- "flow:read",
7620
- "flow:edit",
7621
- "flow:publish",
7622
- "channel:read",
7623
- "channel:manage",
7624
- "experiment:read",
7625
- "experiment:manage",
7626
- "media:manage",
7627
- "ai:brand_extract",
7628
- "ai:translate",
7629
- "store:manage",
7630
- "analytics:read",
7631
- "customers:read",
7632
- "notifications:read",
7633
- "notifications:write"
7634
- ),
7635
- editor: caps(
7636
- "org:read",
7637
- "flow:read",
7638
- "flow:edit",
7639
- "flow:publish",
7640
- "channel:read",
7641
- "channel:manage",
7642
- "experiment:read",
7643
- "experiment:manage",
7644
- "media:manage",
7645
- "ai:brand_extract",
7646
- "ai:translate",
7647
- "store:manage",
7648
- "analytics:read",
7649
- "customers:read",
7650
- "notifications:read",
7651
- "notifications:write"
7652
- ),
7653
- viewer: caps(
7654
- "org:read",
7655
- "flow:read",
7656
- "channel:read",
7657
- "experiment:read",
7658
- "analytics:read",
7659
- "customers:read",
7660
- "notifications:read",
7661
- "notifications:write"
7662
- )
7663
- };
7664
-
7665
- // ../contracts/src/dashboard/workspace.ts
7666
- var WorkspaceMemberRowSchema = external_exports.object({
7667
- userId: external_exports.string().uuid(),
7668
- email: external_exports.string(),
7669
- /** Same display rule as rollout requester labels. */
7670
- label: external_exports.string(),
7671
- workspaceRole: external_exports.enum(WORKSPACE_ROLES),
7672
- createdAt: external_exports.string()
7673
- });
7674
- var ListWorkspaceMembersResponseSchema = external_exports.object({
7675
- items: external_exports.array(WorkspaceMemberRowSchema)
7676
- });
7677
- var ListNotificationsResponseSchema = external_exports.object({
7678
- items: external_exports.array(NotificationSchema),
7679
- unreadCount: external_exports.number().int().nonnegative()
7680
- });
7681
- var AnalyticsRangeSchema = external_exports.object({
7682
- flowId: external_exports.string().uuid(),
7683
- environment: external_exports.enum(ENVIRONMENTS),
7684
- startDate: external_exports.string().datetime(),
7685
- endDate: external_exports.string().datetime(),
7686
- filters: external_exports.object({
7687
- platform: external_exports.array(external_exports.string()).optional(),
7688
- locale: external_exports.array(external_exports.string()).optional(),
7689
- variantId: external_exports.array(external_exports.string()).optional(),
7690
- customProperties: external_exports.record(external_exports.string(), external_exports.string()).optional()
7691
- }).optional()
7692
- });
7693
- var FunnelResponseSchema = external_exports.object({
7694
- steps: external_exports.array(
7695
- external_exports.object({
7696
- stepId: external_exports.string(),
7697
- views: external_exports.number().int().nonnegative(),
7698
- completes: external_exports.number().int().nonnegative(),
7699
- skips: external_exports.number().int().nonnegative(),
7700
- dropoffs: external_exports.number().int().nonnegative()
7701
- })
7702
- ),
7703
- totalStarts: external_exports.number().int().nonnegative(),
7704
- totalCompletes: external_exports.number().int().nonnegative()
7705
- });
7706
- var ResponseBreakdownSchema = external_exports.object({
7707
- fields: external_exports.array(
7708
- external_exports.object({
7709
- stepId: external_exports.string(),
7710
- fieldKey: external_exports.string(),
7711
- values: external_exports.array(
7712
- external_exports.object({
7713
- value: external_exports.string(),
7714
- count: external_exports.number().int().nonnegative()
7715
- })
7716
- )
7717
- })
7718
- )
7719
- });
7720
-
7721
- // ../contracts/src/dashboard/analytics.ts
7722
- var RoleSchema = external_exports.enum(ROLES);
7723
- var MembershipSchema = external_exports.object({
7724
- userId: external_exports.string().uuid(),
7725
- orgId: external_exports.string().uuid(),
7726
- role: RoleSchema
7727
- });
7728
-
7729
- // ../contracts/src/dashboard/onboardingChecklist.ts
7730
- var ONBOARDING_TASK_IDS = ["sdk_events"];
7731
- var OnboardingTaskIdSchema = external_exports.enum(ONBOARDING_TASK_IDS);
7732
- var OnboardingTaskStatusSchema = external_exports.enum(["pending", "done", "unknown"]);
7733
- var OnboardingTaskCompletionSourceSchema = external_exports.enum(["auto", "manual"]).nullable();
7734
- var OnboardingTaskActionSchema = external_exports.object({
7735
- docsHref: external_exports.string().url().optional(),
7736
- keysHref: external_exports.string().optional(),
7737
- verifyable: external_exports.boolean().optional()
7738
- });
7739
- var OnboardingTaskSchema = external_exports.object({
7740
- id: OnboardingTaskIdSchema,
7741
- title: external_exports.string(),
7742
- description: external_exports.string(),
7743
- status: OnboardingTaskStatusSchema,
7744
- completionSource: OnboardingTaskCompletionSourceSchema,
7745
- action: OnboardingTaskActionSchema.optional()
7746
- });
7747
- var OnboardingChecklistFocusAppSchema = external_exports.object({
7748
- id: external_exports.string().uuid(),
7749
- name: external_exports.string()
7750
- });
7751
- var OnboardingChecklistResponseSchema = external_exports.object({
7752
- tasks: external_exports.array(OnboardingTaskSchema),
7753
- completedCount: external_exports.number().int().nonnegative(),
7754
- totalCount: external_exports.number().int().nonnegative(),
7755
- focusApp: OnboardingChecklistFocusAppSchema.nullable(),
7756
- dismissed: external_exports.boolean(),
7757
- eligible: external_exports.boolean()
7758
- });
7759
- var OnboardingTaskVerifyResponseSchema = external_exports.object({
7760
- task: OnboardingTaskSchema
7761
- });
7762
- var OnboardingTaskCompleteResponseSchema = external_exports.object({
7763
- task: OnboardingTaskSchema
7764
- });
7765
- var OnboardingChecklistDismissResponseSchema = external_exports.object({
7766
- ok: external_exports.literal(true)
7767
- });
7768
6459
 
7769
6460
  // ../contracts/src/sdk.ts
7770
6461
  var SdkResolveRequestSchema = external_exports.object({
@@ -7898,11 +6589,85 @@ var IapPurchaseStoredPropertiesSchema = IapPurchaseEventPropertiesSchema.innerTy
7898
6589
  fx_unavailable: external_exports.boolean().optional()
7899
6590
  });
7900
6591
 
7901
- // ../contracts/src/experiment-sample-size.ts
7902
- var DEFAULT_STATS_BASELINE_CVR = EXPERIMENT_STATS_DESIGN_DEFAULTS.statsDesignBaselineCvr;
7903
- var DEFAULT_STATS_MDE_PP = EXPERIMENT_STATS_DESIGN_DEFAULTS.statsDesignMdePp;
7904
- var DEFAULT_STATS_FAMILY_ALPHA = EXPERIMENT_STATS_DESIGN_DEFAULTS.statsDesignAlpha;
7905
- var DEFAULT_STATS_POWER = EXPERIMENT_STATS_DESIGN_DEFAULTS.statsDesignPower;
6592
+ // ../contracts/src/canvasEditorGates.ts
6593
+ var CanvasEditorGatesResolvedSchema = external_exports.object({
6594
+ lottie: external_exports.boolean(),
6595
+ oauthLogin: external_exports.boolean(),
6596
+ oauthProviderPreset: external_exports.boolean(),
6597
+ oauthProviderCustom: external_exports.boolean(),
6598
+ emailPasswordAuth: external_exports.boolean(),
6599
+ emailPasswordField: external_exports.boolean(),
6600
+ emailPasswordSubmit: external_exports.boolean(),
6601
+ requestOsPermission: external_exports.boolean()
6602
+ });
6603
+ var ALL_TRUE = {
6604
+ lottie: true,
6605
+ oauthLogin: true,
6606
+ oauthProviderPreset: true,
6607
+ oauthProviderCustom: true,
6608
+ emailPasswordAuth: true,
6609
+ emailPasswordField: true,
6610
+ emailPasswordSubmit: true,
6611
+ requestOsPermission: true
6612
+ };
6613
+ var CanvasEditorGatesPatchSchema = external_exports.object({
6614
+ lottie: external_exports.boolean().optional(),
6615
+ oauthLogin: external_exports.boolean().optional(),
6616
+ oauthProviderPreset: external_exports.boolean().optional(),
6617
+ oauthProviderCustom: external_exports.boolean().optional(),
6618
+ emailPasswordAuth: external_exports.boolean().optional(),
6619
+ emailPasswordField: external_exports.boolean().optional(),
6620
+ emailPasswordSubmit: external_exports.boolean().optional(),
6621
+ requestOsPermission: external_exports.boolean().optional()
6622
+ }).strict();
6623
+ var parseCanvasEditorGates = (raw) => {
6624
+ if (raw == null) return { ...ALL_TRUE };
6625
+ const parsed = CanvasEditorGatesPatchSchema.safeParse(raw);
6626
+ if (!parsed.success) return { ...ALL_TRUE };
6627
+ return { ...ALL_TRUE, ...parsed.data };
6628
+ };
6629
+ var layerViolationMessage = (screenId, layerId, label) => `Screen "${screenId}": ${label} (layer "${layerId}") is disabled for this app in canvas editor settings.`;
6630
+ var buttonOsPermissionMessage = (screenId, layerId) => `Screen "${screenId}": request OS permission button actions are disabled for this app (layer "${layerId}").`;
6631
+ var collectCanvasGateViolations = (manifest, gates) => {
6632
+ const issues = [];
6633
+ for (const screen of manifest.screens) {
6634
+ walkScreenLayers(screen, (l) => {
6635
+ if ((l.kind === "lottie" || l.kind === "video") && !gates.lottie) {
6636
+ issues.push(
6637
+ layerViolationMessage(
6638
+ screen.id,
6639
+ l.id,
6640
+ l.kind === "video" ? "Video layers" : "Lottie layers"
6641
+ )
6642
+ );
6643
+ }
6644
+ if (l.kind === "oauth_login" && !gates.oauthLogin) {
6645
+ issues.push(layerViolationMessage(screen.id, l.id, "OAuth login layers"));
6646
+ }
6647
+ if (l.kind === "oauth_provider") {
6648
+ if (l.variant === "preset" && !gates.oauthProviderPreset) {
6649
+ issues.push(layerViolationMessage(screen.id, l.id, "OAuth provider (preset) layers"));
6650
+ }
6651
+ if (l.variant === "custom" && !gates.oauthProviderCustom) {
6652
+ issues.push(layerViolationMessage(screen.id, l.id, "OAuth provider (custom) layers"));
6653
+ }
6654
+ }
6655
+ if (l.kind === "email_password_auth" && !gates.emailPasswordAuth) {
6656
+ issues.push(layerViolationMessage(screen.id, l.id, "Email/password auth layers"));
6657
+ }
6658
+ if (l.kind === "email_password_field" && !gates.emailPasswordField) {
6659
+ issues.push(layerViolationMessage(screen.id, l.id, "Email/password field layers"));
6660
+ }
6661
+ if (l.kind === "email_password_submit" && !gates.emailPasswordSubmit) {
6662
+ issues.push(layerViolationMessage(screen.id, l.id, "Email/password submit layers"));
6663
+ }
6664
+ if (l.kind === "button" && l.action.kind === "request_os_permission" && !gates.requestOsPermission) {
6665
+ issues.push(buttonOsPermissionMessage(screen.id, l.id));
6666
+ }
6667
+ });
6668
+ }
6669
+ return issues;
6670
+ };
7906
6671
 
7907
6672
  // ../flow-runtime/src/validation.ts
7908
6673
  var validateManifest = (data) => {