@gravity-rail/sdk 0.45.0 → 0.46.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types/generated/addon.ts","../src/types/generated/session.ts","../src/types/generated/customer_activity.ts","../src/types/generated/phi_posture.ts","../src/types/generated/workspace.ts","../src/types/generated/metric.ts","../src/types/generated/pilot_program.ts"],"sourcesContent":["/**\n * Generated by Orval, grouped by scripts/types-codegen/group_generated.ts\n * (group map from emit_openapi.py). Do not edit manually.\n * Group: addon\n */\n\nimport type { PlanConfig } from './billing';\n\n/**\n * The result of one attach or detach.\n *\n * ``featuresSynced`` is reported rather than assumed: billing is the\n * durable half and the feature reconciliation is repairable, so a failed\n * resync must not roll back a completed purchase — but the client has to be\n * able to tell the difference.\n */\nexport interface AddonMutationResponse {\n productId: number;\n subscriptionItemId: number;\n scope: AddonMutationResponseScope;\n workspaceUuid?: string | null;\n providesFeatures: string[];\n featuresSynced: boolean;\n syncedWorkspaceUuids: string[];\n}\n\nexport type AddonMutationResponseScope = typeof AddonMutationResponseScope[keyof typeof AddonMutationResponseScope];\n\n\nexport const AddonMutationResponseScope = {\n organization: 'organization',\n workspace: 'workspace',\n} as const;\n\n/**\n * Buy one add-on for an organization, optionally scoped to a workspace.\n *\n * ``extra=\"forbid\"`` because this is a billing mutation: a misspelled field\n * that silently does nothing would charge the customer for a scope they did\n * not ask for.\n */\nexport interface AttachAddonRequest {\n /**\n * ID of the add-on product to attach\n * @exclusiveMinimum 0\n */\n productId: number;\n /** Workspace to scope the add-on to. Omit for an organization-wide add-on, which every workspace in the organization inherits. */\n workspaceUuid?: string | null;\n}\n\n/**\n * One add-on in an organization's catalogue, with its attachment state.\n */\nexport interface OrganizationAddonResponse {\n id: number;\n productId: number;\n name: string;\n tagline?: string | null;\n description: string;\n icon?: string | null;\n color?: string | null;\n providesFeatures: string[];\n requiresFeatures: string[];\n plans?: OrganizationAddonResponsePlans;\n priceCents?: number | null;\n /** Whether this add-on can be attached right now: self-service, not archived, and carrying a Stripe price for the organization's billing period. */\n purchasable: boolean;\n attached: boolean;\n scope?: OrganizationAddonResponseScope;\n workspaceUuid?: string | null;\n workspaceName?: string | null;\n subscriptionItemId?: number | null;\n}\n\nexport type OrganizationAddonResponsePlans = {[key: string]: PlanConfig} | null;\n\nexport type OrganizationAddonResponseScope = typeof OrganizationAddonResponseScope[keyof typeof OrganizationAddonResponseScope] | null;\n\n\nexport const OrganizationAddonResponseScope = {\n organization: 'organization',\n workspace: 'workspace',\n} as const;\n\n/**\n * The organization's add-on catalogue and what it currently owns.\n *\n * An ENVELOPE, never a bare list. ``canManage`` is why: it is the only way a\n * client can render a correct read-only state for a member who may see the\n * catalogue but not buy from it. A bare array would force the client to guess\n * at billing privilege and offer an attach button that 403s.\n */\nexport interface OrganizationAddonsResponse {\n organizationUuid: string;\n subscriptionId?: number | null;\n planPeriod?: string | null;\n canManage: boolean;\n canAttach: boolean;\n addons: OrganizationAddonResponse[];\n}\n","/**\n * Generated by Orval, grouped by scripts/types-codegen/group_generated.ts\n * (group map from emit_openapi.py). Do not edit manually.\n * Group: session\n */\n\n\n/**\n * ``{token, sessionKind, expiresAt}`` as sign-in and exchange responses carry it.\n */\nexport interface MintedSessionFields {\n token: string;\n sessionKind: SessionKind;\n expiresAt: string;\n}\n\n/**\n * What ``describe_session_token`` reports about a presented session.\n *\n * ``accountUuid`` / ``switchedFromAccountUuid`` let the frontend check that an\n * account-switch stash belongs to the account that switched (the restore in\n * ``/api/auth/end-temp-session``). Both describe a token the caller already\n * holds.\n */\nexport interface SessionDescription {\n sessionKind: SessionKind;\n expiresAt: string;\n accountUuid?: string | null;\n switchedFromAccountUuid?: string | null;\n}\n\n/**\n * The kind of session a cookie carries, and the kind of host that reads it.\n */\nexport type SessionKind = typeof SessionKind[keyof typeof SessionKind];\n\n\nexport const SessionKind = {\n account: 'account',\n site: 'site',\n} as const;\n","/**\n * Generated by Orval, grouped by scripts/types-codegen/group_generated.ts\n * (group map from emit_openapi.py). Do not edit manually.\n * Group: customer_activity\n */\n\n\n/**\n * PHI-free aggregate over ALL rows matching the filters (not a page).\n *\n * Counts, ages in hours, thresholds and identifiers only — no titles, review\n * notes, classifier feedback, subject labels, member data or message content\n * is read or returned.\n */\nexport interface CustomerActivityBacklogSummaryResponse {\n generatedAt: string;\n queryVersion: string;\n filters: CustomerActivitySummaryFilters;\n totalCount: number;\n backlogCount: number;\n reviewedCount: number;\n unclassifiedCount?: number;\n oldestBacklogCreatedAt?: string | null;\n oldestBacklogAgeHours?: number | null;\n byStatus: CustomerActivityStatusBucket[];\n bySeverity: CustomerActivitySeverityBucket[];\n bySource: CustomerActivitySourceBucket[];\n throughput: CustomerActivityThroughputWindow[];\n sla: CustomerActivitySlaSummary;\n}\n\n/**\n * What the blind sample of one detector version holds.\n *\n * All three counts leave out events whose outcome is test activity.\n * ``sampleRecorded`` counts the events the detector recorded for a subject it\n * judged clean. ``sampleReviewed`` counts those that carry a reviewer verdict\n * on the ``labels`` claim. ``sampleWithMiss`` counts the reviewed ones where\n * the reviewer added at least one label.\n */\nexport interface CustomerActivityClassifierBlindSample {\n detectorVersion?: string | null;\n sampleRecorded: number;\n sampleReviewed: number;\n sampleWithMiss: number;\n}\n\nexport interface CustomerActivityClassifierDefinitionResponse {\n detectorName: CustomerActivityClassifierDetectorName;\n subjectType: string;\n labels: CustomerActivityClassifierLabel[];\n}\n\nexport type CustomerActivityClassifierDetectorName = typeof CustomerActivityClassifierDetectorName[keyof typeof CustomerActivityClassifierDetectorName];\n\n\nexport const CustomerActivityClassifierDetectorName = {\n assignment_chat_classifier: 'assignment_chat_classifier',\n manager_chat_classifier: 'manager_chat_classifier',\n concierge_chat_classifier: 'concierge_chat_classifier',\n chat_review: 'chat_review',\n a2p_agent_inferred_stop: 'a2p_agent_inferred_stop',\n} as const;\n\nexport type CustomerActivityClassifierLabel = typeof CustomerActivityClassifierLabel[keyof typeof CustomerActivityClassifierLabel];\n\n\nexport const CustomerActivityClassifierLabel = {\n user_distress: 'user_distress',\n user_confusion: 'user_confusion',\n health_topic_mentioned: 'health_topic_mentioned',\n health_advice_given: 'health_advice_given',\n escalation_failure: 'escalation_failure',\n repeated_tool_failure: 'repeated_tool_failure',\n transcription_quality: 'transcription_quality',\n repetitive_loop: 'repetitive_loop',\n manager_no_response: 'manager_no_response',\n manager_incomplete_task: 'manager_incomplete_task',\n docs_or_skill_gap: 'docs_or_skill_gap',\n discovery_thrash: 'discovery_thrash',\n manager_language_mismatch: 'manager_language_mismatch',\n} as const;\n\n/**\n * Reviewer verdicts on one label, for one detector version.\n *\n * ``flagged`` counts events the classifier recorded with the label.\n * ``reviewed`` counts the flagged events that carry a reviewer verdict on the\n * ``labels`` claim (test activity excluded); each of those is either\n * ``confirmed`` (the reviewer kept the label) or ``rejected`` (the reviewer\n * removed it). ``addedByReviewer`` counts judged events where the reviewer\n * added a label the classifier did not predict.\n *\n * ``precision`` is ``confirmed / (confirmed + rejected)`` with a Wilson 95%\n * interval; all three are ``None`` when no flagged event has a verdict, which\n * is a different fact from a precision of zero.\n *\n * ``addedOnSample`` is the part of ``addedByReviewer`` that sits on\n * blind-sample events. ``estimatedMissed`` is ``addedOnSample`` times the\n * response's ``blindSampleRateN``, and ``recall`` is\n * ``confirmed / (confirmed + estimatedMissed)``. Both are ``None`` when the\n * version has no blind-sample event with a verdict, and ``recall`` is also\n * ``None`` when ``confirmed + estimatedMissed`` is zero.\n */\nexport interface CustomerActivityClassifierLabelQuality {\n detectorVersion?: string | null;\n label: CustomerActivityClassifierLabel;\n flagged: number;\n reviewed: number;\n confirmed: number;\n rejected: number;\n addedByReviewer: number;\n precision?: number | null;\n precisionLow?: number | null;\n precisionHigh?: number | null;\n addedOnSample: number;\n estimatedMissed?: number | null;\n recall?: number | null;\n}\n\n/**\n * PHI-free reviewer-verdict aggregate for one classifier detector.\n *\n * Counts, ratios, closed-vocabulary labels and detector versions only — no\n * event id, title, review note or feedback note is returned.\n * ``eventsReviewed`` counts every event with a reviewer verdict on the\n * ``labels`` claim, test activity excluded. A row's ``reviewed`` applies that\n * same test and also requires the row's label among the predicted labels, so\n * a judged event with no predicted label is in ``eventsReviewed`` and in no\n * row's ``reviewed``.\n *\n * ``blindSampleRateN`` is the one-in-N rate at which the detector records the\n * subjects it judges clean, ``None`` for a detector that records no such\n * sample. ``blindSample`` has one entry per detector version that recorded a\n * sample event other than test activity.\n */\nexport interface CustomerActivityClassifierQualityResponse {\n generatedAt: string;\n detectorName: CustomerActivityClassifierDetectorName;\n createdAfter?: string | null;\n eventsTotal: number;\n eventsReviewed: number;\n blindSampleRateN?: number | null;\n blindSample: CustomerActivityClassifierBlindSample[];\n rows: CustomerActivityClassifierLabelQuality[];\n}\n\nexport interface CustomerActivityClassifiersResponse {\n assignmentChatClassifier: CustomerActivityClassifierDefinitionResponse;\n managerChatClassifier: CustomerActivityClassifierDefinitionResponse;\n conciergeChatClassifier: CustomerActivityClassifierDefinitionResponse;\n}\n\nexport interface CustomerActivityEventListResponse {\n items: CustomerActivityEventResponse[];\n total: number;\n page: number;\n pageSize: number;\n totalPages: number;\n}\n\n/**\n * Admin/operator view of one customer-activity event.\n *\n * The list response remains free of operator-authored text. The single-event\n * detail response may include ``reviewNote`` and ``classifierFeedback`` for the\n * internal review workflow.\n */\nexport interface CustomerActivityEventResponse {\n id: number;\n uuid: string;\n accountId?: number | null;\n accountName?: string | null;\n organizationId?: number | null;\n organizationName?: string | null;\n workspaceId?: number | null;\n workspaceName?: string | null;\n subjectType: string;\n subjectRef: string;\n subjectMessageRef?: string | null;\n title?: string | null;\n labels: string[];\n severity: CustomerActivitySeverity;\n confidence?: number | null;\n score?: number | null;\n source: CustomerActivityEventSource;\n dedupeKey?: string | null;\n detectorName?: CustomerActivityClassifierDetectorName | null;\n detectorVersion?: string | null;\n modelId?: string | null;\n promptVersion?: string | null;\n traceId?: string | null;\n status: CustomerActivityEventStatus;\n reviewOutcome?: CustomerActivityReviewOutcome | null;\n reviewNote?: string | null;\n classifierFeedback?: CustomerActivityEventResponseClassifierFeedback;\n linkUrl?: string | null;\n reviewedByAccountId?: number | null;\n reviewedByName?: string | null;\n reviewedAt?: string | null;\n supportRequestId?: number | null;\n resourceId?: number | null;\n workspaceUuid?: string | null;\n chatClassifierPrompt?: string | null;\n subjectTitle?: string | null;\n subjectSubtitle?: string | null;\n createdAt: string;\n updatedAt: string;\n}\n\nexport type CustomerActivityEventResponseClassifierFeedback = { [key: string]: unknown } | null;\n\nexport type CustomerActivityEventSource = typeof CustomerActivityEventSource[keyof typeof CustomerActivityEventSource];\n\n\nexport const CustomerActivityEventSource = {\n system: 'system',\n customer: 'customer',\n classifier: 'classifier',\n operator: 'operator',\n} as const;\n\nexport type CustomerActivityEventStatus = typeof CustomerActivityEventStatus[keyof typeof CustomerActivityEventStatus];\n\n\nexport const CustomerActivityEventStatus = {\n new: 'new',\n reviewed: 'reviewed',\n} as const;\n\nexport type CustomerActivityReviewOutcome = typeof CustomerActivityReviewOutcome[keyof typeof CustomerActivityReviewOutcome];\n\n\nexport const CustomerActivityReviewOutcome = {\n no_action_needed: 'no_action_needed',\n support_request_created: 'support_request_created',\n bug_filed: 'bug_filed',\n linked_existing_work: 'linked_existing_work',\n classifier_feedback: 'classifier_feedback',\n test_activity: 'test_activity',\n a2p_suppression_reversed: 'a2p_suppression_reversed',\n} as const;\n\nexport type CustomerActivitySeverity = typeof CustomerActivitySeverity[keyof typeof CustomerActivitySeverity];\n\n\nexport const CustomerActivitySeverity = {\n none: 'none',\n minimal: 'minimal',\n low: 'low',\n medium: 'medium',\n high: 'high',\n critical: 'critical',\n} as const;\n\nexport interface CustomerActivitySeverityBucket {\n severity: CustomerActivitySeverity;\n backlogCount: number;\n reviewedCount: number;\n oldestBacklogAgeHours?: number | null;\n}\n\n/**\n * Open (unreviewed) events at one severity past their review threshold.\n *\n * ``thresholdSource`` travels with the threshold it describes: a breach count\n * must never be readable without both the number that produced it and whether\n * that number is ratified policy or a provisional default.\n */\nexport interface CustomerActivitySlaBucket {\n severity: CustomerActivitySeverity;\n thresholdHours: number;\n thresholdSource: CustomerActivitySlaThresholdSource;\n breachCount: number;\n oldestBacklogAgeHours?: number | null;\n}\n\nexport interface CustomerActivitySlaSummary {\n buckets: CustomerActivitySlaBucket[];\n totalBreachCount: number;\n}\n\n/**\n * Where ONE severity's SLA threshold came from.\n *\n * ``default`` = the provisional in-repo default (see\n * ``lib/services/customer_activity_metrics.py``); ``request`` = the caller\n * supplied it. Tracked per severity rather than per response so that\n * overriding one threshold cannot make the other read as caller-supplied\n * policy when it is still an unratified default.\n */\nexport type CustomerActivitySlaThresholdSource = typeof CustomerActivitySlaThresholdSource[keyof typeof CustomerActivitySlaThresholdSource];\n\n\nexport const CustomerActivitySlaThresholdSource = {\n default: 'default',\n request: 'request',\n} as const;\n\nexport interface CustomerActivitySourceBucket {\n source: CustomerActivityEventSource;\n backlogCount: number;\n reviewedCount: number;\n}\n\nexport interface CustomerActivityStatusBucket {\n status: CustomerActivityEventStatus;\n count: number;\n}\n\n/**\n * Echo of the filters the aggregate was computed under.\n *\n * Identifiers, closed-vocabulary enums and the open-vocabulary\n * ``subjectType`` only — so an exported aggregate carries its own scope and\n * can never be mistaken for a whole-queue figure.\n */\nexport interface CustomerActivitySummaryFilters {\n status?: CustomerActivityEventStatus | null;\n subjectType?: string | null;\n source?: CustomerActivityEventSource | null;\n severity?: CustomerActivitySeverity | null;\n reviewOutcome?: CustomerActivityReviewOutcome | null;\n detectorName?: CustomerActivityClassifierDetectorName | null;\n workspaceId?: number | null;\n organizationId?: number | null;\n accountId?: number | null;\n}\n\n/**\n * Adjudication throughput over a trailing window.\n *\n * ``recordedCount`` counts events created in the window; ``reviewedCount``\n * counts events whose review verdict was recorded in it (``reviewed_at``).\n * Reopening an event clears ``reviewed_at``, so the pair reads as \"arrived vs\n * currently-adjudicated\", and arrival outpacing adjudication is exactly the\n * growing-backlog signal.\n */\nexport interface CustomerActivityThroughputWindow {\n windowHours: number;\n recordedCount: number;\n reviewedCount: number;\n}\n","/**\n * Generated by Orval, grouped by scripts/types-codegen/group_generated.ts\n * (group map from emit_openapi.py). Do not edit manually.\n * Group: phi_posture\n */\n\nimport type { DeclaredDataUse } from './organization';\nimport type { PhiDataPolicy, PhiPostureDecision, PhiPostureReasonCode } from './workspace';\n\n/**\n * Whether an ``App`` has been reviewed as fit to carry PHI (ADR-18 §2a).\n *\n * Distinct from ``Builder.is_verified``, which is a display badge on the\n * consent screen: \"we know who published this\" is a weaker claim than \"this\n * app may carry patient data\". Superuser-set and provenance-carrying (a\n * non-:attr:`UNREVIEWED` row must name a reviewer and a review time — the\n * same CHECK-constraint discipline as the workspace posture columns).\n *\n * :attr:`UNREVIEWED` is the system default and means only \"no approval on\n * file\"; :attr:`PHI_DENIED` is an active decision that the app must not carry\n * PHI even where a customer attestation would otherwise lift the restriction.\n */\nexport type AppPhiReviewStatus = typeof AppPhiReviewStatus[keyof typeof AppPhiReviewStatus];\n\n\nexport const AppPhiReviewStatus = {\n unreviewed: 'unreviewed',\n phi_approved: 'phi_approved',\n phi_denied: 'phi_denied',\n} as const;\n\nexport type PhiPolicyReason = typeof PhiPolicyReason[keyof typeof PhiPolicyReason];\n\n\nexport const PhiPolicyReason = {\n initial_classification: 'initial_classification',\n customer_confirmation: 'customer_confirmation',\n agreement_verified: 'agreement_verified',\n scope_change: 'scope_change',\n periodic_review: 'periodic_review',\n correction: 'correction',\n incident_response: 'incident_response',\n} as const;\n\nexport type PhiPolicySource = typeof PhiPolicySource[keyof typeof PhiPolicySource];\n\n\nexport const PhiPolicySource = {\n customer_attestation: 'customer_attestation',\n contract_review: 'contract_review',\n staff_review: 'staff_review',\n legacy_inventory: 'legacy_inventory',\n} as const;\n\nexport interface PhiPostureFinding {\n reasonCode: PhiPostureReasonCode;\n organizationId: number;\n workspaceId?: number | null;\n workspaceUuid?: string | null;\n decision: PhiPostureDecision;\n}\n\nexport interface PhiPostureReportResponse {\n generatedAt: string;\n organizationCount: number;\n workspaceCount: number;\n findingCount: number;\n offset: number;\n limit: number;\n nextOffset?: number | null;\n findings: PhiPostureFinding[];\n truncated: boolean;\n}\n\nexport interface PhiPostureTransitionResponse {\n targetType: PhiPostureTransitionResponseTargetType;\n organizationId: number;\n workspaceId?: number | null;\n workspaceUuid?: string | null;\n declaredDataUse?: DeclaredDataUse | null;\n phiDataPolicy?: PhiDataPolicy | null;\n decision?: PhiPostureDecision | null;\n reasonCode?: PhiPostureReasonCode | null;\n policyVersion: string;\n source: string;\n reason: string;\n reviewedAt: string;\n reviewedByAccountId: number;\n reviewDueAt: string;\n}\n\nexport type PhiPostureTransitionResponseTargetType = typeof PhiPostureTransitionResponseTargetType[keyof typeof PhiPostureTransitionResponseTargetType];\n\n\nexport const PhiPostureTransitionResponseTargetType = {\n organization: 'organization',\n workspace: 'workspace',\n} as const;\n\nexport interface UpdateOrganizationPhiPostureRequest {\n /**\n * @minLength 1\n * @maxLength 64\n */\n policyVersion: string;\n source: PhiPolicySource;\n reason: PhiPolicyReason;\n reviewDueAt: string;\n declaredDataUse: DeclaredDataUse;\n}\n\nexport interface UpdateWorkspacePhiPolicyRequest {\n /**\n * @minLength 1\n * @maxLength 64\n */\n policyVersion: string;\n source: PhiPolicySource;\n reason: PhiPolicyReason;\n reviewDueAt: string;\n phiDataPolicy: PhiDataPolicy;\n}\n","/**\n * Generated by Orval, grouped by scripts/types-codegen/group_generated.ts\n * (group map from emit_openapi.py). Do not edit manually.\n * Group: workspace\n */\n\nimport type { Query } from './ir';\n\n/**\n * Superuser request to bring a workspace's seeded roles to canonical form.\n *\n * The body is required even for a dry run, and is deliberately not a query\n * parameter: a cookie-authenticated POST with no body is forgeable by a\n * cross-site HTML form (see ``tests/lint/test_csrf_bodyless_mutation_lint.py``),\n * and requiring a JSON body forces a forgery into a 422.\n */\nexport interface AdminCanonicalizeMemberRolesRequest {\n apply?: boolean;\n}\n\n/**\n * Admin request to create a user's membership in a workspace.\n */\nexport interface AdminCreateWorkspaceMemberRequest {\n memberRoleId?: number | null;\n}\n\n/**\n * Request model for admin workspace operations.\n */\nexport interface AdminCreateWorkspaceRequest {\n organizationId: number;\n name?: string | null;\n slug?: string | null;\n signupCode?: string | null;\n isPublic?: boolean | null;\n allowSignup?: boolean | null;\n resellerId?: number | null;\n templateWorkspaceUuid?: string | null;\n locale?: string | null;\n features?: string[] | null;\n chatClassifierPrompt?: string | null;\n}\n\n/**\n * Admin request to map a site to a workspace.\n */\nexport interface AdminMapSiteRequest {\n workspaceId?: number | null;\n siteUuid: string;\n name?: string | null;\n siteSlug?: string | null;\n externalDomain?: string | null;\n ownerId?: number | null;\n allowSignup?: boolean;\n}\n\n/**\n * Response model for site mappings.\n */\nexport interface AdminSiteMappingResponse {\n id: number;\n siteId: number;\n siteUuid: string;\n siteName: string;\n siteSlug: string;\n externalDomain?: string | null;\n workspaceId: number;\n workspaceUuid: string;\n workspaceName: string;\n workspaceSlug: string;\n createdAt: string;\n updatedAt: string;\n}\n\n/**\n * Admin request to update a user's membership in a workspace.\n */\nexport interface AdminUpdateWorkspaceMemberRequest {\n tosAccepted?: boolean | null;\n memberRoleId?: number | null;\n}\n\n/**\n * Request model for admin workspace operations.\n */\nexport interface AdminUpdateWorkspaceRequest {\n organizationId?: number | null;\n name?: string | null;\n slug?: string | null;\n signupCode?: string | null;\n isPublic?: boolean | null;\n allowSignup?: boolean | null;\n resellerId?: number | null;\n creatorId?: number | null;\n features?: string[] | null;\n featuresOverride?: AdminUpdateWorkspaceRequestFeaturesOverride;\n themes?: string[] | null;\n locale?: string | null;\n timezone?: string | null;\n chatClassifierPrompt?: string | null;\n}\n\nexport type AdminUpdateWorkspaceRequestFeaturesOverride = {[key: string]: boolean} | null;\n\nexport interface AdminWorkspaceResponse {\n id: number;\n uuid: string;\n slug: string;\n name: string;\n organizationId: number;\n organizationUuid?: string | null;\n organizationName?: string | null;\n organizationLogoUrl?: string | null;\n signupCode?: string | null;\n createdAt: string;\n userRole: string | null;\n canManageBundles?: boolean;\n isPublic?: boolean;\n allowSignup?: boolean;\n resellerId?: number | null;\n themes?: string[];\n features?: string[] | null;\n featureStatus?: AdminWorkspaceResponseFeatureStatus;\n signupRequestStatus?: string | null;\n status?: number | null;\n templateWorkspaceUuid?: string | null;\n locale?: string | null;\n timezone?: string | null;\n requiresOrgAuth?: boolean | null;\n authUrl?: string | null;\n creatorId?: number | null;\n creatorName?: string | null;\n dbId?: number | null;\n featuresOverride?: AdminWorkspaceResponseFeaturesOverride;\n billingOwnerId?: number | null;\n billingOwnerName?: string | null;\n subscriptionProductId?: number | null;\n subscriptionProductName?: string | null;\n chatClassifierPrompt?: string | null;\n phiDataPolicy?: PhiDataPolicy;\n phiPostureDecision?: PhiPostureDecision;\n phiPostureReasonCode?: PhiPostureReasonCode;\n phiPolicyVersion?: string | null;\n phiPolicySource?: string | null;\n phiPolicyReason?: string | null;\n phiPolicyReviewedAt?: string | null;\n phiPolicyReviewedByAccountId?: number | null;\n phiPolicyReviewDueAt?: string | null;\n}\n\nexport type AdminWorkspaceResponseFeatureStatus = {[key: string]: string} | null;\n\nexport type AdminWorkspaceResponseFeaturesOverride = {[key: string]: boolean} | null;\n\nexport interface BusinessHoursStatusResponse {\n isBusinessHours: boolean;\n}\n\n/**\n * Typed body for the CLI-facing ``change-org`` / ``change-org/preview``\n * admin endpoints.\n *\n * Typing ``targetOrganizationId`` / ``newCreatorId`` as ``int`` makes FastAPI\n * return 422 on a non-numeric body field instead of letting a string value\n * reach the DB driver. Mirrors the superuser\n * ``WorkspaceMigrationRequest`` model used by the sibling\n * ``POST /admin/org-migration/workspace`` endpoint.\n */\nexport interface ChangeWorkspaceOrgRequest {\n /**\n * ID of the target organization\n * @exclusiveMinimum 0\n */\n targetOrganizationId: number;\n /**\n * Account ID to set as the workspace creator (created or promoted to OWNER in the target org)\n * @exclusiveMinimum 0\n */\n newCreatorId: number;\n}\n\nexport interface ClassifyPhoneResponse {\n phoneType?: string | null;\n}\n\n/**\n * Minimal workspace row for pickers that only need to switch (Lantern).\n *\n * Served by ``GET /api/v2/w/?can_use_device=1``. Deliberately carries no\n * feature map, role, or settings — a companion device chooses a workspace\n * from identity plus the org step-up pair below, and everything else it\n * discovers from inside the workspace it chose. The step-up contract is the\n * same as ``WorkspaceResponse``: ``requiresOrgAuth`` states the org's\n * policy (a definite True/False on every row this route builds); a device\n * can never hold org-session evidence, so ``True`` means \"this switch\n * strands until someone completes org SSO\".\n */\nexport interface CompactWorkspaceResponse {\n id: number;\n uuid: string;\n slug: string;\n name: string;\n requiresOrgAuth?: boolean;\n authUrl?: string | null;\n}\n\nexport interface CostInfo {\n score: number;\n budget: number;\n}\n\n/**\n * Request model for associating data records with assignments.\n */\nexport interface DataRecordAssociationRequest {\n id: number;\n accessMode?: number;\n}\n\nexport interface DeleteMembershipResponse {\n message: string;\n}\n\nexport interface DeleteWorkspaceResponse {\n status: string;\n}\n\nexport interface FirstRunState {\n mode?: string;\n statuses?: FirstRunStateStatuses;\n collapsed?: boolean | null;\n}\n\nexport type FirstRunStateStatuses = {[key: string]: string} | null;\n\n/**\n * Create request for org-scoped workspace creation.\n *\n * Only allows fields appropriate for org admins.\n * Does NOT allow: resellerId, features, featuresOverride, isPublic, allowSignup.\n */\nexport interface OrgCreateWorkspaceRequest {\n /**\n * @minLength 1\n * @maxLength 200\n */\n name: string;\n slug?: string | null;\n templateWorkspaceUuid?: string | null;\n setupPurpose?: OrgCreateWorkspaceRequestSetupPurpose;\n /** @maxItems 8 */\n setupPurposes?: OrgCreateWorkspaceRequestSetupPurposesItem[];\n bundleUuid?: string | null;\n}\n\nexport type OrgCreateWorkspaceRequestSetupPurpose = typeof OrgCreateWorkspaceRequestSetupPurpose[keyof typeof OrgCreateWorkspaceRequestSetupPurpose] | null;\n\n\nexport const OrgCreateWorkspaceRequestSetupPurpose = {\n patient_enrollment: 'patient_enrollment',\n wellness_checks: 'wellness_checks',\n care_gaps: 'care_gaps',\n post_discharge: 'post_discharge',\n patient_requests: 'patient_requests',\n developer: 'developer',\n just_curious: 'just_curious',\n other: 'other',\n} as const;\n\nexport type OrgCreateWorkspaceRequestSetupPurposesItem = typeof OrgCreateWorkspaceRequestSetupPurposesItem[keyof typeof OrgCreateWorkspaceRequestSetupPurposesItem];\n\n\nexport const OrgCreateWorkspaceRequestSetupPurposesItem = {\n patient_enrollment: 'patient_enrollment',\n wellness_checks: 'wellness_checks',\n care_gaps: 'care_gaps',\n post_discharge: 'post_discharge',\n patient_requests: 'patient_requests',\n developer: 'developer',\n just_curious: 'just_curious',\n other: 'other',\n} as const;\n\n/**\n * Request to join a workspace as an org admin.\n */\nexport interface OrgJoinWorkspaceRequest {\n memberRoleId: number;\n}\n\n/**\n * Response after joining a workspace.\n */\nexport interface OrgJoinWorkspaceResponse {\n memberId: number;\n memberRoleId: number;\n message: string;\n}\n\n/**\n * Organization settings an **org admin** may change.\n *\n * Name, slug, contact details, logo and the security contact.\n *\n * Deliberately a separate model from :class:`UpdateOrganizationRequest`\n * rather than a subset enforced at the route: the privileged field\n * ``enforceCreditLimit`` is *absent from the schema*, so an org admin\n * cannot set it even by crafting the request body. Pydantic ignores\n * unknown keys, and there is no code path from here to that column.\n *\n * It remains superuser-only, on ``PUT /api/v2/admin/organizations/{id}``\n * behind ``Depends(get_superuser)``: ``enforceCreditLimit`` decides whether\n * a customer is hard-blocked (402) at zero credits or merely alerted, i.e.\n * whether they can keep spending.\n *\n * SSO is not here either — it has its own admin-scoped endpoint\n * (``PUT /api/v2/o/{org_uuid}/sso``) with its own audit trail.\n */\nexport interface OrgSettingsUpdateRequest {\n name?: string | null;\n slug?: string | null;\n contactEmail?: string | null;\n contactPhone?: string | null;\n logoUrl?: string | null;\n securityContactEmail?: string | null;\n securityContactName?: string | null;\n}\n\n/**\n * Update request for org-scoped workspace updates.\n *\n * Only allows fields that org admins should be able to change.\n * Does NOT allow: features, featuresOverride, organizationId, resellerId,\n * creatorId, themes.\n */\nexport interface OrgUpdateWorkspaceRequest {\n name?: string | null;\n slug?: string | null;\n signupCode?: string | null;\n isPublic?: boolean | null;\n allowSignup?: boolean | null;\n locale?: string | null;\n timezone?: string | null;\n}\n\n/**\n * Workspace response for org context.\n *\n * Similar to AdminWorkspaceResponse but without superuser-only fields\n * like dbId, featuresOverride, billingOwnerId, etc.\n */\nexport interface OrgWorkspaceResponse {\n id: number;\n uuid: string;\n slug: string;\n name: string;\n organizationId: number;\n organizationUuid?: string | null;\n organizationName?: string | null;\n signupCode?: string | null;\n createdAt: string;\n isPublic?: boolean;\n allowSignup?: boolean;\n resellerId?: number | null;\n status: number;\n features?: string[] | null;\n featureStatus?: OrgWorkspaceResponseFeatureStatus;\n creatorId?: number | null;\n creatorName?: string | null;\n locale?: string | null;\n timezone?: string | null;\n isMember?: boolean;\n}\n\nexport type OrgWorkspaceResponseFeatureStatus = {[key: string]: string} | null;\n\n/**\n * One workspace card's expensive half: workspace-schema aggregates.\n *\n * ``myRoleName`` is about the requesting account and is returned to any org\n * member who belongs to the workspace. The counts are org-administrative\n * information and are populated only for ``org:read`` holders; everyone else\n * gets ``None`` (rendered as \"—\" rather than zero, so the UI never implies\n * an empty workspace when it simply may not look).\n *\n * ``schemaReady`` is False while the workspace is still provisioning — its\n * tables do not exist yet, so the counts are absent for a reason the card\n * can explain instead of showing a failure.\n */\nexport interface OrgWorkspaceStatsResponse {\n workspaceUuid: string;\n /** False while the workspace is still provisioning, or when its schema could not be read. The counts are absent in that case. */\n schemaReady?: boolean;\n /** The REQUESTING account's member-role name in this workspace. Null when they have no member row there. */\n myRoleName?: string | null;\n /** Non-archived members in this workspace. NULL — not 0 — when the caller lacks org:read, or when the workspace schema is unreadable (schemaReady=false). Zero means the workspace really is empty. */\n memberCount?: number | null;\n /** Published and draft sites in this workspace. NULL — not 0 — when the caller lacks org:read, or when the workspace schema is unreadable (schemaReady=false). Zero means the workspace really is empty. */\n siteCount?: number | null;\n /** Email inboxes in this workspace. NULL — not 0 — when the caller lacks org:read, or when the workspace schema is unreadable (schemaReady=false). Zero means the workspace really is empty. */\n inboxCount?: number | null;\n /** Non-archived phone numbers in this workspace. NULL — not 0 — when the caller lacks org:read, or when the workspace schema is unreadable (schemaReady=false). Zero means the workspace really is empty. */\n phoneNumberCount?: number | null;\n}\n\n/**\n * One workspace card's cheap half: identity plus a GLB-side count.\n *\n * ``orgMemberCount`` joins workspace membership to org membership. A separate\n * \"all accounts\" tally was tried and dropped: the\n * ``enforce_org_membership_before_workspace`` trigger refuses a workspace\n * membership for an account with no org membership, so the two numbers are\n * equal except in the transient state after an org membership is revoked —\n * a distinction no card was showing.\n */\nexport interface OrgWorkspaceSummaryResponse {\n uuid: string;\n name: string;\n slug: string;\n /** WorkspaceProvisionStatus. 2 = AVAILABLE; anything else means the workspace is still being provisioned. */\n status: number;\n createdAt: string;\n isPublic?: boolean;\n allowSignup?: boolean;\n /** Whether the requesting account has a workspace membership here. */\n isMember?: boolean;\n /** Accounts with access to this workspace who are also members of this organization. */\n orgMemberCount?: number;\n}\n\nexport type PhiDataPolicy = typeof PhiDataPolicy[keyof typeof PhiDataPolicy];\n\n\nexport const PhiDataPolicy = {\n unclassified: 'unclassified',\n phi_prohibited: 'phi_prohibited',\n phi_permitted: 'phi_permitted',\n} as const;\n\nexport type PhiPostureDecision = typeof PhiPostureDecision[keyof typeof PhiPostureDecision];\n\n\nexport const PhiPostureDecision = {\n allow_non_phi: 'allow_non_phi',\n warn_non_phi: 'warn_non_phi',\n review_required: 'review_required',\n authorization_required: 'authorization_required',\n conflict: 'conflict',\n} as const;\n\nexport type PhiPostureReasonCode = typeof PhiPostureReasonCode[keyof typeof PhiPostureReasonCode];\n\n\nexport const PhiPostureReasonCode = {\n org_unclassified: 'org_unclassified',\n workspace_unclassified: 'workspace_unclassified',\n non_phi_policy_aligned: 'non_phi_policy_aligned',\n phi_expected_workspace_prohibited: 'phi_expected_workspace_prohibited',\n phi_authorization_not_evaluated: 'phi_authorization_not_evaluated',\n phi_coverage_satisfied: 'phi_coverage_satisfied',\n phi_coverage_missing: 'phi_coverage_missing',\n phi_coverage_expired: 'phi_coverage_expired',\n non_phi_org_workspace_permitted: 'non_phi_org_workspace_permitted',\n phi_permitted_org_not_expected: 'phi_permitted_org_not_expected',\n organization_review_expired: 'organization_review_expired',\n workspace_review_expired: 'workspace_review_expired',\n invalid_state: 'invalid_state',\n} as const;\n\nexport interface PublicWorkspaceResponse {\n id: number;\n uuid: string;\n slug: string;\n name: string;\n createdAt: string;\n allowSignup?: boolean;\n resellerId?: number | null;\n memberRole?: string | null;\n signupRequestStatus?: string | null;\n}\n\nexport interface QueryDataTypeInfo {\n id: number;\n slug: string;\n name: string;\n isCollection: boolean;\n recordFields: RecordFieldInfo[];\n}\n\n/**\n * A labeled choice for a field whose raw values are ids/codes.\n */\nexport interface QueryEnumOption {\n value: unknown;\n label: string;\n color?: string | null;\n}\n\nexport interface QueryFieldInfo {\n path: string;\n type: string;\n operators: string[];\n sortable?: boolean;\n selectable?: boolean;\n enumValues?: unknown[] | null;\n enumOptions?: QueryEnumOption[] | null;\n displayName?: string | null;\n category?: string | null;\n}\n\nexport interface QueryFieldsResponse {\n entities: QueryFieldsResponseEntities;\n aggregateSources: QueryFieldsResponseAggregateSources;\n dataTypes: QueryDataTypeInfo[];\n recordSystemFields: QueryFieldInfo[];\n relations?: QueryFieldsResponseRelations;\n aggregateSourceCategories?: QueryFieldsResponseAggregateSourceCategories;\n}\n\nexport type QueryFieldsResponseAggregateSourceCategories = {[key: string]: {[key: string]: string}};\n\nexport type QueryFieldsResponseAggregateSources = {[key: string]: string[]};\n\nexport type QueryFieldsResponseEntities = {[key: string]: QueryFieldInfo[]};\n\nexport type QueryFieldsResponseRelations = {[key: string]: {[key: string]: QueryFieldInfo[]}};\n\nexport interface RecordFieldInfo {\n slug: string;\n name: string;\n type: string;\n operators: string[];\n enumValues?: unknown[] | null;\n}\n\nexport interface RunQueryRequest {\n query: Query;\n mode?: RunQueryRequestMode;\n}\n\nexport type RunQueryRequestMode = typeof RunQueryRequestMode[keyof typeof RunQueryRequestMode] | null;\n\n\nexport const RunQueryRequestMode = {\n rows: 'rows',\n count: 'count',\n aggregate: 'aggregate',\n} as const;\n\nexport interface RunQueryResponse {\n mode: string;\n items?: RunQueryResponseItems;\n nextCursor?: string | null;\n count?: number | null;\n rows?: RunQueryResponseRows;\n warnings?: string[];\n cost?: CostInfo | null;\n}\n\nexport type RunQueryResponseItems = { [key: string]: unknown }[] | null;\n\nexport type RunQueryResponseRows = { [key: string]: unknown }[] | null;\n\n/**\n * Request model for associating child tasks (parent-child relationships).\n *\n * ``order`` is optional and backward-compatible: when omitted, callers\n * that build associations from a UI-style ``childTasks`` list keep the\n * historical array-index ordering. When provided (e.g. by the workspace\n * transfer importer), it preserves the authored routing order so that\n * automatic routing still selects the lower-order matching child after\n * transfer.\n */\nexport interface TaskAssociationRequest {\n taskId: number;\n autoNext: boolean;\n required: boolean;\n choicePrompt?: string | null;\n celCondition?: string | null;\n order?: number | null;\n}\n\n/**\n * Update workspace defaults.\n */\nexport interface UpdateWorkspaceDefaultsRequest {\n defaultPhoneNumberId?: number | null;\n defaultAgentId?: number | null;\n escalationBusinessHours?: string | null;\n escalationOnlineMessageTemplate?: string | null;\n escalationOfflineMessageTemplate?: string | null;\n escalationNotifiedMessageTemplate?: string | null;\n escalationPausedMessageTemplate?: string | null;\n emailFooter?: string | null;\n defaultReplyToInboxId?: number | null;\n pauseOnEscalate?: boolean | null;\n enableAudioRecording?: boolean | null;\n enableVoicemailDetection?: boolean | null;\n allowDevices?: boolean;\n shortenUrls?: boolean | null;\n transcriptionModel?: string | null;\n}\n\n/**\n * Feature choices from Workspace settings, as ``{slug: enabled}``.\n */\nexport interface UpdateWorkspaceFeaturesRequest {\n features: UpdateWorkspaceFeaturesRequestFeatures;\n}\n\nexport type UpdateWorkspaceFeaturesRequestFeatures = {[key: string]: boolean};\n\n/**\n * Update a workspace.\n */\nexport interface UpdateWorkspaceRequest {\n name?: string | null;\n slug?: string | null;\n signupCode?: string | null;\n isPublic?: boolean | null;\n allowSignup?: boolean | null;\n locale?: string | null;\n timezone?: string | null;\n}\n\nexport interface ValidateQueryResponse {\n valid: boolean;\n cost: CostInfo;\n warnings?: string[];\n errors?: string[];\n}\n\n/**\n * Slim view of an OrgDomain for selection in workspace forms.\n *\n * Intentionally smaller than `OrgDomainResponse` — workspace members\n * don't need ownership tokens, DNS records, last-checked timestamps,\n * etc. Just enough to populate a dropdown, pass the uuid back as a\n * foreign reference (e.g. `orgDomainUuid` on inbox creation), and\n * let the UI mark non-verified entries as disabled with a reason.\n */\nexport interface WorkspaceAvailableDomain {\n uuid: string;\n domain: string;\n ownershipStatus: string;\n emailStatus?: string | null;\n siteStatus?: string | null;\n isChildHost?: boolean;\n}\n\nexport interface WorkspaceAvailableDomainsResponse {\n items: WorkspaceAvailableDomain[];\n total: number;\n}\n\n/**\n * Response model for workspace counts.\n */\nexport interface WorkspaceCountsResponse {\n humans: number;\n agents: number;\n tasks: number;\n workflows: number;\n inboxes: number;\n phoneNumbers: number;\n chats: number;\n files: number;\n sites: number;\n forms: number;\n}\n\n/**\n * One feature as Workspace settings shows it.\n */\nexport interface WorkspaceFeatureState {\n slug: string;\n name: string;\n description: string;\n category: string;\n icon?: string | null;\n enabled: boolean;\n editable: boolean;\n}\n\n/**\n * Every feature this workspace's plan allows, and whether it is on.\n */\nexport interface WorkspaceFeaturesResponse {\n features: WorkspaceFeatureState[];\n}\n\n/**\n * Request model for joining a workspace.\n */\nexport interface WorkspaceJoinRequest {\n memberRoleId: number;\n orgRole?: string | null;\n}\n\n/**\n * Response model for joining a workspace.\n */\nexport interface WorkspaceJoinResponse {\n success: boolean;\n memberUuid: string;\n memberId: number;\n workspaceUuid: string;\n workspaceName: string;\n memberRoleName: string;\n message: string;\n}\n\nexport interface WorkspaceResponse {\n id: number;\n uuid: string;\n slug: string;\n name: string;\n organizationId: number;\n organizationUuid?: string | null;\n organizationName?: string | null;\n organizationLogoUrl?: string | null;\n signupCode?: string | null;\n createdAt: string;\n userRole: string | null;\n canManageBundles?: boolean;\n isPublic?: boolean;\n allowSignup?: boolean;\n resellerId?: number | null;\n themes?: string[];\n features?: string[] | null;\n featureStatus?: WorkspaceResponseFeatureStatus;\n signupRequestStatus?: string | null;\n status?: number | null;\n templateWorkspaceUuid?: string | null;\n locale?: string | null;\n timezone?: string | null;\n requiresOrgAuth?: boolean | null;\n authUrl?: string | null;\n}\n\nexport type WorkspaceResponseFeatureStatus = {[key: string]: string} | null;\n\n/**\n * Individual scope metadata.\n */\nexport interface WorkspaceScopeResponse {\n name: string;\n category: string;\n description: string;\n implies?: string[];\n dangerous?: boolean;\n}\n\n/**\n * Response containing all workspace-grantable scopes.\n */\nexport interface WorkspaceScopesListResponse {\n items: WorkspaceScopeResponse[];\n categories: string[];\n}\n\nexport interface WorkspaceSettingsResponse {\n id: number;\n slug: string;\n defaultPhoneNumberId: number | null;\n defaultAgentId: number | null;\n workspaceFolderId?: number | null;\n escalationBusinessHours: string | null;\n escalationOnlineMessageTemplate: string | null;\n escalationOfflineMessageTemplate: string | null;\n escalationNotifiedMessageTemplate: string | null;\n escalationPausedMessageTemplate: string | null;\n emailFooter: string | null;\n defaultReplyToInboxId: number | null;\n pauseOnEscalate: boolean;\n sesDomain: string;\n enableAudioRecording: boolean;\n enableVoicemailDetection: boolean;\n allowDevices: boolean;\n shortenUrls: boolean;\n shortenUrlsExampleUrl: string;\n shortenUrlsAvailable: boolean;\n transcriptionModel?: string | null;\n defaultChatModel: string;\n defaultRealtimeModel: string;\n defaultInferenceModel: string;\n defaultVoiceModel: string;\n firstRunMode?: string | null;\n}\n","/**\n * Generated by Orval, grouped by scripts/types-codegen/group_generated.ts\n * (group map from emit_openapi.py). Do not edit manually.\n * Group: metric\n */\n\n\n/**\n * On-demand compute of enabled chat-source metrics for one chat.\n */\nexport interface ComputeChatMetricsRequest {\n /**\n * Chat id to evaluate\n * @minimum 1\n */\n chatId: number;\n}\n\n/**\n * Result of an on-demand chat metrics compute.\n */\nexport interface ComputeChatMetricsResponse {\n chatId: number;\n observationCount: number;\n}\n\n/**\n * Create a workspace metric definition.\n */\nexport interface CreateMetricRequest {\n /**\n * @minLength 1\n * @maxLength 255\n */\n name: string;\n /** Stable identifier; auto-derived from name when omitted. */\n slug?: string | null;\n description?: string | null;\n metricType: MetricType;\n source?: MetricSource;\n kind?: MetricKind;\n unit?: MetricUnit;\n celExpression?: string | null;\n evaluationPrompt?: string | null;\n /**\n * @minimum 0\n * @maximum 1\n */\n passingThreshold?: number;\n sourceConfig?: MetricSourceConfig | null;\n denominator?: MetricDenominator;\n attributionWindowSeconds?: number | null;\n enabled?: boolean;\n chatType?: MetricChatType;\n /** Workflows this chat metric measures. Required for chat metrics — pass [] to mean every workflow, deliberately. Omitting it is an error, so a scope is never chosen by accident. */\n workflowIds?: number[] | null;\n /** Optional goal for this metric — 'reach this value'. */\n targetValue?: number | null;\n /** Optional due date for targetValue. */\n targetDate?: string | null;\n}\n\n/**\n * Which conversation surface a chat metric measures.\n *\n * One metric measures one surface, deliberately. An assignment chat, a\n * sidebar DM and a contributor-input chat are different populations with\n * different success conditions; averaging them yields a number that\n * describes nothing. Want resolution rate for DMs too? That is a second\n * metric, and the two are legitimately comparable side by side.\n *\n * ``manager`` is absent on purpose — workspace-management chats are the\n * operator talking to the product, never a customer outcome.\n */\nexport type MetricChatType = typeof MetricChatType[keyof typeof MetricChatType];\n\n\nexport const MetricChatType = {\n assignment: 'assignment',\n dm: 'dm',\n contributor: 'contributor',\n} as const;\n\n/**\n * Explicit rate denominator — stored on the definition, not a convention.\n *\n * Read it as \"count once per\": what the rate divides by.\n *\n * * ``OBSERVATIONS`` — each observation counts once. For every metric\n * that can exist today that is one per conversation, because a\n * conversation yields exactly one observation.\n * * ``UNIQUE_MEMBERS`` — each Member counts once no matter how many\n * chats they had in the window. Required by pilot agreements written\n * as \"unique clients who respond… multiple responses from the same\n * client count as a single engagement\": a member in a multi-touch\n * journey has several chats, so averaging over observations\n * double-counts them and produces a defensible number that is not the\n * number in the contract.\n *\n * There was briefly a third value, ``CHATS``, reserved so a future\n * message-sourced metric could distinguish \"per observation\" (per\n * message) from \"per conversation\". It computed an identical number to\n * ``OBSERVATIONS`` for every metric that can exist today, so it reached\n * the UI as two buttons producing the same result. Reintroduce it with\n * the ``CHAT_MESSAGE`` source (#22474), when the distinction is real.\n */\nexport type MetricDenominator = typeof MetricDenominator[keyof typeof MetricDenominator];\n\n\nexport const MetricDenominator = {\n observations: 'observations',\n unique_members: 'unique_members',\n} as const;\n\n/**\n * Aggregation semantics for stored values.\n *\n * * ``OBSERVATION`` — one row per subject (chat/message/member). Aggregate\n * with avg/sum/count over a window. Must not be last-valued.\n * * ``GAUGE`` — point-in-time count of matching rows. Last-value only;\n * must not be summed across a window. Computed by the ``member_filter``\n * source.\n */\nexport type MetricKind = typeof MetricKind[keyof typeof MetricKind];\n\n\nexport const MetricKind = {\n observation: 'observation',\n gauge: 'gauge',\n} as const;\n\n/**\n * One observation — reason may be PHI; gated by analytics scope.\n */\nexport interface MetricObservationResponse {\n id: number;\n uuid: string;\n metricId: number;\n value: number;\n observedAt: string;\n chatId: number | null;\n memberId: number | null;\n messageId: number | null;\n /** Rubric grader free text — PHI-bearing; omit from aggregate export */\n reason?: string | null;\n modelId?: string | null;\n modelVersion?: string | null;\n evaluationData?: MetricObservationResponseEvaluationData;\n createdAt: string;\n}\n\nexport type MetricObservationResponseEvaluationData = { [key: string]: unknown } | null;\n\n/**\n * API shape for a Metric definition.\n */\nexport interface MetricResponse {\n id: number;\n uuid: string;\n name: string;\n slug: string;\n description: string | null;\n metricType: string;\n source: string;\n kind: string;\n unit: string;\n celExpression: string | null;\n evaluationPrompt: string | null;\n passingThreshold: number;\n sourceConfig: MetricResponseSourceConfig;\n denominator: string;\n attributionWindowSeconds: number | null;\n chatType: string;\n workflowIds: number[];\n targetValue: number | null;\n targetDate: string | null;\n enabled: boolean;\n archived: boolean;\n createdAt: string;\n updatedAt: string;\n}\n\nexport type MetricResponseSourceConfig = { [key: string]: unknown } | null;\n\n/**\n * One time-bucket of aggregated observations.\n */\nexport interface MetricSeriesBucket {\n bucketStart: string;\n value: number | null;\n count: number;\n}\n\n/**\n * Time-series readout for a metric.\n */\nexport interface MetricSeriesResponse {\n metricId: number;\n metricUuid: string;\n metricName: string;\n unit: string;\n kind: string;\n denominator: string;\n aggregation: string;\n bucket: string;\n start: string;\n end: string;\n buckets: MetricSeriesBucket[];\n overallValue: number | null;\n overallCount: number;\n targetValue?: number | null;\n targetDate?: string | null;\n}\n\n/**\n * What triggers computation of a metric observation.\n *\n * * ``CHAT`` — rides ``ChatPostProcessingWorkflow`` after a chat goes quiet.\n * * ``MEMBER_FILTER`` — point-in-time count of Members matching a\n * :class:`~lib.models.workspace.member_filter.MemberFilter`. This is the\n * source that subsumed the former ``MilestoneGoal`` (a named target over a\n * Member cohort at a date); ``source_config`` carries\n * ``{\"member_filter_id\": <id>}``.\n *\n * Other sources are reserved for follow-on work.\n */\nexport type MetricSource = typeof MetricSource[keyof typeof MetricSource];\n\n\nexport const MetricSource = {\n chat: 'chat',\n member_filter: 'member_filter',\n} as const;\n\n/**\n * Per-source parameters for a metric definition.\n *\n * Typed rather than a bare ``dict[str, Any]`` because the values are\n * load-bearing at compute time and failure is silent. A chat metric whose\n * ``minMessages`` arrives as ``\"10\"`` was previously ignored outright —\n * ``metric_meets_min_messages`` only honours the key when it is already an\n * ``int`` — so the metric graded conversations the author meant to exclude\n * and nothing said so. ``extra=\"forbid\"`` gives the same treatment to a\n * typo'd key, which used to be stored and quietly do nothing.\n *\n * API keys are camelCase per the naming convention; the persisted JSONB\n * keeps snake_case because that is what ``metric_eval_service`` reads.\n * ``to_storage`` is the only place that translation happens.\n */\nexport interface MetricSourceConfig {\n memberFilterId?: number | null;\n minMessages?: number | null;\n}\n\n/**\n * How a metric value is computed.\n *\n * ``EXPRESSION`` is CEL-evaluated (synchronous, deterministic).\n * ``RUBRIC`` is LLM-evaluated (async, probabilistic). Those two mirror\n * :class:`~lib.models.workspace.qualification.CriterionType`.\n *\n * ``FILTER_COUNT`` has no authored expression at all — the value is the\n * number of rows matching a saved filter named in ``source_config``. It\n * pairs with ``source=member_filter`` + ``kind=gauge`` and is what the\n * retired MilestoneGoal computed.\n */\nexport type MetricType = typeof MetricType[keyof typeof MetricType];\n\n\nexport const MetricType = {\n expression: 'expression',\n rubric: 'rubric',\n filter_count: 'filter_count',\n} as const;\n\n/**\n * Display/aggregation hint for the metric's values.\n */\nexport type MetricUnit = typeof MetricUnit[keyof typeof MetricUnit];\n\n\nexport const MetricUnit = {\n rate: 'rate',\n score: 'score',\n count: 'count',\n custom: 'custom',\n} as const;\n\n/**\n * Partial update of a metric definition.\n *\n * ``metricType`` is immutable after create (same rule as ScenarioCriterion).\n */\nexport interface UpdateMetricRequest {\n name?: string | null;\n description?: string | null;\n unit?: MetricUnit | null;\n celExpression?: string | null;\n evaluationPrompt?: string | null;\n passingThreshold?: number | null;\n sourceConfig?: MetricSourceConfig | null;\n denominator?: MetricDenominator | null;\n attributionWindowSeconds?: number | null;\n enabled?: boolean | null;\n archived?: boolean | null;\n workflowIds?: number[] | null;\n targetValue?: number | null;\n targetDate?: string | null;\n}\n","/**\n * Generated by Orval, grouped by scripts/types-codegen/group_generated.ts\n * (group map from emit_openapi.py). Do not edit manually.\n * Group: pilot_program\n */\n\n\n/**\n * All pilot-program config rows the operator asked for.\n */\nexport interface PilotProgramListResponse {\n programs: PilotProgramResponse[];\n total: number;\n includesInactive: boolean;\n}\n\n/**\n * One ``pilot_programs`` config row.\n */\nexport interface PilotProgramResponse {\n id: number;\n uuid: string;\n label: string;\n customerId?: number | null;\n coveredWorkspaceIds: number[];\n relationshipType: PilotRelationshipType;\n lifecycleStage: PilotStage;\n stageEnteredAt: string;\n allocationMinutes?: number | null;\n allocationPeriodStart?: string | null;\n notifyThresholdPct: number;\n notifyContactLabel?: string | null;\n stalenessThresholdDays: number;\n active: boolean;\n createdAt?: string | null;\n updatedAt?: string | null;\n}\n\n/**\n * How this pilot relates to us commercially.\n *\n * Drives the staleness read: a ``DIRECT_PILOT`` is healthy when its own\n * workspaces are active; a ``PARTNER_CHANNEL`` (co-sale partner / reseller) is\n * healthy on deal + integration activity even with low own-workspace volume.\n */\nexport type PilotRelationshipType = typeof PilotRelationshipType[keyof typeof PilotRelationshipType];\n\n\nexport const PilotRelationshipType = {\n direct_pilot: 'direct_pilot',\n partner_channel: 'partner_channel',\n} as const;\n\n/**\n * The pilot funnel stage (distinct from the churn-risk\n * ``CustomerHealthLifecycleStage`` in the customer-health read model —\n * that answers \"how healthy?\", this answers \"how far through the pilot?\").\n *\n * ``SIGNED``/``LIVE``/``VALUE_EVIDENCED`` are the in-flight stages a staleness\n * watcher covers; ``ON_HOLD`` is a deliberate pause (never paged on); and\n * ``CONVERTED``/``CHURNED`` are terminal outcomes (no staleness signal).\n */\nexport type PilotStage = typeof PilotStage[keyof typeof PilotStage];\n\n\nexport const PilotStage = {\n signed: 'signed',\n live: 'live',\n value_evidenced: 'value_evidenced',\n converted: 'converted',\n on_hold: 'on_hold',\n churned: 'churned',\n} as const;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BO,IAAM,6BAA6B;AAAA,EACxC,cAAc;AAAA,EACd,WAAW;AACb;AAgDO,IAAM,iCAAiC;AAAA,EAC5C,cAAc;AAAA,EACd,WAAW;AACb;;;AC9CO,IAAM,cAAc;AAAA,EACzB,SAAS;AAAA,EACT,MAAM;AACR;;;ACgBO,IAAM,yCAAyC;AAAA,EACpD,4BAA4B;AAAA,EAC5B,yBAAyB;AAAA,EACzB,2BAA2B;AAAA,EAC3B,aAAa;AAAA,EACb,yBAAyB;AAC3B;AAKO,IAAM,kCAAkC;AAAA,EAC7C,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,wBAAwB;AAAA,EACxB,qBAAqB;AAAA,EACrB,oBAAoB;AAAA,EACpB,uBAAuB;AAAA,EACvB,uBAAuB;AAAA,EACvB,iBAAiB;AAAA,EACjB,qBAAqB;AAAA,EACrB,yBAAyB;AAAA,EACzB,mBAAmB;AAAA,EACnB,kBAAkB;AAAA,EAClB,2BAA2B;AAC7B;AAsIO,IAAM,8BAA8B;AAAA,EACzC,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,UAAU;AACZ;AAKO,IAAM,8BAA8B;AAAA,EACzC,KAAK;AAAA,EACL,UAAU;AACZ;AAKO,IAAM,gCAAgC;AAAA,EAC3C,kBAAkB;AAAA,EAClB,yBAAyB;AAAA,EACzB,WAAW;AAAA,EACX,sBAAsB;AAAA,EACtB,qBAAqB;AAAA,EACrB,eAAe;AAAA,EACf,0BAA0B;AAC5B;AAKO,IAAM,2BAA2B;AAAA,EACtC,MAAM;AAAA,EACN,SAAS;AAAA,EACT,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,UAAU;AACZ;AAyCO,IAAM,qCAAqC;AAAA,EAChD,SAAS;AAAA,EACT,SAAS;AACX;;;ACvQO,IAAM,kBAAkB;AAAA,EAC7B,wBAAwB;AAAA,EACxB,uBAAuB;AAAA,EACvB,oBAAoB;AAAA,EACpB,cAAc;AAAA,EACd,iBAAiB;AAAA,EACjB,YAAY;AAAA,EACZ,mBAAmB;AACrB;AAKO,IAAM,kBAAkB;AAAA,EAC7B,sBAAsB;AAAA,EACtB,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,kBAAkB;AACpB;AA0CO,IAAM,yCAAyC;AAAA,EACpD,cAAc;AAAA,EACd,WAAW;AACb;;;ACiVO,IAAM,gBAAgB;AAAA,EAC3B,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,eAAe;AACjB;AAKO,IAAM,qBAAqB;AAAA,EAChC,eAAe;AAAA,EACf,cAAc;AAAA,EACd,iBAAiB;AAAA,EACjB,wBAAwB;AAAA,EACxB,UAAU;AACZ;AAKO,IAAM,uBAAuB;AAAA,EAClC,kBAAkB;AAAA,EAClB,wBAAwB;AAAA,EACxB,wBAAwB;AAAA,EACxB,mCAAmC;AAAA,EACnC,iCAAiC;AAAA,EACjC,wBAAwB;AAAA,EACxB,sBAAsB;AAAA,EACtB,sBAAsB;AAAA,EACtB,iCAAiC;AAAA,EACjC,gCAAgC;AAAA,EAChC,6BAA6B;AAAA,EAC7B,0BAA0B;AAAA,EAC1B,eAAe;AACjB;;;ACvYO,IAAM,iBAAiB;AAAA,EAC5B,YAAY;AAAA,EACZ,IAAI;AAAA,EACJ,aAAa;AACf;AA4BO,IAAM,oBAAoB;AAAA,EAC/B,cAAc;AAAA,EACd,gBAAgB;AAClB;AAcO,IAAM,aAAa;AAAA,EACxB,aAAa;AAAA,EACb,OAAO;AACT;AAoGO,IAAM,eAAe;AAAA,EAC1B,MAAM;AAAA,EACN,eAAe;AACjB;AAqCO,IAAM,aAAa;AAAA,EACxB,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,cAAc;AAChB;AAQO,IAAM,aAAa;AAAA,EACxB,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AACV;;;AC9OO,IAAM,wBAAwB;AAAA,EACnC,cAAc;AAAA,EACd,iBAAiB;AACnB;AAcO,IAAM,aAAa;AAAA,EACxB,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,iBAAiB;AAAA,EACjB,WAAW;AAAA,EACX,SAAS;AAAA,EACT,SAAS;AACX;","names":[]}
1
+ {"version":3,"sources":["../src/types/generated/addon.ts","../src/types/generated/session.ts","../src/types/generated/customer_activity.ts","../src/types/generated/phi_posture.ts","../src/types/generated/workspace.ts","../src/types/generated/metric.ts","../src/types/generated/pilot_program.ts"],"sourcesContent":["/**\n * Generated by Orval, grouped by scripts/types-codegen/group_generated.ts\n * (group map from emit_openapi.py). Do not edit manually.\n * Group: addon\n */\n\nimport type { PlanConfig } from './billing';\n\n/**\n * The result of one attach or detach.\n *\n * ``featuresSynced`` is reported rather than assumed: billing is the\n * durable half and the feature reconciliation is repairable, so a failed\n * resync must not roll back a completed purchase — but the client has to be\n * able to tell the difference.\n */\nexport interface AddonMutationResponse {\n productId: number;\n subscriptionItemId: number;\n scope: AddonMutationResponseScope;\n workspaceUuid?: string | null;\n providesFeatures: string[];\n featuresSynced: boolean;\n syncedWorkspaceUuids: string[];\n}\n\nexport type AddonMutationResponseScope = typeof AddonMutationResponseScope[keyof typeof AddonMutationResponseScope];\n\n\nexport const AddonMutationResponseScope = {\n organization: 'organization',\n workspace: 'workspace',\n} as const;\n\n/**\n * Buy one add-on for an organization, optionally scoped to a workspace.\n *\n * ``extra=\"forbid\"`` because this is a billing mutation: a misspelled field\n * that silently does nothing would charge the customer for a scope they did\n * not ask for.\n */\nexport interface AttachAddonRequest {\n /**\n * ID of the add-on product to attach\n * @exclusiveMinimum 0\n */\n productId: number;\n /** Workspace to scope the add-on to. Omit for an organization-wide add-on, which every workspace in the organization inherits. */\n workspaceUuid?: string | null;\n}\n\n/**\n * One add-on in an organization's catalogue, with its attachment state.\n */\nexport interface OrganizationAddonResponse {\n id: number;\n productId: number;\n name: string;\n tagline?: string | null;\n description: string;\n icon?: string | null;\n color?: string | null;\n providesFeatures: string[];\n requiresFeatures: string[];\n plans?: OrganizationAddonResponsePlans;\n priceCents?: number | null;\n /** Whether this add-on can be attached right now: self-service, not archived, and carrying a Stripe price for the organization's billing period. */\n purchasable: boolean;\n attached: boolean;\n scope?: OrganizationAddonResponseScope;\n workspaceUuid?: string | null;\n workspaceName?: string | null;\n subscriptionItemId?: number | null;\n}\n\nexport type OrganizationAddonResponsePlans = {[key: string]: PlanConfig} | null;\n\nexport type OrganizationAddonResponseScope = typeof OrganizationAddonResponseScope[keyof typeof OrganizationAddonResponseScope] | null;\n\n\nexport const OrganizationAddonResponseScope = {\n organization: 'organization',\n workspace: 'workspace',\n} as const;\n\n/**\n * The organization's add-on catalogue and what it currently owns.\n *\n * An ENVELOPE, never a bare list. ``canManage`` is why: it is the only way a\n * client can render a correct read-only state for a member who may see the\n * catalogue but not buy from it. A bare array would force the client to guess\n * at billing privilege and offer an attach button that 403s.\n */\nexport interface OrganizationAddonsResponse {\n organizationUuid: string;\n subscriptionId?: number | null;\n planPeriod?: string | null;\n canManage: boolean;\n canAttach: boolean;\n addons: OrganizationAddonResponse[];\n}\n","/**\n * Generated by Orval, grouped by scripts/types-codegen/group_generated.ts\n * (group map from emit_openapi.py). Do not edit manually.\n * Group: session\n */\n\n\n/**\n * ``{token, sessionKind, expiresAt}`` as sign-in and exchange responses carry it.\n */\nexport interface MintedSessionFields {\n token: string;\n sessionKind: SessionKind;\n expiresAt: string;\n}\n\n/**\n * What ``describe_session_token`` reports about a presented session.\n *\n * ``accountUuid`` / ``switchedFromAccountUuid`` let the frontend check that an\n * account-switch stash belongs to the account that switched (the restore in\n * ``/api/auth/end-temp-session``). Both describe a token the caller already\n * holds.\n */\nexport interface SessionDescription {\n sessionKind: SessionKind;\n expiresAt: string;\n accountUuid?: string | null;\n switchedFromAccountUuid?: string | null;\n}\n\n/**\n * The kind of session a cookie carries, and the kind of host that reads it.\n */\nexport type SessionKind = typeof SessionKind[keyof typeof SessionKind];\n\n\nexport const SessionKind = {\n account: 'account',\n site: 'site',\n} as const;\n","/**\n * Generated by Orval, grouped by scripts/types-codegen/group_generated.ts\n * (group map from emit_openapi.py). Do not edit manually.\n * Group: customer_activity\n */\n\n\n/**\n * PHI-free aggregate over ALL rows matching the filters (not a page).\n *\n * Counts, ages in hours, thresholds and identifiers only — no titles, review\n * notes, classifier feedback, subject labels, member data or message content\n * is read or returned.\n */\nexport interface CustomerActivityBacklogSummaryResponse {\n generatedAt: string;\n queryVersion: string;\n filters: CustomerActivitySummaryFilters;\n totalCount: number;\n backlogCount: number;\n reviewedCount: number;\n unclassifiedCount?: number;\n oldestBacklogCreatedAt?: string | null;\n oldestBacklogAgeHours?: number | null;\n byStatus: CustomerActivityStatusBucket[];\n bySeverity: CustomerActivitySeverityBucket[];\n bySource: CustomerActivitySourceBucket[];\n throughput: CustomerActivityThroughputWindow[];\n sla: CustomerActivitySlaSummary;\n}\n\n/**\n * What the blind sample of one detector version holds.\n *\n * All three counts leave out events whose outcome is test activity.\n * ``sampleRecorded`` counts the events the detector recorded for a subject it\n * judged clean. ``sampleReviewed`` counts those that carry a reviewer verdict\n * on the ``labels`` claim. ``sampleWithMiss`` counts the reviewed ones where\n * the reviewer added at least one label.\n */\nexport interface CustomerActivityClassifierBlindSample {\n detectorVersion?: string | null;\n sampleRecorded: number;\n sampleReviewed: number;\n sampleWithMiss: number;\n}\n\nexport interface CustomerActivityClassifierDefinitionResponse {\n detectorName: CustomerActivityClassifierDetectorName;\n subjectType: string;\n labels: CustomerActivityClassifierLabel[];\n}\n\nexport type CustomerActivityClassifierDetectorName = typeof CustomerActivityClassifierDetectorName[keyof typeof CustomerActivityClassifierDetectorName];\n\n\nexport const CustomerActivityClassifierDetectorName = {\n assignment_chat_classifier: 'assignment_chat_classifier',\n manager_chat_classifier: 'manager_chat_classifier',\n concierge_chat_classifier: 'concierge_chat_classifier',\n chat_review: 'chat_review',\n a2p_agent_inferred_stop: 'a2p_agent_inferred_stop',\n} as const;\n\nexport type CustomerActivityClassifierLabel = typeof CustomerActivityClassifierLabel[keyof typeof CustomerActivityClassifierLabel];\n\n\nexport const CustomerActivityClassifierLabel = {\n user_distress: 'user_distress',\n user_confusion: 'user_confusion',\n health_topic_mentioned: 'health_topic_mentioned',\n health_advice_given: 'health_advice_given',\n escalation_failure: 'escalation_failure',\n repeated_tool_failure: 'repeated_tool_failure',\n transcription_quality: 'transcription_quality',\n repetitive_loop: 'repetitive_loop',\n manager_no_response: 'manager_no_response',\n manager_incomplete_task: 'manager_incomplete_task',\n docs_or_skill_gap: 'docs_or_skill_gap',\n discovery_thrash: 'discovery_thrash',\n manager_language_mismatch: 'manager_language_mismatch',\n} as const;\n\n/**\n * Reviewer verdicts on one label, for one detector version.\n *\n * ``flagged`` counts events the classifier recorded with the label.\n * ``reviewed`` counts the flagged events that carry a reviewer verdict on the\n * ``labels`` claim (test activity excluded); each of those is either\n * ``confirmed`` (the reviewer kept the label) or ``rejected`` (the reviewer\n * removed it). ``addedByReviewer`` counts judged events where the reviewer\n * added a label the classifier did not predict.\n *\n * ``precision`` is ``confirmed / (confirmed + rejected)`` with a Wilson 95%\n * interval; all three are ``None`` when no flagged event has a verdict, which\n * is a different fact from a precision of zero.\n *\n * ``addedOnSample`` is the part of ``addedByReviewer`` that sits on\n * blind-sample events. ``estimatedMissed`` is ``addedOnSample`` times the\n * response's ``blindSampleRateN``, and ``recall`` is\n * ``confirmed / (confirmed + estimatedMissed)``. Both are ``None`` when the\n * version has no blind-sample event with a verdict, and ``recall`` is also\n * ``None`` when ``confirmed + estimatedMissed`` is zero.\n */\nexport interface CustomerActivityClassifierLabelQuality {\n detectorVersion?: string | null;\n label: CustomerActivityClassifierLabel;\n flagged: number;\n reviewed: number;\n confirmed: number;\n rejected: number;\n addedByReviewer: number;\n precision?: number | null;\n precisionLow?: number | null;\n precisionHigh?: number | null;\n addedOnSample: number;\n estimatedMissed?: number | null;\n recall?: number | null;\n}\n\n/**\n * PHI-free reviewer-verdict aggregate for one classifier detector.\n *\n * Counts, ratios, closed-vocabulary labels and detector versions only — no\n * event id, title, review note or feedback note is returned.\n * ``eventsReviewed`` counts every event with a reviewer verdict on the\n * ``labels`` claim, test activity excluded. A row's ``reviewed`` applies that\n * same test and also requires the row's label among the predicted labels, so\n * a judged event with no predicted label is in ``eventsReviewed`` and in no\n * row's ``reviewed``.\n *\n * ``blindSampleRateN`` is the one-in-N rate at which the detector records the\n * subjects it judges clean, ``None`` for a detector that records no such\n * sample. ``blindSample`` has one entry per detector version that recorded a\n * sample event other than test activity.\n */\nexport interface CustomerActivityClassifierQualityResponse {\n generatedAt: string;\n detectorName: CustomerActivityClassifierDetectorName;\n createdAfter?: string | null;\n eventsTotal: number;\n eventsReviewed: number;\n blindSampleRateN?: number | null;\n blindSample: CustomerActivityClassifierBlindSample[];\n rows: CustomerActivityClassifierLabelQuality[];\n}\n\nexport interface CustomerActivityClassifiersResponse {\n assignmentChatClassifier: CustomerActivityClassifierDefinitionResponse;\n managerChatClassifier: CustomerActivityClassifierDefinitionResponse;\n conciergeChatClassifier: CustomerActivityClassifierDefinitionResponse;\n}\n\nexport interface CustomerActivityEventListResponse {\n items: CustomerActivityEventResponse[];\n total: number;\n page: number;\n pageSize: number;\n totalPages: number;\n}\n\n/**\n * Admin/operator view of one customer-activity event.\n *\n * The list response remains free of operator-authored text. The single-event\n * detail response may include ``reviewNote`` and ``classifierFeedback`` for the\n * internal review workflow.\n */\nexport interface CustomerActivityEventResponse {\n id: number;\n uuid: string;\n accountId?: number | null;\n accountName?: string | null;\n organizationId?: number | null;\n organizationName?: string | null;\n workspaceId?: number | null;\n workspaceName?: string | null;\n subjectType: string;\n subjectRef: string;\n subjectMessageRef?: string | null;\n title?: string | null;\n labels: string[];\n severity: CustomerActivitySeverity;\n confidence?: number | null;\n score?: number | null;\n source: CustomerActivityEventSource;\n dedupeKey?: string | null;\n detectorName?: CustomerActivityClassifierDetectorName | null;\n detectorVersion?: string | null;\n modelId?: string | null;\n promptVersion?: string | null;\n traceId?: string | null;\n status: CustomerActivityEventStatus;\n reviewOutcome?: CustomerActivityReviewOutcome | null;\n reviewNote?: string | null;\n classifierFeedback?: CustomerActivityEventResponseClassifierFeedback;\n linkUrl?: string | null;\n reviewedByAccountId?: number | null;\n reviewedByName?: string | null;\n reviewedAt?: string | null;\n supportRequestId?: number | null;\n resourceId?: number | null;\n workspaceUuid?: string | null;\n chatClassifierPrompt?: string | null;\n subjectTitle?: string | null;\n subjectSubtitle?: string | null;\n createdAt: string;\n updatedAt: string;\n}\n\nexport type CustomerActivityEventResponseClassifierFeedback = { [key: string]: unknown } | null;\n\nexport type CustomerActivityEventSource = typeof CustomerActivityEventSource[keyof typeof CustomerActivityEventSource];\n\n\nexport const CustomerActivityEventSource = {\n system: 'system',\n customer: 'customer',\n classifier: 'classifier',\n operator: 'operator',\n} as const;\n\nexport type CustomerActivityEventStatus = typeof CustomerActivityEventStatus[keyof typeof CustomerActivityEventStatus];\n\n\nexport const CustomerActivityEventStatus = {\n new: 'new',\n reviewed: 'reviewed',\n} as const;\n\nexport type CustomerActivityReviewOutcome = typeof CustomerActivityReviewOutcome[keyof typeof CustomerActivityReviewOutcome];\n\n\nexport const CustomerActivityReviewOutcome = {\n no_action_needed: 'no_action_needed',\n support_request_created: 'support_request_created',\n bug_filed: 'bug_filed',\n linked_existing_work: 'linked_existing_work',\n classifier_feedback: 'classifier_feedback',\n test_activity: 'test_activity',\n a2p_suppression_reversed: 'a2p_suppression_reversed',\n} as const;\n\nexport type CustomerActivitySeverity = typeof CustomerActivitySeverity[keyof typeof CustomerActivitySeverity];\n\n\nexport const CustomerActivitySeverity = {\n none: 'none',\n minimal: 'minimal',\n low: 'low',\n medium: 'medium',\n high: 'high',\n critical: 'critical',\n} as const;\n\nexport interface CustomerActivitySeverityBucket {\n severity: CustomerActivitySeverity;\n backlogCount: number;\n reviewedCount: number;\n oldestBacklogAgeHours?: number | null;\n}\n\n/**\n * Open (unreviewed) events at one severity past their review threshold.\n *\n * ``thresholdSource`` travels with the threshold it describes: a breach count\n * must never be readable without both the number that produced it and whether\n * that number is ratified policy or a provisional default.\n */\nexport interface CustomerActivitySlaBucket {\n severity: CustomerActivitySeverity;\n thresholdHours: number;\n thresholdSource: CustomerActivitySlaThresholdSource;\n breachCount: number;\n oldestBacklogAgeHours?: number | null;\n}\n\nexport interface CustomerActivitySlaSummary {\n buckets: CustomerActivitySlaBucket[];\n totalBreachCount: number;\n}\n\n/**\n * Where ONE severity's SLA threshold came from.\n *\n * ``default`` = the provisional in-repo default (see\n * ``lib/services/customer_activity_metrics.py``); ``request`` = the caller\n * supplied it. Tracked per severity rather than per response so that\n * overriding one threshold cannot make the other read as caller-supplied\n * policy when it is still an unratified default.\n */\nexport type CustomerActivitySlaThresholdSource = typeof CustomerActivitySlaThresholdSource[keyof typeof CustomerActivitySlaThresholdSource];\n\n\nexport const CustomerActivitySlaThresholdSource = {\n default: 'default',\n request: 'request',\n} as const;\n\nexport interface CustomerActivitySourceBucket {\n source: CustomerActivityEventSource;\n backlogCount: number;\n reviewedCount: number;\n}\n\nexport interface CustomerActivityStatusBucket {\n status: CustomerActivityEventStatus;\n count: number;\n}\n\n/**\n * Echo of the filters the aggregate was computed under.\n *\n * Identifiers, closed-vocabulary enums and the open-vocabulary\n * ``subjectType`` only — so an exported aggregate carries its own scope and\n * can never be mistaken for a whole-queue figure.\n */\nexport interface CustomerActivitySummaryFilters {\n status?: CustomerActivityEventStatus | null;\n subjectType?: string | null;\n source?: CustomerActivityEventSource | null;\n severity?: CustomerActivitySeverity | null;\n reviewOutcome?: CustomerActivityReviewOutcome | null;\n detectorName?: CustomerActivityClassifierDetectorName | null;\n workspaceId?: number | null;\n organizationId?: number | null;\n accountId?: number | null;\n}\n\n/**\n * Adjudication throughput over a trailing window.\n *\n * ``recordedCount`` counts events created in the window; ``reviewedCount``\n * counts events whose review verdict was recorded in it (``reviewed_at``).\n * Reopening an event clears ``reviewed_at``, so the pair reads as \"arrived vs\n * currently-adjudicated\", and arrival outpacing adjudication is exactly the\n * growing-backlog signal.\n */\nexport interface CustomerActivityThroughputWindow {\n windowHours: number;\n recordedCount: number;\n reviewedCount: number;\n}\n","/**\n * Generated by Orval, grouped by scripts/types-codegen/group_generated.ts\n * (group map from emit_openapi.py). Do not edit manually.\n * Group: phi_posture\n */\n\nimport type { DeclaredDataUse } from './organization';\nimport type { PhiDataPolicy, PhiPostureDecision, PhiPostureReasonCode } from './workspace';\n\n/**\n * Whether an ``App`` has been reviewed as fit to carry PHI (ADR-18 §2a).\n *\n * Distinct from ``Builder.is_verified``, which is a display badge on the\n * consent screen: \"we know who published this\" is a weaker claim than \"this\n * app may carry patient data\". Superuser-set and provenance-carrying (a\n * non-:attr:`UNREVIEWED` row must name a reviewer and a review time — the\n * same CHECK-constraint discipline as the workspace posture columns).\n *\n * :attr:`UNREVIEWED` is the system default and means only \"no approval on\n * file\"; :attr:`PHI_DENIED` is an active decision that the app must not carry\n * PHI even where a customer attestation would otherwise lift the restriction.\n */\nexport type AppPhiReviewStatus = typeof AppPhiReviewStatus[keyof typeof AppPhiReviewStatus];\n\n\nexport const AppPhiReviewStatus = {\n unreviewed: 'unreviewed',\n phi_approved: 'phi_approved',\n phi_denied: 'phi_denied',\n} as const;\n\nexport type PhiPolicyReason = typeof PhiPolicyReason[keyof typeof PhiPolicyReason];\n\n\nexport const PhiPolicyReason = {\n initial_classification: 'initial_classification',\n customer_confirmation: 'customer_confirmation',\n agreement_verified: 'agreement_verified',\n scope_change: 'scope_change',\n periodic_review: 'periodic_review',\n correction: 'correction',\n incident_response: 'incident_response',\n} as const;\n\nexport type PhiPolicySource = typeof PhiPolicySource[keyof typeof PhiPolicySource];\n\n\nexport const PhiPolicySource = {\n customer_attestation: 'customer_attestation',\n contract_review: 'contract_review',\n staff_review: 'staff_review',\n legacy_inventory: 'legacy_inventory',\n} as const;\n\nexport interface PhiPostureFinding {\n reasonCode: PhiPostureReasonCode;\n organizationId: number;\n workspaceId?: number | null;\n workspaceUuid?: string | null;\n decision: PhiPostureDecision;\n}\n\nexport interface PhiPostureReportResponse {\n generatedAt: string;\n organizationCount: number;\n workspaceCount: number;\n findingCount: number;\n offset: number;\n limit: number;\n nextOffset?: number | null;\n findings: PhiPostureFinding[];\n truncated: boolean;\n}\n\nexport interface PhiPostureTransitionResponse {\n targetType: PhiPostureTransitionResponseTargetType;\n organizationId: number;\n workspaceId?: number | null;\n workspaceUuid?: string | null;\n declaredDataUse?: DeclaredDataUse | null;\n phiDataPolicy?: PhiDataPolicy | null;\n decision?: PhiPostureDecision | null;\n reasonCode?: PhiPostureReasonCode | null;\n policyVersion: string;\n source: string;\n reason: string;\n reviewedAt: string;\n reviewedByAccountId: number;\n reviewDueAt: string;\n}\n\nexport type PhiPostureTransitionResponseTargetType = typeof PhiPostureTransitionResponseTargetType[keyof typeof PhiPostureTransitionResponseTargetType];\n\n\nexport const PhiPostureTransitionResponseTargetType = {\n organization: 'organization',\n workspace: 'workspace',\n} as const;\n\nexport interface UpdateOrganizationPhiPostureRequest {\n /**\n * @minLength 1\n * @maxLength 64\n */\n policyVersion: string;\n source: PhiPolicySource;\n reason: PhiPolicyReason;\n reviewDueAt: string;\n declaredDataUse: DeclaredDataUse;\n}\n\nexport interface UpdateWorkspacePhiPolicyRequest {\n /**\n * @minLength 1\n * @maxLength 64\n */\n policyVersion: string;\n source: PhiPolicySource;\n reason: PhiPolicyReason;\n reviewDueAt: string;\n phiDataPolicy: PhiDataPolicy;\n}\n","/**\n * Generated by Orval, grouped by scripts/types-codegen/group_generated.ts\n * (group map from emit_openapi.py). Do not edit manually.\n * Group: workspace\n */\n\nimport type { Query } from './ir';\n\n/**\n * Superuser request to bring a workspace's seeded roles to canonical form.\n *\n * The body is required even for a dry run, and is deliberately not a query\n * parameter: a cookie-authenticated POST with no body is forgeable by a\n * cross-site HTML form (see ``tests/lint/test_csrf_bodyless_mutation_lint.py``),\n * and requiring a JSON body forces a forgery into a 422.\n */\nexport interface AdminCanonicalizeMemberRolesRequest {\n apply?: boolean;\n}\n\n/**\n * Admin request to create a user's membership in a workspace.\n */\nexport interface AdminCreateWorkspaceMemberRequest {\n memberRoleId?: number | null;\n}\n\n/**\n * Request model for admin workspace operations.\n */\nexport interface AdminCreateWorkspaceRequest {\n organizationId: number;\n name?: string | null;\n slug?: string | null;\n signupCode?: string | null;\n isPublic?: boolean | null;\n allowSignup?: boolean | null;\n resellerId?: number | null;\n templateWorkspaceUuid?: string | null;\n locale?: string | null;\n features?: string[] | null;\n chatClassifierPrompt?: string | null;\n}\n\n/**\n * Admin request to map a site to a workspace.\n */\nexport interface AdminMapSiteRequest {\n workspaceId?: number | null;\n siteUuid: string;\n name?: string | null;\n siteSlug?: string | null;\n externalDomain?: string | null;\n ownerId?: number | null;\n allowSignup?: boolean;\n}\n\n/**\n * Response model for site mappings.\n */\nexport interface AdminSiteMappingResponse {\n id: number;\n siteId: number;\n siteUuid: string;\n siteName: string;\n siteSlug: string;\n externalDomain?: string | null;\n workspaceId: number;\n workspaceUuid: string;\n workspaceName: string;\n workspaceSlug: string;\n createdAt: string;\n updatedAt: string;\n}\n\n/**\n * Admin request to update a user's membership in a workspace.\n */\nexport interface AdminUpdateWorkspaceMemberRequest {\n tosAccepted?: boolean | null;\n memberRoleId?: number | null;\n}\n\n/**\n * Request model for admin workspace operations.\n */\nexport interface AdminUpdateWorkspaceRequest {\n organizationId?: number | null;\n name?: string | null;\n slug?: string | null;\n signupCode?: string | null;\n isPublic?: boolean | null;\n allowSignup?: boolean | null;\n resellerId?: number | null;\n creatorId?: number | null;\n features?: string[] | null;\n featuresOverride?: AdminUpdateWorkspaceRequestFeaturesOverride;\n themes?: string[] | null;\n locale?: string | null;\n timezone?: string | null;\n chatClassifierPrompt?: string | null;\n}\n\nexport type AdminUpdateWorkspaceRequestFeaturesOverride = {[key: string]: boolean} | null;\n\nexport interface AdminWorkspaceResponse {\n id: number;\n uuid: string;\n slug: string;\n name: string;\n organizationId: number;\n organizationUuid?: string | null;\n organizationName?: string | null;\n organizationLogoUrl?: string | null;\n signupCode?: string | null;\n createdAt: string;\n userRole: string | null;\n canManageBundles?: boolean;\n isPublic?: boolean;\n allowSignup?: boolean;\n resellerId?: number | null;\n themes?: string[];\n features?: string[] | null;\n featureStatus?: AdminWorkspaceResponseFeatureStatus;\n signupRequestStatus?: string | null;\n status?: number | null;\n templateWorkspaceUuid?: string | null;\n locale?: string | null;\n timezone?: string | null;\n requiresOrgAuth?: boolean | null;\n authUrl?: string | null;\n creatorId?: number | null;\n creatorName?: string | null;\n dbId?: number | null;\n featuresOverride?: AdminWorkspaceResponseFeaturesOverride;\n billingOwnerId?: number | null;\n billingOwnerName?: string | null;\n subscriptionProductId?: number | null;\n subscriptionProductName?: string | null;\n chatClassifierPrompt?: string | null;\n phiDataPolicy?: PhiDataPolicy;\n phiPostureDecision?: PhiPostureDecision;\n phiPostureReasonCode?: PhiPostureReasonCode;\n phiPolicyVersion?: string | null;\n phiPolicySource?: string | null;\n phiPolicyReason?: string | null;\n phiPolicyReviewedAt?: string | null;\n phiPolicyReviewedByAccountId?: number | null;\n phiPolicyReviewDueAt?: string | null;\n}\n\nexport type AdminWorkspaceResponseFeatureStatus = {[key: string]: string} | null;\n\nexport type AdminWorkspaceResponseFeaturesOverride = {[key: string]: boolean} | null;\n\nexport interface BusinessHoursStatusResponse {\n isBusinessHours: boolean;\n}\n\n/**\n * Typed body for the CLI-facing ``change-org`` / ``change-org/preview``\n * admin endpoints.\n *\n * Typing ``targetOrganizationId`` / ``newCreatorId`` as ``int`` makes FastAPI\n * return 422 on a non-numeric body field instead of letting a string value\n * reach the DB driver. Mirrors the superuser\n * ``WorkspaceMigrationRequest`` model used by the sibling\n * ``POST /admin/org-migration/workspace`` endpoint.\n */\nexport interface ChangeWorkspaceOrgRequest {\n /**\n * ID of the target organization\n * @exclusiveMinimum 0\n */\n targetOrganizationId: number;\n /**\n * Account ID to set as the workspace creator (created or promoted to OWNER in the target org)\n * @exclusiveMinimum 0\n */\n newCreatorId: number;\n}\n\nexport interface ClassifyPhoneResponse {\n phoneType?: string | null;\n}\n\n/**\n * Minimal workspace row for pickers that only need to switch (Lantern).\n *\n * Served by ``GET /api/v2/w/?can_use_device=1``. Deliberately carries no\n * feature map, role, or settings — a companion device chooses a workspace\n * from identity plus the org step-up pair below, and everything else it\n * discovers from inside the workspace it chose. The step-up contract is the\n * same as ``WorkspaceResponse``: ``requiresOrgAuth`` states the org's\n * policy (a definite True/False on every row this route builds); a device\n * can never hold org-session evidence, so ``True`` means \"this switch\n * strands until someone completes org SSO\".\n */\nexport interface CompactWorkspaceResponse {\n id: number;\n uuid: string;\n slug: string;\n name: string;\n requiresOrgAuth?: boolean;\n authUrl?: string | null;\n}\n\nexport interface CostInfo {\n score: number;\n budget: number;\n}\n\n/**\n * Request model for associating data records with assignments.\n */\nexport interface DataRecordAssociationRequest {\n id: number;\n accessMode?: number;\n}\n\nexport interface DeleteMembershipResponse {\n message: string;\n}\n\nexport interface DeleteWorkspaceResponse {\n status: string;\n}\n\nexport interface FirstRunState {\n mode?: string;\n statuses?: FirstRunStateStatuses;\n collapsed?: boolean | null;\n}\n\nexport type FirstRunStateStatuses = {[key: string]: string} | null;\n\n/**\n * Create request for org-scoped workspace creation.\n *\n * Only allows fields appropriate for org admins.\n * Does NOT allow: resellerId, features, featuresOverride, isPublic, allowSignup.\n */\nexport interface OrgCreateWorkspaceRequest {\n /**\n * @minLength 1\n * @maxLength 200\n */\n name: string;\n slug?: string | null;\n templateWorkspaceUuid?: string | null;\n setupPurpose?: OrgCreateWorkspaceRequestSetupPurpose;\n /** @maxItems 8 */\n setupPurposes?: OrgCreateWorkspaceRequestSetupPurposesItem[];\n bundleUuid?: string | null;\n}\n\nexport type OrgCreateWorkspaceRequestSetupPurpose = typeof OrgCreateWorkspaceRequestSetupPurpose[keyof typeof OrgCreateWorkspaceRequestSetupPurpose] | null;\n\n\nexport const OrgCreateWorkspaceRequestSetupPurpose = {\n patient_enrollment: 'patient_enrollment',\n wellness_checks: 'wellness_checks',\n care_gaps: 'care_gaps',\n post_discharge: 'post_discharge',\n patient_requests: 'patient_requests',\n developer: 'developer',\n just_curious: 'just_curious',\n other: 'other',\n} as const;\n\nexport type OrgCreateWorkspaceRequestSetupPurposesItem = typeof OrgCreateWorkspaceRequestSetupPurposesItem[keyof typeof OrgCreateWorkspaceRequestSetupPurposesItem];\n\n\nexport const OrgCreateWorkspaceRequestSetupPurposesItem = {\n patient_enrollment: 'patient_enrollment',\n wellness_checks: 'wellness_checks',\n care_gaps: 'care_gaps',\n post_discharge: 'post_discharge',\n patient_requests: 'patient_requests',\n developer: 'developer',\n just_curious: 'just_curious',\n other: 'other',\n} as const;\n\n/**\n * Request to join a workspace as an org admin.\n */\nexport interface OrgJoinWorkspaceRequest {\n memberRoleId: number;\n}\n\n/**\n * Response after joining a workspace.\n */\nexport interface OrgJoinWorkspaceResponse {\n memberId: number;\n memberRoleId: number;\n message: string;\n}\n\n/**\n * Organization settings an **org admin** may change.\n *\n * Name, slug, contact details, logo and the security contact.\n *\n * Deliberately a separate model from :class:`UpdateOrganizationRequest`\n * rather than a subset enforced at the route: the privileged field\n * ``enforceCreditLimit`` is *absent from the schema*, so an org admin\n * cannot set it even by crafting the request body. Pydantic ignores\n * unknown keys, and there is no code path from here to that column.\n *\n * It remains superuser-only, on ``PUT /api/v2/admin/organizations/{id}``\n * behind ``Depends(get_superuser)``: ``enforceCreditLimit`` decides whether\n * a customer is hard-blocked (402) at zero credits or merely alerted, i.e.\n * whether they can keep spending.\n *\n * SSO is not here either — it has its own admin-scoped endpoint\n * (``PUT /api/v2/o/{org_uuid}/sso``) with its own audit trail.\n */\nexport interface OrgSettingsUpdateRequest {\n name?: string | null;\n slug?: string | null;\n contactEmail?: string | null;\n contactPhone?: string | null;\n logoUrl?: string | null;\n securityContactEmail?: string | null;\n securityContactName?: string | null;\n}\n\n/**\n * Update request for org-scoped workspace updates.\n *\n * Only allows fields that org admins should be able to change.\n * Does NOT allow: features, featuresOverride, organizationId, resellerId,\n * creatorId, themes.\n */\nexport interface OrgUpdateWorkspaceRequest {\n name?: string | null;\n slug?: string | null;\n signupCode?: string | null;\n isPublic?: boolean | null;\n allowSignup?: boolean | null;\n locale?: string | null;\n timezone?: string | null;\n}\n\n/**\n * Workspace response for org context.\n *\n * Similar to AdminWorkspaceResponse but without superuser-only fields\n * like dbId, featuresOverride, billingOwnerId, etc.\n */\nexport interface OrgWorkspaceResponse {\n id: number;\n uuid: string;\n slug: string;\n name: string;\n organizationId: number;\n organizationUuid?: string | null;\n organizationName?: string | null;\n signupCode?: string | null;\n createdAt: string;\n isPublic?: boolean;\n allowSignup?: boolean;\n resellerId?: number | null;\n status: number;\n features?: string[] | null;\n featureStatus?: OrgWorkspaceResponseFeatureStatus;\n creatorId?: number | null;\n creatorName?: string | null;\n locale?: string | null;\n timezone?: string | null;\n isMember?: boolean;\n}\n\nexport type OrgWorkspaceResponseFeatureStatus = {[key: string]: string} | null;\n\n/**\n * One workspace card's expensive half: workspace-schema aggregates.\n *\n * ``myRoleName`` is about the requesting account and is returned to any org\n * member who belongs to the workspace. The counts are org-administrative\n * information and are populated only for ``org:read`` holders; everyone else\n * gets ``None`` (rendered as \"—\" rather than zero, so the UI never implies\n * an empty workspace when it simply may not look).\n *\n * ``schemaReady`` is False while the workspace is still provisioning — its\n * tables do not exist yet, so the counts are absent for a reason the card\n * can explain instead of showing a failure.\n */\nexport interface OrgWorkspaceStatsResponse {\n workspaceUuid: string;\n /** False while the workspace is still provisioning, or when its schema could not be read. The counts are absent in that case. */\n schemaReady?: boolean;\n /** The REQUESTING account's member-role name in this workspace. Null when they have no member row there. */\n myRoleName?: string | null;\n /** Non-archived members in this workspace. NULL — not 0 — when the caller lacks org:read, or when the workspace schema is unreadable (schemaReady=false). Zero means the workspace really is empty. */\n memberCount?: number | null;\n /** Published and draft sites in this workspace. NULL — not 0 — when the caller lacks org:read, or when the workspace schema is unreadable (schemaReady=false). Zero means the workspace really is empty. */\n siteCount?: number | null;\n /** Email inboxes in this workspace. NULL — not 0 — when the caller lacks org:read, or when the workspace schema is unreadable (schemaReady=false). Zero means the workspace really is empty. */\n inboxCount?: number | null;\n /** Non-archived phone numbers in this workspace. NULL — not 0 — when the caller lacks org:read, or when the workspace schema is unreadable (schemaReady=false). Zero means the workspace really is empty. */\n phoneNumberCount?: number | null;\n}\n\n/**\n * One workspace card's cheap half: identity plus a GLB-side count.\n *\n * ``orgMemberCount`` joins workspace membership to org membership. A separate\n * \"all accounts\" tally was tried and dropped: the\n * ``enforce_org_membership_before_workspace`` trigger refuses a workspace\n * membership for an account with no org membership, so the two numbers are\n * equal except in the transient state after an org membership is revoked —\n * a distinction no card was showing.\n */\nexport interface OrgWorkspaceSummaryResponse {\n uuid: string;\n name: string;\n slug: string;\n /** WorkspaceProvisionStatus. 2 = AVAILABLE; anything else means the workspace is still being provisioned. */\n status: number;\n createdAt: string;\n isPublic?: boolean;\n allowSignup?: boolean;\n /** Whether the requesting account has a workspace membership here. */\n isMember?: boolean;\n /** Accounts with access to this workspace who are also members of this organization. */\n orgMemberCount?: number;\n}\n\nexport type PhiDataPolicy = typeof PhiDataPolicy[keyof typeof PhiDataPolicy];\n\n\nexport const PhiDataPolicy = {\n unclassified: 'unclassified',\n phi_prohibited: 'phi_prohibited',\n phi_permitted: 'phi_permitted',\n} as const;\n\nexport type PhiPostureDecision = typeof PhiPostureDecision[keyof typeof PhiPostureDecision];\n\n\nexport const PhiPostureDecision = {\n allow_non_phi: 'allow_non_phi',\n warn_non_phi: 'warn_non_phi',\n review_required: 'review_required',\n authorization_required: 'authorization_required',\n conflict: 'conflict',\n} as const;\n\nexport type PhiPostureReasonCode = typeof PhiPostureReasonCode[keyof typeof PhiPostureReasonCode];\n\n\nexport const PhiPostureReasonCode = {\n org_unclassified: 'org_unclassified',\n workspace_unclassified: 'workspace_unclassified',\n non_phi_policy_aligned: 'non_phi_policy_aligned',\n phi_expected_workspace_prohibited: 'phi_expected_workspace_prohibited',\n phi_authorization_not_evaluated: 'phi_authorization_not_evaluated',\n phi_coverage_satisfied: 'phi_coverage_satisfied',\n phi_coverage_missing: 'phi_coverage_missing',\n phi_coverage_expired: 'phi_coverage_expired',\n non_phi_org_workspace_permitted: 'non_phi_org_workspace_permitted',\n phi_permitted_org_not_expected: 'phi_permitted_org_not_expected',\n organization_review_expired: 'organization_review_expired',\n workspace_review_expired: 'workspace_review_expired',\n invalid_state: 'invalid_state',\n} as const;\n\nexport interface PublicWorkspaceResponse {\n id: number;\n uuid: string;\n slug: string;\n name: string;\n createdAt: string;\n allowSignup?: boolean;\n resellerId?: number | null;\n memberRole?: string | null;\n signupRequestStatus?: string | null;\n}\n\nexport interface QueryDataTypeInfo {\n id: number;\n slug: string;\n name: string;\n isCollection: boolean;\n recordFields: RecordFieldInfo[];\n}\n\n/**\n * A labeled choice for a field whose raw values are ids/codes.\n */\nexport interface QueryEnumOption {\n value: unknown;\n label: string;\n color?: string | null;\n}\n\nexport interface QueryFieldInfo {\n path: string;\n type: string;\n operators: string[];\n sortable?: boolean;\n selectable?: boolean;\n enumValues?: unknown[] | null;\n enumOptions?: QueryEnumOption[] | null;\n displayName?: string | null;\n category?: string | null;\n}\n\nexport interface QueryFieldsResponse {\n entities: QueryFieldsResponseEntities;\n aggregateSources: QueryFieldsResponseAggregateSources;\n dataTypes: QueryDataTypeInfo[];\n recordSystemFields: QueryFieldInfo[];\n relations?: QueryFieldsResponseRelations;\n aggregateSourceCategories?: QueryFieldsResponseAggregateSourceCategories;\n}\n\nexport type QueryFieldsResponseAggregateSourceCategories = {[key: string]: {[key: string]: string}};\n\nexport type QueryFieldsResponseAggregateSources = {[key: string]: string[]};\n\nexport type QueryFieldsResponseEntities = {[key: string]: QueryFieldInfo[]};\n\nexport type QueryFieldsResponseRelations = {[key: string]: {[key: string]: QueryFieldInfo[]}};\n\nexport interface RecordFieldInfo {\n slug: string;\n name: string;\n type: string;\n operators: string[];\n enumValues?: unknown[] | null;\n}\n\nexport interface RunQueryRequest {\n query: Query;\n mode?: RunQueryRequestMode;\n}\n\nexport type RunQueryRequestMode = typeof RunQueryRequestMode[keyof typeof RunQueryRequestMode] | null;\n\n\nexport const RunQueryRequestMode = {\n rows: 'rows',\n count: 'count',\n aggregate: 'aggregate',\n} as const;\n\nexport interface RunQueryResponse {\n mode: string;\n items?: RunQueryResponseItems;\n nextCursor?: string | null;\n count?: number | null;\n rows?: RunQueryResponseRows;\n warnings?: string[];\n cost?: CostInfo | null;\n}\n\nexport type RunQueryResponseItems = { [key: string]: unknown }[] | null;\n\nexport type RunQueryResponseRows = { [key: string]: unknown }[] | null;\n\n/**\n * Request model for associating child tasks (parent-child relationships).\n *\n * ``order`` is optional and backward-compatible: when omitted, callers\n * that build associations from a UI-style ``childTasks`` list keep the\n * historical array-index ordering. When provided (e.g. by the workspace\n * transfer importer), it preserves the authored routing order so that\n * automatic routing still selects the lower-order matching child after\n * transfer.\n */\nexport interface TaskAssociationRequest {\n taskId: number;\n autoNext: boolean;\n required: boolean;\n choicePrompt?: string | null;\n celCondition?: string | null;\n order?: number | null;\n}\n\n/**\n * Update workspace defaults.\n */\nexport interface UpdateWorkspaceDefaultsRequest {\n defaultPhoneNumberId?: number | null;\n defaultAgentId?: number | null;\n escalationBusinessHours?: string | null;\n escalationOnlineMessageTemplate?: string | null;\n escalationOfflineMessageTemplate?: string | null;\n escalationNotifiedMessageTemplate?: string | null;\n escalationPausedMessageTemplate?: string | null;\n emailFooter?: string | null;\n defaultReplyToInboxId?: number | null;\n pauseOnEscalate?: boolean | null;\n enableAudioRecording?: boolean | null;\n enableVoicemailDetection?: boolean | null;\n allowDevices?: boolean;\n shortenUrls?: boolean | null;\n transcriptionModel?: string | null;\n}\n\n/**\n * Feature choices from Workspace settings, as ``{slug: enabled}``.\n */\nexport interface UpdateWorkspaceFeaturesRequest {\n features: UpdateWorkspaceFeaturesRequestFeatures;\n}\n\nexport type UpdateWorkspaceFeaturesRequestFeatures = {[key: string]: boolean};\n\n/**\n * Update a workspace.\n */\nexport interface UpdateWorkspaceRequest {\n name?: string | null;\n slug?: string | null;\n signupCode?: string | null;\n isPublic?: boolean | null;\n allowSignup?: boolean | null;\n locale?: string | null;\n timezone?: string | null;\n}\n\nexport interface ValidateQueryResponse {\n valid: boolean;\n cost: CostInfo;\n warnings?: string[];\n errors?: string[];\n}\n\n/**\n * Slim view of an OrgDomain for selection in workspace forms.\n *\n * Intentionally smaller than `OrgDomainResponse` — workspace members\n * don't need ownership tokens, DNS records, last-checked timestamps,\n * etc. Just enough to populate a dropdown, pass the uuid back as a\n * foreign reference (e.g. `orgDomainUuid` on inbox creation), and\n * let the UI mark non-verified entries as disabled with a reason.\n */\nexport interface WorkspaceAvailableDomain {\n uuid: string;\n domain: string;\n ownershipStatus: string;\n emailStatus?: string | null;\n siteStatus?: string | null;\n isChildHost?: boolean;\n}\n\nexport interface WorkspaceAvailableDomainsResponse {\n items: WorkspaceAvailableDomain[];\n total: number;\n}\n\n/**\n * Response model for workspace counts.\n */\nexport interface WorkspaceCountsResponse {\n humans: number;\n agents: number;\n tasks: number;\n workflows: number;\n inboxes: number;\n phoneNumbers: number;\n chats: number;\n files: number;\n sites: number;\n forms: number;\n}\n\n/**\n * One feature as Workspace settings shows it.\n */\nexport interface WorkspaceFeatureState {\n slug: string;\n name: string;\n description: string;\n category: string;\n icon?: string | null;\n enabled: boolean;\n editable: boolean;\n}\n\n/**\n * Every feature this workspace's plan allows, and whether it is on.\n */\nexport interface WorkspaceFeaturesResponse {\n features: WorkspaceFeatureState[];\n}\n\n/**\n * Request model for joining a workspace.\n */\nexport interface WorkspaceJoinRequest {\n memberRoleId: number;\n orgRole?: string | null;\n}\n\n/**\n * Response model for joining a workspace.\n */\nexport interface WorkspaceJoinResponse {\n success: boolean;\n memberUuid: string;\n memberId: number;\n workspaceUuid: string;\n workspaceName: string;\n memberRoleName: string;\n message: string;\n}\n\nexport interface WorkspaceResponse {\n id: number;\n uuid: string;\n slug: string;\n name: string;\n organizationId: number;\n organizationUuid?: string | null;\n organizationName?: string | null;\n organizationLogoUrl?: string | null;\n signupCode?: string | null;\n createdAt: string;\n userRole: string | null;\n canManageBundles?: boolean;\n isPublic?: boolean;\n allowSignup?: boolean;\n resellerId?: number | null;\n themes?: string[];\n features?: string[] | null;\n featureStatus?: WorkspaceResponseFeatureStatus;\n signupRequestStatus?: string | null;\n status?: number | null;\n templateWorkspaceUuid?: string | null;\n locale?: string | null;\n timezone?: string | null;\n requiresOrgAuth?: boolean | null;\n authUrl?: string | null;\n}\n\nexport type WorkspaceResponseFeatureStatus = {[key: string]: string} | null;\n\n/**\n * Individual scope metadata.\n */\nexport interface WorkspaceScopeResponse {\n name: string;\n category: string;\n description: string;\n implies?: string[];\n dangerous?: boolean;\n}\n\n/**\n * Response containing all workspace-grantable scopes.\n */\nexport interface WorkspaceScopesListResponse {\n items: WorkspaceScopeResponse[];\n categories: string[];\n}\n\nexport interface WorkspaceSettingsResponse {\n id: number;\n slug: string;\n defaultPhoneNumberId: number | null;\n defaultAgentId: number | null;\n workspaceFolderId?: number | null;\n escalationBusinessHours: string | null;\n escalationOnlineMessageTemplate: string | null;\n escalationOfflineMessageTemplate: string | null;\n escalationNotifiedMessageTemplate: string | null;\n escalationPausedMessageTemplate: string | null;\n emailFooter: string | null;\n defaultReplyToInboxId: number | null;\n pauseOnEscalate: boolean;\n sesDomain: string;\n enableAudioRecording: boolean;\n enableVoicemailDetection: boolean;\n allowDevices: boolean;\n shortenUrls: boolean;\n shortenUrlsExampleUrl: string;\n shortenUrlsAvailable: boolean;\n transcriptionModel?: string | null;\n defaultChatModel: string;\n defaultRealtimeModel: string;\n defaultInferenceModel: string;\n defaultVoiceModel: string;\n firstRunMode?: string | null;\n}\n","/**\n * Generated by Orval, grouped by scripts/types-codegen/group_generated.ts\n * (group map from emit_openapi.py). Do not edit manually.\n * Group: metric\n */\n\n\n/**\n * On-demand compute of enabled chat-source metrics for one chat.\n */\nexport interface ComputeChatMetricsRequest {\n /**\n * Chat id to evaluate\n * @minimum 1\n */\n chatId: number;\n}\n\n/**\n * Result of an on-demand chat metrics compute.\n */\nexport interface ComputeChatMetricsResponse {\n chatId: number;\n observationCount: number;\n}\n\n/**\n * Create a workspace metric definition.\n */\nexport interface CreateMetricRequest {\n /**\n * @minLength 1\n * @maxLength 255\n */\n name: string;\n /** Stable identifier; auto-derived from name when omitted. */\n slug?: string | null;\n description?: string | null;\n metricType: MetricType;\n source?: MetricSource;\n kind?: MetricKind;\n unit?: MetricUnit;\n celExpression?: string | null;\n evaluationPrompt?: string | null;\n /**\n * @minimum 0\n * @maximum 1\n */\n passingThreshold?: number;\n sourceConfig?: MetricSourceConfig | null;\n denominator?: MetricDenominator;\n attributionWindowSeconds?: number | null;\n enabled?: boolean;\n chatType?: MetricChatType;\n /** Workflows this chat metric measures. Required for chat metrics — pass [] to mean every workflow, deliberately. Omitting it is an error, so a scope is never chosen by accident. */\n workflowIds?: number[] | null;\n /** Optional goal for this metric — 'reach this value'. */\n targetValue?: number | null;\n /** Optional due date for targetValue. */\n targetDate?: string | null;\n}\n\n/**\n * Which conversation surface a chat metric measures.\n *\n * One metric measures one surface, deliberately. An assignment chat, a\n * sidebar DM and a contributor-input chat are different populations with\n * different success conditions; averaging them yields a number that\n * describes nothing. Want resolution rate for DMs too? That is a second\n * metric, and the two are legitimately comparable side by side.\n *\n * ``manager`` is absent on purpose — workspace-management chats are the\n * operator talking to the product, never a customer outcome.\n */\nexport type MetricChatType = typeof MetricChatType[keyof typeof MetricChatType];\n\n\nexport const MetricChatType = {\n assignment: 'assignment',\n dm: 'dm',\n contributor: 'contributor',\n} as const;\n\n/**\n * Explicit rate denominator — stored on the definition, not a convention.\n *\n * Read it as \"count once per\": what the rate divides by.\n *\n * * ``OBSERVATIONS`` — each observation counts once. For every metric\n * that can exist today that is one per conversation, because a\n * conversation yields exactly one observation.\n * * ``UNIQUE_MEMBERS`` — each Member counts once no matter how many\n * chats they had in the window. Required by pilot agreements written\n * as \"unique clients who respond… multiple responses from the same\n * client count as a single engagement\": a member in a multi-touch\n * journey has several chats, so averaging over observations\n * double-counts them and produces a defensible number that is not the\n * number in the contract.\n *\n * There was briefly a third value, ``CHATS``, reserved so a future\n * message-sourced metric could distinguish \"per observation\" (per\n * message) from \"per conversation\". It computed an identical number to\n * ``OBSERVATIONS`` for every metric that can exist today, so it reached\n * the UI as two buttons producing the same result. Reintroduce it with\n * the ``CHAT_MESSAGE`` source (#22474), when the distinction is real.\n */\nexport type MetricDenominator = typeof MetricDenominator[keyof typeof MetricDenominator];\n\n\nexport const MetricDenominator = {\n observations: 'observations',\n unique_members: 'unique_members',\n} as const;\n\n/**\n * Aggregation semantics for stored values.\n *\n * * ``OBSERVATION`` — one row per subject (chat/message/member). Aggregate\n * with avg/sum/count over a window. Must not be last-valued.\n * * ``GAUGE`` — point-in-time count of matching rows. Last-value only;\n * must not be summed across a window. Computed by the ``member_filter``\n * source.\n */\nexport type MetricKind = typeof MetricKind[keyof typeof MetricKind];\n\n\nexport const MetricKind = {\n observation: 'observation',\n gauge: 'gauge',\n} as const;\n\n/**\n * One observation — reason may be PHI; gated by analytics scope.\n */\nexport interface MetricObservationResponse {\n id: number;\n uuid: string;\n metricId: number;\n value: number;\n observedAt: string;\n chatId: number | null;\n memberId: number | null;\n messageId: number | null;\n /** Rubric grader free text — PHI-bearing; omit from aggregate export */\n reason?: string | null;\n modelId?: string | null;\n modelVersion?: string | null;\n evaluationData?: MetricObservationResponseEvaluationData;\n createdAt: string;\n}\n\nexport type MetricObservationResponseEvaluationData = { [key: string]: unknown } | null;\n\n/**\n * API shape for a Metric definition.\n */\nexport interface MetricResponse {\n id: number;\n uuid: string;\n name: string;\n slug: string;\n description: string | null;\n metricType: string;\n source: string;\n kind: string;\n unit: string;\n celExpression: string | null;\n evaluationPrompt: string | null;\n passingThreshold: number;\n sourceConfig: MetricResponseSourceConfig;\n denominator: string;\n attributionWindowSeconds: number | null;\n chatType: string;\n workflowIds: number[];\n targetValue: number | null;\n targetDate: string | null;\n enabled: boolean;\n archived: boolean;\n createdAt: string;\n updatedAt: string;\n}\n\nexport type MetricResponseSourceConfig = { [key: string]: unknown } | null;\n\n/**\n * One time-bucket of aggregated observations.\n */\nexport interface MetricSeriesBucket {\n bucketStart: string;\n value: number | null;\n count: number;\n}\n\n/**\n * Time-series readout for a metric.\n */\nexport interface MetricSeriesResponse {\n metricId: number;\n metricUuid: string;\n metricName: string;\n unit: string;\n kind: string;\n denominator: string;\n aggregation: string;\n bucket: string;\n start: string;\n end: string;\n buckets: MetricSeriesBucket[];\n overallValue: number | null;\n overallCount: number;\n targetValue?: number | null;\n targetDate?: string | null;\n}\n\n/**\n * What triggers computation of a metric observation.\n *\n * * ``CHAT`` — rides ``ChatPostProcessingWorkflow`` after a chat goes quiet.\n * * ``MEMBER_FILTER`` — point-in-time count of Members matching a\n * :class:`~lib.models.workspace.member_filter.MemberFilter`. This is the\n * source that subsumed the former ``MilestoneGoal`` (a named target over a\n * Member cohort at a date); ``source_config`` carries\n * ``{\"member_filter_id\": <id>}``.\n *\n * Other sources are reserved for follow-on work.\n */\nexport type MetricSource = typeof MetricSource[keyof typeof MetricSource];\n\n\nexport const MetricSource = {\n chat: 'chat',\n member_filter: 'member_filter',\n} as const;\n\n/**\n * Per-source parameters for a metric definition.\n *\n * Typed rather than a bare ``dict[str, Any]`` because the values are\n * load-bearing at compute time and failure is silent. A chat metric whose\n * ``minMessages`` arrives as ``\"10\"`` was previously ignored outright —\n * ``metric_meets_min_messages`` only honours the key when it is already an\n * ``int`` — so the metric graded conversations the author meant to exclude\n * and nothing said so. ``extra=\"forbid\"`` gives the same treatment to a\n * typo'd key, which used to be stored and quietly do nothing.\n *\n * API keys are camelCase per the naming convention; the persisted JSONB\n * keeps snake_case because that is what ``metric_eval_service`` reads.\n * ``to_storage`` is the only place that translation happens.\n */\nexport interface MetricSourceConfig {\n memberFilterId?: number | null;\n minMessages?: number | null;\n}\n\n/**\n * How a metric value is computed.\n *\n * ``EXPRESSION`` is CEL-evaluated (synchronous, deterministic).\n * ``RUBRIC`` is LLM-evaluated (async, probabilistic). Those two mirror\n * :class:`~lib.models.workspace.qualification.CriterionType`.\n *\n * ``FILTER_COUNT`` has no authored expression at all — the value is the\n * number of rows matching a saved filter named in ``source_config``. It\n * pairs with ``source=member_filter`` + ``kind=gauge`` and is what the\n * retired MilestoneGoal computed.\n */\nexport type MetricType = typeof MetricType[keyof typeof MetricType];\n\n\nexport const MetricType = {\n expression: 'expression',\n rubric: 'rubric',\n filter_count: 'filter_count',\n} as const;\n\n/**\n * Display/aggregation hint for the metric's values.\n */\nexport type MetricUnit = typeof MetricUnit[keyof typeof MetricUnit];\n\n\nexport const MetricUnit = {\n rate: 'rate',\n score: 'score',\n count: 'count',\n custom: 'custom',\n} as const;\n\n/**\n * Partial update of a metric definition.\n *\n * ``metricType`` is immutable after create (same rule as ScenarioCriterion).\n */\nexport interface UpdateMetricRequest {\n name?: string | null;\n description?: string | null;\n unit?: MetricUnit | null;\n celExpression?: string | null;\n evaluationPrompt?: string | null;\n passingThreshold?: number | null;\n sourceConfig?: MetricSourceConfig | null;\n denominator?: MetricDenominator | null;\n attributionWindowSeconds?: number | null;\n enabled?: boolean | null;\n archived?: boolean | null;\n workflowIds?: number[] | null;\n targetValue?: number | null;\n targetDate?: string | null;\n}\n","/**\n * Generated by Orval, grouped by scripts/types-codegen/group_generated.ts\n * (group map from emit_openapi.py). Do not edit manually.\n * Group: pilot_program\n */\n\n\n/**\n * All pilot-program config rows the operator asked for.\n */\nexport interface PilotProgramListResponse {\n programs: PilotProgramResponse[];\n total: number;\n includesInactive: boolean;\n}\n\n/**\n * One ``pilot_programs`` config row.\n */\nexport interface PilotProgramResponse {\n id: number;\n uuid: string;\n label: string;\n customerId?: number | null;\n coveredWorkspaceIds: number[];\n relationshipType: PilotRelationshipType;\n lifecycleStage: PilotStage;\n stageEnteredAt: string;\n allocationMinutes?: number | null;\n allocationPeriodStart?: string | null;\n notifyThresholdPct: number;\n notifyContactLabel?: string | null;\n stalenessThresholdDays: number;\n active: boolean;\n createdAt?: string | null;\n updatedAt?: string | null;\n}\n\n/**\n * How this pilot relates to us commercially.\n *\n * Drives the staleness read: a ``DIRECT_PILOT`` is healthy when its own\n * workspaces are active; a ``PARTNER_CHANNEL`` (co-sale partner / reseller) is\n * healthy on deal + integration activity even with low own-workspace volume.\n */\nexport type PilotRelationshipType = typeof PilotRelationshipType[keyof typeof PilotRelationshipType];\n\n\nexport const PilotRelationshipType = {\n direct_pilot: 'direct_pilot',\n partner_channel: 'partner_channel',\n} as const;\n\n/**\n * The pilot funnel stage (distinct from the churn-risk\n * ``CustomerHealthLifecycleStage`` in the customer-health read model —\n * that answers \"how healthy?\", this answers \"how far through the pilot?\").\n *\n * ``SIGNED``/``LIVE``/``VALUE_EVIDENCED`` are the in-flight stages a staleness\n * watcher covers; ``ON_HOLD`` is a deliberate pause (never paged on); and\n * ``CONVERTED``/``CHURNED`` are terminal outcomes (no staleness signal).\n */\nexport type PilotStage = typeof PilotStage[keyof typeof PilotStage];\n\n\nexport const PilotStage = {\n signed: 'signed',\n live: 'live',\n value_evidenced: 'value_evidenced',\n converted: 'converted',\n on_hold: 'on_hold',\n churned: 'churned',\n} as const;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BO,IAAM,6BAA6B;AAAA,EACxC,cAAc;AAAA,EACd,WAAW;AACb;AAgDO,IAAM,iCAAiC;AAAA,EAC5C,cAAc;AAAA,EACd,WAAW;AACb;;;AC9CO,IAAM,cAAc;AAAA,EACzB,SAAS;AAAA,EACT,MAAM;AACR;;;ACgBO,IAAM,yCAAyC;AAAA,EACpD,4BAA4B;AAAA,EAC5B,yBAAyB;AAAA,EACzB,2BAA2B;AAAA,EAC3B,aAAa;AAAA,EACb,yBAAyB;AAC3B;AAKO,IAAM,kCAAkC;AAAA,EAC7C,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,wBAAwB;AAAA,EACxB,qBAAqB;AAAA,EACrB,oBAAoB;AAAA,EACpB,uBAAuB;AAAA,EACvB,uBAAuB;AAAA,EACvB,iBAAiB;AAAA,EACjB,qBAAqB;AAAA,EACrB,yBAAyB;AAAA,EACzB,mBAAmB;AAAA,EACnB,kBAAkB;AAAA,EAClB,2BAA2B;AAC7B;AAsIO,IAAM,8BAA8B;AAAA,EACzC,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,UAAU;AACZ;AAKO,IAAM,8BAA8B;AAAA,EACzC,KAAK;AAAA,EACL,UAAU;AACZ;AAKO,IAAM,gCAAgC;AAAA,EAC3C,kBAAkB;AAAA,EAClB,yBAAyB;AAAA,EACzB,WAAW;AAAA,EACX,sBAAsB;AAAA,EACtB,qBAAqB;AAAA,EACrB,eAAe;AAAA,EACf,0BAA0B;AAC5B;AAKO,IAAM,2BAA2B;AAAA,EACtC,MAAM;AAAA,EACN,SAAS;AAAA,EACT,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,UAAU;AACZ;AAyCO,IAAM,qCAAqC;AAAA,EAChD,SAAS;AAAA,EACT,SAAS;AACX;;;ACvQO,IAAM,kBAAkB;AAAA,EAC7B,wBAAwB;AAAA,EACxB,uBAAuB;AAAA,EACvB,oBAAoB;AAAA,EACpB,cAAc;AAAA,EACd,iBAAiB;AAAA,EACjB,YAAY;AAAA,EACZ,mBAAmB;AACrB;AAKO,IAAM,kBAAkB;AAAA,EAC7B,sBAAsB;AAAA,EACtB,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,kBAAkB;AACpB;AA0CO,IAAM,yCAAyC;AAAA,EACpD,cAAc;AAAA,EACd,WAAW;AACb;;;ACiVO,IAAM,gBAAgB;AAAA,EAC3B,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,eAAe;AACjB;AAKO,IAAM,qBAAqB;AAAA,EAChC,eAAe;AAAA,EACf,cAAc;AAAA,EACd,iBAAiB;AAAA,EACjB,wBAAwB;AAAA,EACxB,UAAU;AACZ;AAKO,IAAM,uBAAuB;AAAA,EAClC,kBAAkB;AAAA,EAClB,wBAAwB;AAAA,EACxB,wBAAwB;AAAA,EACxB,mCAAmC;AAAA,EACnC,iCAAiC;AAAA,EACjC,wBAAwB;AAAA,EACxB,sBAAsB;AAAA,EACtB,sBAAsB;AAAA,EACtB,iCAAiC;AAAA,EACjC,gCAAgC;AAAA,EAChC,6BAA6B;AAAA,EAC7B,0BAA0B;AAAA,EAC1B,eAAe;AACjB;;;ACvYO,IAAM,iBAAiB;AAAA,EAC5B,YAAY;AAAA,EACZ,IAAI;AAAA,EACJ,aAAa;AACf;AA4BO,IAAM,oBAAoB;AAAA,EAC/B,cAAc;AAAA,EACd,gBAAgB;AAClB;AAcO,IAAM,aAAa;AAAA,EACxB,aAAa;AAAA,EACb,OAAO;AACT;AAoGO,IAAM,eAAe;AAAA,EAC1B,MAAM;AAAA,EACN,eAAe;AACjB;AAqCO,IAAM,aAAa;AAAA,EACxB,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,cAAc;AAChB;AAQO,IAAM,aAAa;AAAA,EACxB,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AACV;;;AC9OO,IAAM,wBAAwB;AAAA,EACnC,cAAc;AAAA,EACd,iBAAiB;AACnB;AAcO,IAAM,aAAa;AAAA,EACxB,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,iBAAiB;AAAA,EACjB,WAAW;AAAA,EACX,SAAS;AAAA,EACT,SAAS;AACX;","names":[]}
@@ -1,4 +1,4 @@
1
- import { cq as MemberImportPreviewResponse, ct as MemberImportPreviewSummary, cs as MemberImportPreviewRowAction, co as MemberImportMatchInfoMatchType, cx as MemberImportStreamEvent } from './tasks-DAPby6cw.js';
1
+ import { cq as MemberImportPreviewResponse, ct as MemberImportPreviewSummary, cs as MemberImportPreviewRowAction, co as MemberImportMatchInfoMatchType, cx as MemberImportStreamEvent } from './tasks-Ca6yfsj2.js';
2
2
 
3
3
  /** Counts and row references for logs/CLI/chat. Drops identity, contacts and free text. */
4
4
  declare function toSafeMemberImportPreview(preview: MemberImportPreviewResponse): {
@@ -1,4 +1,4 @@
1
- import { cq as MemberImportPreviewResponse, ct as MemberImportPreviewSummary, cs as MemberImportPreviewRowAction, co as MemberImportMatchInfoMatchType, cx as MemberImportStreamEvent } from './tasks-DAPby6cw.cjs';
1
+ import { cq as MemberImportPreviewResponse, ct as MemberImportPreviewSummary, cs as MemberImportPreviewRowAction, co as MemberImportMatchInfoMatchType, cx as MemberImportStreamEvent } from './tasks-Ca6yfsj2.cjs';
2
2
 
3
3
  /** Counts and row references for logs/CLI/chat. Drops identity, contacts and free text. */
4
4
  declare function toSafeMemberImportPreview(preview: MemberImportPreviewResponse): {
@@ -1,5 +1,5 @@
1
- import { bX as ChannelMessagesUnavailableReason, m7 as Resource$1, Z as ActivityEventLine, L as ActivityAggregateResponse, $ as ActivityEventsResponse } from './chat-interaction-CGNwztoc.cjs';
2
- import { eX as SortOrder } from './tasks-DAPby6cw.cjs';
1
+ import { bX as ChannelMessagesUnavailableReason, m7 as Resource$1, Z as ActivityEventLine, L as ActivityAggregateResponse, $ as ActivityEventsResponse } from './chat-interaction-CO9ecTSn.js';
2
+ import { eX as SortOrder } from './tasks-Ca6yfsj2.js';
3
3
 
4
4
  /**
5
5
  * Generated by Orval, grouped by scripts/types-codegen/group_generated.ts
@@ -106,6 +106,13 @@ interface MemberNotifyActionParams {
106
106
  messageTemplate?: string | null;
107
107
  }
108
108
 
109
+ /**
110
+ * Generated from lib.rules.actions.builtin.email_send.
111
+ * Do not edit manually. Regenerated by yarn generate:types.
112
+ */
113
+ /** The most Members one `email:send` action may name in `memberIds`. */
114
+ declare const MAX_EMAIL_SEND_RECIPIENTS = 20;
115
+
109
116
  /**
110
117
  * Generated by Orval, grouped by scripts/types-codegen/group_generated.ts
111
118
  * (group map from emit_openapi.py). Do not edit manually.
@@ -2290,4 +2297,4 @@ interface RevisionState {
2290
2297
  */
2291
2298
  declare function getRevisionState(workflow: RevisionStateWorkflow, revision?: RevisionStateRevision): RevisionState;
2292
2299
 
2293
- export { type VoiceMetricsResponse$1 as $, type AIModelUsageResponse as A, type BillingStatistics as B, type CallEndSection as C, CreateMemberContactPointRequestSharing as D, type CurrentPlanInfo as E, DEFAULT_AGENT_CHAT_MODEL as F, DEFAULT_AGENT_REALTIME_MODEL as G, DEFAULT_AGENT_REALTIME_MODEL_CONFIG as H, DEFAULT_CHAT_MODEL as I, DEFAULT_CUSTOM_VOICE_MODEL as J, DEFAULT_VOICE_INFERENCE_MODEL as K, type DailyPhoneRowResponse as L, type DailySMSRowResponse as M, type DashboardMetrics as N, type DataRecordContext as O, type DataRecordImportOutcomes as P, type DeviceCacheFileEntry as Q, type DeviceCacheManifestResponse as R, type EfficiencyMetricsResponse as S, type EmailCountsResponse as T, type EmailUsageResponse as U, type EngineTimeSeries as V, type ErrorCodeBucket as W, type EventRuleMetrics as X, type ExportStatistics as Y, type FeatureSyncStatus as Z, type MetricSummary$1 as _, type AIUsageDetailsResponse as a, ToolkitState as a$, type WorkspaceHealthResponse$1 as a0, type HealthCheckStatistics as a1, type HealthDetailRequest as a2, type HealthMetricsRequest as a3, type HealthMetricsResponse as a4, type HealthSummary as a5, type ImportStatistics as a6, MEMBER_RELATIONSHIP_KINDS as a7, type MemberContactPointResponse as a8, type MemberContactPointConfirmationResponse as a9, type ResourceMetadata as aA, type ResourceOverageResponse as aB, type ResourceUsageResponse as aC, type RetireMemberContactPointRequest as aD, type RevisionState as aE, type RevisionStateRevision as aF, type RevisionStateWorkflow as aG, type RoutineRunMetrics as aH, SCOPES as aI, SCOPE_PRESETS as aJ, type SMSCommunicationDetailsResponse as aK, type SMSMessageUsageResponse as aL, type SMSPhoneNumberUsageResponse as aM, type ScenarioDependencyAssessment as aN, ScopeCategory as aO, ScopeManager as aP, type ScopeName as aQ, type SiteContext as aR, type SkippedWorkspace as aS, type StatisticsSummary as aT, type SystemStatistics as aU, type TaskContext as aV, type TaskCountResponse as aW, type TimeSeriesData as aX, type TimeSeriesDataPoint as aY, type ToolParameter as aZ, type ToolkitContext as a_, type MemberContactPointListResponse as aa, type MemberImportColumnResponse as ab, type MemberNotificationPreferences as ac, type MemberNotifyActionParams as ad, type MemberNotifyRecipientMode as ae, type MemberUsageReport as af, type MetricDataPoint as ag, type MetricSection as ah, type MetricSummary as ai, type MetricValue as aj, PIDS_DISPOSITIONS as ak, PIDS_SOURCES as al, type PageContext as am, type PerformanceMetrics as an, type PhoneCallPhoneNumberUsageResponse as ao, type PhoneCallUsageResponse as ap, type PhoneCommunicationDetailsResponse as aq, type PhoneNumberUsage as ar, type PidsDisposition as as, type PidsSource as at, type ProductOverageConfigResponse as au, type ProvisionPlanRequest as av, type ProvisionPlanResponse as aw, type RawDataRecordImportResponse as ax, type RequestsSection as ay, type RequestsStatusEntry as az, type AcquisitionFunnelChannel as b, type TopOffender as b0, type TopResourceOverageResponse as b1, type TtsReconnectOutcomeEntry as b2, type TtsReconnectSection as b3, type UpdateMemberContactPointRequest as b4, UpdateMemberContactPointRequestContactType as b5, UpdateMemberContactPointRequestPurpose as b6, UpdateMemberContactPointRequestSharing as b7, type UsageProductSummaryResponse as b8, type UsageReportResponse as b9, type UsageReportRequest as ba, type UsageStatistics as bb, type VoiceMetricsResponse as bc, type VoiceMetricsTimeRange as bd, WIDGET_SLUGS as be, type WebhookMetrics as bf, type WidgetSlug as bg, type WorkflowContext as bh, type WorkspaceHealthDetail as bi, type WorkspaceHealthResponse as bj, type WorkspaceHealthRow as bk, type WorkspaceUsageReportResponse as bl, formatAppContextAsMarkdown as bm, getAllResourceSlugs as bn, getResourceMetadata as bo, getRevisionState as bp, ScenarioDependencyAssessmentRefusalCodesItem as bq, type ScopeDefinition as br, type AcquisitionFunnelRecentSignup as c, type AcquisitionFunnelResponse as d, type ActivityDetail as e, type ActivityFeedResponse as f, type AdminDomainResponse as g, type AdminDomainSiteMapping as h, type AdminDomainWidgetMapping as i, type AdminPidsFindingResponse as j, type AnalyticsFilter as k, type AnalyticsQuery as l, type AppContext as m, type AttachedAddonInfo as n, type BundleScenarioPreflightResponse as o, type CallEndStatusEntry as p, type ChannelErrorBreakdown as q, type ChannelFailures as r, type ChannelMessageResponse as s, ChannelMessageDirection as t, ChannelMessageSource as u, type ChannelMessagesResponse as v, type CommunicationDetailsResponse as w, type CreateMemberContactPointRequest as x, CreateMemberContactPointRequestContactType as y, CreateMemberContactPointRequestPurpose as z };
2300
+ export { type VoiceMetricsResponse$1 as $, type AIModelUsageResponse as A, type BillingStatistics as B, type CallEndSection as C, CreateMemberContactPointRequestSharing as D, type CurrentPlanInfo as E, DEFAULT_AGENT_CHAT_MODEL as F, DEFAULT_AGENT_REALTIME_MODEL as G, DEFAULT_AGENT_REALTIME_MODEL_CONFIG as H, DEFAULT_CHAT_MODEL as I, DEFAULT_CUSTOM_VOICE_MODEL as J, DEFAULT_VOICE_INFERENCE_MODEL as K, type DailyPhoneRowResponse as L, type DailySMSRowResponse as M, type DashboardMetrics as N, type DataRecordContext as O, type DataRecordImportOutcomes as P, type DeviceCacheFileEntry as Q, type DeviceCacheManifestResponse as R, type EfficiencyMetricsResponse as S, type EmailCountsResponse as T, type EmailUsageResponse as U, type EngineTimeSeries as V, type ErrorCodeBucket as W, type EventRuleMetrics as X, type ExportStatistics as Y, type FeatureSyncStatus as Z, type MetricSummary$1 as _, type AIUsageDetailsResponse as a, type ToolkitContext as a$, type WorkspaceHealthResponse$1 as a0, type HealthCheckStatistics as a1, type HealthDetailRequest as a2, type HealthMetricsRequest as a3, type HealthMetricsResponse as a4, type HealthSummary as a5, type ImportStatistics as a6, MAX_EMAIL_SEND_RECIPIENTS as a7, MEMBER_RELATIONSHIP_KINDS as a8, type MemberContactPointResponse as a9, type RequestsStatusEntry as aA, type ResourceMetadata as aB, type ResourceOverageResponse as aC, type ResourceUsageResponse as aD, type RetireMemberContactPointRequest as aE, type RevisionState as aF, type RevisionStateRevision as aG, type RevisionStateWorkflow as aH, type RoutineRunMetrics as aI, SCOPES as aJ, SCOPE_PRESETS as aK, type SMSCommunicationDetailsResponse as aL, type SMSMessageUsageResponse as aM, type SMSPhoneNumberUsageResponse as aN, type ScenarioDependencyAssessment as aO, ScopeCategory as aP, ScopeManager as aQ, type ScopeName as aR, type SiteContext as aS, type SkippedWorkspace as aT, type StatisticsSummary as aU, type SystemStatistics as aV, type TaskContext as aW, type TaskCountResponse as aX, type TimeSeriesData as aY, type TimeSeriesDataPoint as aZ, type ToolParameter as a_, type MemberContactPointConfirmationResponse as aa, type MemberContactPointListResponse as ab, type MemberImportColumnResponse as ac, type MemberNotificationPreferences as ad, type MemberNotifyActionParams as ae, type MemberNotifyRecipientMode as af, type MemberUsageReport as ag, type MetricDataPoint as ah, type MetricSection as ai, type MetricSummary as aj, type MetricValue as ak, PIDS_DISPOSITIONS as al, PIDS_SOURCES as am, type PageContext as an, type PerformanceMetrics as ao, type PhoneCallPhoneNumberUsageResponse as ap, type PhoneCallUsageResponse as aq, type PhoneCommunicationDetailsResponse as ar, type PhoneNumberUsage as as, type PidsDisposition as at, type PidsSource as au, type ProductOverageConfigResponse as av, type ProvisionPlanRequest as aw, type ProvisionPlanResponse as ax, type RawDataRecordImportResponse as ay, type RequestsSection as az, type AcquisitionFunnelChannel as b, ToolkitState as b0, type TopOffender as b1, type TopResourceOverageResponse as b2, type TtsReconnectOutcomeEntry as b3, type TtsReconnectSection as b4, type UpdateMemberContactPointRequest as b5, UpdateMemberContactPointRequestContactType as b6, UpdateMemberContactPointRequestPurpose as b7, UpdateMemberContactPointRequestSharing as b8, type UsageProductSummaryResponse as b9, type UsageReportResponse as ba, type UsageReportRequest as bb, type UsageStatistics as bc, type VoiceMetricsResponse as bd, type VoiceMetricsTimeRange as be, WIDGET_SLUGS as bf, type WebhookMetrics as bg, type WidgetSlug as bh, type WorkflowContext as bi, type WorkspaceHealthDetail as bj, type WorkspaceHealthResponse as bk, type WorkspaceHealthRow as bl, type WorkspaceUsageReportResponse as bm, formatAppContextAsMarkdown as bn, getAllResourceSlugs as bo, getResourceMetadata as bp, getRevisionState as bq, ScenarioDependencyAssessmentRefusalCodesItem as br, type ScopeDefinition as bs, type AcquisitionFunnelRecentSignup as c, type AcquisitionFunnelResponse as d, type ActivityDetail as e, type ActivityFeedResponse as f, type AdminDomainResponse as g, type AdminDomainSiteMapping as h, type AdminDomainWidgetMapping as i, type AdminPidsFindingResponse as j, type AnalyticsFilter as k, type AnalyticsQuery as l, type AppContext as m, type AttachedAddonInfo as n, type BundleScenarioPreflightResponse as o, type CallEndStatusEntry as p, type ChannelErrorBreakdown as q, type ChannelFailures as r, type ChannelMessageResponse as s, ChannelMessageDirection as t, ChannelMessageSource as u, type ChannelMessagesResponse as v, type CommunicationDetailsResponse as w, type CreateMemberContactPointRequest as x, CreateMemberContactPointRequestContactType as y, CreateMemberContactPointRequestPurpose as z };
@@ -1,5 +1,5 @@
1
- import { bX as ChannelMessagesUnavailableReason, m7 as Resource$1, Z as ActivityEventLine, L as ActivityAggregateResponse, $ as ActivityEventsResponse } from './chat-interaction-DRn2dJ2X.js';
2
- import { eX as SortOrder } from './tasks-DAPby6cw.js';
1
+ import { bX as ChannelMessagesUnavailableReason, m7 as Resource$1, Z as ActivityEventLine, L as ActivityAggregateResponse, $ as ActivityEventsResponse } from './chat-interaction-0MSzmdxz.cjs';
2
+ import { eX as SortOrder } from './tasks-Ca6yfsj2.cjs';
3
3
 
4
4
  /**
5
5
  * Generated by Orval, grouped by scripts/types-codegen/group_generated.ts
@@ -106,6 +106,13 @@ interface MemberNotifyActionParams {
106
106
  messageTemplate?: string | null;
107
107
  }
108
108
 
109
+ /**
110
+ * Generated from lib.rules.actions.builtin.email_send.
111
+ * Do not edit manually. Regenerated by yarn generate:types.
112
+ */
113
+ /** The most Members one `email:send` action may name in `memberIds`. */
114
+ declare const MAX_EMAIL_SEND_RECIPIENTS = 20;
115
+
109
116
  /**
110
117
  * Generated by Orval, grouped by scripts/types-codegen/group_generated.ts
111
118
  * (group map from emit_openapi.py). Do not edit manually.
@@ -2290,4 +2297,4 @@ interface RevisionState {
2290
2297
  */
2291
2298
  declare function getRevisionState(workflow: RevisionStateWorkflow, revision?: RevisionStateRevision): RevisionState;
2292
2299
 
2293
- export { type VoiceMetricsResponse$1 as $, type AIModelUsageResponse as A, type BillingStatistics as B, type CallEndSection as C, CreateMemberContactPointRequestSharing as D, type CurrentPlanInfo as E, DEFAULT_AGENT_CHAT_MODEL as F, DEFAULT_AGENT_REALTIME_MODEL as G, DEFAULT_AGENT_REALTIME_MODEL_CONFIG as H, DEFAULT_CHAT_MODEL as I, DEFAULT_CUSTOM_VOICE_MODEL as J, DEFAULT_VOICE_INFERENCE_MODEL as K, type DailyPhoneRowResponse as L, type DailySMSRowResponse as M, type DashboardMetrics as N, type DataRecordContext as O, type DataRecordImportOutcomes as P, type DeviceCacheFileEntry as Q, type DeviceCacheManifestResponse as R, type EfficiencyMetricsResponse as S, type EmailCountsResponse as T, type EmailUsageResponse as U, type EngineTimeSeries as V, type ErrorCodeBucket as W, type EventRuleMetrics as X, type ExportStatistics as Y, type FeatureSyncStatus as Z, type MetricSummary$1 as _, type AIUsageDetailsResponse as a, ToolkitState as a$, type WorkspaceHealthResponse$1 as a0, type HealthCheckStatistics as a1, type HealthDetailRequest as a2, type HealthMetricsRequest as a3, type HealthMetricsResponse as a4, type HealthSummary as a5, type ImportStatistics as a6, MEMBER_RELATIONSHIP_KINDS as a7, type MemberContactPointResponse as a8, type MemberContactPointConfirmationResponse as a9, type ResourceMetadata as aA, type ResourceOverageResponse as aB, type ResourceUsageResponse as aC, type RetireMemberContactPointRequest as aD, type RevisionState as aE, type RevisionStateRevision as aF, type RevisionStateWorkflow as aG, type RoutineRunMetrics as aH, SCOPES as aI, SCOPE_PRESETS as aJ, type SMSCommunicationDetailsResponse as aK, type SMSMessageUsageResponse as aL, type SMSPhoneNumberUsageResponse as aM, type ScenarioDependencyAssessment as aN, ScopeCategory as aO, ScopeManager as aP, type ScopeName as aQ, type SiteContext as aR, type SkippedWorkspace as aS, type StatisticsSummary as aT, type SystemStatistics as aU, type TaskContext as aV, type TaskCountResponse as aW, type TimeSeriesData as aX, type TimeSeriesDataPoint as aY, type ToolParameter as aZ, type ToolkitContext as a_, type MemberContactPointListResponse as aa, type MemberImportColumnResponse as ab, type MemberNotificationPreferences as ac, type MemberNotifyActionParams as ad, type MemberNotifyRecipientMode as ae, type MemberUsageReport as af, type MetricDataPoint as ag, type MetricSection as ah, type MetricSummary as ai, type MetricValue as aj, PIDS_DISPOSITIONS as ak, PIDS_SOURCES as al, type PageContext as am, type PerformanceMetrics as an, type PhoneCallPhoneNumberUsageResponse as ao, type PhoneCallUsageResponse as ap, type PhoneCommunicationDetailsResponse as aq, type PhoneNumberUsage as ar, type PidsDisposition as as, type PidsSource as at, type ProductOverageConfigResponse as au, type ProvisionPlanRequest as av, type ProvisionPlanResponse as aw, type RawDataRecordImportResponse as ax, type RequestsSection as ay, type RequestsStatusEntry as az, type AcquisitionFunnelChannel as b, type TopOffender as b0, type TopResourceOverageResponse as b1, type TtsReconnectOutcomeEntry as b2, type TtsReconnectSection as b3, type UpdateMemberContactPointRequest as b4, UpdateMemberContactPointRequestContactType as b5, UpdateMemberContactPointRequestPurpose as b6, UpdateMemberContactPointRequestSharing as b7, type UsageProductSummaryResponse as b8, type UsageReportResponse as b9, type UsageReportRequest as ba, type UsageStatistics as bb, type VoiceMetricsResponse as bc, type VoiceMetricsTimeRange as bd, WIDGET_SLUGS as be, type WebhookMetrics as bf, type WidgetSlug as bg, type WorkflowContext as bh, type WorkspaceHealthDetail as bi, type WorkspaceHealthResponse as bj, type WorkspaceHealthRow as bk, type WorkspaceUsageReportResponse as bl, formatAppContextAsMarkdown as bm, getAllResourceSlugs as bn, getResourceMetadata as bo, getRevisionState as bp, ScenarioDependencyAssessmentRefusalCodesItem as bq, type ScopeDefinition as br, type AcquisitionFunnelRecentSignup as c, type AcquisitionFunnelResponse as d, type ActivityDetail as e, type ActivityFeedResponse as f, type AdminDomainResponse as g, type AdminDomainSiteMapping as h, type AdminDomainWidgetMapping as i, type AdminPidsFindingResponse as j, type AnalyticsFilter as k, type AnalyticsQuery as l, type AppContext as m, type AttachedAddonInfo as n, type BundleScenarioPreflightResponse as o, type CallEndStatusEntry as p, type ChannelErrorBreakdown as q, type ChannelFailures as r, type ChannelMessageResponse as s, ChannelMessageDirection as t, ChannelMessageSource as u, type ChannelMessagesResponse as v, type CommunicationDetailsResponse as w, type CreateMemberContactPointRequest as x, CreateMemberContactPointRequestContactType as y, CreateMemberContactPointRequestPurpose as z };
2300
+ export { type VoiceMetricsResponse$1 as $, type AIModelUsageResponse as A, type BillingStatistics as B, type CallEndSection as C, CreateMemberContactPointRequestSharing as D, type CurrentPlanInfo as E, DEFAULT_AGENT_CHAT_MODEL as F, DEFAULT_AGENT_REALTIME_MODEL as G, DEFAULT_AGENT_REALTIME_MODEL_CONFIG as H, DEFAULT_CHAT_MODEL as I, DEFAULT_CUSTOM_VOICE_MODEL as J, DEFAULT_VOICE_INFERENCE_MODEL as K, type DailyPhoneRowResponse as L, type DailySMSRowResponse as M, type DashboardMetrics as N, type DataRecordContext as O, type DataRecordImportOutcomes as P, type DeviceCacheFileEntry as Q, type DeviceCacheManifestResponse as R, type EfficiencyMetricsResponse as S, type EmailCountsResponse as T, type EmailUsageResponse as U, type EngineTimeSeries as V, type ErrorCodeBucket as W, type EventRuleMetrics as X, type ExportStatistics as Y, type FeatureSyncStatus as Z, type MetricSummary$1 as _, type AIUsageDetailsResponse as a, type ToolkitContext as a$, type WorkspaceHealthResponse$1 as a0, type HealthCheckStatistics as a1, type HealthDetailRequest as a2, type HealthMetricsRequest as a3, type HealthMetricsResponse as a4, type HealthSummary as a5, type ImportStatistics as a6, MAX_EMAIL_SEND_RECIPIENTS as a7, MEMBER_RELATIONSHIP_KINDS as a8, type MemberContactPointResponse as a9, type RequestsStatusEntry as aA, type ResourceMetadata as aB, type ResourceOverageResponse as aC, type ResourceUsageResponse as aD, type RetireMemberContactPointRequest as aE, type RevisionState as aF, type RevisionStateRevision as aG, type RevisionStateWorkflow as aH, type RoutineRunMetrics as aI, SCOPES as aJ, SCOPE_PRESETS as aK, type SMSCommunicationDetailsResponse as aL, type SMSMessageUsageResponse as aM, type SMSPhoneNumberUsageResponse as aN, type ScenarioDependencyAssessment as aO, ScopeCategory as aP, ScopeManager as aQ, type ScopeName as aR, type SiteContext as aS, type SkippedWorkspace as aT, type StatisticsSummary as aU, type SystemStatistics as aV, type TaskContext as aW, type TaskCountResponse as aX, type TimeSeriesData as aY, type TimeSeriesDataPoint as aZ, type ToolParameter as a_, type MemberContactPointConfirmationResponse as aa, type MemberContactPointListResponse as ab, type MemberImportColumnResponse as ac, type MemberNotificationPreferences as ad, type MemberNotifyActionParams as ae, type MemberNotifyRecipientMode as af, type MemberUsageReport as ag, type MetricDataPoint as ah, type MetricSection as ai, type MetricSummary as aj, type MetricValue as ak, PIDS_DISPOSITIONS as al, PIDS_SOURCES as am, type PageContext as an, type PerformanceMetrics as ao, type PhoneCallPhoneNumberUsageResponse as ap, type PhoneCallUsageResponse as aq, type PhoneCommunicationDetailsResponse as ar, type PhoneNumberUsage as as, type PidsDisposition as at, type PidsSource as au, type ProductOverageConfigResponse as av, type ProvisionPlanRequest as aw, type ProvisionPlanResponse as ax, type RawDataRecordImportResponse as ay, type RequestsSection as az, type AcquisitionFunnelChannel as b, ToolkitState as b0, type TopOffender as b1, type TopResourceOverageResponse as b2, type TtsReconnectOutcomeEntry as b3, type TtsReconnectSection as b4, type UpdateMemberContactPointRequest as b5, UpdateMemberContactPointRequestContactType as b6, UpdateMemberContactPointRequestPurpose as b7, UpdateMemberContactPointRequestSharing as b8, type UsageProductSummaryResponse as b9, type UsageReportResponse as ba, type UsageReportRequest as bb, type UsageStatistics as bc, type VoiceMetricsResponse as bd, type VoiceMetricsTimeRange as be, WIDGET_SLUGS as bf, type WebhookMetrics as bg, type WidgetSlug as bh, type WorkflowContext as bi, type WorkspaceHealthDetail as bj, type WorkspaceHealthResponse as bk, type WorkspaceHealthRow as bl, type WorkspaceUsageReportResponse as bm, formatAppContextAsMarkdown as bn, getAllResourceSlugs as bo, getResourceMetadata as bp, getRevisionState as bq, ScenarioDependencyAssessmentRefusalCodesItem as br, type ScopeDefinition as bs, type AcquisitionFunnelRecentSignup as c, type AcquisitionFunnelResponse as d, type ActivityDetail as e, type ActivityFeedResponse as f, type AdminDomainResponse as g, type AdminDomainSiteMapping as h, type AdminDomainWidgetMapping as i, type AdminPidsFindingResponse as j, type AnalyticsFilter as k, type AnalyticsQuery as l, type AppContext as m, type AttachedAddonInfo as n, type BundleScenarioPreflightResponse as o, type CallEndStatusEntry as p, type ChannelErrorBreakdown as q, type ChannelFailures as r, type ChannelMessageResponse as s, ChannelMessageDirection as t, ChannelMessageSource as u, type ChannelMessagesResponse as v, type CommunicationDetailsResponse as w, type CreateMemberContactPointRequest as x, CreateMemberContactPointRequestContactType as y, CreateMemberContactPointRequestPurpose as z };
@@ -1,6 +1,6 @@
1
1
  import { z } from 'zod';
2
- import { ad as CalendarScheduleAvailabilityType, af as CalendarScheduleRecurrence, a5 as CalendarEventStatus, C as AttendeeResponseStatus, D as DataFieldType, b8 as DataTypeRecordScope, b4 as DataSensitivity, aQ as DataCategory, bT as IndexStatus } from './tasks-DAPby6cw.cjs';
3
- export { fS as AbilityData, fT as AbilityDataSchema, fU as AnonymousInquiryFormSchema, fV as ArchiveTaskInput, fW as ArchiveTaskSchema, fX as ChildTaskFormData, fY as ChildTaskFormDataSchema, fZ as CreateInquiryInput, f_ as CreateInquirySchema, f$ as CreateTaskInput, g0 as CreateTaskSchema, g1 as DeleteInquiryInput, g2 as DeleteInquirySchema, g3 as DeleteTaskInput, g4 as DeleteTaskSchema, g5 as EnrichInquiryInput, g6 as EnrichInquirySchema, g7 as GetInquiryInput, g8 as GetInquirySchema, g9 as GetTaskInput, ga as GetTaskSchema, gb as ListInquiriesInput, gc as ListInquiriesSchema, gd as ListTasksInput, ge as ListTasksSchema, gf as TaskFormData, gg as TaskFormDataSchema, gh as UnarchiveTaskInput, gi as UnarchiveTaskSchema, gj as UpdateInquiryInput, gk as UpdateInquiryRequestSchema, gl as UpdateInquirySchema, gm as UpdateTaskInput, gn as UpdateTaskSchema } from './tasks-DAPby6cw.cjs';
2
+ import { ad as CalendarScheduleAvailabilityType, af as CalendarScheduleRecurrence, a5 as CalendarEventStatus, C as AttendeeResponseStatus, D as DataFieldType, b8 as DataTypeRecordScope, b4 as DataSensitivity, aQ as DataCategory, bT as IndexStatus } from './tasks-Ca6yfsj2.cjs';
3
+ export { fS as AbilityData, fT as AbilityDataSchema, fU as AnonymousInquiryFormSchema, fV as ArchiveTaskInput, fW as ArchiveTaskSchema, fX as ChildTaskFormData, fY as ChildTaskFormDataSchema, fZ as CreateInquiryInput, f_ as CreateInquirySchema, f$ as CreateTaskInput, g0 as CreateTaskSchema, g1 as DeleteInquiryInput, g2 as DeleteInquirySchema, g3 as DeleteTaskInput, g4 as DeleteTaskSchema, g5 as EnrichInquiryInput, g6 as EnrichInquirySchema, g7 as GetInquiryInput, g8 as GetInquirySchema, g9 as GetTaskInput, ga as GetTaskSchema, gb as ListInquiriesInput, gc as ListInquiriesSchema, gd as ListTasksInput, ge as ListTasksSchema, gf as TaskFormData, gg as TaskFormDataSchema, gh as UnarchiveTaskInput, gi as UnarchiveTaskSchema, gj as UpdateInquiryInput, gk as UpdateInquiryRequestSchema, gl as UpdateInquirySchema, gm as UpdateTaskInput, gn as UpdateTaskSchema } from './tasks-Ca6yfsj2.cjs';
4
4
  import { Tool } from '@modelcontextprotocol/sdk/types.js';
5
5
 
6
6
  declare const AccountFormDataSchema: z.ZodObject<{
package/dist/schemas.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { z } from 'zod';
2
- import { ad as CalendarScheduleAvailabilityType, af as CalendarScheduleRecurrence, a5 as CalendarEventStatus, C as AttendeeResponseStatus, D as DataFieldType, b8 as DataTypeRecordScope, b4 as DataSensitivity, aQ as DataCategory, bT as IndexStatus } from './tasks-DAPby6cw.js';
3
- export { fS as AbilityData, fT as AbilityDataSchema, fU as AnonymousInquiryFormSchema, fV as ArchiveTaskInput, fW as ArchiveTaskSchema, fX as ChildTaskFormData, fY as ChildTaskFormDataSchema, fZ as CreateInquiryInput, f_ as CreateInquirySchema, f$ as CreateTaskInput, g0 as CreateTaskSchema, g1 as DeleteInquiryInput, g2 as DeleteInquirySchema, g3 as DeleteTaskInput, g4 as DeleteTaskSchema, g5 as EnrichInquiryInput, g6 as EnrichInquirySchema, g7 as GetInquiryInput, g8 as GetInquirySchema, g9 as GetTaskInput, ga as GetTaskSchema, gb as ListInquiriesInput, gc as ListInquiriesSchema, gd as ListTasksInput, ge as ListTasksSchema, gf as TaskFormData, gg as TaskFormDataSchema, gh as UnarchiveTaskInput, gi as UnarchiveTaskSchema, gj as UpdateInquiryInput, gk as UpdateInquiryRequestSchema, gl as UpdateInquirySchema, gm as UpdateTaskInput, gn as UpdateTaskSchema } from './tasks-DAPby6cw.js';
2
+ import { ad as CalendarScheduleAvailabilityType, af as CalendarScheduleRecurrence, a5 as CalendarEventStatus, C as AttendeeResponseStatus, D as DataFieldType, b8 as DataTypeRecordScope, b4 as DataSensitivity, aQ as DataCategory, bT as IndexStatus } from './tasks-Ca6yfsj2.js';
3
+ export { fS as AbilityData, fT as AbilityDataSchema, fU as AnonymousInquiryFormSchema, fV as ArchiveTaskInput, fW as ArchiveTaskSchema, fX as ChildTaskFormData, fY as ChildTaskFormDataSchema, fZ as CreateInquiryInput, f_ as CreateInquirySchema, f$ as CreateTaskInput, g0 as CreateTaskSchema, g1 as DeleteInquiryInput, g2 as DeleteInquirySchema, g3 as DeleteTaskInput, g4 as DeleteTaskSchema, g5 as EnrichInquiryInput, g6 as EnrichInquirySchema, g7 as GetInquiryInput, g8 as GetInquirySchema, g9 as GetTaskInput, ga as GetTaskSchema, gb as ListInquiriesInput, gc as ListInquiriesSchema, gd as ListTasksInput, ge as ListTasksSchema, gf as TaskFormData, gg as TaskFormDataSchema, gh as UnarchiveTaskInput, gi as UnarchiveTaskSchema, gj as UpdateInquiryInput, gk as UpdateInquiryRequestSchema, gl as UpdateInquirySchema, gm as UpdateTaskInput, gn as UpdateTaskSchema } from './tasks-Ca6yfsj2.js';
4
4
  import { Tool } from '@modelcontextprotocol/sdk/types.js';
5
5
 
6
6
  declare const AccountFormDataSchema: z.ZodObject<{
@@ -3068,11 +3068,15 @@ interface PlayAudioActionParams {
3068
3068
  */
3069
3069
  volume?: number;
3070
3070
  }
3071
+
3071
3072
  interface EmailSendActionParams {
3072
3073
  subjectTemplate?: string;
3073
3074
  bodyTemplate?: string;
3074
3075
  inboxUUID: string;
3076
+ /** Deprecated stored override; author recipients through `memberIds`. */
3075
3077
  toEmail?: string;
3078
+ recipientMode?: 'target_member' | 'specific_member';
3079
+ memberIds?: number[];
3076
3080
  contentType?: 'text' | 'html';
3077
3081
  workflowUUID?: string;
3078
3082
  initialUserMessage?: string;
@@ -3068,11 +3068,15 @@ interface PlayAudioActionParams {
3068
3068
  */
3069
3069
  volume?: number;
3070
3070
  }
3071
+
3071
3072
  interface EmailSendActionParams {
3072
3073
  subjectTemplate?: string;
3073
3074
  bodyTemplate?: string;
3074
3075
  inboxUUID: string;
3076
+ /** Deprecated stored override; author recipients through `memberIds`. */
3075
3077
  toEmail?: string;
3078
+ recipientMode?: 'target_member' | 'specific_member';
3079
+ memberIds?: number[];
3076
3080
  contentType?: 'text' | 'html';
3077
3081
  workflowUUID?: string;
3078
3082
  initialUserMessage?: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gravity-rail/sdk",
3
- "version": "0.45.0",
3
+ "version": "0.46.0",
4
4
  "description": "Gravity Rail TypeScript SDK — API client for workspace management",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",