@happyvertical/smrt-planner 0.0.0-stage → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +170 -2
- package/app/404.html +80 -0
- package/app/_app/immutable/assets/0.B5zXkXe_.css +1 -0
- package/app/_app/immutable/assets/10.hpcnxvK1.css +1 -0
- package/app/_app/immutable/assets/11.D7zoXfVV.css +1 -0
- package/app/_app/immutable/assets/12.CPobm1ED.css +1 -0
- package/app/_app/immutable/assets/2.CyaWdRdI.css +1 -0
- package/app/_app/immutable/assets/3.BlPQOes8.css +1 -0
- package/app/_app/immutable/assets/8.2gQeKBp_.css +1 -0
- package/app/_app/immutable/assets/9.HOPT4xtg.css +1 -0
- package/app/_app/immutable/assets/AiSetup.Cb22AigN.css +1 -0
- package/app/_app/immutable/assets/Button.DkP0qkG9.css +1 -0
- package/app/_app/immutable/assets/ConnectTools.BgIJOOGW.css +1 -0
- package/app/_app/immutable/assets/FieldMapForm.BCU-4pO4.css +1 -0
- package/app/_app/immutable/assets/ModelPage.Dd3LcMta.css +1 -0
- package/app/_app/immutable/assets/SectionActions.CTkVuNMF.css +1 -0
- package/app/_app/immutable/assets/SectionIcons.5Udq9vN-.css +1 -0
- package/app/_app/immutable/assets/SegmentedControl.B8SrQacd.css +1 -0
- package/app/_app/immutable/assets/dist.C5nHBk_O.css +1 -0
- package/app/_app/immutable/assets/feedback.BVKAwFck.css +1 -0
- package/app/_app/immutable/assets/forms.BChZ2RWM.css +1 -0
- package/app/_app/immutable/assets/inter-latin-ext.B_-bZUTo.woff2 +0 -0
- package/app/_app/immutable/assets/inter-latin.8kRkwJBP.woff2 +0 -0
- package/app/_app/immutable/assets/jetbrains-mono-latin-ext.Bnd2h4Br.woff2 +0 -0
- package/app/_app/immutable/assets/jetbrains-mono-latin.Db4Uuiha.woff2 +0 -0
- package/app/_app/immutable/assets/ort-wasm-simd-threaded.asyncify.CxOG5pUO.wasm +0 -0
- package/app/_app/immutable/assets/percent.LH0z-ozZ.css +1 -0
- package/app/_app/immutable/assets/space-grotesk-latin-ext.wJGaI8U0.woff2 +0 -0
- package/app/_app/immutable/assets/space-grotesk-latin.DPT1xrvW.woff2 +0 -0
- package/app/_app/immutable/assets/store.CGDwHkkF.css +1 -0
- package/app/_app/immutable/assets/ui.B1A1Zl2p.css +1 -0
- package/app/_app/immutable/assets/workspace.BIMkuZDb.css +1 -0
- package/app/_app/immutable/chunks/1okeBSoq.js +1 -0
- package/app/_app/immutable/chunks/2jFBkS1C.js +1 -0
- package/app/_app/immutable/chunks/6P9zxrzU.js +1 -0
- package/app/_app/immutable/chunks/B32EWqI8.js +9 -0
- package/app/_app/immutable/chunks/B4Kevpe0.js +1 -0
- package/app/_app/immutable/chunks/BJfAXhak.js +3 -0
- package/app/_app/immutable/chunks/BKwRT_1p.js +1 -0
- package/app/_app/immutable/chunks/BQxY8kkL.js +1 -0
- package/app/_app/immutable/chunks/BS4h9ES-.js +1 -0
- package/app/_app/immutable/chunks/BWPhGFHl.js +1 -0
- package/app/_app/immutable/chunks/BYcBM-fh.js +1 -0
- package/app/_app/immutable/chunks/BegKiy2G.js +1 -0
- package/app/_app/immutable/chunks/Bjy-W4x2.js +81 -0
- package/app/_app/immutable/chunks/BnRri03M.js +1 -0
- package/app/_app/immutable/chunks/C7zBd-pD.js +1 -0
- package/app/_app/immutable/chunks/CA-A9Ngs.js +1 -0
- package/app/_app/immutable/chunks/CMhpRMKg.js +1 -0
- package/app/_app/immutable/chunks/CPRHZZeW.js +1 -0
- package/app/_app/immutable/chunks/CRQ1Pmzr.js +1 -0
- package/app/_app/immutable/chunks/CWtfVMDz.js +1 -0
- package/app/_app/immutable/chunks/CgAkqYsL.js +1 -0
- package/app/_app/immutable/chunks/Chyo8rdT.js +3 -0
- package/app/_app/immutable/chunks/Ci0DUht6.js +34 -0
- package/app/_app/immutable/chunks/CmmuWmp6.js +2 -0
- package/app/_app/immutable/chunks/CrFNLK0f.js +1 -0
- package/app/_app/immutable/chunks/CrO3W89x.js +1 -0
- package/app/_app/immutable/chunks/CsprTb3f.js +2 -0
- package/app/_app/immutable/chunks/CyUMm_Wp.js +1 -0
- package/app/_app/immutable/chunks/CygC84VT.js +2 -0
- package/app/_app/immutable/chunks/D0VgZnk1.js +1 -0
- package/app/_app/immutable/chunks/D71UrO5c.js +1 -0
- package/app/_app/immutable/chunks/D7hhQvDO.js +1 -0
- package/app/_app/immutable/chunks/DD7gpKb2.js +1 -0
- package/app/_app/immutable/chunks/DNRgqfTx.js +1 -0
- package/app/_app/immutable/chunks/DRByVC-c.js +1 -0
- package/app/_app/immutable/chunks/DVRKjN-E.js +1 -0
- package/app/_app/immutable/chunks/D_J_XtJy.js +846 -0
- package/app/_app/immutable/chunks/Dbjm4OuC.js +1 -0
- package/app/_app/immutable/chunks/Dc4q22LH.js +42 -0
- package/app/_app/immutable/chunks/Dd_uD5pT.js +1 -0
- package/app/_app/immutable/chunks/DkR8_Ws6.js +2 -0
- package/app/_app/immutable/chunks/Dp9GVO-9.js +1 -0
- package/app/_app/immutable/chunks/DqcD-WtP.js +1 -0
- package/app/_app/immutable/chunks/Dt-HX3Vu.js +1 -0
- package/app/_app/immutable/chunks/FbOxj-PF.js +69 -0
- package/app/_app/immutable/chunks/QukgIHDX.js +1 -0
- package/app/_app/immutable/chunks/WxSPP8QW.js +4 -0
- package/app/_app/immutable/chunks/Xp1g1t4n.js +3 -0
- package/app/_app/immutable/chunks/iET62IRm.js +2 -0
- package/app/_app/immutable/chunks/leQCwW2d.js +1 -0
- package/app/_app/immutable/chunks/p6bgzXiY.js +1 -0
- package/app/_app/immutable/chunks/uBIymjUX.js +1 -0
- package/app/_app/immutable/chunks/xihTtKlq.js +1 -0
- package/app/_app/immutable/entry/app.IZIJXhgq.js +2 -0
- package/app/_app/immutable/entry/start.BuaYHD1N.js +1 -0
- package/app/_app/immutable/nodes/0.m_U8WC7E.js +10 -0
- package/app/_app/immutable/nodes/1.Crw8ULhB.js +1 -0
- package/app/_app/immutable/nodes/10.1nQxyH9H.js +4 -0
- package/app/_app/immutable/nodes/11.Cw0JnQF3.js +1 -0
- package/app/_app/immutable/nodes/12.BIocA1aI.js +1 -0
- package/app/_app/immutable/nodes/2.CR5BwGnt.js +17 -0
- package/app/_app/immutable/nodes/3.1B56hgAG.js +1 -0
- package/app/_app/immutable/nodes/4.SSIC7sUh.js +1 -0
- package/app/_app/immutable/nodes/5.DgdwleDQ.js +1 -0
- package/app/_app/immutable/nodes/6.DmD9rqLU.js +1 -0
- package/app/_app/immutable/nodes/7.DdngsBmo.js +1 -0
- package/app/_app/immutable/nodes/8.D2Mszsua.js +3 -0
- package/app/_app/immutable/nodes/9.CLYsywul.js +1 -0
- package/app/_app/immutable/workers/assets/ort-wasm-simd-threaded.asyncify-CxOG5pUO.wasm +0 -0
- package/app/_app/immutable/workers/llm.worker-wfCOG_uk.js +69 -0
- package/app/_app/immutable/workers/local-speech.worker-DWbfmFUk.js +51 -0
- package/app/_app/version.json +1 -0
- package/app/ai/index.html +89 -0
- package/app/blueprint/index.html +87 -0
- package/app/cookbook/index.html +87 -0
- package/app/index.html +103 -0
- package/app/m/ads/AdDeliveryTier/index.html +96 -0
- package/app/m/ads/AdEvent/index.html +96 -0
- package/app/m/ads/AdFormat/index.html +96 -0
- package/app/m/ads/AdGroup/index.html +96 -0
- package/app/m/ads/AdVariation/index.html +96 -0
- package/app/m/analytics/AnalyticsDataStream/index.html +96 -0
- package/app/m/analytics/AnalyticsEvent/index.html +96 -0
- package/app/m/analytics/AnalyticsProperty/index.html +96 -0
- package/app/m/analytics/AnalyticsReport/index.html +96 -0
- package/app/m/approvals/ApprovalEvent/index.html +96 -0
- package/app/m/approvals/ApprovalPolicy/index.html +96 -0
- package/app/m/approvals/ApprovalRequest/index.html +96 -0
- package/app/m/assets/Asset/index.html +96 -0
- package/app/m/assets/AssetAssociation/index.html +97 -0
- package/app/m/assets/AssetMetafield/index.html +96 -0
- package/app/m/assets/AssetStatus/index.html +96 -0
- package/app/m/assets/AssetType/index.html +96 -0
- package/app/m/assets/Folder/index.html +96 -0
- package/app/m/chat/AgentSession/index.html +96 -0
- package/app/m/chat/ChatMessage/index.html +97 -0
- package/app/m/chat/ChatParticipant/index.html +97 -0
- package/app/m/chat/ChatReaction/index.html +96 -0
- package/app/m/chat/ChatRoom/index.html +96 -0
- package/app/m/chat/ChatThread/index.html +97 -0
- package/app/m/chat/VoiceGatewayTurn/index.html +96 -0
- package/app/m/chat/VoiceSession/index.html +96 -0
- package/app/m/commerce/Agreement/index.html +96 -0
- package/app/m/commerce/Cart/index.html +96 -0
- package/app/m/commerce/Contract/index.html +96 -0
- package/app/m/commerce/ContractLineItem/index.html +97 -0
- package/app/m/commerce/Customer/index.html +96 -0
- package/app/m/commerce/Estimate/index.html +96 -0
- package/app/m/commerce/Fulfillment/index.html +96 -0
- package/app/m/commerce/FulfillmentLineItem/index.html +97 -0
- package/app/m/commerce/Invoice/index.html +96 -0
- package/app/m/commerce/InvoiceLineItem/index.html +97 -0
- package/app/m/commerce/Lease/index.html +96 -0
- package/app/m/commerce/LicenseSale/index.html +96 -0
- package/app/m/commerce/Order/index.html +96 -0
- package/app/m/commerce/Payment/index.html +96 -0
- package/app/m/commerce/PaymentAllocation/index.html +97 -0
- package/app/m/commerce/PaymentInstrument/index.html +96 -0
- package/app/m/commerce/PaymentIntent/index.html +96 -0
- package/app/m/commerce/Payout/index.html +96 -0
- package/app/m/commerce/ProductionOrder/index.html +96 -0
- package/app/m/commerce/PurchaseOrder/index.html +96 -0
- package/app/m/commerce/Vendor/index.html +96 -0
- package/app/m/commerce/WholesaleOrder/index.html +96 -0
- package/app/m/content/Content/index.html +96 -0
- package/app/m/content/ContentContribution/index.html +96 -0
- package/app/m/content/ContentContributionAttachment/index.html +96 -0
- package/app/m/content/ContentContributionRevision/index.html +96 -0
- package/app/m/content/ContentContributionType/index.html +96 -0
- package/app/m/content/ContentContributor/index.html +96 -0
- package/app/m/content/ContentCorrection/index.html +96 -0
- package/app/m/content/ContentFeedSource/index.html +96 -0
- package/app/m/content/ContentGovernanceAssignment/index.html +96 -0
- package/app/m/content/ContentGovernancePolicy/index.html +96 -0
- package/app/m/content/ContentGovernanceProfile/index.html +96 -0
- package/app/m/content/ContentReference/index.html +96 -0
- package/app/m/content/ContentReview/index.html +96 -0
- package/app/m/content/ContentVersion/index.html +96 -0
- package/app/m/content/Contents/index.html +96 -0
- package/app/m/events/Event/index.html +96 -0
- package/app/m/events/EventParticipant/index.html +97 -0
- package/app/m/events/EventSeries/index.html +96 -0
- package/app/m/events/EventType/index.html +96 -0
- package/app/m/facts/Fact/index.html +96 -0
- package/app/m/facts/FactContent/index.html +96 -0
- package/app/m/facts/FactEvidence/index.html +96 -0
- package/app/m/facts/FactSource/index.html +96 -0
- package/app/m/facts/FactSubject/index.html +96 -0
- package/app/m/facts/FactTag/index.html +96 -0
- package/app/m/fields/FieldPolicy/index.html +96 -0
- package/app/m/fields/FieldPolicySuggestion/index.html +96 -0
- package/app/m/fields/FieldUsageCounter/index.html +96 -0
- package/app/m/images/Image/index.html +96 -0
- package/app/m/inventory/InventoryLocation/index.html +96 -0
- package/app/m/inventory/StockLevel/index.html +96 -0
- package/app/m/inventory/StockMovement/index.html +96 -0
- package/app/m/ledgers/Account/index.html +96 -0
- package/app/m/ledgers/Journal/index.html +96 -0
- package/app/m/ledgers/JournalEntry/index.html +97 -0
- package/app/m/manufacturing/Assembly/index.html +96 -0
- package/app/m/manufacturing/BillOfMaterials/index.html +96 -0
- package/app/m/manufacturing/BomLine/index.html +96 -0
- package/app/m/manufacturing/Operation/index.html +96 -0
- package/app/m/manufacturing/ProductionRun/index.html +96 -0
- package/app/m/manufacturing/ProductionRunCompletion/index.html +96 -0
- package/app/m/manufacturing/RoutingStep/index.html +96 -0
- package/app/m/marketing/Campaign/index.html +96 -0
- package/app/m/marketing/CampaignChannel/index.html +96 -0
- package/app/m/marketing/CampaignMetricSnapshot/index.html +96 -0
- package/app/m/messages/Account/index.html +96 -0
- package/app/m/messages/Attachment/index.html +96 -0
- package/app/m/messages/Blacklist/index.html +96 -0
- package/app/m/messages/Email/failed-sends/index.html +96 -0
- package/app/m/messages/Email/index.html +96 -0
- package/app/m/messages/Email/mailbox/index.html +96 -0
- package/app/m/messages/EmailAccount/index.html +96 -0
- package/app/m/messages/EmailFolder/index.html +96 -0
- package/app/m/messages/Message/index.html +96 -0
- package/app/m/messages/MessagingEndpoint/index.html +96 -0
- package/app/m/messages/PersonaMessageRoute/index.html +96 -0
- package/app/m/messages/SlackAccount/index.html +96 -0
- package/app/m/messages/SlackMessage/index.html +96 -0
- package/app/m/messages/TelegramAccount/index.html +96 -0
- package/app/m/messages/Tweet/index.html +96 -0
- package/app/m/messages/TwitterAccount/index.html +96 -0
- package/app/m/messages/Whitelist/index.html +96 -0
- package/app/m/messages/ZulipAccount/index.html +96 -0
- package/app/m/places/Place/index.html +96 -0
- package/app/m/places/PlaceType/index.html +96 -0
- package/app/m/preferences/UiPreferenceRecord/index.html +96 -0
- package/app/m/products/Category/index.html +96 -0
- package/app/m/products/Material/index.html +96 -0
- package/app/m/products/Product/index.html +96 -0
- package/app/m/products/Product/ingredients/index.html +96 -0
- package/app/m/products/ProductVariant/index.html +97 -0
- package/app/m/products/Sku/index.html +97 -0
- package/app/m/profiles/ApiKey/index.html +96 -0
- package/app/m/profiles/Bot/index.html +96 -0
- package/app/m/profiles/MagicLinkToken/index.html +96 -0
- package/app/m/profiles/NostrIdentity/index.html +96 -0
- package/app/m/profiles/OidcIdentity/index.html +96 -0
- package/app/m/profiles/Organization/index.html +96 -0
- package/app/m/profiles/Person/index.html +96 -0
- package/app/m/profiles/Profile/index.html +96 -0
- package/app/m/profiles/ProfileMetadata/index.html +96 -0
- package/app/m/profiles/ProfileMetafield/index.html +96 -0
- package/app/m/profiles/ProfileRelationship/index.html +96 -0
- package/app/m/profiles/ProfileRelationshipTerm/index.html +96 -0
- package/app/m/profiles/ProfileRelationshipType/index.html +96 -0
- package/app/m/profiles/ProfileType/index.html +96 -0
- package/app/m/projects/Comment/index.html +97 -0
- package/app/m/projects/Issue/index.html +96 -0
- package/app/m/projects/Label/index.html +96 -0
- package/app/m/projects/Project/index.html +96 -0
- package/app/m/projects/ProjectIntegration/index.html +96 -0
- package/app/m/projects/PullRequest/index.html +96 -0
- package/app/m/projects/Repository/index.html +96 -0
- package/app/m/properties/Property/index.html +96 -0
- package/app/m/properties/Zone/index.html +96 -0
- package/app/m/reports/RuntimeReport/index.html +96 -0
- package/app/m/reports/SmrtPrincipalReportRefreshTask/index.html +96 -0
- package/app/m/reports/SmrtReportLock/index.html +96 -0
- package/app/m/reports/SmrtReportRefreshTask/index.html +96 -0
- package/app/m/reports/SmrtReportRun/index.html +96 -0
- package/app/m/reports/SmrtReportSchedule/index.html +96 -0
- package/app/m/reports/SmrtReportWatermark/index.html +96 -0
- package/app/m/sales/AttributionException/index.html +96 -0
- package/app/m/sales/AttributionPolicy/index.html +96 -0
- package/app/m/sales/Commission/index.html +96 -0
- package/app/m/sales/CommissionAdjustment/index.html +96 -0
- package/app/m/sales/CommissionPayout/index.html +96 -0
- package/app/m/sales/CommissionPlan/index.html +96 -0
- package/app/m/sales/Earner/index.html +96 -0
- package/app/m/sales/EarnerSourceAttribution/index.html +96 -0
- package/app/m/sales/EarningEvent/index.html +96 -0
- package/app/m/sales/ExecutedAgreement/index.html +96 -0
- package/app/m/sales/Lead/index.html +96 -0
- package/app/m/sales/Opportunity/index.html +96 -0
- package/app/m/sales/OpportunityConversion/index.html +96 -0
- package/app/m/sales/PipelineDefinition/index.html +96 -0
- package/app/m/sales/PipelineStage/index.html +97 -0
- package/app/m/sales/Referral/index.html +96 -0
- package/app/m/sales/ReferralAgreement/index.html +96 -0
- package/app/m/sales/ReferralLink/index.html +96 -0
- package/app/m/sales/ReferralProgram/index.html +96 -0
- package/app/m/sales/ReferralTermSnapshot/index.html +96 -0
- package/app/m/sales/ReferralTouch/index.html +96 -0
- package/app/m/sales/Referrer/index.html +96 -0
- package/app/m/sales/SalesActivity/index.html +96 -0
- package/app/m/sales/SalesRepresentative/index.html +96 -0
- package/app/m/sites/Site/index.html +96 -0
- package/app/m/sites/SiteAgentBinding/index.html +96 -0
- package/app/m/social/OAuthState/index.html +96 -0
- package/app/m/social/SocialAccount/index.html +96 -0
- package/app/m/social/SocialPost/index.html +96 -0
- package/app/m/social/SocialPostAnalyticsSnapshot/index.html +96 -0
- package/app/m/subscriptions/BillingAdjustment/index.html +96 -0
- package/app/m/subscriptions/ClientCharge/index.html +96 -0
- package/app/m/subscriptions/CreditGrant/index.html +96 -0
- package/app/m/subscriptions/PricingRule/index.html +96 -0
- package/app/m/subscriptions/RetailCharge/index.html +96 -0
- package/app/m/subscriptions/SpendingPolicy/index.html +96 -0
- package/app/m/subscriptions/SubscriptionPlan/index.html +96 -0
- package/app/m/subscriptions/TenantSubscription/index.html +96 -0
- package/app/m/subscriptions/TenantUsageMetric/index.html +96 -0
- package/app/m/support/ServiceTimeEntry/index.html +96 -0
- package/app/m/support/SupportAiRun/index.html +96 -0
- package/app/m/support/SupportAvailability/index.html +96 -0
- package/app/m/support/SupportCase/index.html +96 -0
- package/app/m/support/SupportCaseEvent/index.html +96 -0
- package/app/m/support/SupportChannelBinding/index.html +96 -0
- package/app/m/support/SupportCharge/index.html +96 -0
- package/app/m/support/SupportCompensation/index.html +96 -0
- package/app/m/support/SupportCompensationPlan/index.html +96 -0
- package/app/m/support/SupportEscalation/index.html +96 -0
- package/app/m/support/SupportInteraction/index.html +96 -0
- package/app/m/support/SupportPlan/index.html +96 -0
- package/app/m/support/SupportPolicy/index.html +96 -0
- package/app/m/support/SupportQualification/index.html +96 -0
- package/app/m/support/SupportServiceTarget/index.html +96 -0
- package/app/m/support/SupportSpecialist/index.html +96 -0
- package/app/m/support/SupportWorkLink/index.html +96 -0
- package/app/m/tags/Tag/index.html +96 -0
- package/app/m/tags/TagAlias/index.html +96 -0
- package/app/m/timesheets/AttendanceBreak/index.html +96 -0
- package/app/m/timesheets/AttendancePunch/index.html +96 -0
- package/app/m/timesheets/ServiceChargeSnapshot/index.html +96 -0
- package/app/m/timesheets/ServiceCompensationSnapshot/index.html +96 -0
- package/app/m/timesheets/ServiceTimeEntry/index.html +96 -0
- package/app/m/users/AccessRequest/index.html +96 -0
- package/app/m/users/Group/index.html +96 -0
- package/app/m/users/GroupMember/index.html +96 -0
- package/app/m/users/GroupRole/index.html +96 -0
- package/app/m/users/Membership/index.html +97 -0
- package/app/m/users/MembershipOverride/index.html +96 -0
- package/app/m/users/Permission/index.html +96 -0
- package/app/m/users/ResourceGrant/index.html +96 -0
- package/app/m/users/Role/index.html +96 -0
- package/app/m/users/RolePermission/index.html +96 -0
- package/app/m/users/Session/index.html +96 -0
- package/app/m/users/Tenant/index.html +96 -0
- package/app/m/users/TenantIntegration/index.html +96 -0
- package/app/m/users/TenantPermissionOverride/index.html +96 -0
- package/app/m/users/User/index.html +96 -0
- package/app/m/users/UsersCliAuthRequest/index.html +96 -0
- package/app/m/users/UsersMagicLinkToken/index.html +96 -0
- package/app/m/video/Character/index.html +96 -0
- package/app/m/video/CharacterAsset/index.html +96 -0
- package/app/m/video/CompositeJob/index.html +96 -0
- package/app/m/video/Performer/index.html +96 -0
- package/app/m/video/PerformerAsset/index.html +96 -0
- package/app/m/video/Scene/index.html +96 -0
- package/app/m/video/SceneAsset/index.html +96 -0
- package/app/m/video/VideoComposition/index.html +96 -0
- package/app/m/video/VideoCompositionAsset/index.html +96 -0
- package/app/m/video/VideoSequence/index.html +96 -0
- package/app/m/video/VideoSequenceAsset/index.html +96 -0
- package/app/m/video/VideoShot/index.html +96 -0
- package/app/m/video/VideoShotAsset/index.html +96 -0
- package/app/m/video/VideoShotCharacter/index.html +96 -0
- package/app/m/video/VideoWorkflow/index.html +96 -0
- package/app/m/voice/VoiceOutput/index.html +96 -0
- package/app/m/voice/VoiceProfile/index.html +96 -0
- package/app/m/voice/VoiceSample/index.html +96 -0
- package/app/packages/ads/index.html +92 -0
- package/app/packages/analytics/index.html +92 -0
- package/app/packages/approvals/index.html +92 -0
- package/app/packages/assets/index.html +92 -0
- package/app/packages/chat/index.html +92 -0
- package/app/packages/comments/index.html +92 -0
- package/app/packages/commerce/index.html +92 -0
- package/app/packages/content/index.html +92 -0
- package/app/packages/events/index.html +92 -0
- package/app/packages/expenses/index.html +92 -0
- package/app/packages/facts/index.html +92 -0
- package/app/packages/fields/index.html +92 -0
- package/app/packages/human-resources/index.html +92 -0
- package/app/packages/images/index.html +92 -0
- package/app/packages/index.html +90 -0
- package/app/packages/inventory/index.html +92 -0
- package/app/packages/ledgers/index.html +92 -0
- package/app/packages/manufacturing/index.html +92 -0
- package/app/packages/marketing/index.html +92 -0
- package/app/packages/messages/index.html +92 -0
- package/app/packages/places/index.html +92 -0
- package/app/packages/preferences/index.html +92 -0
- package/app/packages/products/index.html +92 -0
- package/app/packages/profiles/index.html +92 -0
- package/app/packages/projects/index.html +92 -0
- package/app/packages/properties/index.html +92 -0
- package/app/packages/reports/index.html +92 -0
- package/app/packages/sales/index.html +92 -0
- package/app/packages/sites/index.html +92 -0
- package/app/packages/social/index.html +92 -0
- package/app/packages/subscriptions/index.html +92 -0
- package/app/packages/support/index.html +92 -0
- package/app/packages/tags/index.html +92 -0
- package/app/packages/timesheets/index.html +92 -0
- package/app/packages/users/index.html +92 -0
- package/app/packages/video/index.html +92 -0
- package/app/packages/voice/index.html +92 -0
- package/app/recipes/account-access/help/index.html +93 -0
- package/app/recipes/account-access/index.html +95 -0
- package/app/recipes/activity/help/index.html +93 -0
- package/app/recipes/activity/index.html +94 -0
- package/app/recipes/agreements/help/index.html +93 -0
- package/app/recipes/agreements/index.html +96 -0
- package/app/recipes/analytics.reports/help/index.html +93 -0
- package/app/recipes/analytics.reports/index.html +94 -0
- package/app/recipes/assets/help/index.html +93 -0
- package/app/recipes/assets/index.html +95 -0
- package/app/recipes/billing/help/index.html +93 -0
- package/app/recipes/billing/index.html +95 -0
- package/app/recipes/chat.assistant/help/index.html +93 -0
- package/app/recipes/chat.assistant/index.html +94 -0
- package/app/recipes/comments/help/index.html +93 -0
- package/app/recipes/comments/index.html +94 -0
- package/app/recipes/commerce.customers/help/index.html +93 -0
- package/app/recipes/commerce.customers/index.html +94 -0
- package/app/recipes/commerce.estimates/help/index.html +93 -0
- package/app/recipes/commerce.estimates/index.html +94 -0
- package/app/recipes/commerce.purchases/help/index.html +93 -0
- package/app/recipes/commerce.purchases/index.html +94 -0
- package/app/recipes/commerce.sales/help/index.html +93 -0
- package/app/recipes/commerce.sales/index.html +94 -0
- package/app/recipes/commerce.vendors/help/index.html +93 -0
- package/app/recipes/commerce.vendors/index.html +94 -0
- package/app/recipes/commerce.wholesale/help/index.html +93 -0
- package/app/recipes/commerce.wholesale/index.html +94 -0
- package/app/recipes/events.calendar/help/index.html +93 -0
- package/app/recipes/events.calendar/index.html +94 -0
- package/app/recipes/fields.form-customization/help/index.html +93 -0
- package/app/recipes/fields.form-customization/index.html +94 -0
- package/app/recipes/inventory.stock/help/index.html +93 -0
- package/app/recipes/inventory.stock/index.html +94 -0
- package/app/recipes/ledgers.bookkeeping/help/index.html +93 -0
- package/app/recipes/ledgers.bookkeeping/index.html +94 -0
- package/app/recipes/messages/help/index.html +93 -0
- package/app/recipes/messages/index.html +95 -0
- package/app/recipes/products/help/index.html +93 -0
- package/app/recipes/products/index.html +96 -0
- package/app/recipes/projects.tracker/help/index.html +93 -0
- package/app/recipes/projects.tracker/index.html +94 -0
- package/app/recipes/reports.materialized/help/index.html +93 -0
- package/app/recipes/reports.materialized/index.html +94 -0
- package/app/recipes/sales.pipeline/help/index.html +93 -0
- package/app/recipes/sales.pipeline/index.html +94 -0
- package/app/recipes/tags.taxonomy/help/index.html +93 -0
- package/app/recipes/tags.taxonomy/index.html +94 -0
- package/app/recipes/team-collaboration/help/index.html +93 -0
- package/app/recipes/team-collaboration/index.html +94 -0
- package/app/s/custom-billing/index.html +89 -0
- package/app/s/custom-buying/index.html +89 -0
- package/app/s/custom-classes/index.html +89 -0
- package/app/s/custom-jobs/index.html +89 -0
- package/app/s/custom-kitchen/index.html +89 -0
- package/app/s/custom-material/index.html +89 -0
- package/app/s/custom-members/index.html +89 -0
- package/app/s/custom-parts/index.html +89 -0
- package/app/s/custom-schedule/index.html +89 -0
- package/app/s/custom-shop/index.html +89 -0
- package/app/s/custom-wholesale/index.html +89 -0
- package/app/s/section-access-control/index.html +89 -0
- package/app/s/section-account-security/index.html +89 -0
- package/app/s/section-accounting/index.html +89 -0
- package/app/s/section-activity/index.html +89 -0
- package/app/s/section-agreements/index.html +89 -0
- package/app/s/section-analytics/index.html +89 -0
- package/app/s/section-assets/index.html +89 -0
- package/app/s/section-billing/index.html +89 -0
- package/app/s/section-calendar/index.html +89 -0
- package/app/s/section-catalog/index.html +89 -0
- package/app/s/section-chat.assistant/index.html +89 -0
- package/app/s/section-comments/index.html +89 -0
- package/app/s/section-fields.form-customization/index.html +89 -0
- package/app/s/section-messages/index.html +89 -0
- package/app/s/section-more/index.html +89 -0
- package/app/s/section-operations/index.html +89 -0
- package/app/s/section-projects/index.html +89 -0
- package/app/s/section-purchasing/index.html +89 -0
- package/app/s/section-reports.materialized/index.html +89 -0
- package/app/s/section-sales/index.html +89 -0
- package/app/s/section-taxonomy/index.html +89 -0
- package/app/s/section-team/index.html +89 -0
- package/dist/ai/echo-gate.d.ts +13 -0
- package/dist/ai/echo-gate.js +21 -0
- package/dist/ai/icons.d.ts +9 -0
- package/dist/ai/icons.js +9 -0
- package/dist/ai/instance.d.ts +3 -0
- package/dist/ai/instance.js +25 -0
- package/dist/ai/state.svelte.d.ts +130 -0
- package/dist/ai/state.svelte.js +316 -0
- package/dist/ai/status.d.ts +67 -0
- package/dist/ai/status.js +125 -0
- package/dist/assets/smrt-mark.svg +38 -0
- package/dist/assistant/change.d.ts +101 -0
- package/dist/assistant/change.js +209 -0
- package/dist/assistant/engine.d.ts +20 -0
- package/dist/assistant/engine.js +43 -0
- package/dist/assistant/llm.worker.d.ts +1 -0
- package/dist/assistant/llm.worker.js +7 -0
- package/dist/assistant/match.d.ts +59 -0
- package/dist/assistant/match.js +271 -0
- package/dist/assistant/models.d.ts +38 -0
- package/dist/assistant/models.js +57 -0
- package/dist/assistant/offers.svelte.d.ts +36 -0
- package/dist/assistant/offers.svelte.js +59 -0
- package/dist/assistant/prefs.d.ts +14 -0
- package/dist/assistant/prefs.js +32 -0
- package/dist/assistant/prompt.d.ts +23 -0
- package/dist/assistant/prompt.js +163 -0
- package/dist/assistant/session.svelte.d.ts +74 -0
- package/dist/assistant/session.svelte.js +181 -0
- package/dist/assistant/theme-undo.svelte.d.ts +38 -0
- package/dist/assistant/theme-undo.svelte.js +50 -0
- package/dist/assistant/transport.d.ts +73 -0
- package/dist/assistant/transport.js +231 -0
- package/dist/assistant/voice-host.d.ts +10 -0
- package/dist/assistant/voice-host.js +17 -0
- package/dist/assistant/voice.svelte.d.ts +107 -0
- package/dist/assistant/voice.svelte.js +261 -0
- package/dist/catalog/catalog.json +89663 -0
- package/dist/catalog/generate/build.d.ts +33 -0
- package/dist/catalog/generate/build.js +131 -0
- package/dist/catalog/generate/exclusions.d.ts +18 -0
- package/dist/catalog/generate/exclusions.js +33 -0
- package/dist/catalog/generate/extract.d.ts +90 -0
- package/dist/catalog/generate/extract.js +326 -0
- package/dist/catalog/generate/local.d.ts +8 -0
- package/dist/catalog/generate/local.js +45 -0
- package/dist/catalog/generate/recipe-demo.d.ts +11 -0
- package/dist/catalog/generate/recipe-demo.js +29 -0
- package/dist/catalog/generate/recipe-metadata.d.ts +12 -0
- package/dist/catalog/generate/recipe-metadata.js +138 -0
- package/dist/catalog/generate/registry.d.ts +14 -0
- package/dist/catalog/generate/registry.js +83 -0
- package/dist/catalog/index.d.ts +21 -0
- package/dist/catalog/index.js +53 -0
- package/dist/catalog/types.d.ts +141 -0
- package/dist/catalog/types.js +8 -0
- package/dist/components/AiSetup.svelte +528 -0
- package/dist/components/AiSetup.svelte.d.ts +8 -0
- package/dist/components/AiStatusIcons.svelte +86 -0
- package/dist/components/AiStatusIcons.svelte.d.ts +18 -0
- package/dist/components/AppSettings.svelte +100 -0
- package/dist/components/AppSettings.svelte.d.ts +10 -0
- package/dist/components/BrowserAssistant.svelte +318 -0
- package/dist/components/BrowserAssistant.svelte.d.ts +8 -0
- package/dist/components/ChildRecords.svelte +331 -0
- package/dist/components/ChildRecords.svelte.d.ts +15 -0
- package/dist/components/ConnectTools.svelte +145 -0
- package/dist/components/ConnectTools.svelte.d.ts +8 -0
- package/dist/components/CookbooksPanel.svelte +308 -0
- package/dist/components/CookbooksPanel.svelte.d.ts +3 -0
- package/dist/components/ExportPanel.svelte +217 -0
- package/dist/components/ExportPanel.svelte.d.ts +3 -0
- package/dist/components/FeatureCard.svelte +197 -0
- package/dist/components/FeatureCard.svelte.d.ts +13 -0
- package/dist/components/FeaturesPanel.svelte +155 -0
- package/dist/components/FeaturesPanel.svelte.d.ts +3 -0
- package/dist/components/FieldInput.svelte +307 -0
- package/dist/components/FieldInput.svelte.d.ts +24 -0
- package/dist/components/FieldMapForm.svelte +173 -0
- package/dist/components/FieldMapForm.svelte.d.ts +18 -0
- package/dist/components/FormWorkspace.svelte +274 -0
- package/dist/components/FormWorkspace.svelte.d.ts +19 -0
- package/dist/components/HelpView.svelte +129 -0
- package/dist/components/HelpView.svelte.d.ts +12 -0
- package/dist/components/ModelOptions.svelte +239 -0
- package/dist/components/ModelOptions.svelte.d.ts +12 -0
- package/dist/components/ModelPage.svelte +295 -0
- package/dist/components/ModelPage.svelte.d.ts +9 -0
- package/dist/components/ModelWorkspace.svelte +488 -0
- package/dist/components/ModelWorkspace.svelte.d.ts +32 -0
- package/dist/components/PlannerEditBridge.svelte +36 -0
- package/dist/components/PlannerEditBridge.svelte.d.ts +3 -0
- package/dist/components/PlannerPalette.svelte +38 -0
- package/dist/components/PlannerPalette.svelte.d.ts +18 -0
- package/dist/components/RecipeCards.svelte +145 -0
- package/dist/components/RecipeCards.svelte.d.ts +3 -0
- package/dist/components/RecipeHelp.svelte +54 -0
- package/dist/components/RecipeHelp.svelte.d.ts +9 -0
- package/dist/components/RecipeOptions.svelte +160 -0
- package/dist/components/RecipeOptions.svelte.d.ts +9 -0
- package/dist/components/RecordFeatures.svelte +240 -0
- package/dist/components/RecordFeatures.svelte.d.ts +3 -0
- package/dist/components/RelationField.svelte +175 -0
- package/dist/components/RelationField.svelte.d.ts +16 -0
- package/dist/components/SectionActions.svelte +91 -0
- package/dist/components/SectionActions.svelte.d.ts +12 -0
- package/dist/components/SectionIcons.svelte +98 -0
- package/dist/components/SectionIcons.svelte.d.ts +15 -0
- package/dist/components/SectionOverview.svelte +65 -0
- package/dist/components/SectionOverview.svelte.d.ts +14 -0
- package/dist/components/SectionPage.svelte +230 -0
- package/dist/components/SectionPage.svelte.d.ts +7 -0
- package/dist/components/SettingsPanel.svelte +60 -0
- package/dist/components/SettingsPanel.svelte.d.ts +7 -0
- package/dist/components/ThemeBridge.svelte +56 -0
- package/dist/components/ThemeBridge.svelte.d.ts +3 -0
- package/dist/components/ThemeSection.svelte +167 -0
- package/dist/components/ThemeSection.svelte.d.ts +11 -0
- package/dist/components/VariantGridForm.svelte +309 -0
- package/dist/components/VariantGridForm.svelte.d.ts +12 -0
- package/dist/components/VoiceTyping.svelte +108 -0
- package/dist/components/VoiceTyping.svelte.d.ts +7 -0
- package/dist/cookbook/assemble.d.ts +16 -0
- package/dist/cookbook/assemble.js +29 -0
- package/dist/cookbook/file.d.ts +7 -0
- package/dist/cookbook/file.js +25 -0
- package/dist/cookbook/legacy.d.ts +9 -0
- package/dist/cookbook/legacy.js +87 -0
- package/dist/cookbook/migrate.d.ts +22 -0
- package/dist/cookbook/migrate.js +106 -0
- package/dist/cookbook/parse.d.ts +16 -0
- package/dist/cookbook/parse.js +246 -0
- package/dist/cookbook/storage.d.ts +45 -0
- package/dist/cookbook/storage.js +98 -0
- package/dist/cookbook/store.svelte.d.ts +94 -0
- package/dist/cookbook/store.svelte.js +231 -0
- package/dist/cookbook/types.d.ts +76 -0
- package/dist/cookbook/types.js +11 -0
- package/dist/cookbook/validate.d.ts +14 -0
- package/dist/cookbook/validate.js +29 -0
- package/dist/core/app.d.ts +37 -0
- package/dist/core/app.js +119 -0
- package/dist/core/catalog.d.ts +19 -0
- package/dist/core/catalog.js +9 -0
- package/dist/core/headless.d.ts +52 -0
- package/dist/core/headless.js +39 -0
- package/dist/core/index.d.ts +28 -0
- package/dist/core/index.js +28 -0
- package/dist/core/prompt.d.ts +38 -0
- package/dist/core/prompt.js +95 -0
- package/dist/core/reply.d.ts +60 -0
- package/dist/core/reply.js +89 -0
- package/dist/core/request.d.ts +15 -0
- package/dist/core/request.js +55 -0
- package/dist/data/children.d.ts +20 -0
- package/dist/data/children.js +80 -0
- package/dist/data/columns.d.ts +56 -0
- package/dist/data/columns.js +150 -0
- package/dist/data/context.d.ts +8 -0
- package/dist/data/context.js +19 -0
- package/dist/data/derived.d.ts +79 -0
- package/dist/data/derived.js +139 -0
- package/dist/data/display.d.ts +23 -0
- package/dist/data/display.js +84 -0
- package/dist/data/fakes.d.ts +52 -0
- package/dist/data/fakes.js +443 -0
- package/dist/data/format.d.ts +48 -0
- package/dist/data/format.js +121 -0
- package/dist/data/labels.d.ts +45 -0
- package/dist/data/labels.js +179 -0
- package/dist/data/packs.d.ts +95 -0
- package/dist/data/packs.js +830 -0
- package/dist/data/payments.d.ts +17 -0
- package/dist/data/payments.js +60 -0
- package/dist/data/planner-source.d.ts +7 -0
- package/dist/data/planner-source.js +32 -0
- package/dist/data/source.d.ts +119 -0
- package/dist/data/source.js +432 -0
- package/dist/features/catalogue.d.ts +96 -0
- package/dist/features/catalogue.js +225 -0
- package/dist/features/demo.d.ts +36 -0
- package/dist/features/demo.js +66 -0
- package/dist/features/palette.d.ts +39 -0
- package/dist/features/palette.js +53 -0
- package/dist/fields/address.d.ts +23 -0
- package/dist/fields/address.js +39 -0
- package/dist/fields/invalid.d.ts +2 -0
- package/dist/fields/invalid.js +8 -0
- package/dist/fields/modal.d.ts +7 -0
- package/dist/fields/modal.js +14 -0
- package/dist/fields/percent.d.ts +8 -0
- package/dist/fields/percent.js +16 -0
- package/dist/fields/renderer.d.ts +17 -0
- package/dist/fields/renderer.js +43 -0
- package/dist/forms/active.d.ts +16 -0
- package/dist/forms/active.js +24 -0
- package/dist/forms/fieldMap.d.ts +44 -0
- package/dist/forms/fieldMap.js +134 -0
- package/dist/forms/shared.d.ts +41 -0
- package/dist/forms/shared.js +138 -0
- package/dist/forms/stock.d.ts +28 -0
- package/dist/forms/stock.js +104 -0
- package/dist/forms/variantGrid.d.ts +83 -0
- package/dist/forms/variantGrid.js +283 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.js +16 -0
- package/dist/inference/byo.svelte.d.ts +90 -0
- package/dist/inference/byo.svelte.js +295 -0
- package/dist/inference/config.d.ts +77 -0
- package/dist/inference/config.js +205 -0
- package/dist/inference/host.d.ts +40 -0
- package/dist/inference/host.js +57 -0
- package/dist/inference/openai.d.ts +59 -0
- package/dist/inference/openai.js +207 -0
- package/dist/inference/presets.d.ts +5 -0
- package/dist/inference/presets.js +46 -0
- package/dist/kitchen/client.d.ts +39 -0
- package/dist/kitchen/client.js +115 -0
- package/dist/kitchen/fragment.d.ts +30 -0
- package/dist/kitchen/fragment.js +49 -0
- package/dist/kitchen/state.svelte.d.ts +26 -0
- package/dist/kitchen/state.svelte.js +45 -0
- package/dist/library/apply.d.ts +17 -0
- package/dist/library/apply.js +32 -0
- package/dist/library/document.d.ts +12 -0
- package/dist/library/document.js +27 -0
- package/dist/library/icons.d.ts +6 -0
- package/dist/library/icons.js +26 -0
- package/dist/library/index.d.ts +8 -0
- package/dist/library/index.js +12 -0
- package/dist/library/library.json +788 -0
- package/dist/library/menu.d.ts +18 -0
- package/dist/library/menu.js +72 -0
- package/dist/library/state.svelte.d.ts +10 -0
- package/dist/library/state.svelte.js +28 -0
- package/dist/library/types.d.ts +57 -0
- package/dist/library/types.js +1 -0
- package/dist/overviews/definitions.d.ts +24 -0
- package/dist/overviews/definitions.js +97 -0
- package/dist/overviews/page.d.ts +21 -0
- package/dist/overviews/page.js +36 -0
- package/dist/overviews/registry.d.ts +44 -0
- package/dist/overviews/registry.js +191 -0
- package/dist/overviews/validate.d.ts +32 -0
- package/dist/overviews/validate.js +91 -0
- package/dist/planner/Planner.svelte +204 -0
- package/dist/planner/Planner.svelte.d.ts +4 -0
- package/dist/planner/app.svelte.d.ts +6 -0
- package/dist/planner/app.svelte.js +23 -0
- package/dist/planner/assistant.d.ts +46 -0
- package/dist/planner/assistant.js +122 -0
- package/dist/planner/commands/adapter.d.ts +121 -0
- package/dist/planner/commands/adapter.js +597 -0
- package/dist/planner/commands/catalog.d.ts +19 -0
- package/dist/planner/commands/catalog.js +54 -0
- package/dist/planner/commands/controller.svelte.d.ts +13 -0
- package/dist/planner/commands/controller.svelte.js +77 -0
- package/dist/planner/commands/index.d.ts +15 -0
- package/dist/planner/commands/index.js +15 -0
- package/dist/planner/commands/schemas.d.ts +25 -0
- package/dist/planner/commands/schemas.js +67 -0
- package/dist/planner/commands/slices.d.ts +18 -0
- package/dist/planner/commands/slices.js +49 -0
- package/dist/planner/commands/types.d.ts +80 -0
- package/dist/planner/commands/types.js +18 -0
- package/dist/planner/create.d.ts +4 -0
- package/dist/planner/create.js +22 -0
- package/dist/planner/instance.d.ts +15 -0
- package/dist/planner/instance.js +22 -0
- package/dist/planner/query.d.ts +16 -0
- package/dist/planner/query.js +28 -0
- package/dist/planner/selection.d.ts +15 -0
- package/dist/planner/selection.js +38 -0
- package/dist/planner/selection.svelte.d.ts +29 -0
- package/dist/planner/selection.svelte.js +54 -0
- package/dist/planner/tab.svelte.d.ts +11 -0
- package/dist/planner/tab.svelte.js +22 -0
- package/dist/planner/types.d.ts +41 -0
- package/dist/planner/types.js +1 -0
- package/dist/recipes/cards.d.ts +55 -0
- package/dist/recipes/cards.js +80 -0
- package/dist/recipes/features.d.ts +53 -0
- package/dist/recipes/features.js +97 -0
- package/dist/recipes/help/descriptions.json +373 -0
- package/dist/recipes/help.d.ts +121 -0
- package/dist/recipes/help.js +262 -0
- package/dist/recipes/index.d.ts +65 -0
- package/dist/recipes/index.js +95 -0
- package/dist/recipes/merge.d.ts +26 -0
- package/dist/recipes/merge.js +21 -0
- package/dist/recipes/overlay.json +409 -0
- package/dist/recipes/plan-data.d.ts +41 -0
- package/dist/recipes/plan-data.js +97 -0
- package/dist/recipes/plumbing.d.ts +70 -0
- package/dist/recipes/plumbing.js +185 -0
- package/dist/recipes/policy.d.ts +118 -0
- package/dist/recipes/policy.js +268 -0
- package/dist/recipes/resolve.d.ts +19 -0
- package/dist/recipes/resolve.js +65 -0
- package/dist/recipes/scope.d.ts +25 -0
- package/dist/recipes/scope.js +31 -0
- package/dist/recipes/sections.d.ts +49 -0
- package/dist/recipes/sections.js +84 -0
- package/dist/recipes/state.svelte.d.ts +67 -0
- package/dist/recipes/state.svelte.js +112 -0
- package/dist/recipes/types.d.ts +322 -0
- package/dist/recipes/types.js +8 -0
- package/dist/sections/entries.d.ts +30 -0
- package/dist/sections/entries.js +57 -0
- package/dist/sections/info.d.ts +16 -0
- package/dist/sections/info.js +39 -0
- package/dist/sections/path.d.ts +12 -0
- package/dist/sections/path.js +18 -0
- package/dist/settings/app-settings.d.ts +44 -0
- package/dist/settings/app-settings.js +138 -0
- package/dist/settings/currencies.d.ts +2 -0
- package/dist/settings/currencies.js +8 -0
- package/dist/theme/runtime.d.ts +14 -0
- package/dist/theme/runtime.js +27 -0
- package/dist/theme/theme.d.ts +47 -0
- package/dist/theme/theme.js +122 -0
- package/dist/upstream/CustomerSelect.svelte +60 -0
- package/dist/upstream/CustomerSelect.svelte.d.ts +17 -0
- package/dist/upstream/VendorSelect.svelte +60 -0
- package/dist/upstream/VendorSelect.svelte.d.ts +17 -0
- package/dist/upstream/overlay.d.ts +10 -0
- package/dist/upstream/overlay.js +49 -0
- package/dist/upstream/partySelect.d.ts +8 -0
- package/dist/upstream/partySelect.js +21 -0
- package/dist/upstream/partyTypes.d.ts +64 -0
- package/dist/upstream/partyTypes.js +8 -0
- package/dist/upstream/relations.d.ts +2 -0
- package/dist/upstream/relations.js +24 -0
- package/dist/upstream/selects.d.ts +26 -0
- package/dist/upstream/selects.js +20 -0
- package/dist/upstream/widgets.d.ts +20 -0
- package/dist/upstream/widgets.js +30 -0
- package/package.json +81 -3
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./iET62IRm.js","./uBIymjUX.js","./BQxY8kkL.js"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{At as e,B as t,D as n,E as r,Et as i,F as a,H as o,J as s,K as c,Mt as l,Nt as u,R as d,Tt as f,U as p,V as m,Z as h,a as g,at as _,b as v,dt as y,et as b,ft as x,gt as S,it as C,mt as w,ot as T,pt as E,q as D,ut as O,v as k,vt as A,xt as j}from"./Chyo8rdT.js";import{t as M}from"./uBIymjUX.js";import"./xihTtKlq.js";import{t as N}from"./CPRHZZeW.js";import{n as ee}from"./DVRKjN-E.js";import{d as te,f as P,i as ne,n as F,o as I,r as re,u as L}from"./WxSPP8QW.js";import{_ as ie,i as R,v as ae}from"./CygC84VT.js";import{S as oe,d as se,i as ce,l as le,o as ue,r as de}from"./p6bgzXiY.js";import{n as fe}from"./DkR8_Ws6.js";import{n as pe,r as me}from"./CyUMm_Wp.js";import{a as he,t as ge}from"./BQxY8kkL.js";import{A as _e,K as ve}from"./D_J_XtJy.js";import{n as ye,t as be}from"./leQCwW2d.js";async function xe(e={}){let t=e.window??(typeof window<`u`?window:void 0),n=e.navigator??(typeof navigator<`u`?navigator:void 0);return!t||!(`SpeechRecognition`in t)&&!(`webkitSpeechRecognition`in t)?`missing`:n&&`brave`in n&&n.brave||/\bElectron\//.test(n?.userAgent??``)?`unreliable`:`works`}function Se(e){return new Worker(new URL(`../workers/local-speech.worker-DWbfmFUk.js`,import.meta.url).href,{name:e?.name})}var Ce=2**28,we=16,Te=.95;function Ee(e){if(e===0)return 1;let t=Math.PI*e;return Math.sin(t)/t}function De(e,t,n){for(let[e,r]of[[`fromRate`,t],[`toRate`,n]])if(!Number.isFinite(r)||r<=0)throw new he(`invalid_argument`,`${e} must be a positive finite number (got ${String(r)})`);let r=Math.floor(e.length*n/t);if(r>Ce)throw new he(`invalid_argument`,`resampled output would be ${r} samples; the limit is ${Ce}`);if(t===n)return e.slice();let i=new Float32Array(r),a=t/n,o=a>1?Te/a:1,s=we/o,c=e.length-1;for(let t=0;t<r;t+=1){let n=t*a,r=Math.max(0,Math.ceil(n-s)),l=Math.min(c,Math.floor(n+s)),u=0,d=0;for(let t=r;t<=l;t+=1){let r=t-n,i=.5+.5*Math.cos(Math.PI*r/s),a=o*Ee(o*r)*i;u+=a*e[t],d+=a}i[t]=d===0?0:u/d}return i}var Oe={silenceMs:800,minSpeechMs:150,preRollMs:300,maxUtteranceMs:3e4,sensitivity:.5,calibrateMs:300},ke=.0015,Ae=.003,je=.006,Me=.2,Ne=.02,Pe=2e3,Fe=250;function Ie(e,t,n){return Math.min(n,Math.max(t,e))}function Le(e={}){let t=(e,t,n)=>typeof e==`number`&&Number.isFinite(e)?Math.max(n,e):t;return{silenceMs:t(e.silenceMs,Oe.silenceMs,20),minSpeechMs:t(e.minSpeechMs,Oe.minSpeechMs,0),preRollMs:t(e.preRollMs,Oe.preRollMs,0),maxUtteranceMs:t(e.maxUtteranceMs,Oe.maxUtteranceMs,1e3),sensitivity:Ie(typeof e.sensitivity==`number`&&Number.isFinite(e.sensitivity)?e.sensitivity:Oe.sensitivity,0,1),calibrateMs:t(e.calibrateMs,Oe.calibrateMs,0)}}function Re(e){let t=e.length;if(t===0)return 0;let n=0;for(let r=0;r<t;r++){let t=e[r];n+=t*t}return Math.sqrt(n/t)}function ze(e={}){let t=Le(e),n=6-4*t.sensitivity,r=.02-.015*t.sensitivity,i=Ae,a=0,o=[],s=!1,c=0,l=0,u=0,d=()=>Math.max(i*n,r),f=()=>Math.max(d()*.6,i*1.5),p=()=>{s=!1,c=0,l=0,u=0};return{get speaking(){return s},get noiseFloor(){return i},get threshold(){return d()},push(e,n=20){let r=[],m=Number.isFinite(e)?Math.max(0,e):0,h=Ie(m/(d()*3),0,1),g=a<t.calibrateMs;if(g&&(a+=n,!s)){o.push(m);let e=[...o].sort((e,t)=>e-t);i=Ie(e[Math.min(e.length-1,Math.floor(e.length*Me))]??Ae,ke,je)}if(!s){if(m>d())c+=n,c>=t.minSpeechMs&&(s=!0,l=0,u=c,r.push({type:`start`,leadMs:t.preRollMs+c}),c=0);else if(g)c=0;else{c=0;let e=n/Pe*(m<i?4:1);i=Ie(i+(m-i)*Math.min(1,e),ke,Ne)}return{events:r,level:h,speaking:s}}return u+=n,m>f()?l=0:l+=n,l>=t.silenceMs?(r.push({type:`end`,reason:`silence`,trailingSilenceMs:l}),p()):u>=t.maxUtteranceMs&&(r.push({type:`split`}),u=0,l=0),{events:r,level:h,speaking:s}},flush(){let e=[];return s&&e.push({type:`end`,reason:`flush`,trailingSilenceMs:l}),p(),e}}}function Be(e){let t=Le(e),n=ze(t),r=Math.max(1,Math.round(e.sampleRate*20/1e3)),i=r/e.sampleRate*1e3,a=Math.ceil((t.preRollMs+t.minSpeechMs)/i)+1,o=[],s=new Float32Array,c=null,l=!1,u=(t,n,r)=>{let a=Math.max(0,Math.floor((r-Fe)/i)),o=t.slice(0,Math.max(1,t.length-a)),s=0;for(let e of o)s+=e.length;let c=new Float32Array(s),l=0;for(let e of o)c.set(e,l),l+=e.length;e.onUtterance({pcm:c,sampleRate:e.sampleRate,durationMs:s/e.sampleRate*1e3,reason:n})},d=t=>{t!==l&&(l=t,e.onSpeaking?.(t))},f=s=>{let l=n.push(Re(s),i);e.onLevel?.(l.level),o.push(s),o.length>a&&o.shift(),c&&c.push(s);for(let e of l.events)if(e.type===`start`){c=[...o];let e=Math.ceil(t.preRollMs/i),n=Math.max(0,o.length-Math.ceil(t.minSpeechMs/i));for(let t=n;t<e;t++)c.unshift(new Float32Array(r))}else if(e.type===`end`){let t=c??[];c=null,o.length=0,t.length>0&&u(t,e.reason,e.trailingSilenceMs)}else if(e.type===`split`){let e=c??[];c=[],e.length>0&&u(e,`max`,0)}d(n.speaking)};return{get speaking(){return n.speaking},segmenter:n,push(e){let t=e;s.length>0&&(t=new Float32Array(s.length+e.length),t.set(s,0),t.set(e,s.length));let n=0;for(;n+r<=t.length;)f(t.slice(n,n+r)),n+=r;s=t.slice(n)},flush(){let t=n.flush();for(let e of t)e.type===`end`&&c&&c.length>0&&u(c,`flush`,e.trailingSilenceMs);c=null,o.length=0,s=new Float32Array,d(!1),e.onLevel?.(0)},discard(){n.flush(),c=null,o.length=0,s=new Float32Array,d(!1),e.onLevel?.(0)}}}var Ve=44,He=4294967295,Ue=1;function We(e){let t=new Int16Array(e.length);for(let n=0;n<e.length;n+=1){let r=e[n];Number.isNaN(r)||(t[n]=Math.min(32767,Math.round((r>1?1:r<-1?-1:r)*32768)))}return t}function Ge(e,t){if(!Number.isInteger(e)||e<1||e*2>He)throw new he(`invalid_argument`,`${t} must be a positive integer sample rate (got ${String(e)})`)}function Ke(e,t,n){for(let r=0;r<n.length;r+=1)e.setUint8(t+r,n.charCodeAt(r))}function qe(e,t){Ge(t,`sampleRate`);let n=e.length*2;if(n+Ve-8>He)throw new he(`invalid_argument`,`too many samples for a single WAV (4 GiB limit)`);let r=e instanceof Int16Array?e:We(e),i=new Uint8Array(Ve+n),a=new DataView(i.buffer);Ke(a,0,`RIFF`),a.setUint32(4,36+n,!0),Ke(a,8,`WAVE`),Ke(a,12,`fmt `),a.setUint32(16,16,!0),a.setUint16(20,Ue,!0),a.setUint16(22,1,!0),a.setUint32(24,t,!0),a.setUint32(28,t*2,!0),a.setUint16(32,2,!0),a.setUint16(34,16,!0),Ke(a,36,`data`),a.setUint32(40,n,!0);for(let e=0;e<r.length;e+=1)a.setInt16(Ve+e*2,r[e],!0);return i}var Je=`hv-pcm-tap`,Ye=`
|
|
3
|
+
class HvPcmTap extends AudioWorkletProcessor {
|
|
4
|
+
process(inputs) {
|
|
5
|
+
const channels = inputs[0];
|
|
6
|
+
if (channels && channels.length > 0 && channels[0].length > 0) {
|
|
7
|
+
const frames = channels[0].length;
|
|
8
|
+
const mono = new Float32Array(frames);
|
|
9
|
+
for (let c = 0; c < channels.length; c += 1) {
|
|
10
|
+
const data = channels[c];
|
|
11
|
+
for (let i = 0; i < frames; i += 1) mono[i] += data[i];
|
|
12
|
+
}
|
|
13
|
+
if (channels.length > 1) {
|
|
14
|
+
for (let i = 0; i < frames; i += 1) mono[i] /= channels.length;
|
|
15
|
+
}
|
|
16
|
+
this.port.postMessage(mono, [mono.buffer]);
|
|
17
|
+
}
|
|
18
|
+
return true;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
registerProcessor('${Je}', HvPcmTap);
|
|
22
|
+
`;function Xe(){return typeof AudioContext<`u`&&typeof AudioWorkletNode<`u`&&typeof Blob<`u`&&typeof URL<`u`&&typeof URL.createObjectURL==`function`}function Ze(e,t){let{sampleRate:n,maxDurationMs:r}=t;if(!Number.isInteger(n)||n<1)throw RangeError(`sampleRate must be a positive integer`);if(!Number.isFinite(r)||r<=0)throw RangeError(`maxDurationMs must be a positive number`);if(!Xe())throw new ge(`unsupported`,`PCM capture needs AudioContext, AudioWorkletNode and Blob URLs`);let i=new AudioContext,a=Math.ceil(r/1e3*i.sampleRate),o=[],s=0,c=!1,l=!1,u=!1,d=!1,f,p,m,h,g=e=>{if(d)return;let n=e.data;if(t.onSamples?.(n,i.sampleRate),t.retain===!1)return;let r=a-s;n.length>r&&(n=n.subarray(0,Math.max(0,r)),c=!0),n.length>0&&(o.push(n),s+=n.length),s>=a&&!l&&(l=!0,t.onLimit?.())},_=()=>{if(f!==void 0){let e=f;f=void 0;try{URL.revokeObjectURL(e)}catch{}}},v=()=>{if(h)return h;d=!0,_(),m&&(m.port.onmessage=null);try{p?.disconnect(),m?.disconnect()}catch{}return h=(async()=>{try{i.state!==`closed`&&await i.close()}catch{}})(),h},y=(async()=>{f=URL.createObjectURL(new Blob([Ye],{type:`text/javascript`}));try{await i.audioWorklet.addModule(f)}finally{_()}d||(p=i.createMediaStreamSource(e),m=new AudioWorkletNode(i,Je,{numberOfInputs:1,numberOfOutputs:1,outputChannelCount:[1]}),m.port.onmessage=g,p.connect(m),m.connect(i.destination),i.state===`suspended`&&await i.resume())})();y.catch(()=>void 0);let b;return{ready:y,stop(){return b??=(async()=>{try{await y}catch(e){throw await v(),new ge(`setup_failed`,`PCM capture could not start`,e)}if(await v(),u)throw new ge(`cancelled`,`PCM capture was cancelled`);let e=new Float32Array(s),t=0;for(let n of o.splice(0))e.set(n,t),t+=n.length;let r=De(e,i.sampleRate,n);return{samples:r,wav:qe(r,n),truncated:c}})(),b},cancel(){u||(u=!0,o.length=0,v())}}}var Qe=16e3;function $e(){return Xe()&&typeof navigator<`u`&&typeof navigator.mediaDevices?.getUserMedia==`function`}var et=36e5;async function tt(e={}){let t=e.createCapture??Ze;if(!e.createCapture&&!$e()&&!e.stream)throw new ge(`unsupported`,`Hands-free capture needs the microphone API and Web Audio`);let n=!e.stream,r=e.stream??await navigator.mediaDevices.getUserMedia(e.constraints??{audio:{echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0}}),i={speechstart:new Set,speechend:new Set,level:new Set},a=(e,t)=>{for(let n of[...i[e]])try{n(t)}catch{}},o,s=!1,c=!1,l=0,u=Math.max(0,e.resumeGuardMs??350),d=()=>{if(n)for(let e of r.getTracks())e.stop()},f;try{f=t(r,{sampleRate:Qe,maxDurationMs:et,retain:!1,onSamples:(t,n)=>{if(!s&&!c){if(l>0){l-=t.length/n*1e3;return}o??=Be({...e,sampleRate:n,onSpeaking:e=>{e&&a(`speechstart`,{})},onLevel:e=>a(`level`,{level:e}),onUtterance:e=>{let t=De(e.pcm,e.sampleRate,Qe);a(`speechend`,{samples:t,sampleRate:Qe,durationMs:e.durationMs,reason:e.reason})}}),o.push(t)}}})}catch(e){throw d(),e}if(f.ready)try{await f.ready}catch(e){throw s=!0,f.cancel(),d(),new ge(`setup_failed`,`Hands-free capture could not start`,e)}let p=async e=>{s||(e&&o?.flush(),s=!0,f.cancel(),d())};return{on(e,t){let n=i[e];return n.add(t),()=>{n.delete(t)}},get speaking(){return o?.speaking??!1},get suspended(){return c},suspend(){s||c||(c=!0,l=0,o?.discard(),a(`level`,{level:0}))},resume(){!s&&c&&(c=!1,l=u)},stop:()=>p(!0),cancel:()=>{p(!1)}}}var nt=e=>{let t=null,n=!1,r=!1,i=!1;return{async start(){let a=await tt({...e.vad,...e.constraints?{constraints:e.constraints}:{}});if(n||r){a.cancel();return}t=a,i&&a.suspend(),a.on(`speechstart`,()=>e.onSpeaking?.(!0)),a.on(`level`,({level:t})=>e.onLevel?.(t)),a.on(`speechend`,t=>{e.onSpeaking?.(!1),e.onUtterance({pcm:t.samples,sampleRate:t.sampleRate,durationMs:t.durationMs,reason:t.reason})})},suspend(){i=!0,t?.suspend(),e.onSpeaking?.(!1)},resume(){i=!1,t?.resume()},stop(){r=!0;let n=t;t=null,n?.stop().catch(t=>{e.onError?.(t instanceof Error?t:Error(String(t)))})},cancel(){n=!0,t?.cancel(),t=null}}};function rt(e){return me({model:e,createWorker:()=>new Se,loadSpeech:()=>M(()=>import(`./iET62IRm.js`),__vite__mapDeps([0,1,2]),import.meta.url)})}var it=[`material`,`glass`,`studio`,`smrt`,`happyvertical`],at=`@happyvertical/smrt-commerce:`,ot={currency:[`Order`,`PurchaseOrder`,`WholesaleOrder`,`Estimate`,`Invoice`,`Agreement`].map(e=>({model:`${at}${e}`,field:`currency`})),taxRate:[`InvoiceLineItem`,`ContractLineItem`].map(e=>({model:`${at}${e}`,field:`taxRate`})),paymentTerms:[...[`Order`,`WholesaleOrder`,`Estimate`,`Invoice`,`Agreement`].map(e=>({model:`${at}${e}`,field:`terms`})),{model:`${at}Customer`,field:`paymentTerms`}]},st={id:`more`,label:`More`},ct=/^@[^/]+\/(?:smrt-)?([^:]+):(.+)$/;function lt(e,t){let n=e.models.find(e=>e.id===t);if(n)return{packageId:n.packageId,name:n.name};let r=ct.exec(t);return r?{packageId:r[1],name:r[2]}:{packageId:`unknown`,name:t}}var ut=(e,t,n)=>`item:${e}:${t}${n?`:${n}`:``}`,dt=e=>e.replace(/([a-z0-9])([A-Z])/g,`$1 $2`).replace(/^./,e=>e.toUpperCase()),ft=(e,t)=>dt(lt(e,t).name);function pt(e,t){let n=new Map(e.recipes.map(e=>[e.id,e])),r=new Map;for(let i of[...t.recipes].sort()){let t=n.get(i);if(!t)continue;let a=t.section??{id:t.group?.id??t.id,label:t.group?.label??t.label},o=`section:${a.id}`,s=r.get(o)??{id:o,label:a.label,items:[]};for(let n of t.nav){let{packageId:t,name:r}=lt(e,n.model),i=ut(t,r,n.key);s.items.some(e=>e.id===i)||s.items.push({id:i,label:n.label})}r.set(o,s)}let i=[...r.values()].filter(e=>e.items.length>0),a=new Set(e.models.filter(e=>e.exposed!==!1).map(e=>e.id)),o=t.features.filter(e=>a.has(e));return o.length&&i.push({id:`section:${st.id}`,label:st.label,items:o.map(t=>{let{packageId:n,name:r}=lt(e,t);return{id:ut(n,r),label:dt(r)}})}),i}var mt=(e,t)=>{if(!t?.length)return e;let n=e=>{let n=t.indexOf(e);return n<0?2**53-1:n};return[...e].sort((e,t)=>n(e.id)-n(t.id))};function ht(e,t){let n=t.layout,r=pt(e,t).map(e=>({id:e.id,label:e.label,defaultLabel:e.label,custom:!1,hidden:!1,items:e.items.map(e=>({id:e.id,label:e.label,defaultLabel:e.label,hidden:!1}))}));for(let e of n?.customSections??[])r.some(t=>t.id===e.id)||r.push({id:e.id,label:e.label,defaultLabel:e.label,custom:!0,hidden:!1,items:[]});for(let[e,t]of Object.entries(n?.moved??{})){let n=r.find(e=>e.id===t);if(n)for(let t of r){let r=t.items.findIndex(t=>t.id===e);r>=0&&t!==n&&n.items.push(...t.items.splice(r,1))}}let i=new Set(n?.hidden??[]);for(let e of r){let t=n?.sections?.[e.id]?.label?.trim();t&&!e.custom&&(e.label=t),e.hidden=i.has(e.id),e.items=mt(e.items,n?.itemOrder?.[e.id]);for(let t of e.items){let e=n?.items?.[t.id]?.label?.trim();e&&(t.label=e),t.hidden=i.has(t.id)}}return mt(r.filter(e=>e.custom||e.items.length>0),n?.sectionOrder)}var gt=(e,t)=>e.models.find(e=>e.id===t),_t=e=>{let t={...e};for(let e of[`hidden`,`customSections`,`sectionOrder`])t[e]?.length||delete t[e];for(let e of[`sections`,`items`,`itemOrder`,`moved`,`panels`,`placements`])t[e]&&Object.keys(t[e]).length===0&&delete t[e];return Object.keys(t).length>1?t:void 0};function vt(e,t,n){let r=e?structuredClone(e):{version:1},i=n.trim();if(t.custom)return i?(r.customSections=r.customSections?.map(e=>e.id===t.id?{...e,label:i}:e),_t(r)):e;let a={...r.sections??{}},o={...a[t.id]??{}};return!i||i===t.defaultLabel?delete o.label:o.label=i,Object.keys(o).length?a[t.id]=o:delete a[t.id],r.sections=a,_t(r)}function yt(e,t,n){let r=e?structuredClone(e):{version:1},i=n?.trim()??``,a={...r.items??{}},o={...a[t.id]??{}};return!i||i===t.defaultLabel?delete o.label:o.label=i,Object.keys(o).length?a[t.id]=o:delete a[t.id],r.items=a,_t(r)}function bt(e,t,n){let r=e?structuredClone(e):{version:1},i=(r.hidden??[]).filter(e=>e!==t);return r.hidden=n?[...i,t]:i,_t(r)}var xt=`https://s-m-r-t.dev/schemas/cookbook/v1.json`,St=new Set([`basic`,`advanced`,`hidden`]),Ct=new Set([`api`,`mcp`,`cli`]),wt=new Set([`light`,`dark`,`system`]),z=e=>typeof e==`object`&&!!e&&!Array.isArray(e),Tt=e=>Array.isArray(e)&&e.every(e=>typeof e==`string`),Et=(e,t)=>z(e)&&!Object.hasOwn(e,`__proto__`)&&Object.values(e).every(t);function Dt(e,t,n){if(!z(e))return n.push(`${t} must be an object`);for(let r of[`objectRef`,`fieldName`])(typeof e[r]!=`string`||!e[r])&&n.push(`${t}.${r} must be a non-empty string`);e.scopeType!==`app`&&n.push(`${t}.scopeType must be "app"`);for(let r of[`defaultValue`,`help`,`label`]){let i=e[r];i!=null&&typeof i!=`string`&&n.push(`${t}.${r} must be a string or null`)}let r=e.visibility;r!=null&&!(typeof r==`string`&&St.has(r))&&n.push(`${t}.visibility must be basic, advanced or hidden`);let i=e.displayOrder;i!=null&&!(typeof i==`number`&&Number.isFinite(i))&&n.push(`${t}.displayOrder must be a finite number`),e.locked!=null&&typeof e.locked!=`boolean`&&n.push(`${t}.locked must be a boolean`)}function Ot(e,t){if(!z(e)||e.version!==1)return t.push(`layout must be an object with version 1`);for(let n of[`sectionOrder`,`hidden`])e[n]!==void 0&&!Tt(e[n])&&t.push(`layout.${n} must be a list of strings`);for(let n of[`itemOrder`,`moved`,`placements`]){let r=e[n];r!==void 0&&((n===`itemOrder`?Et(r,Tt):Et(r,e=>typeof e==`string`))||t.push(n===`itemOrder`?`layout.itemOrder must map ids to lists of strings`:`layout.${n} must map ids to strings`))}for(let n of[`sections`,`items`,`panels`])e[n]!==void 0&&!Et(e[n],e=>z(e))&&t.push(`layout.${n} must map ids to objects`);let n=e.customSections;n!==void 0&&!(Array.isArray(n)&&n.every(e=>z(e)&&typeof e.id==`string`&&typeof e.label==`string`))&&t.push(`layout.customSections must be a list of { id, label }`)}function kt(e,t){if(!z(e))return t.push(`theme must be an object`);e.preset!==void 0&&typeof e.preset!=`string`&&t.push(`theme.preset must be a string`),e.colorScheme!==void 0&&!(typeof e.colorScheme==`string`&&wt.has(e.colorScheme))&&t.push(`theme.colorScheme must be light, dark or system`);let n=e.custom;n!==void 0&&(!z(n)||typeof n.primary!=`string`?t.push(`theme.custom must be an object with a string primary`):/^#[0-9a-fA-F]{6}$/.test(n.primary)?n.fontFamily!==void 0&&typeof n.fontFamily!=`string`&&t.push(`theme.custom.fontFamily must be a string`):t.push(`theme.custom.primary must be a hex colour like #c2410c`))}function At(e,t,n){if(!z(e)||e.version!==1)return n.push(`${t} must be an object with version 1`);for(let r of[`order`,`removed`])e[r]!==void 0&&!Tt(e[r])&&n.push(`${t}.${r} must be a list of strings`);let r=e.added;r!==void 0&&!(Array.isArray(r)&&r.every(e=>z(e)))&&n.push(`${t}.added must be a list of widgets`),e.changed!==void 0&&!Et(e.changed,e=>z(e))&&n.push(`${t}.changed must map widget ids to objects`)}function jt(e,t={}){if(!z(e))return{ok:!1,errors:[`expected a JSON object`]};let n=[],r=[],{$schema:i,version:a}=e;i!==void 0&&i!==`https://s-m-r-t.dev/schemas/cookbook/v1.json`&&i!==`https://s-m-r-t.dev/schemas/blueprint/v1.json`&&n.push(`$schema must be ${xt}`),a===void 0?n.push(`version is required`):typeof a!=`number`||!Number.isInteger(a)?n.push(`version must be a whole number`):a>1?n.push(`version ${a} is newer than this reader understands (1)`):a!==1&&n.push(`version ${a} is not supported`),i===`https://s-m-r-t.dev/schemas/blueprint/v1.json`&&r.push(`$schema uses the legacy blueprint URL; migrated`);for(let t of[`name`,`description`])e[t]!==void 0&&typeof e[t]!=`string`&&n.push(`${t} must be a string`);let o=[];if(!Tt(e.recipes))n.push(`recipes must be a list of recipe ids`);else if(o=[...new Set(e.recipes)].sort(),t.recipes){let e=new Set(t.recipes);for(let t of o)e.has(t)||n.push(`recipes: unknown recipe "${t}"`)}let s=[];e.features!==void 0&&(Tt(e.features)?(s=[...new Set(e.features)].sort(),s.length!==e.features.length&&r.push(`features listed a model more than once; deduplicated`)):n.push(`features must be a list of model names`));let c=[];if(!Array.isArray(e.policies))n.push(`policies must be a list`);else for(let[t,r]of e.policies.entries())Dt(r,`policies[${t}]`,n),c.push(r);if(e.exposure!==void 0&&(Et(e.exposure,e=>Tt(e)&&e.every(e=>Ct.has(e)))||n.push(`exposure must map model names to lists of api, mcp or cli`)),e.layout!==void 0&&Ot(e.layout,n),e.theme!==void 0&&kt(e.theme,n),e.overviews!==void 0){if(!z(e.overviews)||Object.hasOwn(e.overviews,`__proto__`))n.push(`overviews must map overview ids to overrides`);else for(let[t,r]of Object.entries(e.overviews))At(r,`overviews.${t}`,n)}if(n.length)return{ok:!1,errors:n};let l={...e,$schema:xt,version:1,recipes:o,features:s,policies:c};return e.exposure!==void 0&&(l.exposure=e.exposure),e.layout!==void 0&&(l.layout=e.layout),e.theme!==void 0&&(l.theme=e.theme),e.overviews!==void 0&&(l.overviews=e.overviews),{ok:!0,cookbook:l,warnings:r}}var B=e=>e===void 0?e:structuredClone(e),Mt=(e,t)=>JSON.stringify(e??null)===JSON.stringify(t??null),Nt=()=>({$schema:xt,version:1,recipes:[],features:[],policies:[]});function Pt(e){return!e.recipes.length&&!e.features.length&&!e.policies.length&&!Object.keys(e.exposure??{}).length&&!e.layout&&!e.theme&&!Object.keys(e.overviews??{}).length}var Ft=e=>[...new Set(e)].sort();function It(e){let t=new Set([`$schema`,`version`,`name`,`description`,`recipes`,`features`,`policies`,`exposure`,`layout`,`theme`,`overviews`]),n={$schema:xt,version:1,...e.name?{name:e.name}:{},...e.description?{description:e.description}:{},recipes:Ft(e.recipes),features:Ft(e.features),policies:[...e.policies].sort((e,t)=>e.objectRef.localeCompare(t.objectRef)||e.fieldName.localeCompare(t.fieldName)).map(e=>({...e}))},r=Object.fromEntries(Object.keys(e.exposure??{}).sort().filter(t=>e.exposure?.[t]?.length).map(t=>[t,[...e.exposure?.[t]??[]].sort()]));Object.keys(r).length&&(n.exposure=r),e.layout&&(n.layout=B(e.layout));let i=an(e.theme);i&&(n.theme=i);let a=Object.entries(e.overviews??{}).sort(([e],[t])=>e<t?-1:+(e>t));a.length&&(n.overviews=Object.fromEntries(a.map(([e,t])=>[e,B(t)])));for(let[r,i]of Object.entries(e))t.has(r)||(n[r]=B(i));return n}var Lt=e=>new Map(e.recipes.map(e=>[e.id,e]));function Rt(e,t){let n=new Set,r=e=>{let i=t.get(e);if(i&&!n.has(e)){n.add(e);for(let e of i.requires)r(e)}};for(let t of e)r(t);let i=!0;for(;i;){i=!1;for(let e of[...n])for(let a of t.get(e)?.requiresAny??[]){if(a.some(e=>n.has(e)))continue;let e=a.find(e=>t.has(e));e&&(r(e),i=!0)}}return Ft(n)}function zt(e,t){let n=Lt(e);return new Set([...t.recipes.flatMap(e=>n.get(e)?.models??[]),...t.features])}function Bt(e){return e.settingTargets??ot}function Vt(e,t){return Object.values(Bt(e)).some(e=>e.some(e=>e.model===t.objectRef&&e.field===t.fieldName))}function Ht(e,t){let n=zt(e,t),r={...t,policies:t.policies.filter(t=>n.has(t.objectRef)||Vt(e,t))};if(t.exposure){let e=Object.fromEntries(Object.entries(t.exposure).filter(([e])=>n.has(e)));Object.keys(e).length?r.exposure=e:delete r.exposure}return r}var Ut=(e,t)=>{let n=Lt(e);return t.recipes.filter(e=>n.has(e))},Wt=(e,t)=>{let n=Lt(e);return t.recipes.filter(e=>!n.has(e))};function Gt(e,t){let n=new Set(e),r=new Set(t);return{added:t.filter(e=>!n.has(e)),removed:e.filter(e=>!r.has(e))}}function Kt(e,t,n){let r=Lt(e),i=Ut(e,t),a=Rt([...i,...n],r);return{doc:{...t,recipes:Ft([...a,...Wt(e,t)])},changes:{...Gt(i,a),kept:[]}}}function qt(e,t,n){let r=Lt(e),i=Ut(e,t),a=new Set(n),o=Rt(i.filter(e=>!a.has(e)),r),s=Ht(e,{...t,recipes:Ft([...o,...Wt(e,t)])}),{added:c,removed:l}=Gt(i,o);return{doc:s,changes:{added:c,removed:l,kept:n.filter(e=>o.includes(e)&&i.includes(e))}}}function Jt(e,t,n,r){let i=new Set(t.features);for(let e of n)r?i.add(e):i.delete(e);let a=[...i].sort(),o={...t,features:a};return r||(o=Ht(e,o)),{doc:o,changes:{...Gt(t.features,a),kept:[]}}}var Yt=(e,t)=>({added:[...e.added,...t.added],removed:[...e.removed,...t.removed],kept:[...e.kept,...t.kept]}),Xt={currency:`USD`,taxRate:0,paymentTerms:``},Zt=[`currency`,`taxRate`,`paymentTerms`];function Qt(e){if(e?.defaultValue!==void 0&&e.defaultValue!==null)try{return JSON.parse(e.defaultValue)}catch{return}}var $t=(e,t,n)=>e.find(e=>e.scopeType===`app`&&e.objectRef===t&&e.fieldName===n);function en(e,t){let n=Bt(e),r={...Xt},i=(e,r)=>{for(let{model:i,field:a}of n[e]){let e=Qt($t(t.policies,i,a));if(typeof e===r)return e}},a=i(`currency`,`string`),o=i(`taxRate`,`number`),s=i(`paymentTerms`,`string`);return typeof a==`string`&&(r.currency=a),typeof o==`number`&&(r.taxRate=o),typeof s==`string`&&(r.paymentTerms=s),r}var tn=e=>e==null||e===``;function nn(e,t,n,r){let i=Lt(e);for(let e of t.recipes){let t=i.get(e)?.options?.[n]?.fields?.[r];if(t&&`default`in t)return t.default}return gt(e,n)?.fields?.find(e=>e.name===r)?.default}function rn(e,t,n){let r=Bt(e),i=t.policies.map(e=>({...e}));for(let a of Zt){let o=n[a],s=a===`paymentTerms`?String(o).trim():a===`currency`?String(o).trim().toUpperCase():o;for(let{model:n,field:o}of r[a]){let r=nn(e,t,n,o),c=!tn(s)&&!(!tn(r)&&r===s)&&!(tn(r)&&a===`taxRate`&&s===0),l=$t(i,n,o);if(c){let e=JSON.stringify(s);l?l.defaultValue=e:i.push({objectRef:n,fieldName:o,scopeType:`app`,defaultValue:e})}else l&&(delete l.defaultValue,Object.keys(l).length<=3&&(i=i.filter(e=>e!==l)))}}return{...t,policies:i}}function an(e){if(!e)return;let t={};return e.preset&&(t.preset=e.preset),e.colorScheme&&(t.colorScheme=e.colorScheme),e.custom&&(t.custom={...e.custom}),Object.keys(t).length?t:void 0}function on(e){let t=e?.colorScheme??`system`,n=e?.custom?`brand colour ${e.custom.primary}`:e?.preset??`smrt`;return t===`system`?n:`${n}, ${t}`}function sn(e,t){let n={...e.theme??{}};t.preset&&(n.preset=t.preset,delete n.custom),t.primary&&(n.custom={primary:t.primary.toLowerCase(),...e.theme?.custom?.fontFamily?{fontFamily:e.theme.custom.fontFamily}:{}}),t.colorScheme&&(n.colorScheme=t.colorScheme);let r=an(n),i={...e};return r?i.theme=r:delete i.theme,i}function cn(e,t){let n=[],r=(e,t,r,i)=>n.push({severity:e,code:t,path:r,message:i}),i=jt(t);if(!i.ok){for(let e of i.errors)r(`error`,`invalid_document`,``,e);return n}for(let e of i.warnings)r(`warning`,`migrated`,``,e);let a=i.cookbook,o=Lt(e);for(let[e,t]of a.recipes.entries())o.has(t)||r(`error`,`unknown_recipe`,`recipes[${e}]`,`Unknown recipe "${t}".`);let s=new Set(Rt(a.recipes,o));for(let e of s)a.recipes.includes(e)||r(`error`,`missing_requirement`,`recipes`,`A recipe needs "${e}", which is not listed.`);for(let[t,n]of a.features.entries()){let i=gt(e,n);i?i.exposed===!1&&r(`error`,`model_not_exposed`,`features[${t}]`,`${n} cannot be added as a feature.`):r(`error`,`unknown_model`,`features[${t}]`,`Unknown model "${n}".`)}let c=zt(e,a);for(let[t,n]of a.policies.entries()){let i=`policies[${t}]`,a=gt(e,n.objectRef);if(!a){r(`error`,`unknown_model`,`${i}.objectRef`,`Unknown model "${n.objectRef}".`);continue}a.fields&&!a.fields.some(e=>e.name===n.fieldName&&!e.system)&&r(`error`,`unknown_field`,`${i}.fieldName`,`${a.name} has no field "${n.fieldName}".`),!c.has(n.objectRef)&&!Vt(e,n)&&r(`warning`,`policy_not_covered`,i,`${a.name} is not in the app, so this row has no effect.`)}for(let t of Object.keys(a.exposure??{}))gt(e,t)||r(`error`,`unknown_model`,`exposure.${t}`,`Unknown model "${t}".`);let l=e.themePresets??it;if(a.theme?.preset&&!l.includes(a.theme.preset)&&r(`error`,`unknown_preset`,`theme.preset`,`Unknown theme preset "${a.theme.preset}".`),a.layout){let t=ht(e,{...a,layout:void 0}),n=new Set([...t.flatMap(e=>[e.id,...e.items.map(e=>e.id)]),...(a.layout.customSections??[]).map(e=>e.id)]),i=[...(a.layout.hidden??[]).map((e,t)=>[`layout.hidden[${t}]`,e]),...Object.keys(a.layout.sections??{}).map(e=>[`layout.sections.${e}`,e]),...Object.keys(a.layout.items??{}).map(e=>[`layout.items.${e}`,e]),...(a.layout.sectionOrder??[]).map((e,t)=>[`layout.sectionOrder[${t}]`,e])];for(let[e,t]of i)n.has(t)||r(`warning`,`unknown_layout_id`,e,`The menu has no section or entry "${t}".`)}return n}var V=(e,t,n={})=>({ok:!1,error:{code:e,message:t,...n}}),H=(e,t=``,n={})=>({ok:!0,state:e,summary:t,...n}),ln=`This replaces the recipes, options, menu and look. Send replace: true to confirm.`,un=e=>e.join(`, `);function dn(e){return`${(e??``).normalize(`NFD`).replace(/\p{M}/gu,``).toLowerCase().replace(/[^a-z0-9]+/g,`-`).replace(/^-+|-+$/g,``)||`my-app`}.cookbook.json`}var fn=e=>`${JSON.stringify(e,null,2)}\n`;function pn(e,t){let n=new Map(e.recipes.map(e=>[e.id,e])),r=t.recipes.filter(e=>n.has(e)),i=t.recipes.filter(e=>!n.has(e));return It(Ht(e,{...B(t),recipes:[...Rt(r,n),...i]}))}function mn(e,t){return t?e.cookbooks?.find(e=>e.id===t)?.name:void 0}var hn=(e,t)=>{let n=t=>e.recipes.find(e=>e.id===t)?.label??t;return[t.added.length?`Added ${un(t.added.map(n))}.`:``,t.removed.length?`Removed ${un(t.removed.map(n))}.`:``,t.kept.length?`Kept ${un(t.kept.map(n))} (needed).`:``].filter(Boolean).join(` `)},gn=(e,t)=>[t.added.length?`Added ${un(t.added.map(t=>ft(e,t)))}.`:``,t.removed.length?`Removed ${un(t.removed.map(t=>ft(e,t)))}.`:``].filter(Boolean).join(` `),_n=e=>`${Number((e*100).toFixed(4))}%`,U=(e,t)=>({...e,doc:It(t)});function vn(e,t){let n=ht(e,t);return{sections:n,section:e=>n.find(t=>t.id===e),item:e=>n.flatMap(e=>e.items).find(t=>t.id===e)}}var yn=(e,t)=>{let n={...e};return t?n.layout=t:delete n.layout,n},bn={add_recipes(e,t,{ids:n}){let r=n.filter(t=>!e.recipes.some(e=>e.id===t));if(r.length)return V(`not_found`,`No such recipe: ${un(r)}.`,{path:`input.ids`});let{doc:i,changes:a}=Kt(e,t.doc,n);return H(U(t,i),hn(e,a),{changes:a})},remove_recipes(e,t,{ids:n}){let{doc:r,changes:i}=qt(e,t.doc,n);return H(U(t,r),hn(e,i),{changes:i})},add_features(e,t,{ids:n}){let r=n.filter(t=>!gt(e,t)?.exposed);if(r.length)return V(`not_found`,`No such model to add: ${un(r)}.`,{path:`input.ids`});let{doc:i,changes:a}=Jt(e,t.doc,n,!0);return H(U(t,i),gn(e,a),{changes:a})},remove_features(e,t,{ids:n}){let{doc:r,changes:i}=Jt(e,t.doc,n,!1);return H(U(t,r),gn(e,i),{changes:i})},add_cookbook(e,t,{id:n}){let r=e.cookbooks?.find(e=>e.id===n);if(!r)return V(`not_found`,`No cookbook "${n}".`,{path:`input.id`});let i=Kt(e,t.doc,r.document.recipes),a=Jt(e,i.doc,r.document.features.filter(t=>gt(e,t)?.exposed),!0),o=Yt(i.changes,a.changes);return H(U(t,a.doc),o.added.length?`Added the ${r.name} cookbook.`:``,{changes:o})},remove_cookbook(e,t,{id:n}){let r=e.cookbooks?.find(e=>e.id===n);if(!r)return V(`not_found`,`No cookbook "${n}".`,{path:`input.id`});let i=qt(e,t.doc,r.document.recipes),a=Jt(e,i.doc,r.document.features,!1),o=Yt(i.changes,a.changes);return H(U(t,a.doc),[hn(e,i.changes),gn(e,a.changes)].filter(Boolean).join(` `),{changes:o})},apply_cookbook(e,t,{id:n,replace:r}){let i=e.cookbooks?.find(e=>e.id===n);return i?!r&&!Pt(t.doc)?V(`confirmation_required`,ln):H({doc:pn(e,i.document),applied:n},`${i.name} set up.`):V(`not_found`,`No cookbook "${n}".`,{path:`input.id`})},import_cookbook(e,t,{document:n,replace:r}){let i=jt(n);if(!i.ok)return V(`invalid_input`,i.errors[0]??`Not a cookbook.`,{path:`input.document`,details:{errors:i.errors}});if(!r&&!Pt(t.doc))return V(`confirmation_required`,ln);let a=i.cookbook.recipes.length;return H({doc:pn(e,i.cookbook),applied:null},`Imported ${a} ${a===1?`recipe`:`recipes`}.`,i.warnings.length?{warnings:i.warnings}:{})},set_settings(e,t,n){let r=en(e,t.doc),i={...r},a=[];if(n.currency!==void 0){let t=n.currency.trim().toUpperCase();if(e.currencies&&!e.currencies.includes(t))return V(`invalid_input`,`${t} is not a known currency.`,{path:`input.currency`});if(!/^[A-Z]{3}$/.test(t))return V(`invalid_input`,`currency must be a three-letter code.`,{path:`input.currency`});t!==r.currency&&(i.currency=t,a.push(`currency ${t}`))}if(n.taxRate!==void 0){let e=Number((n.taxRate/100).toFixed(6));e!==r.taxRate&&(i.taxRate=e,a.push(`tax ${_n(e)}`))}if(n.paymentTerms!==void 0){let e=[...n.paymentTerms].map(e=>e.charCodeAt(0)<32||e.charCodeAt(0)===127?` `:e).join(``).trim();if(!e)return V(`invalid_input`,`paymentTerms must not be empty.`,{path:`input.paymentTerms`});e!==r.paymentTerms&&(i.paymentTerms=e,a.push(`terms ${e}`))}if(!a.length)return H(t);let o=a.join(`, `);return H(U(t,rn(e,t.doc,i)),`${o[0].toUpperCase()}${o.slice(1)}.`)},set_policy(e,t,n){let r=gt(e,n.model);if(!r)return V(`not_found`,`No such model: ${n.model}.`,{path:`input.model`});if(r.fields){let e=r.fields.find(e=>e.name===n.field);if(!e||e.system)return V(`not_found`,`${r.name} has no field ${n.field}.`,{path:`input.field`})}if(!zt(e,t.doc).has(r.id))return V(`not_found`,`${dt(r.name)} is not in the app yet; add its recipe or feature first.`,{path:`input.model`});if(t.doc.recipes.some(t=>e.recipes.find(e=>e.id===t)?.options?.[r.id]?.fields?.[n.field]?.locked))return V(`failed`,`${n.field} is locked by its recipe.`,{path:`input.field`});let i=t.doc.policies.map(e=>({...e})),a=i.find(e=>e.objectRef===r.id&&e.fieldName===n.field),o=a??{objectRef:r.id,fieldName:n.field,scopeType:`app`},s=JSON.stringify(o);for(let e of[`visibility`,`label`,`help`]){let t=n[e];t!==void 0&&(t===null?delete o[e]:o[e]=t)}if(n.defaultValue!==void 0){if(n.defaultValue===null)delete o.defaultValue;else{let e=JSON.stringify(n.defaultValue);if(e===void 0)return V(`invalid_input`,`defaultValue is not a JSON value.`,{path:`input.defaultValue`});o.defaultValue=e}}let c=Object.keys(o).length<=3;if(JSON.stringify(o)===s||c&&!a)return H(t);let l=i.filter(e=>e!==a);return H(U(t,{...t.doc,policies:c?l:[...l,o]}),`Updated ${dt(r.name)} ${n.field}.`)},set_theme(e,t,n){let r=sn(t.doc,n);return JSON.stringify(It(r).theme??null)===JSON.stringify(t.doc.theme??null)?H(t):H(U(t,r),`Theme: ${on(It(r).theme)}.`)},reset_theme(e,t){if(!t.doc.theme)return H(t);let n={...t.doc};return delete n.theme,H(U(t,n),`Theme: default.`)},set_name(e,t,n){let r={...t.doc};for(let e of[`name`,`description`]){let t=n[e];if(t===void 0)continue;let i=t?.trim();i?r[e]=i:delete r[e]}return JSON.stringify(It(r))===JSON.stringify(t.doc)?H(t):H(U(t,r),n.name?`Named the app ${n.name.trim()}.`:`Updated the app details.`)},rename_section(e,t,{id:n,label:r}){let i=vn(e,t.doc).section(n);if(!i)return V(`not_found`,`No menu section "${n}".`,{path:`input.id`});let a=vt(t.doc.layout,i,r);return JSON.stringify(a??null)===JSON.stringify(t.doc.layout??null)?H(t):H(U(t,yn(t.doc,a)),`Renamed the section to ${r.trim()}.`)},rename_item(e,t,{id:n,label:r}){let i=vn(e,t.doc).item(n);if(!i)return V(`not_found`,`No menu entry "${n}".`,{path:`input.id`});let a=yt(t.doc.layout,i,r);return JSON.stringify(a??null)===JSON.stringify(t.doc.layout??null)?H(t):H(U(t,yn(t.doc,a)),r?`Renamed the entry to ${r.trim()}.`:`Entry name restored.`)},hide(e,t,{id:n}){let r=vn(e,t.doc);return r.section(n)??r.item(n)?t.doc.layout?.hidden?.includes(n)?H(t):H(U(t,yn(t.doc,bt(t.doc.layout,n,!0))),`Hidden.`):V(`not_found`,`No menu section or entry "${n}".`,{path:`input.id`})},show(e,t,{id:n}){let r=vn(e,t.doc);return!r.section(n)&&!r.item(n)?V(`not_found`,`No menu section or entry "${n}".`,{path:`input.id`}):t.doc.layout?.hidden?.includes(n)?H(U(t,yn(t.doc,bt(t.doc.layout,n,!1))),`Shown.`):H(t)},validate(e,t){let n=cn(e,t.doc);return H(t,``,{data:{ok:!n.some(e=>e.severity===`error`),diagnostics:n}})},export_cookbook(e,t,{name:n}){return H(t,``,{data:{fileName:dn(n??t.doc.name??mn(e,t.applied)),text:fn(t.doc),cookbook:B(t.doc)}})}};function xn(e,t,n,r){let i=bn[n];return i?i(e,t,r):V(`unknown_command`,`No command "${n}".`)}var Sn=(e,t)=>({type:`array`,description:e,minItems:1,maxItems:50,items:t?.length?{type:`string`,enum:[...t]}:{type:`string`,minLength:1}}),Cn=(e,t={})=>({type:`string`,description:e,minLength:1,maxLength:200,...t}),W=(e,t=[])=>({type:`object`,properties:e,...t.length?{required:t}:{},additionalProperties:!1});function wn(e){let t=e.recipes.map(e=>e.id),n=(e.cookbooks??[]).map(e=>e.id),r=e.themePresets??it,i=e=>({type:`string`,description:e,...n.length?{enum:[...n]}:{minLength:1}}),a=e=>Cn(`The id of ${e}, as the plan snapshot's "sections" lists it.`),o={type:`boolean`,description:`Confirm replacing what is there.`};return[{name:`add_recipes`,description:`Switch recipes on. Recipes they require come along. Returns what was added.`,inputSchema:W({ids:Sn(`Recipe ids to add.`,t)},[`ids`])},{name:`remove_recipes`,description:`Switch recipes off. A recipe another one needs is kept and reported.`,inputSchema:W({ids:Sn(`Recipe ids to remove.`,t)},[`ids`])},{name:`add_features`,description:"Add single models no recipe covers, by qualified name (`@scope/pkg:Class`).",inputSchema:W({ids:Sn(`Qualified model names to add.`)},[`ids`])},{name:`remove_features`,description:`Remove single models added with add_features.`,inputSchema:W({ids:Sn(`Qualified model names to remove.`)},[`ids`])},{name:`add_cookbook`,description:`Add the recipes and features of a ready-made cookbook to the current app. Nothing is replaced.`,inputSchema:W({id:i(`The cookbook to add.`)},[`id`])},{name:`remove_cookbook`,description:`Remove the recipes and features a ready-made cookbook adds. Ones another recipe needs are kept.`,inputSchema:W({id:i(`The cookbook to remove.`)},[`id`])},{name:`apply_cookbook`,description:`Select a ready-made cookbook: replace the whole app (recipes, options, menu, theme) with it. When the app has anything in it, replace must be true.`,inputSchema:W({id:i(`The cookbook to set up.`),replace:o},[`id`])},{name:`import_cookbook`,description:`Replace the whole app with a cookbook document (version 1). Checked strictly; nothing is applied if it is invalid. When the app has anything in it, replace must be true.`,inputSchema:W({document:{type:`object`,description:`A cookbook document, version 1.`},replace:o},[`document`])},{name:`set_settings`,description:`Change app settings: currency, default tax rate (percent), default payment terms. Applies to new records only.`,inputSchema:W({currency:e.currencies?.length?{type:`string`,description:`ISO 4217 code, e.g. CAD.`,enum:[...e.currencies]}:{type:`string`,description:`ISO 4217 code, e.g. CAD.`,pattern:`^[A-Z]{3}$`},taxRate:{type:`number`,description:`Default tax rate in percent, 0 to 100.`,minimum:0,maximum:100},paymentTerms:{type:`string`,description:`Default payment terms, e.g. "Net 30".`,minLength:1,maxLength:40}})},{name:`set_policy`,description:`Set one field's policy: default value, visibility, label or help. The model must be covered by a recipe or feature that is on. null clears a part.`,inputSchema:W({model:Cn(`Qualified model name, e.g. @happyvertical/smrt-commerce:Order.`),field:Cn(`The model field name.`),defaultValue:{description:`The default as a JSON value (a string, number or boolean). null clears it.`},visibility:{enum:[`basic`,`advanced`,`hidden`,null],description:`Whether the field shows in forms and lists.`},label:{type:[`string`,`null`],description:`A different label.`,maxLength:120},help:{type:[`string`,`null`],description:`Help text under the field.`,maxLength:400}},[`model`,`field`])},{name:`set_theme`,description:`Change the look: a preset, a brand colour, light or dark. A preset replaces a brand colour.`,inputSchema:W({preset:{enum:[...r],description:`A built-in theme.`},primary:{type:`string`,description:`Brand colour as #rrggbb.`,pattern:`^#[0-9a-fA-F]{6}$`},colorScheme:{enum:[`light`,`dark`,`system`],description:`Light, dark or follow the device.`}})},{name:`reset_theme`,description:`Go back to the default look.`,inputSchema:W({})},{name:`set_name`,description:`Name and describe the app. null clears a part.`,inputSchema:W({name:{type:[`string`,`null`],minLength:1,maxLength:60},description:{type:[`string`,`null`],minLength:1,maxLength:400}})},{name:`rename_section`,description:`Rename a menu section.`,inputSchema:W({id:a(`the section`),label:Cn(`The new name.`,{maxLength:60})},[`id`,`label`])},{name:`rename_item`,description:`Rename a menu entry. A null label restores its own name.`,inputSchema:W({id:a(`the entry`),label:{type:[`string`,`null`],minLength:1,maxLength:60}},[`id`,`label`])},{name:`hide`,description:`Hide a menu section or entry. Nothing is deleted.`,inputSchema:W({id:a(`the section or entry`)},[`id`])},{name:`show`,description:`Show a hidden menu section or entry again.`,inputSchema:W({id:a(`the section or entry`)},[`id`])},{name:`validate`,description:`Check the current cookbook against the catalog and report typed diagnostics. Changes nothing.`,inputSchema:W({})},{name:`export_cookbook`,description:`The cookbook as a <name>.cookbook.json file (text in the result). Changes nothing.`,inputSchema:W({name:Cn(`A name for the file.`,{maxLength:60})})},{name:`undo`,description:`Undo an earlier change by the undoId its receipt carried. Refused with a conflict when the plan changed since, unless force is true.`,inputSchema:W({undoId:Cn(`The undoId from a receipt.`),force:{type:`boolean`,description:`Undo even after later edits.`}},[`undoId`])}]}function Tn(e){return{name:`run_batch`,description:`Run several commands as one atomic batch: all apply or none does. A failure names the command and leaves the plan unchanged.`,inputSchema:{type:`object`,properties:{id:{type:`string`,minLength:1,maxLength:200},expectedRevision:{type:`integer`,minimum:0},commands:{type:`array`,minItems:1,maxItems:50,items:{oneOf:wn(e).map(e=>({type:`object`,properties:{name:{const:e.name},input:e.inputSchema},required:[`name`],additionalProperties:!1}))}}},required:[`commands`],additionalProperties:!1}}}var En=e=>e===null?`null`:Array.isArray(e)?`array`:Number.isInteger(e)?`integer`:typeof e;function Dn(e,t){let n=En(t);return n===e||e===`number`&&n===`integer`}function On(e,t,n=`input`){let r=e=>({path:n,message:`${n} ${e}`}),i=e.type;if(i){let e=Array.isArray(i)?i:[i];if(!e.some(e=>Dn(e,t)))return r(`must be ${e.join(` or `)}`)}let a=e.enum;if(a&&!a.includes(t))return r(a.length>12?`is not a known value`:`must be one of ${a.map(e=>JSON.stringify(e)).join(`, `)}`);if(typeof t==`string`){let{minLength:n,maxLength:i,pattern:a}=e;if(n!==void 0&&t.length<n)return r(`must not be empty`);if(i!==void 0&&t.length>i)return r(`must be at most ${i} characters`);if(a&&!new RegExp(a).test(t))return r(`has the wrong format`)}if(typeof t==`number`){let{minimum:n,maximum:i}=e;if(!Number.isFinite(t))return r(`must be a finite number`);if(n!==void 0&&t<n)return r(`must be at least ${n}`);if(i!==void 0&&t>i)return r(`must be at most ${i}`)}if(Array.isArray(t)){let{minItems:i,maxItems:a,items:o}=e;if(i!==void 0&&t.length<i)return r(`needs at least ${i} item${i===1?``:`s`}`);if(a!==void 0&&t.length>a)return r(`takes at most ${a} items`);if(o)for(let[e,r]of t.entries()){let t=On(o,r,`${n}[${e}]`);if(t)return t}}if(En(t)===`object`){let r=t,{properties:i,required:a,additionalProperties:o}=e;for(let e of a??[])if(r[e]===void 0)return{path:`${n}.${e}`,message:`${n}.${e} is required`};for(let[e,t]of Object.entries(r)){let r=i?.[e];if(!r){if(o===!1)return{path:`${n}.${e}`,message:`${n}.${e} is not an option of this command`};continue}if(t===void 0)continue;let a=On(r,t,`${n}.${e}`);if(a)return a}}return null}function kn(e){return Object.fromEntries(wn(e).map(e=>[e.name,e.inputSchema]))}var G=(e,t,n={})=>({code:e,message:t,...n}),An=e=>Array.isArray(e)?e.map(An):e&&typeof e==`object`?Object.fromEntries(Object.keys(e).sort().map(t=>[t,An(e[t])])):e,jn=e=>{try{return JSON.stringify(An(e))??`undefined`}catch{return`unserializable`}};function Mn(e,t,n){if(!e||typeof e!=`object`||Array.isArray(e))return{ok:!1,error:G(`unknown_command`,`A command is an object: { name, input }.`)};let r=e,{name:i,input:a={}}=r;if(typeof i!=`string`||!Object.hasOwn(t,i))return{ok:!1,error:G(`unknown_command`,`Unknown command ${JSON.stringify(i)}.`)};for(let e of Object.keys(r))if(e!==`name`&&e!==`input`&&!n.includes(e))return{ok:!1,error:G(`invalid_input`,`${e} is not part of a command.`,{path:e})};let o=On(t[i],a);return o?{ok:!1,error:G(`invalid_input`,o.message,{path:o.path})}:{ok:!0,name:i,input:a}}var Nn=e=>e===void 0||typeof e==`string`&&e.length>0&&e.length<=200?null:G(`invalid_input`,`id must be a non-empty string of at most 200 characters.`,{path:`id`}),Pn=e=>e===void 0||Number.isInteger(e)&&e>=0?null:G(`invalid_input`,`expectedRevision must be a whole number.`,{path:`expectedRevision`});function Fn(e){let{catalog:t}=e,n=kn(t),r=wn(t),i=Tn(t),a=e.maxJournal??500,o=e.maxUndo??20,s,c=0,l=new Map;if(e.state){let n=e.state,r=jt(n.cookbook);if(!r.ok)throw Error(`Invalid saved cookbook: ${r.errors.join(`; `)}`);if(!Number.isInteger(n.revision)||n.revision<0)throw Error(`Invalid saved revision.`);s={doc:pn(t,r.cookbook),applied:n.applied??null},c=n.revision;for(let e of n.journal??[])l.set(e.id,B(e))}else if(e.cookbook!==void 0){let n=jt(e.cookbook);if(!n.ok)throw Error(`Invalid cookbook: ${n.errors.join(`; `)}`);s={doc:pn(t,n.cookbook),applied:null}}else s={doc:pn(t,Nt()),applied:null};let u=new Map,d=[],f=0,p=new Map;function m(e,n){let{doc:r}=e,i=new Map(t.recipes.map(e=>[e.id,e])),a=en(t,r),o=new Set(t.models.filter(e=>e.exposed!==!1).map(e=>e.id));return{version:1,revision:n,app:{name:r.name??mn(t,e.applied)??`my-app`,description:r.description??null,cookbook:e.applied},recipes:r.recipes.flatMap(e=>{let t=i.get(e);return t?[{id:e,label:t.label}]:[]}),features:r.features.filter(e=>o.has(e)),unavailable:[...r.recipes.filter(e=>!i.has(e)),...r.features.filter(e=>!o.has(e))],settings:{currency:a.currency,taxRate:Number((a.taxRate*100).toFixed(4)),paymentTerms:a.paymentTerms},theme:{text:on(r.theme),preset:r.theme?.preset??null,primary:r.theme?.custom?.primary??null,colorScheme:r.theme?.colorScheme??`system`},sections:ht(t,r).map(e=>({id:e.id,label:e.label,hidden:e.hidden,items:e.items.map(e=>({id:e.id,label:e.label,hidden:e.hidden}))})),policies:r.policies.length,undo:[...d]}}let h=()=>m(s,c);function g(){for(let[e,t]of p)t!==c&&(p.set(e,c),e(h()))}function _(e,t,n){if(e!==void 0)for(l.set(e,{id:e,fingerprint:t,result:B(n)});l.size>a;){let e=l.keys().next().value;if(e===void 0)break;l.delete(e)}}function v(e,t){if(e===void 0)return null;let n=l.get(e);return n?n.fingerprint===t?{...B(n.result),replayed:!0}:{ok:!1,id:e,error:G(`id_reuse`,`The id "${e}" was already used for a different command.`,{path:`id`})}:null}function y(e,t){let n=`undo-${++f}`;u.set(n,{before:B(e),after:B(t)}),d=[...d,n].slice(-o);for(let e of[...u.keys()])d.includes(e)||u.delete(e);return n}let b=(e,t)=>e.applied!==t.applied||!Mt(e.doc,t.doc);function x(e,t,n,r,i,a,o){return{ok:!0,...e===void 0?{}:{id:e},snapshot:a,receipt:{name:t,...e===void 0?{}:{id:e},summary:i===r?``:n.summary,changed:i!==r,revisionBefore:r,revisionAfter:i,...o?{undoId:o}:{},...n.changes?{changes:n.changes}:{},...n.warnings?{warnings:n.warnings}:{}},...n.data===void 0?{}:{data:n.data}}}function S(e,t){let n=u.get(t.undoId);if(!n)return{ok:!1,...e===void 0?{}:{id:e},error:G(`not_found`,`Nothing to undo for "${t.undoId}".`,{path:`input.undoId`})};if(!t.force&&b(s,n.after))return{ok:!1,...e===void 0?{}:{id:e},error:G(`conflict`,`The plan changed since; send force: true to undo anyway.`,{details:{currentRevision:c}})};let r=c,i=B(n.before),a=b(s,i);s=i,a&&(c+=1),u.delete(t.undoId),d=d.filter(e=>e!==t.undoId);let o=x(e,`undo`,{ok:!0,state:s,summary:`Undone.`},r,c,h());return g(),o}function C(e,r={}){try{let i=e&&typeof e==`object`&&!Array.isArray(e)?e:void 0,a=i?.id,o=Nn(a);if(o)return{ok:!1,error:o};let l=i?.expectedRevision??r.expectedRevision,u=Pn(l);if(u)return{ok:!1,...a===void 0?{}:{id:a},error:u};let d=jn({name:i?.name,input:i?.input??{},expectedRevision:l}),f=v(a,d);if(f)return f;let p=e=>(_(a,d,e),e),m=e=>({ok:!1,...a===void 0?{}:{id:a},error:e}),C=Mn(e,n,[`id`,`expectedRevision`]);if(!C.ok)return p(m(C.error));if(l!==void 0&&l!==c)return p(m(G(`conflict`,`The plan is at revision ${c}, not ${l}. Read the snapshot and try again.`,{details:{expectedRevision:l,currentRevision:c}})));if(C.name===`undo`)return p(S(a,C.input));let w=s,T=xn(t,w,C.name,C.input);if(!T.ok)return p(m(T.error));let E=c,D=b(w,T.state),O;D&&(s=T.state,c+=1,O=y(w,T.state));let k=p(x(a,C.name,T,E,c,h(),O));return g(),k}catch(e){return{ok:!1,error:G(`failed`,e instanceof Error?e.message:String(e))}}}function w(e){let r=(e,t)=>({ok:!1,...t===void 0?{}:{id:t},error:e,snapshot:h()});try{if(!e||typeof e!=`object`||Array.isArray(e))return r(G(`invalid_input`,`A batch is an object: { commands }.`));let i=e,a=i.id,o=Nn(a);if(o)return r(o);let l=Pn(i.expectedRevision);if(l)return r(l,a);let u=jn({commands:i.commands,expectedRevision:i.expectedRevision}),d=v(a,u);if(d)return`results`in d||`snapshot`in d?d:r(d.error,a);let f=e=>(_(a,u,e),e),p=i.commands;if(!Array.isArray(p)||p.length===0||p.length>50)return f(r(G(`invalid_input`,`commands must be a list of 1 to 50 commands.`,{path:`commands`}),a));let S=i.expectedRevision;if(S!==void 0&&S!==c)return f(r(G(`conflict`,`The plan is at revision ${c}, not ${S}. Read the snapshot and try again.`,{details:{expectedRevision:S,currentRevision:c}}),a));let C=(e,t,n)=>f(r(G(`batch_failed`,`Command ${e+1} (${String(t)}) failed: ${n.message}`,{path:`commands[${e}]`,details:{index:e,cause:n}}),a)),w=s,T=c,E=w,D=T,O=[];for(let[e,r]of p.entries()){let i=Mn(r,n,[]);if(!i.ok)return C(e,r?.name,i.error);if(i.name===`undo`)return C(e,`undo`,G(`invalid_input`,`undo cannot run inside a batch.`));let a=xn(t,E,i.name,i.input);if(!a.ok)return C(e,i.name,a.error);let o=D;b(E,a.state)&&(D+=1),E=a.state,O.push(x(void 0,i.name,a,o,D,m(E,D)))}let k=D!==T,A;if(k){s=E,c=D,A=y(w,E);for(let e of O)e.receipt.changed&&delete e.receipt.undoId}let j=f({ok:!0,...a===void 0?{}:{id:a},snapshot:h(),receipt:{...a===void 0?{}:{id:a},count:O.length,changed:k,revisionBefore:T,revisionAfter:D,...A?{undoId:A}:{}},results:O});return g(),j}catch(e){return r(G(`failed`,e instanceof Error?e.message:String(e)))}}return{run:C,batch:w,snapshot:h,cookbook:()=>B(s.doc),state:()=>({version:1,revision:c,applied:s.applied,cookbook:B(s.doc),journal:[...l.values()].map(e=>B(e))}),subscribe(e){return p.set(e,c),e(h()),()=>{p.delete(e)}},tools:r,batchTool:i}}var In=new Set(`AED AFN ALL AMD ANG AOA ARS AUD AWG AZN BAM BBD BDT BGN BHD BIF BMD BND BOB BRL BSD BTN BWP BYN BZD CAD CDF CHF CLP CNY COP CRC CUP CVE CZK DJF DKK DOP DZD EGP ERN ETB EUR FJD FKP GBP GEL GHS GIP GMD GNF GTQ GYD HKD HNL HTG HUF IDR ILS INR IQD IRR ISK JMD JOD JPY KES KGS KHR KMF KPW KRW KWD KYD KZT LAK LBP LKR LRD LSL LYD MAD MDL MGA MKD MMK MNT MOP MRU MUR MVR MWK MXN MYR MZN NAD NGN NIO NOK NPR NZD OMR PAB PEN PGK PHP PKR PLN PYG QAR RON RSD RUB RWF SAR SBD SCR SDG SEK SGD SHP SLE SOS SRD SSP STN SYP SZL THB TJS TMT TND TOP TRY TTD TWD TZS UAH UGX USD UYU UZS VES VND VUV WST XAF XCD XOF XPF YER ZAR ZMW ZWG`.split(` `));function Ln(){let e=ve.packages.flatMap(e=>e.models.map(t=>({id:t.id,name:t.name,packageId:e.id,...t.description?{description:t.description}:{},exposed:t.exposed,fields:t.fields.map(e=>({name:e.name,...e.system?{system:!0}:{},...e.default===void 0?{}:{default:e.default}}))})));return{recipes:oe,models:e,cookbooks:ye.map(e=>({id:e.id,name:e.name,document:e.document})),themePresets:L,currencies:[...In],settingTargets:ue}}var Rn;function zn(){return Rn??=Ln(),Rn}var Bn=[`cookbooks`,`recipes`,`features`,`layout`,`settings`,`export`],Vn={name:`focus`,description:`Move the planner's view to a tab and/or a menu section. Navigation only; it changes nothing in the plan.`,inputSchema:{type:`object`,properties:{tab:{enum:[...Bn],description:`The tab to open.`},section:{type:`string`,minLength:1,maxLength:200,description:`The id of a menu section, as the plan snapshot's "sections" lists it.`}},additionalProperties:!1}};function Hn(e){return[...wn(e),Vn]}function Un(e,t){return Hn({...zn(),recipes:e.map(e=>({id:e,label:e,models:[],nav:[],requires:[]})),cookbooks:t.map(e=>({id:e,name:e,document:{}}))})}var Wn=Un(oe.map(e=>e.id),ye.map(e=>e.id));Object.fromEntries(Wn.map(e=>[e.name,e.inputSchema])),Wn.map(e=>e.name);function Gn(e,t,n=`input`){return On(e,t,n)?.message??null}function Kn(e){let t=e;return{get:()=>t,set:e=>{t=e}}}var K=(e,t,n={})=>({code:e,message:t,...n}),q=(e,t)=>({ok:!1,...t===void 0?{}:{id:t},error:e}),J=e=>typeof e==`object`&&!!e&&!Array.isArray(e),qn=new Set([`apply_cookbook`,`import_cookbook`]),Jn=e=>e instanceof Error?e.message:String(e);function Yn(e,t){if(!J(e))return JSON.stringify([t,e??null]);let{overviews:n,...r}=e;return JSON.stringify([t,r])}function Xn(e){let{catalog:t,port:n,options:r={},env:i={}}=e,a=i.section??Kn(null),o=i.tab??Kn(null),s=Hn(t),c=e=>s.find(t=>t.name===e)?.inputSchema,l=c(`focus`),u=c(`undo`),d,f=``,p=null,m=new Map,h=new Map,g=0,_=new Map,v=()=>n?.applied?.()??null,y=()=>r.navigation?.getTab()??o.get();function b(){if(!n?.read){d=Fn(e.cookbook===void 0?{catalog:t}:{catalog:t,state:{version:1,revision:0,applied:null,cookbook:e.cookbook,journal:[]}});return}let r=n.read();f=Yn(r,v());try{d=Fn({catalog:t,state:{version:1,revision:0,applied:v(),cookbook:r,journal:[]}})}catch(e){d=Fn({catalog:t}),p=Jn(e)}}b();function x(e,n){let r=d.state();try{d=Fn({catalog:t,state:{version:1,revision:r.revision+1,applied:v(),cookbook:e,journal:r.journal}}),p=null}catch(e){p=Jn(e)}m=new Map,h=new Map,f=n}function S(){if(n?.read)try{let e=n.read(),t=Yn(e,v());if(t===f)return;x(e,t)}catch(e){p=Jn(e)}}let C=()=>K(`failed`,`The app's document is not one the planner can read (${p}). Fix it or reset the cookbook, then try again.`),w=e=>q(C(),e);function T(e){if(!e)return;let t=m.get(e);return t||(t=`undo-${++g}`,m.set(e,t),h.set(t,e)),t}function E(e){let t=new Set(e);for(let[e,n]of m)t.has(e)||(m.delete(e),h.delete(n))}let D=e=>({...e,undo:e.undo.map(e=>T(e)),focus:{tab:y(),section:a.get()}});function O(){let e=d.snapshot();return E(e.undo),D(e)}function k(e){if(!n?.read)return e;try{let t=n.read(),r=J(t)?t.overviews:void 0,{overviews:i,...a}=e;return It(J(r)&&Object.keys(r).length?{...a,overviews:r}:a)}catch{return e}}function A(e){if(!e.ok)return e;let{receipt:t}=e,n=e.replayed?void 0:T(t.undoId),{undoId:r,...i}=t,a=e.data;if(t.name===`export_cookbook`&&J(a)&&!e.replayed){let e=k(a.cookbook);a={...a,cookbook:e,text:`${JSON.stringify(e,null,2)}\n`}}return{...e,...a===void 0?{}:{data:a},snapshot:O(),receipt:{...i,...n?{undoId:n}:{}}}}function j(e,t){if(!n?.write)return;let i=d.snapshot().app.cookbook,a=e.includes(`apply_cookbook`)||i!==null&&i!==t;n.write(d.cookbook(),{commands:e,replaced:e.some(e=>qn.has(e)),applied:i,libraryApplied:a}),n.read&&(f=Yn(n.read(),v())),a&&r.onReplaced?.()}function M(){if(!_.size)return;S();let e=O(),t=JSON.stringify(e);for(let[n,r]of _)r!==t&&(_.set(n,t),n(e))}function N(e,t){for(let t of Object.keys(e))if(![`name`,`input`,`id`,`expectedRevision`].includes(t))return K(`invalid_input`,`${t} is not part of a command.`,{path:t});let{id:n}=e;if(n!==void 0&&!(typeof n==`string`&&n.length>0&&n.length<=200))return K(`invalid_input`,`id must be a non-empty string of at most 200 characters.`,{path:`id`});let r=e.expectedRevision??t.expectedRevision;return r!==void 0&&!(Number.isInteger(r)&&r>=0)?K(`invalid_input`,`expectedRevision must be a whole number.`,{path:`expectedRevision`}):null}function ee(e,t){let n=N(e,t),i=typeof e.id==`string`?e.id:void 0;if(n)return q(n,i);let s=e.expectedRevision??t.expectedRevision,c=e.input??{},u=Gn(l,c);if(u)return q(K(`invalid_input`,u,{path:`input`}),i);let f=d.snapshot().revision;if(s!==void 0&&s!==f)return q(K(`conflict`,`The plan is at revision ${f}, not ${s}. Read the snapshot and try again.`,{details:{expectedRevision:s,currentRevision:f}}),i);if(c.section!==void 0&&!O().sections.some(e=>e.id===c.section))return q(K(`not_found`,`No menu section "${c.section}".`,{path:`input.section`}),i);let p=!1;c.tab&&Bn.includes(c.tab)&&(p||=y()!==c.tab,o.set(c.tab),r.navigation?.setTab(c.tab)),c.section!==void 0&&(p||=a.get()!==c.section,a.set(c.section),r.navigation?.setSection?.(c.section));let m={ok:!0,...i===void 0?{}:{id:i},snapshot:O(),receipt:{name:`focus`,...i===void 0?{}:{id:i},summary:``,changed:p,revisionBefore:f,revisionAfter:f}};return M(),m}function te(e){let t=e.input;if(!n?.prepareImport||!J(t))return{raw:e};let r=n.prepareImport(t.document);return r.ok?{raw:{...e,input:{...t,document:r.cookbook}},dropped:r.dropped}:q(K(`invalid_input`,r.error,{path:`input.document`}),e.id)}function P(e){if(n?.read&&e.some(e=>typeof e==`string`&&qn.has(e)))try{let e=n.read();if(Pt(d.cookbook())&&!Pt(e)){let n=d.state();d=Fn({catalog:t,state:{version:1,revision:n.revision,applied:v(),cookbook:e,journal:n.journal}}),m=new Map,h=new Map,f=Yn(e,v())}}catch(e){p=Jn(e)}}function ne(e,t={}){try{if(S(),p)return w(J(e)&&typeof e.id==`string`?e.id:void 0);if(!J(e))return A(d.run(e,t));if(e.name===`focus`)return ee(e,t);if(P([e.name]),p)return w(typeof e.id==`string`?e.id:void 0);let n=e,r;if(e.name===`import_cookbook`){let t=te(e);if(`ok`in t)return t;n=t.raw,r=t.dropped}let i=d.snapshot().app.cookbook,a=F(n),o=a?I(n,t,a):A(d.run(n,t));if(!o.ok)return o;!o.replayed&&o.receipt.changed&&j([String(n.name)],i);let s=o;return r?.length&&(s={...o,receipt:{...o.receipt,warnings:[...o.receipt.warnings??[],...r.map(e=>`Not imported: ${e}`)]}}),M(),s.ok?{...s,snapshot:O()}:s}catch(e){return q(K(`failed`,Jn(e)))}}function F(e){let n=e.input;if(e.name!==`apply_cookbook`||!J(n))return;let r=t.cookbooks?.find(e=>e.id===n.id);if(!r||r.document.theme)return;let i=d.cookbook().theme;if(!i)return;let a={};return i.preset&&(a.preset=i.preset),i.custom?.primary&&(a.primary=i.custom.primary),i.colorScheme&&(a.colorScheme=i.colorScheme),Object.keys(a).length?a:void 0}function I(e,t,n){let r=d.batch({...e.id===void 0?{}:{id:e.id},expectedRevision:e.expectedRevision??t.expectedRevision,commands:[e,{name:`set_theme`,input:n}].map(({id:e,expectedRevision:t,...n})=>n)});if(!r.ok){let t=r.error.details?.cause;return q(r.error.code===`batch_failed`&&t?t:r.error,e.id)}let i=r.results[0],a=r.replayed?void 0:T(r.receipt.undoId);return{...i,...r.id===void 0?{}:{id:r.id},...r.replayed?{replayed:!0}:{},snapshot:O(),receipt:{...i.receipt,...r.id===void 0?{}:{id:r.id},revisionBefore:r.receipt.revisionBefore,revisionAfter:r.receipt.revisionAfter,changed:r.receipt.changed,...a?{undoId:a}:{}}}}function re(e){try{if(S(),p)return{ok:!1,error:C(),snapshot:O()};let t=J(e)&&Array.isArray(e.commands)?e.commands:[];if(P(t.map(e=>J(e)?e.name:void 0)),p)return{ok:!1,error:C(),snapshot:O()};let n=d.snapshot().app.cookbook,r=d.batch(e);if(!r.ok)return{...r,snapshot:O()};!r.replayed&&r.receipt.changed&&j(t.map(e=>String(e?.name)),n);let i=r.replayed?void 0:T(r.receipt.undoId),{undoId:a,...o}=r.receipt,s=O(),c={...r,snapshot:s,receipt:{...o,...i?{undoId:i}:{}},results:r.results.map(e=>({...e,snapshot:r.replayed?s:D(e.snapshot)}))};return M(),c}catch(e){return{ok:!1,error:K(`failed`,Jn(e)),snapshot:O()}}}function L(e){if(!J(e)||e.name!==`undo`||!J(e.input))return e;let t=e.input.undoId;return typeof t==`string`?{...e,input:{...e.input,undoId:h.get(t)??``}}:e}function ie(e,t){if(e.ok||e.error.code!==`not_found`)return e;let n=h.get(t);return n?{...e,error:{...e.error,message:e.error.message.replace(`"${n}"`,`"${t}"`)}}:e}let R=(e,t)=>{if(J(e)&&e.name===`undo`&&J(e.input)){let n=e.input.undoId;if(typeof n==`string`&&Gn(u,e.input)===null)return S(),O(),h.has(n)?ie(ne(L(e),t),n):q(K(`not_found`,`Nothing to undo for "${n}".`,{path:`input.undoId`}),e.id)}return ne(L(e),t)};return{run:R,batch:re,snapshot(){return S(),O()},cookbook(){return S(),k(d.cookbook())},undo(){S();let e=O().undo.at(-1);return e?R({name:`undo`,input:{undoId:e}}):q(K(`not_found`,`Nothing to undo.`))},state:()=>d.state(),get tools(){return s},get batchTool(){return d.batchTool},observe(){return S(),JSON.stringify(O())},deliver:M,subscribe(e){i.watch?.start(),S();let t=O();return _.set(e,JSON.stringify(t)),e(t),()=>{_.delete(e),_.size||i.watch?.stop()}}}}var Zn=`smrt-planner:cookbook`,Qn=new class{#e=A(null);get active(){return h(this.#e)}set active(e){S(this.#e,e,!0)}load(e=re()){try{this.active=e?.getItem(`smrt-planner:cookbook`)??null}catch{this.active=null}_e(this.active)}select(e,t=re()){this.active=e;try{t?.setItem(Zn,e)}catch{}}};function $n(e){let t=A(w(e));return{get:()=>h(t),set:e=>{S(t,e,!0)}}}function er(e){return{read:()=>e.snapshot(),applied:()=>Qn.active,prepareImport:e=>ne(e),write(t,{replaced:n,applied:r,libraryApplied:i}){let a=n?t:{...t,overviews:e.snapshot().overviews};n?e.replace(a):e.apply(a),i&&r&&(Qn.select(r),_e(r))}}}function tr(e=F,t={}){let n,r=Xn({catalog:zn(),port:er(e),options:t,env:{section:$n(null),tab:$n(null),watch:{start(){n||=C(()=>{T(()=>{r.observe(),b(r.deliver)})})},stop(){n?.(),n=void 0}}}});return r}var nr=()=>({$schema:I,version:1,recipes:[],features:[],policies:[]});function rr(e){let{store:t,settings:n,theme:r}=e;return{read(){let e={...nr(),recipes:[...t.ids].sort()};n&&(e=se(e,n.read()));let i=r?.read();return i?{...e,theme:i}:e},write(e){let i=new Set(e.recipes),a=new Set(t.ids),o=[...a].filter(e=>!i.has(e));o.length&&t.remove(...o);let s=[...i].filter(e=>!a.has(e));s.length&&t.add(...s),n&&n.write(le(e)),r?.write(e.theme)}}}function ir(e,t={}){return Xn({catalog:zn(),port:rr(e),options:t})}var ar=[`cookbooks`,`recipes`,`features`,`layout`,`settings`,`export`];function or(e,t=`recipes`){let n=new URLSearchParams(e).get(`tab`);return ar.find(e=>e===n)??t}var sr=new class{#e=A(`recipes`);get active(){return h(this.#e)}set active(e){S(this.#e,e,!0)}fromSearch(e,t=`recipes`){this.active=or(e,t)}},cr={},lr=tr(F,{navigation:{getTab:()=>sr.active,setTab:e=>{sr.active=e},setSection:e=>cr.openSection?.(e)},onReplaced:()=>cr.onReplaced?.()}),ur=`Qwen3-1.7B-q4f16_1-MLC`,dr=[{id:ur,label:`Qwen3 1.7B (recommended)`,downloadMB:1100,vramMB:2037},{id:`Llama-3.2-1B-Instruct-q4f16_1-MLC`,label:`Llama 3.2 1B (smallest)`,downloadMB:700,vramMB:879},{id:`Qwen3-4B-q4f16_1-MLC`,label:`Qwen3 4B (smarter, larger)`,downloadMB:2300,vramMB:3432}];function fr(e){return dr.find(t=>t.id===e)}function pr(e){return e>=1e3?`about ${(e/1e3).toFixed(1)} GB`:`about ${e} MB`}function mr(e){return e.label.replace(/\s*\(.*\)\s*$/,``)}var hr=`Qwen3-4B-q4f16_1-MLC`;function gr(e,t){return t>=e.vramMB*1e6*1.2}async function _r(e=typeof navigator>`u`?void 0:navigator){try{return(await e?.gpu?.requestAdapter())?.limits?.maxBufferSize??0}catch{return 0}}function vr(e){return typeof e==`string`?e:e.filter(e=>e.type===`text`).map(e=>e.text).join(`
|
|
23
|
+
`)}var Y=class extends Error{code;provider;model;retryable;constructor(e,t,n,r,i=!1){super(e),this.code=t,this.provider=n,this.model=r,this.retryable=i,this.name=`AIError`}},yr=class extends Y{constructor(e,t){super(`Model not found: ${e}`,`MODEL_NOT_FOUND`,t,e,!1),this.name=`ModelNotFoundError`}},br=class extends Y{constructor(e,t){super(`Input exceeds maximum context length`,`CONTEXT_LENGTH_EXCEEDED`,e,t,!1),this.name=`ContextLengthError`}},xr=class extends Y{constructor(e=`webllm`,t){super(t??`WebGPU is not available in this environment (navigator.gpu is missing); on-device inference cannot run.`,`WEBGPU_UNAVAILABLE`,e,void 0,!1),this.name=`WebGPUUnavailableError`}},Sr=class extends Y{constructor(e){super("The webllm provider needs the optional peer dependency @mlc-ai/web-llm. Install it with `pnpm add @mlc-ai/web-llm` (or the npm/yarn equivalent).",`WEBLLM_PEER_MISSING`,`webllm`,void 0,!1),this.name=`WebLLMPeerMissingError`,e!==void 0&&(this.cause=e)}},Cr=12e4,wr=Object.freeze({maxOutputTokens:131072,defaultOutputTokens:4096,maxReasoningTokens:1024,maxImagesPerRequest:1,onExceeded:`error`});function Tr(e,t,n){if(e===void 0)return t;if(!Number.isFinite(e)||e<=0)throw new Y(`${n} must be a positive finite number`,`AI_LIMIT_INVALID`);return Math.trunc(e)}function Er(e){let t=e.generationLimits||{},n={maxOutputTokens:Tr(t.maxOutputTokens,wr.maxOutputTokens,`generationLimits.maxOutputTokens`),defaultOutputTokens:Math.min(Tr(t.defaultOutputTokens,wr.defaultOutputTokens,`generationLimits.defaultOutputTokens`),Tr(t.maxOutputTokens,wr.maxOutputTokens,`generationLimits.maxOutputTokens`)),maxReasoningTokens:Tr(t.maxReasoningTokens,wr.maxReasoningTokens,`generationLimits.maxReasoningTokens`),maxImagesPerRequest:Tr(t.maxImagesPerRequest,wr.maxImagesPerRequest,`generationLimits.maxImagesPerRequest`),onExceeded:t.onExceeded||wr.onExceeded};if(![`error`,`clamp`].includes(n.onExceeded))throw new Y(`generationLimits.onExceeded must be "error" or "clamp"`,`AI_LIMIT_INVALID`);return{...e,timeout:Tr(e.timeout,Cr,`timeout`),maxRetries:(()=>{if(e.maxRetries===void 0)return 0;if(!Number.isFinite(e.maxRetries)||e.maxRetries<0)throw new Y(`maxRetries must be a non-negative finite number`,`AI_LIMIT_INVALID`);return Math.trunc(e.maxRetries)})(),generationLimits:n}}function Dr(e){switch(e){case!1:case`none`:return 0;case`minimal`:return 1024;case`low`:return 2048;case`medium`:return 4096;case`high`:return 8192;default:return}}function Or(e,t,n,r,i,a){if(!Number.isFinite(e)||e<0)throw new Y(`${r} must be a non-negative finite number`,`AI_LIMIT_INVALID`,i,a);let o=Math.trunc(e);if(o<=t)return o;if(n===`clamp`)return t;throw new Y(`${r} ${o} exceeds configured ceiling ${t}`,`AI_LIMIT_EXCEEDED`,i,a)}function kr(e,t,n,r){let i=Er(e).generationLimits,a=t.maxTokens??i.defaultOutputTokens??i.maxOutputTokens,o=t.thinkingLevel??e.thinkingLevel,s=t.reasoning!==void 0||o!==void 0||t.includeThoughts===!0?t.reasoning?.maxTokens??Dr(t.reasoning?.effort??o)??i.maxReasoningTokens:0;return{...t,maxTokens:Or(a,i.maxOutputTokens,i.onExceeded,`maxTokens`,n,r),reasoning:{...t.reasoning,maxTokens:Or(s,i.maxReasoningTokens,i.onExceeded,`reasoning.maxTokens`,n,r),includeThoughts:t.reasoning?.includeThoughts??t.includeThoughts}}}function Ar(e,t={}){let n=Er(e),r=Tr(t.timeout,n.timeout,`timeout`),i=new AbortController,a=!1,o=()=>i.abort(t.signal?.reason);t.signal?.aborted?o():t.signal?.addEventListener(`abort`,o,{once:!0});let s=setTimeout(()=>{a=!0,i.abort(Error(`AI request timed out after ${r}ms`))},r);return{signal:i.signal,timeout:r,didTimeout:()=>a,cleanup:()=>{clearTimeout(s),t.signal?.removeEventListener(`abort`,o)}}}[...new Set([`getVideoGenerationJob`,`fetchVideoGenerationResult`,`cancelVideoGenerationJob`])];function jr(e,t,n,r,i,a,o){if(!e.onUsage)return;let s=e.usageTags,c=s||o?{...s,...o}:void 0;try{e.onUsage({provider:t,model:r,operation:n,usage:i,duration:Date.now()-a,timestamp:new Date,tags:c})}catch{}}var X=`webllm`,Mr=4096,Nr={chat:!0,completion:!0,embeddings:!1,streaming:!0,functions:!0,vision:!1,fineTuning:!1,imageEmbeddings:!1,imageGeneration:!1,videoGeneration:!1,tts:!1,voiceCloning:!1,voiceDesign:!1,maxContextLength:Mr,supportedOperations:[`chat`,`completion`,`streaming`,`functions`]},Pr=new WeakMap,Fr=new Map;async function Ir(){try{let e=await M(()=>import(`./FbOxj-PF.js`),[],import.meta.url),t=typeof e?.CreateMLCEngine==`function`?e:e?.default;if(typeof t?.CreateMLCEngine!=`function`)throw Error(`@mlc-ai/web-llm did not export CreateMLCEngine`);return t}catch(e){throw new Sr(e)}}function Lr(){return!!globalThis.navigator?.gpu}function Z(e){throw new Y(`${e} is not supported by the webllm provider.`,`NOT_SUPPORTED`,X)}function Rr(e){return Object.fromEntries(Object.entries(e).filter(([,e])=>e!==void 0))}var zr=class{options;explicitModel;factoryEngine;localEngines=new Map;constructor(e){this.explicitModel=e.defaultModel??e.model,this.options=Er({...e,defaultModel:this.explicitModel??`Llama-3.2-1B-Instruct-q4f16_1-MLC`})}async acquireEngine(e,t){let n=this.options.engine;if(n)return typeof n==`function`?(this.factoryEngine??=n().catch(e=>{throw this.factoryEngine=void 0,e}),Ur(this.factoryEngine,t)):n;if(!Lr())throw new xr(X);let r=this.options.appConfig?this.localEngines:Fr,i=r.get(e);if(!i){let t=new Set,n={listeners:t,promise:this.createEngine(e,t)};n.promise.catch(()=>{r.get(e)===n&&r.delete(e)}),r.set(e,n),i=n}let a=this.options.onLoadProgress;a&&i.listeners.add(a);try{return await Ur(i.promise,t)}finally{a&&i.listeners.delete(a)}}async createEngine(e,t){return(await Ir()).CreateMLCEngine(e,{...this.options.appConfig?{appConfig:this.options.appConfig}:{},initProgressCallback:e=>{for(let n of t)try{n(e)}catch{}}})}mapMessages(e){return e.map(e=>{if(e.role===`user`&&Array.isArray(e.content))return{role:`user`,content:e.content.map(e=>e.type===`text`?{type:`text`,text:e.text}:{type:`image_url`,image_url:{url:e.image_url.url}}),...e.name?{name:e.name}:{}};let t=vr(e.content);return e.role===`tool`||e.role===`function`?{role:`tool`,content:t,tool_call_id:e.tool_call_id??e.name??``}:e.role===`assistant`?Rr({role:`assistant`,content:t||(e.tool_calls?.length?null:``),tool_calls:e.tool_calls?.map(e=>({id:e.id,type:e.type,function:{name:e.function.name,arguments:e.function.arguments}}))}):{role:e.role,content:t,...e.name?{name:e.name}:{}}})}mapResponseFormat(e){return e.responseSchema===void 0?e.responseFormat?.type===`json_object`?{type:`json_object`}:void 0:{type:`json_object`,schema:typeof e.responseSchema==`string`?e.responseSchema:JSON.stringify(e.responseSchema)}}buildRequest(e,t,n,r,i){let a=i&&t.tools?.length?t.tools.map(e=>({type:`function`,function:{name:e.function.name,description:e.function.description,parameters:e.function.parameters}})):void 0;return Rr({model:n,messages:this.mapMessages(e),max_tokens:t.maxTokens,temperature:t.temperature,top_p:t.topP,n:t.n,stop:t.stop,frequency_penalty:t.frequencyPenalty,presence_penalty:t.presencePenalty,seed:t.seed,tools:a,tool_choice:a?t.toolChoice:void 0,response_format:this.mapResponseFormat(t),stream:r,stream_options:r?{include_usage:!0}:void 0})}requestModel(e,t){return this.options.engine?t.model??this.explicitModel:e}mapUsage(e){let t=e;if(t)return{promptTokens:t.prompt_tokens??0,completionTokens:t.completion_tokens??0,totalTokens:t.total_tokens??0}}mapFinishReason(e){switch(e){case`length`:return`length`;case`tool_calls`:return`tool_calls`;default:return`stop`}}assertNotInterrupted(e,t){if(e===`abort`)throw new Y(`Generation was interrupted before it finished`,`AI_INTERRUPTED`,X,t,!0)}mapError(e,t){if(e instanceof Y)return e;let n=e?.name??``,r=e instanceof Error?e.message:String(e);if(n===`WebGPUNotAvailableError`||n===`WebGPUNotFoundError`)return new xr(X,r);if(n===`ContextWindowSizeExceededError`||n===`PrefillChunkSizeSmallerThanImageError`)return new br(X,t);if(n===`ModelNotFoundError`||n===`SpecifiedModelNotFoundError`||n===`UnsupportedModelIdError`||n===`ModelNotLoadedError`)return new yr(t??r,X);let i=new Y(r,n===`DeviceLostError`?`WEBGPU_DEVICE_LOST`:`API_ERROR`,X,t);return i.cause=e,i}abortError(e,t,n){if(e?.didTimeout())return new Y(`AI request timed out after ${e.timeout}ms`,`AI_TIMEOUT`,X,n);if(t.signal?.aborted)return new Y(`AI request aborted by caller`,`AI_ABORTED`,X,n)}async lockEngine(e,t){let n=Pr.get(e)??Promise.resolve(),r=()=>{},i=new Promise(e=>{r=e});Pr.set(e,n.then(()=>i));try{await Ur(n,t)}catch(e){throw r(),e}return r}bindInterrupt(e,t){let n=()=>{try{Promise.resolve(e.interruptGenerate()).catch(()=>{})}catch{}};return t.aborted&&n(),t.addEventListener(`abort`,n,{once:!0}),()=>t.removeEventListener(`abort`,n)}async chat(e,t={}){let n=Date.now(),r,i,a,o,s,c=t.model||this.options.defaultModel||`Llama-3.2-1B-Instruct-q4f16_1-MLC`;try{t=kr(this.options,t,X,c);let l=await this.acquireEngine(c,t.signal);r=Ar(this.options,t),a=await this.lockEngine(l,r.signal),i=this.bindInterrupt(l,r.signal),o=l.chat.completions.create(this.buildRequest(e,t,this.requestModel(c,t),!1,!0));let u=o,d=!1,f=()=>{d=!0};u.then(f,f),s=()=>d?void 0:u;let p=await Ur(o,r.signal);if(r.signal.aborted)throw this.abortError(r,t,c)??r.signal.reason;let m=p?.choices?.[0];if(this.assertNotInterrupted(m?.finish_reason,c),!m)throw new Y(`No choices returned from webllm`,`NO_CHOICES`,X);let h=this.mapUsage(p.usage);jr(this.options,X,`chat`,p.model||c,h,n,t.usageTags);let g=m.message?.tool_calls?.map(e=>({id:e.id,type:`function`,function:{name:e.function.name,arguments:e.function.arguments}}));return{content:m.message?.content||``,usage:h,model:p.model||c,finishReason:this.mapFinishReason(m.finish_reason),...g?.length?{toolCalls:g}:{}}}catch(e){throw this.abortError(r,t,c)??this.mapError(e,c)}finally{i?.(),Vr(a,s?.()),r?.cleanup()}}async complete(e,t={}){return this.chat([{role:`user`,content:e}],{model:t.model,maxTokens:t.maxTokens,temperature:t.temperature,topP:t.topP,n:t.n,stop:t.stop,stream:t.stream,onProgress:t.onProgress,signal:t.signal,timeout:t.timeout,reasoning:t.reasoning,usageTags:t.usageTags,continueOnLength:t.continueOnLength})}async message(e,t={}){let n=[...t.history||[],{role:t.role||`user`,content:e}];return(await this.chat(n,{model:t.model,maxTokens:t.maxTokens,temperature:t.temperature,topP:t.topP,stop:t.stop,stream:t.stream,frequencyPenalty:t.frequencyPenalty,presencePenalty:t.presencePenalty,responseFormat:t.responseFormat,responseSchema:t.responseSchema,seed:t.seed,tools:t.tools,toolChoice:t.toolChoice,onProgress:t.onProgress,signal:t.signal,timeout:t.timeout,reasoning:t.reasoning,usageTags:t.usageTags,continueOnLength:t.continueOnLength})).content}async*stream(e,t={}){let n=Date.now(),r,i,a,o,s,c=!1,l,u=t.model||this.options.defaultModel||`Llama-3.2-1B-Instruct-q4f16_1-MLC`;try{t=kr(this.options,t,X,u),a=await this.acquireEngine(u,t.signal),r=Ar(this.options,t),o=await this.lockEngine(a,r.signal),i=this.bindInterrupt(a,r.signal);let d=a.chat.completions.create(this.buildRequest(e,t,this.requestModel(u,t),!0,!1)),f;try{f=await Ur(d,r.signal)}catch(e){throw l=d.then(e=>Hr(e[Symbol.asyncIterator](),a),()=>{}),e}s=f[Symbol.asyncIterator]();let p,m;for(;;){let e=await s.next();if(e.done){c=!0;break}let n=e.value,r=n.choices?.[0];p=r?.finish_reason??p,n.usage&&(m=this.mapUsage(n.usage));let i=r?.delta?.content;i&&(t.onProgress?.(i),yield i)}if(r.signal.aborted)throw this.abortError(r,t,u)??r.signal.reason;this.assertNotInterrupted(p,u),t.onFinishReason?.(this.mapFinishReason(p)),jr(this.options,X,`stream`,u,m,n,t.usageTags)}catch(e){throw this.abortError(r,t,u)??this.mapError(e,u)}finally{if(s&&!c&&a){try{Promise.resolve(a.interruptGenerate()).catch(()=>{})}catch{}await Br(s)}i?.(),Vr(o,l),r?.cleanup()}}async countTokens(e){return Math.ceil(e.length/4)}async getModels(){let e=await Ir(),t=this.options.appConfig?.model_list??e.prebuiltAppConfig.model_list,n=new Set(e.functionCallingModelIds??[]);return t.filter(e=>e.model_type!==1).map(e=>{let t=e.model_type===2,r=n.has(e.model_id);return{id:e.model_id,name:e.model_id,description:e.vram_required_MB?`Runs on-device via WebGPU (~${Math.round(e.vram_required_MB)} MB VRAM)`:`Runs on-device via WebGPU`,contextLength:e.overrides?.context_window_size??Mr,capabilities:[`text`,`chat`,...r?[`functions`]:[],...t?[`vision`]:[]],supportsFunctions:r,supportsVision:t}})}async getCapabilities(){return{...Nr}}async embed(e,t={}){return Z(`Embeddings`)}async embedImage(e,t={}){return Z(`Image embeddings`)}async describeImage(e,t,n={}){return Z(`Image description`)}async generateImage(e,t={}){return Z(`Image generation`)}async submitVideoGenerationJob(e){return Z(`Video generation`)}async getVideoGenerationJob(e){return Z(`Video generation`)}async fetchVideoGenerationResult(e){return Z(`Video generation`)}async cancelVideoGenerationJob(e){return Z(`Video generation`)}async validateVideoGenerationAccess(){return Z(`Video generation`)}async synthesizeSpeech(e,t){return Z(`Text-to-speech`)}streamSpeech(e,t){let n=new Y(`Text-to-speech streaming is not supported by the webllm provider.`,`NOT_SUPPORTED`,X);return{[Symbol.asyncIterator]:()=>({next:()=>Promise.reject(n)})}}async cloneVoice(e){return Z(`Voice cloning`)}async designVoice(e){return Z(`Voice design`)}async getVoices(e){return Z(`Voice listing`)}};async function Br(e){try{for(;!(await e.next()).done;);}catch{}}function Vr(e,t){e&&(t?t.then(e,e):e())}async function Hr(e,t){try{if((await e.next()).done)return;await Promise.resolve(t?.interruptGenerate())}catch{return}await Br(e)}function Ur(e,t){return t?t.aborted?Promise.reject(new Y(`AI request aborted by caller`,`AI_ABORTED`,X)):new Promise((n,r)=>{let i=()=>r(new Y(`AI request aborted by caller`,`AI_ABORTED`,X));t.addEventListener(`abort`,i,{once:!0}),e.then(e=>{t.removeEventListener(`abort`,i),n(e)},e=>{t.removeEventListener(`abort`,i),r(e)})}):e}var Wr={createWorker:()=>new Worker(new URL(new URL(`../workers/llm.worker-wfCOG_uk.js`,import.meta.url).href,``+import.meta.url),{type:`module`}),createEngine:async(e,t,n)=>{let{CreateWebWorkerMLCEngine:r}=await M(async()=>{let{CreateWebWorkerMLCEngine:e}=await import(`./FbOxj-PF.js`);return{CreateWebWorkerMLCEngine:e}},[],import.meta.url);return r(e,t,{initProgressCallback:e=>n(e)})}};async function Gr(e,t,n,r=Wr){if(n?.aborted)throw new DOMException(`Cancelled`,`AbortError`);let i=r.createWorker(),a=()=>i.terminate(),o,s=new Promise((e,t)=>{o=()=>{a(),t(new DOMException(`Cancelled`,`AbortError`))},n?.addEventListener(`abort`,o,{once:!0})});try{return{engine:await Promise.race([r.createEngine(i,e,t),s]),dispose:a}}catch(e){throw a(),e}finally{o&&n?.removeEventListener(`abort`,o)}}var Kr=e=>!!e&&typeof e==`object`&&e.kind===`cookbook-offer`&&typeof e.offerId==`string`,qr=class{find;#e=A(w({}));get offers(){return h(this.#e)}set offers(e){S(this.#e,e,!0)}applier=null;counter=0;constructor(e){this.find=e}pending(){return Object.values(this.offers).find(e=>e.status===`pending`)}engaged(){return Object.values(this.offers).some(e=>e.status===`pending`||e.status===`applied`)}offer(e){let t=this.pending();if(t?.cookbookId===e)return null;t&&(t.status=`replaced`);let n=`offer-${++this.counter}`;return this.offers[n]={id:n,cookbookId:e,status:`pending`,error:``},{kind:`cookbook-offer`,offerId:n}}accept(e){let t=this.offers[e];if(t?.status!==`pending`)return;let n=this.find(t.cookbookId),r=n?this.applier?this.applier(n):`Not ready yet.`:`Unknown cookbook.`;if(r||!n){t.status=`failed`,t.error=r??`Could not set it up.`;return}t.status=`applied`}decline(e){let t=this.offers[e];t?.status===`pending`&&(t.status=`declined`)}},Jr=`smrt-planner:assistant:v1`;function Yr(){return{modelId:ur,consented:[]}}function Xr(e){let t=Yr();try{let n=e?.getItem(Jr);if(!n)return t;let r=JSON.parse(n);typeof r.modelId==`string`&&fr(r.modelId)&&(t.modelId=r.modelId),Array.isArray(r.consented)&&(t.consented=r.consented.filter(e=>typeof e==`string`&&!!fr(e)))}catch{}return t}function Zr(e,t){try{e?.setItem(Jr,JSON.stringify(t))}catch{}}var Qr=e=>!!e&&typeof e==`object`&&e.kind===`theme-undo`&&typeof e.undoId==`string`,$r=class{store;controller;#e=A(w({}));get undos(){return h(this.#e)}set undos(e){S(this.#e,e,!0)}counter=0;constructor(e,t){this.store=e,this.controller=t}record(t,n){let r=`theme-undo-${++this.counter}`;return this.undos[r]={id:r,previous:t?structuredClone(e(t)):void 0,status:`available`,...n?{commandUndoId:n}:{}},{kind:`theme-undo`,undoId:r}}undo(e){let t=this.undos[e];t?.status===`available`&&(t.commandUndoId&&this.controller?.run({name:`undo`,input:{undoId:t.commandUndoId}}).ok||this.store.write(t.previous),t.status=`undone`)}};function ei(e,t=[],n=!1,r=!1){let i=e.map(e=>e.id),a={type:`array`,items:{enum:i},maxItems:i.length},o={reply:{type:`string`,maxLength:200},add:a,remove:a};return t.length&&(o.cookbook={enum:[...t.map(e=>e.id),null]}),n&&(o.settings={type:`object`,properties:{currency:{type:`string`,pattern:`^[A-Z]{3}$`},taxRate:{type:`number`,minimum:0,maximum:100},paymentTerms:{type:`string`,maxLength:40}},additionalProperties:!1}),r&&(o.theme={type:`object`,properties:{preset:{enum:[...L]},primary:{type:`string`,pattern:`^#[0-9a-fA-F]{6}$`},colorScheme:{enum:[`light`,`dark`]}},additionalProperties:!1}),{type:`object`,properties:o,required:[`reply`,`add`,`remove`],additionalProperties:!1}}function ti(e){let t={};if(!e||typeof e!=`object`||Array.isArray(e))return t;let n=e;if(typeof n.currency==`string`){let e=n.currency.trim().toUpperCase();In.has(e)&&(t.currency=e)}let r=n.taxRate;if(typeof r==`number`&&Number.isFinite(r)&&r>=0&&r<=100&&(t.taxRate=r),typeof n.paymentTerms==`string`){let e=[...n.paymentTerms].map(e=>e.charCodeAt(0)<32||e.charCodeAt(0)===127?` `:e).join(``).trim();e&&e.length<=40&&(t.paymentTerms=e)}return t}function ni(e){let t={};if(!e||typeof e!=`object`||Array.isArray(e))return t;let n=e;typeof n.preset==`string`&&L.includes(n.preset)&&(t.preset=n.preset);let r=P(n.primary);return r&&(t.primary=r),(n.colorScheme===`light`||n.colorScheme===`dark`||n.colorScheme===`system`)&&(t.colorScheme=n.colorScheme),t}function ri(e){return e.replace(/<think>[\s\S]*?<\/think>/gi,``).replace(/<think>[\s\S]*$/i,``).trim()}function ii(e){let t=/"reply"\s*:\s*"((?:[^"\\]|\\.)*)/.exec(e);if(!t)return null;let n=t[1];n=n.replace(/\\$/,``);try{n=JSON.parse(`"${n}"`)}catch{n=n.replace(/\\n/g,` `).replace(/\\"/g,`"`)}return n.trim()||null}function ai(e,t,n=[],r={}){let i=new Set(t.map(e=>e.id)),a=ri(e),o=e=>({reply:e,add:[],remove:[],cookbook:null,settings:{},theme:{}}),s=/^[\s`]*[{[]/.test(a)||/"reply"\s*:/.test(a),c=()=>o(s?ii(a)??`Sorry, say that again?`:a),l;try{l=JSON.parse(a)}catch{return c()}if(!l||typeof l!=`object`||Array.isArray(l))return c();let u=l,d=e=>Array.isArray(e)?[...new Set(e.filter(e=>typeof e==`string`&&i.has(e)))]:[],f=d(u.add),p=d(u.remove),m=new Set(f.filter(e=>p.includes(e))),h=r.commands?oi(u.commands):[];return{reply:typeof u.reply==`string`?u.reply.trim():``,add:f.filter(e=>!m.has(e)),remove:p.filter(e=>!m.has(e)),cookbook:typeof u.cookbook==`string`&&n.some(e=>e.id===u.cookbook)?u.cookbook:null,settings:ti(u.settings),theme:ni(u.theme),...h.length?{commands:h}:{}}}function oi(e){if(!Array.isArray(e))return[];let t=[];for(let n of e){if(t.length>=8)break;if(!n||typeof n!=`object`)continue;let{name:e,input:r}=n;typeof e==`string`&&t.push({name:e,input:r??{}})}return t}function si(e,t){let n=e=>t.find(t=>t.id===e)?.label??e,r=e=>e.map(n).join(`, `),i=[];return e.added.length&&i.push(`Added ${r(e.added)}.`),e.removed.length&&i.push(`Removed ${r(e.removed)}.`),e.kept.length&&i.push(`Kept ${r(e.kept)} (needed).`),i.join(` `)}var ci={name:10,synonym:6,keyword:4},li=1.5,ui=new Set([`a`,`an`,`and`,`the`,`of`,`for`,`to`,`in`,`on`,`or`,`general`,`simple`]),di=[`car`,`vehicle`,`metal`,`steel`,`gates`,`studio`,`classes`,`members`,`shop`,`order`,`item`,`material`,`customer`,`sales`,`stock`,`schedule`,`terms`];function fi(e){return e.length<=3?e:e.endsWith(`ies`)?`${e.slice(0,-3)}y`:e.endsWith(`sses`)?e.slice(0,-2):/(us|ss|is)$/.test(e)?e:e.endsWith(`s`)?e.slice(0,-1):e}function pi(e){return e.normalize(`NFD`).replace(/\p{M}/gu,``).toLowerCase().replace(/['’]s\b/g,``).replace(/['’]/g,``).replace(/[^a-z0-9]+/g,` `).trim().split(` `).filter(Boolean).map(fi).join(` `)}var mi=new Set(di.map(pi)),hi={"commerce.customers":[`customer`,`client`,`contacts`,`patrons`],"commerce.purchases":[`purchase`,`buy supplies`,`reorder`,`order from suppliers`],"commerce.sales":[`sell`,`sale`,`sales order`,`point of sale`],"commerce.vendors":[`vendor`,`supplier`,`who we buy from`],"inventory.stock":[`inventory`,`track stock`,`stock levels`,`warehouse`,`count stock`],"products.simple":[`product`,`price list`,`menu`,`things we sell`],"products.clothing":[`clothes`,`shirts`,`fashion`,`sizes and colours`],"products.ingredients":[`ingredient`,`recipe`,`raw material`,`flour`,`components`],"commerce.estimates":[`estimate`,`quote`,`quotes for customers`,`price quote`,`bid`],"commerce.wholesale":[`wholesale`,`bulk`,`trade customers`,`resellers`],"commerce.invoicing":[`invoice`,`send invoices`,`bill customers`,`get paid`,`receipts`],"commerce.fulfillment":[`ship`,`shipping`,`courier`,`parcels`,`deliver`],"commerce.agreements":[`contract`,`agreement`,`sign contracts`],"commerce.leases":[`lease`,`rent out`,`equipment hire`],"commerce.licenses":[`licence`,`licence sales`,`software licenses`],"ledgers.bookkeeping":[`books`,`keep the books`,`bookkeeper`,`accountant`,`expenses`],"projects.tracker":[`project`,`task`,`to do list`,`bug`,`ticket`],"events.calendar":[`appointment`,`schedule appointments`,`event`,`meeting`,`reservation`],"sales.pipeline":[`lead`,`pipeline`,`prospect`,`follow up`,`sales funnel`]};function gi(e,t){let n=pi(e);if(!n)return null;let r=n.split(` `);return r.length===1&&ui.has(n)?null:{text:n,tier:t,weak:t!==`name`&&r.every(e=>mi.has(e)),words:r.length}}function Q(e,t,n){let r=gi(t,n);if(!r)return;let i=e.terms.find(e=>e.text===r.text);if(i){ci[r.tier]>ci[i.tier]&&(i.tier=r.tier,i.weak=r.weak);return}e.terms.push(r)}function _i(e){return pi(e).split(` `).filter(e=>e&&!ui.has(e))}var vi=[`theme`,`colour`,`color`,`colour scheme`,`dark mode`,`light mode`,`brand`,`branding`,`style`,`warmer`,`cooler`,`font`];function yi(e,t=[],n={}){let r=[];for(let t of e){let e={kind:`recipe`,id:t.id,terms:[],exact:pi(t.label)};Q(e,t.label,`name`),Q(e,(t.id.split(`.`).pop()??``).replace(/[-_]/g,` `),`name`);for(let n of _i(t.label))Q(e,n,`synonym`);for(let n of t.synonyms)Q(e,n,`synonym`);for(let n of hi[t.id]??[])Q(e,n,`keyword`);r.push(e)}for(let e of t){let t={kind:`cookbook`,id:e.id,terms:[],exact:pi(e.name)};Q(t,e.name,`name`),Q(t,e.id.replace(/[-_]/g,` `),`name`);for(let n of e.keywords??[])Q(t,n,`keyword`);r.push(t)}if(n.theme){let e={kind:`theme`,id:`theme`,terms:[]};for(let t of vi)Q(e,t,`keyword`);r.push(e)}return{entries:r}}function bi(e,t){let n=pi(t),r=` ${n} `,i=[];for(let t of e.entries){let e=0,a=!1,o=[];for(let n of t.terms)r.includes(` ${n.text} `)&&(o.push(n.text),e+=ci[n.tier]*(n.words>1?li:1)*(n.weak?.5:1),n.weak||(a||=!0));o.length&&(t.exact&&t.exact===n&&(e+=1),i.push({kind:t.kind,id:t.id,score:e,confidence:a?`strong`:`weak`,terms:o}))}return i.sort((e,t)=>t.score-e.score||e.id.localeCompare(t.id))}var xi=5,Si=2,Ci=[{says:`I run a bakery`,cookbook:`bakery`,answer:{reply:`The Bakery cookbook covers that.`,add:[],remove:[],cookbook:`bakery`}},{says:`I need to send invoices`,recipes:[`commerce.invoicing`],answer:{reply:`Added invoicing for billing customers.`,add:[`commerce.invoicing`],remove:[]}},{says:`we don't need the pipeline`,recipes:[`sales.pipeline`],answer:{reply:`Removed leads and pipeline.`,add:[],remove:[`sales.pipeline`]}},{says:`we're in Canada, 13% tax`,settings:!0,answer:{reply:`Set to Canadian dollars and 13% tax.`,add:[],remove:[],settings:{currency:`CAD`,taxRate:13}}},{says:`make it warmer`,theme:!0,answer:{reply:`Gave it a warm amber brand colour.`,add:[],remove:[],theme:{primary:`#d97706`}}},{says:`hello`,answer:{reply:`Hi. What kind of business is it?`,add:[],remove:[]}}];function wi(e,t,n,r){return Ci.filter(i=>(i.recipes??[]).every(t=>e.has(t))&&(!i.cookbook||t.has(i.cookbook))&&(!i.settings||n)&&(!i.theme||r)).map(e=>`"${e.says}" -> ${JSON.stringify(e.answer)}`)}function Ti(e){return`${Number((e*100).toFixed(4))}%`}function Ei(e,t,n=[],r,i,a){let o=i!==void 0,s=(i??[]).filter(e=>e.kind===`recipe`).slice(0,xi).map(e=>e.id),c=(i??[]).filter(e=>e.kind===`cookbook`).slice(0,Si).map(e=>e.id),l=new Set([...s,...t]),u=new Set(c),d=e=>{let t=e.synonyms.length?` Also called: ${e.synonyms.join(`, `)}.`:``;return`- ${e.id}: ${e.label}. ${e.summary}${t}`},f=[`You help assemble a small business app. Reply as JSON.`,`"reply": answer what they just said in one sentence of 12 words or fewer. No greeting; never repeat a reply.`,`"add"/"remove": recipe ids, only what they ask to add or drop; else []. Dependencies are automatic.`];n.length&&f.push(`"cookbook": id only if their business clearly fits, else null.`),r&&f.push(`"settings": only what they state: currency (ISO), taxRate (percent), paymentTerms; else omit, and do not mention them otherwise.`),a&&f.push(`"theme": only if they ask for a look: {"preset": material|glass|studio|smrt|happyvertical} or {"primary": "#rrggbb"}, optional "colorScheme": light|dark; else omit.`);let p=wi(new Set(e.map(e=>e.id)),new Set(n.map(e=>e.id)),!!r,!!a);p.length&&f.push(``,`Examples:`,...p);let m=!!a&&(i??[]).some(e=>e.kind===`theme`);if(s.length||c.length||m){let e=[];m&&e.push(`theming (use "theme")`),c.length&&e.push(`cookbook ${c.join(`, `)}`),s.length&&e.push(`recipes ${s.join(`, `)}`),f.push(``,`Looks relevant: ${e.join(`; `)}.`)}let h=e=>`- ${e.id}: ${e.name}. ${e.summary}`,g=e=>e.join(`, `),_=e.filter(e=>!o||l.has(e.id)),v=o?e.filter(e=>!l.has(e.id)):[];if(f.push(``),_.length&&f.push(`Recipes:`,..._.map(d)),v.length&&f.push(`Other recipes: ${g(v.map(e=>`${e.id} (${e.label})`))}.`),n.length){let e=n.filter(e=>!o||u.has(e.id)),t=o?n.filter(e=>!u.has(e.id)):[];f.push(``),e.length&&f.push(`Cookbooks:`,...e.map(h)),t.length&&f.push(`Other cookbooks: ${g(t.map(e=>`${e.id} (${e.name})`))}.`)}if(f.push(``,`Currently on: ${t.length?t.join(`, `):`none`}.`),r){let e=r.paymentTerms?`, terms ${r.paymentTerms}`:``;f.push(`Settings: currency ${r.currency}, tax ${Ti(r.taxRate)}${e}.`)}return a&&f.push(`Theme: ${te(a.current)}.`),f.join(`
|
|
24
|
+
`)}var Di=`Plan your app`,Oi=`What would you like to build?`,ki=400,Ai=e=>Object.keys(e).length>0;function ji(e,t,n){let r=e.run({name:t,input:n});return r.ok?{summary:r.receipt.summary,undoId:r.receipt.undoId}:{summary:``}}var Mi=(e,t,n)=>ji(e,t,n).summary;function Ni(e,t){let n=[];for(let r of t){let t=e.run(r);if(!t.ok){n.push(`The server's ${r.name} was refused: ${t.error.message}`);break}t.receipt.summary&&n.push(t.receipt.summary)}return n.join(` `)}function Pi(e,t){let n=t.add.length?e.run({name:`add_recipes`,input:{ids:t.add}}):null,r=t.remove.length?e.run({name:`remove_recipes`,input:{ids:t.remove}}):null,i=n?.ok?n.receipt.changes?.added??[]:[],a=r?.ok?r.receipt.changes?.removed??[]:[];return{added:i.filter(e=>!a.includes(e)),removed:a.filter(e=>!i.includes(e)),kept:r?.ok?r.receipt.changes?.kept??[]:[]}}function Fi(e){let t=e.now??(()=>Date.now()),n=0,r=e=>`${e}-${++n}`,i={id:`planner`,title:Di,isResolved:!1,messageCount:0,lastMessageAt:null},a=[],o=new Map,s=null,c=(e,n,o,s)=>{let c={id:r(`m`),threadId:i.id,content:n,role:e,createdAt:new Date(t()),...o?{clientRequestId:o}:{}};return s&&(c.toolCallData=s),a.push(c),i.messageCount=a.length,i.lastMessageAt=c.createdAt,c},l=e.controller??ir({store:e.store,settings:e.settings,theme:e.theme}),u=yi(e.recipes,e.cookbooks??[],{theme:!!e.theme}),d=c(`assistant`,Oi);async function f(t){let n=e.model();if(!n)return{content:(typeof e.unavailable==`function`?e.unavailable():e.unavailable)??`Download a model first, then I can help. The cards on the Planner page work without one.`};s=new AbortController;try{let r=e.cookbooks??[],i=a.filter(e=>e!==d).slice(0,-1).slice(-6).map(e=>({role:e.role,content:e.content})),o=bi(u,t),c=ai(await n.message(t,{history:[{role:`system`,content:Ei(e.recipes,e.store.ids,r,e.settings?.read(),o,e.theme?{current:e.theme.read()}:void 0)},...i],responseSchema:ei(e.recipes,r,!!e.settings,!!e.theme),temperature:0,maxTokens:ki,signal:s.signal}),e.recipes,r,{commands:typeof e.acceptCommands==`function`?e.acceptCommands():e.acceptCommands}),f=Pi(l,c),p=e.settings&&Ai(c.settings)?Mi(l,`set_settings`,c.settings):``,m=e.theme?.read(),h=e.theme&&Ai(c.theme)?ji(l,`set_theme`,c.theme):null,g=h?.undoId&&e.themeUndos?e.themeUndos.record(m,h.undoId):void 0,_=(c.commands??[]).length?Ni(l,c.commands??[]):``,v=[si(f,e.recipes),p,h?.summary??``,_].filter(Boolean).join(` `),y=o.find(e=>e.kind===`cookbook`&&e.confidence===`strong`)?.id,b=c.cookbook??(y&&e.offers?.engaged?.()===!1?y:null),x=b?e.offers?.offer(b)??void 0:void 0,S=x?r.find(e=>e.id===b):void 0,C=c.reply||(S?`Set up ${S.name}?`:``),w=[C,v].filter(Boolean).join(` `);return C&&e.onReply?.(C),{content:w||`Done.`,refs:x&&g?[x,g]:x??g}}catch(e){return s?.signal.aborted?{content:`Stopped.`}:{content:`Sorry, the model could not answer: ${e instanceof Error?e.message:String(e)}`}}finally{s=null}}return{async listThreads(){return[i]},async createThread(){return i},async loadMessages(){return[...a]},async sendMessage(e){let t=o.get(e.clientRequestId);if(t)return t;let n=c(`user`,e.content,e.clientRequestId),r=await f(e.content),i={inProgress:!1,userMessage:n,assistantMessage:c(`assistant`,r.content,void 0,r.refs)};return o.set(e.clientRequestId,i),i},async uploadAttachment(e){throw Error(`The assistant cannot take attachments (${e.name}).`)},abort(){s?.abort()}}}function Ii(e,t){return/^qwen3/i.test(t)?{message:(t,n)=>e.message(`${t} /no_think`,n)}:e}var Li=class{#e=A(`idle`);get status(){return h(this.#e)}set status(e){S(this.#e,e,!0)}#t=A(w({modelId:``,consented:[]}));get prefs(){return h(this.#t)}set prefs(e){S(this.#t,e,!0)}#n=A(w({progress:0,text:``}));get progress(){return h(this.#n)}set progress(e){S(this.#n,e,!0)}#r=A(``);get error(){return h(this.#r)}set error(e){S(this.#r,e,!0)}#i=A(`browser`);get mode(){return h(this.#i)}set mode(e){S(this.#i,e,!0)}#a=A(``);get remoteLabel(){return h(this.#a)}set remoteLabel(e){S(this.#a,e,!0)}transport;offers=new qr(be);themeUndos;loaded=null;chat=null;abort=null;loadGeneration=0;options;constructor(e){this.options=e,this.prefs=Xr(e.storage),this.status=(e.webgpu??Lr)()?`idle`:`unsupported`,this.themeUndos=e.theme?new $r(e.theme,e.controller):null,this.transport=Fi({model:()=>this.chat,store:e.store,recipes:e.recipes,cookbooks:ye,offers:this.offers,settings:e.settings,theme:e.theme,controller:e.controller,themeUndos:this.themeUndos??void 0,acceptCommands:()=>this.mode===`host`,unavailable:()=>this.mode===`byo`?`Connect your model on the AI page first, then I can help. The cards on the Planner page work without one.`:this.mode===`host`?`The assistant is not available right now. The cards on the Planner page work without it.`:this.mode===`manual`?`Inference is off. The cards on the Planner page work without it.`:`Download a model first, then I can help. The cards on the Planner page work without one.`,onReply:t=>e.onReply?.(t)})}setMode(e){e!==this.mode&&this.unload(),this.mode=e,this.status=e===`browser`?(this.options.webgpu??Lr)()?`idle`:`unsupported`:`idle`}useRemote(e,t){this.mode!==`browser`&&(this.chat=e,this.remoteLabel=e?t:``,this.status=e?`ready`:`idle`)}get consented(){return this.prefs.consented.includes(this.prefs.modelId)}select(e){fr(e)&&this.status!==`loading`&&(this.prefs={...this.prefs,modelId:e},Zr(this.options.storage,this.prefs))}async start(){if(this.status===`loading`||this.status===`unsupported`)return;let e=this.prefs.modelId;if(!fr(e))return;this.status=`loading`,this.error=``,this.progress={progress:0,text:`Starting`};let t=new AbortController,n=++this.loadGeneration;this.abort=t;try{let r=await Gr(e,e=>{this.progress=e},t.signal,this.options.host??Wr);if(n!==this.loadGeneration||this.mode!==`browser`){r.dispose();return}this.loaded=r,this.prefs={...this.prefs,consented:[...new Set([...this.prefs.consented,e])]},Zr(this.options.storage,this.prefs),this.chat=Ii(new zr({type:`webllm`,engine:r.engine,model:e}),e),this.status=`ready`}catch(e){if(n!==this.loadGeneration)return;t.signal.aborted?this.status=`idle`:(this.error=e instanceof Error?e.message:String(e),this.status=`error`)}finally{n===this.loadGeneration&&(this.abort=null)}}cancel(){this.abort?.abort()}unload(){this.loadGeneration+=1;let e=this.abort;this.abort=null,e?.abort(),this.transport.abort(),this.loaded?.dispose(),this.loaded=null,this.chat=null,this.status!==`unsupported`&&(this.status=`idle`)}},Ri=[{id:`moonshine-base`,label:`Moonshine base`,note:`Accurate and still quick, best for talking as you go (default)`,adapter:`moonshine`,bytes:pe[`moonshine-base`]?.bytes??0},{id:`moonshine-tiny`,label:`Moonshine tiny`,note:`Fastest, less accurate`,adapter:`moonshine`,bytes:pe[`moonshine-tiny`]?.bytes??0},{id:`whisper-tiny.en`,label:`Whisper tiny`,note:`English, the original choice`,adapter:`whisper-local`,bytes:pe[`whisper-tiny.en`]?.bytes??0}],zi=`moonshine-base`;function Bi(e){return Ri.find(t=>t.id===e)??Ri[0]}var Vi=`smrt-planner:voice:v1`;function Hi(e){try{let t=e?.getItem(Vi);if(t){let e=JSON.parse(t),n=e.local===!0,r=Ri.find(t=>t.id===e.model)?.id;return{local:n,preferLocal:e.preferLocal===!0,model:r??(n?`whisper-tiny.en`:`moonshine-base`)}}}catch{}return{local:!1,preferLocal:!1,model:zi}}function Ui(e,t){try{e?.setItem(Vi,JSON.stringify(t))}catch{}}function Wi(e){return Hi(e).local}function Gi(e,t){Ui(e,{...Hi(e),local:t})}function Ki(e){return Hi(e).preferLocal}function qi(e){return Hi(e).model}function Ji(e,t,n){return e===`works`?`browser`:t&&n?`enable-cached`:`offer`}var Yi=class{#e=A(`checking`);get status(){return h(this.#e)}set status(e){S(this.#e,e,!0)}#t=A(!1);get cached(){return h(this.#t)}set cached(e){S(this.#t,e,!0)}#n=A(0);get progress(){return h(this.#n)}set progress(e){S(this.#n,e,!0)}#r=A(``);get error(){return h(this.#r)}set error(e){S(this.#r,e,!0)}#i=A(!1);get browserWorks(){return h(this.#i)}set browserWorks(e){S(this.#i,e,!0)}#a=A(!1);get preferLocal(){return h(this.#a)}set preferLocal(e){S(this.#a,e,!0)}#o=A(0);get size(){return h(this.#o)}set size(e){S(this.#o,e,!0)}#s=A(zi);get model(){return h(this.#s)}set model(e){S(this.#s,e,!0)}#c=A(!1);get preparing(){return h(this.#c)}set preparing(e){S(this.#c,e,!0)}#l=A(null);get dictation(){return h(this.#l)}set dictation(e){S(this.#l,e)}handle=null;abort=null;options;generation=0;constructor(e){this.options=e}async init(){let e=++this.generation;try{await this.probeAndOffer(e)}catch(t){if(e!==this.generation)return;this.status=`error`,this.error=t instanceof Error?t.message:String(t)}}async probeAndOffer(e){let t=await(this.options.probe??xe)();if(e!==this.generation)return;this.browserWorks=t===`works`,this.preferLocal=Ki(this.options.storage),this.model=qi(this.options.storage);let n=this.preferLocal&&t===`works`?`unreliable`:t;if(n===`works`){this.dictation=(this.options.browserSource??(()=>fe({type:`browser-speech`})))(),this.status=`browser`;return}let r=this.options.createModel(this.model);this.handle?.dispose(),this.handle=r,this.size=r.estimateSize();let i=await r.isCached().catch(()=>!1);e===this.generation&&(this.cached=i,Ji(n,Wi(this.options.storage),this.cached)===`enable-cached`?await this.enable():this.status=`offer`)}async enable(){let e=this.handle;if(!e||this.status===`downloading`)return;let t=++this.generation;this.status=`downloading`,this.error=``,this.progress=0,this.preparing=!1;let n=new AbortController;this.abort=n;try{if(await e.load({onProgress:e=>{t===this.generation&&(this.progress=e.bytesTotal>0?e.bytesLoaded/e.bytesTotal:0,this.preparing=e.state===`extracting`)},signal:n.signal}),t!==this.generation)return;Gi(this.options.storage,!0),this.cached=!0;let r=Bi(this.model);this.dictation=(this.options.localSource??((e,t)=>fe({type:t.adapter,modelHandle:e})))(e,r),this.status=`ready`}catch(e){if(t!==this.generation)return;n.signal.aborted?this.status=`offer`:(this.error=e instanceof Error?e.message:String(e),this.status=`error`)}finally{t===this.generation&&(this.abort=null,this.preparing=!1)}}async setPreferLocal(e){this.browserWorks&&e!==this.preferLocal&&await this.restart({preferLocal:e})}async setModel(e){e!==this.model&&Ri.some(t=>t.id===e)&&await this.restart({model:e})}async restart(e){this.generation++,this.abort?.abort(),this.abort=null,this.preparing=!1,this.handle?.dispose(),this.handle=null,this.dictation=null,Ui(this.options.storage,{...Hi(this.options.storage),...e}),this.status=`checking`,await this.init()}cancel(){this.abort?.abort()}dismiss(){this.status=`dismissed`}dispose(){this.generation++,this.abort?.abort(),this.handle?.dispose(),this.handle=null,this.dictation=null}},Xi=[`json_schema`,`json_object`,`none`],Zi=12e4;function Qi(e){try{let t=new URL(e.trim());if(t.protocol!==`http:`&&t.protocol!==`https:`||t.username||t.password)return null;for(let e of t.searchParams.keys())if(/^(?:api[-_]?key|key|token|authorization|secret|password)$/i.test(e))return null;return`${t.origin}${t.pathname.replace(/\/+$/,``)}`}catch{return null}}function $i(e){let t=e.toLowerCase().replace(/^\[|\]$/g,``);return t===`localhost`||t.endsWith(`.localhost`)||t===`::1`||/^127(\.\d{1,3}){3}$/.test(t)}function ea(e){try{let t=new URL(e.trim());return t.protocol===`https:`||t.protocol===`http:`&&$i(t.hostname)}catch{return!1}}function ta(e){try{return new URL(e.trim()).origin}catch{return null}}var na=class extends Error{status;constructor(e,t){super(e),this.status=t,this.name=`EndpointError`}};function ra(e){return e===401||e===403?`the endpoint refused the key (${e})`:e===404?`the endpoint or model was not found (404), check the address and model name`:e===429?`the endpoint is rate limiting you (429)`:`the endpoint answered ${e}`}function ia(e){let t=(e?.choices?.[0])?.message?.content;if(typeof t==`string`)return t;if(Array.isArray(t))return t.map(e=>e&&typeof e==`object`&&`text`in e?String(e.text):``).join(``);throw new na(`the endpoint sent no reply text`)}function aa(e,t){if(e!==`none`)return e===`json_schema`&&t&&typeof t==`object`?{type:`json_schema`,json_schema:{name:`planner_turn`,strict:!1,schema:t}}:{type:`json_object`}}function oa(e){let t=Qi(e.baseUrl);if(!t)throw new na(`the address is not a valid http(s) URL`);if(e.apiKey&&!ea(t))throw new na(`a key is only sent over https, or to this computer; use an https address`);let n=`${t}/chat/completions`,r=e.fetch??fetch,i=Math.max(0,Xi.indexOf(e.jsonMode??`json_schema`));async function a(t,i){let a=AbortSignal.timeout(Zi);try{return await r(n,{method:`POST`,headers:{"content-type":`application/json`,...e.apiKey?{authorization:`Bearer ${e.apiKey}`}:{}},body:JSON.stringify(t),credentials:`omit`,signal:i?AbortSignal.any([i,a]):a})}catch(e){throw i?.aborted?e:new na(`could not reach the endpoint. Is it running, and does it allow this page (CORS)?`)}}async function o(t,n={}){let r=n.json!==!1;for(;;){let o=r?Xi[i]??`none`:`none`,s=aa(o,n.schema),c=await a({model:e.model,messages:t,stream:!1,temperature:n.temperature??0,...n.maxTokens?{max_tokens:n.maxTokens}:{},...s?{response_format:s}:{}},n.signal);if(c.ok)return r&&e.onJsonMode?.(o),ia(await c.json().catch(()=>null));if(r&&(c.status===400||c.status===422)&&i<Xi.length-1){i+=1;continue}throw new na(ra(c.status),c.status)}}return{complete:o,message(e,t){return o([...(t?.history??[]).map(({role:e,content:t})=>({role:e,content:t})),{role:`user`,content:e}],{maxTokens:t?.maxTokens,signal:t?.signal,temperature:t?.temperature,schema:t?.responseSchema})}}}async function sa(e){try{return{ok:!0,message:(await oa({...e,jsonMode:`none`}).complete([{role:`user`,content:`Reply with the single word OK.`}],{maxTokens:8,json:!1})).trim()?`Connected to ${e.model}.`:`Connected to ${e.model}, but it sent an empty reply.`}}catch(e){return{ok:!1,message:e instanceof na?`Could not connect: ${e.message}.`:`Could not connect.`}}}var ca=[{id:`ollama`,label:`Ollama (on this computer)`,baseUrl:`http://localhost:11434/v1`,model:`llama3.2`,keyless:!0,cors:`Ollama only answers pages it trusts. Start it with OLLAMA_ORIGINS set to this site, for example OLLAMA_ORIGINS=https://your-site.example ollama serve (on macOS: launchctl setenv OLLAMA_ORIGINS https://your-site.example, then restart Ollama). A page served from http://localhost needs no change.`},{id:`openrouter`,label:`OpenRouter`,baseUrl:`https://openrouter.ai/api/v1`,model:`openai/gpt-4o-mini`,cors:`OpenRouter accepts calls from any web page, so no setup is needed. Use a key with a spending limit.`},{id:`openai`,label:`OpenAI`,baseUrl:`https://api.openai.com/v1`,model:`gpt-4o-mini`,cors:`OpenAI accepts calls from web pages when the request carries a key. Use a restricted key with a low spending limit: anyone with access to this browser profile can read it.`},{id:`custom`,label:`Custom OpenAI-compatible endpoint`,baseUrl:``,customUrl:!0,cors:`The server must answer the browser's CORS preflight: allow this site's origin, the "authorization" and "content-type" headers, and the POST and OPTIONS methods.`}];function la(e){if(!e?.length)return[...ca];let t=[];for(let n of e){let e=typeof n==`string`?ca.find(e=>e.id===n):n;e&&!t.some(t=>t.id===e.id)&&t.push(e)}return t.length?t:[...ca]}var ua=`smrt-planner:inference:v1`,da=`smrt-planner:inference-key:v1`,fa=e=>!!e&&typeof e==`object`&&!Array.isArray(e);function pa(e){let t={preset:``,active:!1,entries:{}};try{let n=e?.getItem(ua);if(!n)return t;let r=JSON.parse(n);if(!fa(r))return t;typeof r.preset==`string`&&(t.preset=r.preset),t.active=r.active===!0;let i=!1;if(fa(r.entries)){for(let[e,n]of Object.entries(r.entries))if(fa(n)&&typeof n.baseUrl==`string`&&typeof n.model==`string`){let r=Qi(n.baseUrl)??``;i||=r!==n.baseUrl,t.entries[e]={baseUrl:r,model:n.model}}}i&&(t.active=!1,e?.setItem(ua,JSON.stringify(t)))}catch{}return t}function ma(e){let t={};try{let n=e?.getItem(da),r=n?JSON.parse(n):null;if(fa(r))for(let[e,n]of Object.entries(r))fa(n)&&typeof n.key==`string`&&n.key&&typeof n.origin==`string`&&n.origin&&(t[e]={origin:n.origin,key:n.key})}catch{}return t}var ha=class{presets;#e=A(``);get presetId(){return h(this.#e)}set presetId(e){S(this.#e,e,!0)}#t=A(w({}));get entries(){return h(this.#t)}set entries(e){S(this.#t,e,!0)}#n=A(w({}));get keys(){return h(this.#n)}set keys(e){S(this.#n,e,!0)}#r=A(!1);get active(){return h(this.#r)}set active(e){S(this.#r,e,!0)}#i=A(`idle`);get testStatus(){return h(this.#i)}set testStatus(e){S(this.#i,e,!0)}#a=A(``);get testMessage(){return h(this.#a)}set testMessage(e){S(this.#a,e,!0)}options;credentialStorage;constructor(e){if(this.options=e,this.credentialStorage=e.credentialPersistence===`memory`?null:e.storage,e.credentialPersistence===`memory`)try{e.storage?.removeItem(da)}catch{}this.presets=la(e.presets);let t=pa(e.storage);this.keys=ma(this.credentialStorage),this.entries=t.entries,this.presetId=this.presets.some(e=>e.id===t.preset)?t.preset:this.presets[0]?.id??``,this.active=t.active&&this.complete}get preset(){return this.presets.find(e=>e.id===this.presetId)}get baseUrl(){return this.entries[this.presetId]?.baseUrl??this.preset?.baseUrl??``}get model(){return this.entries[this.presetId]?.model??this.preset?.model??``}get key(){let e=this.keys[this.presetId];return e&&e.origin===ta(this.baseUrl)?e.key:``}get keyForOtherAddress(){let e=this.keys[this.presetId];return!!e&&e.origin!==ta(this.baseUrl)}get complete(){let e=Qi(this.baseUrl);return!!e&&!!this.model.trim()&&(!!this.preset?.keyless||!!this.key.trim()&&ea(e))}select(e){this.presets.some(t=>t.id===e)&&(this.presetId=e,this.resetTest(),this.save())}setBaseUrl(e){this.entries={...this.entries,[this.presetId]:{baseUrl:e,model:this.model}},this.edited()}setModel(e){this.entries={...this.entries,[this.presetId]:{baseUrl:this.baseUrl,model:e}},this.edited()}setKey(e){let t=ta(this.baseUrl),n=e.trim();if(!n||!t){this.forgetKey();return}this.keys={...this.keys,[this.presetId]:{origin:t,key:n}},this.edited()}forgetKey(){let{[this.presetId]:e,...t}=this.keys;this.keys=t,this.edited()}chat(){if(!this.complete)return null;let e=Qi(this.baseUrl);return e?oa({baseUrl:e,model:this.model.trim(),apiKey:this.preset?.keyless?void 0:this.key,fetch:this.options.fetch}):null}async test(){let e=Qi(this.baseUrl);if(!e||!this.model.trim())return this.testStatus=`failed`,this.testMessage=`Enter an http(s) address and a model first.`,{ok:!1,message:this.testMessage};if(!this.preset?.keyless&&!this.key.trim())return this.testStatus=`failed`,this.testMessage=this.keyForOtherAddress?`The saved key was entered for another address. Enter it again for this one.`:`Enter a key first.`,{ok:!1,message:this.testMessage};if(!this.preset?.keyless&&!ea(e))return this.testStatus=`failed`,this.testMessage=`A key is only sent over https, or to this computer. Use an https address.`,{ok:!1,message:this.testMessage};this.testStatus=`testing`,this.testMessage=``;let t=await sa({baseUrl:e,model:this.model.trim(),apiKey:this.preset?.keyless?void 0:this.key,fetch:this.options.fetch});return this.testStatus=t.ok?`ok`:`failed`,this.testMessage=t.message,t}use(){return this.complete?(this.active=!0,this.save(),this.options.onChange?.(),!0):!1}stop(){this.active=!1,this.save(),this.options.onChange?.()}resetTest(){this.testStatus=`idle`,this.testMessage=``}edited(){this.resetTest();let e=this.active;e&&!this.complete&&(this.active=!1),this.save(),e&&this.options.onChange?.()}save(){try{let e=Object.fromEntries(Object.entries(this.entries).map(([e,t])=>[e,{baseUrl:Qi(t.baseUrl)??``,model:t.model}])),t={preset:this.presetId,active:this.active,entries:e};this.options.storage?.setItem(ua,JSON.stringify(t)),this.credentialStorage?.setItem(da,JSON.stringify(this.keys))}catch{}}};function ga(e,t,n,r=`local`){let i=pa(e);if(!i.active)return null;let a=la(t).find(e=>e.id===i.preset),o=i.entries[i.preset],s=Qi(o?.baseUrl??a?.baseUrl??``),c=(o?.model??a?.model??``).trim(),l=ma(r===`memory`?null:e)[i.preset],u=l&&l.origin===ta(s??``)?l.key:``;return!a||!s||!c||!a.keyless&&(!u||!ea(s))?null:oa({baseUrl:s,model:c,apiKey:a.keyless?void 0:u,fetch:n})}function _a(e){return`${(e??``).normalize(`NFD`).replace(/\p{M}/gu,``).toLowerCase().replace(/[^a-z0-9]+/g,`-`).replace(/^-+|-+$/g,``)||`my-app`}.cookbook.json`}function va(e){return`${JSON.stringify(e,null,2)}\n`}function ya(e,t){let n=URL.createObjectURL(new Blob([va(e)],{type:`application/json`})),r=document.createElement(`a`);r.href=n,r.download=_a(t),document.body.append(r),r.click(),r.remove(),URL.revokeObjectURL(n)}var ba=`x-kitchen-token`,xa=e=>!!e&&typeof e==`object`&&!Array.isArray(e);function Sa(e){if(typeof e!=`string`)return!1;let t=e.trim();try{let e=t.startsWith(`/`)&&!t.startsWith(`//`),n=new URL(t,e?`https://planner.invalid`:void 0);return!e&&n.protocol!==`http:`&&n.protocol!==`https:`||n.username||n.password||n.hash?!1:![...n.searchParams.keys()].some(e=>/^(?:api[-_]?key|key|token|authorization|secret|password)$/i.test(e))}catch{return!1}}function Ca(e){if(!xa(e))return;let{endpoint:t}=e;if(Sa(t))return{endpoint:t.trim(),...Object.hasOwn(e,`token`)?{tokenInConfig:!0}:{}}}var wa=e=>Array.isArray(e)?e.filter(e=>typeof e==`string`):[];async function Ta(e,t,n=fetch){let r;try{r=await n(e.endpoint,{method:`POST`,headers:{"content-type":`application/json`,accept:`application/json`,[ba]:e.token},body:va(t)})}catch{return{ok:!1,errors:["The kitchen could not be reached. Is `smrt kitchen` still running?"]}}let i;try{i=await r.json()}catch{i=void 0}if(r.ok&&xa(i)&&i.ok===!0)return{ok:!0,result:{dir:typeof i.dir==`string`?i.dir:``,mode:i.mode===`update`?`update`:`new`,installed:i.installed===!0,added:wa(i.added),nextSteps:wa(i.nextSteps)}};let a=xa(i)?wa(i.errors):[];return xa(i)&&typeof i.error==`string`&&a.push(i.error),{ok:!1,errors:a.length?a:[`The kitchen answered ${r.status}.`]}}var Ea=[`manual`,`browser`,`host`,`byo`],Da={mode:`browser`},Oa={mode:`manual`},ka=`planner.config.json`,Aa=e=>!!e&&typeof e==`object`&&!Array.isArray(e);function ja(e){if(typeof e!=`string`)return!1;let t=e.trim();if(!t)return!1;try{let e=t.startsWith(`/`)&&!t.startsWith(`//`),n=new URL(t,e?`https://planner.invalid`:void 0);if(!e&&n.protocol!==`http:`&&n.protocol!==`https:`||n.username||n.password||n.hash)return!1;for(let e of n.searchParams.keys())if(/^(?:api[-_]?key|key|token|authorization|secret|password)$/i.test(e))return!1;return!0}catch{return!1}}function Ma(e){if(!Aa(e))return null;let{id:t,label:n,baseUrl:r,model:i,keyless:a,cors:o}=e;return typeof t!=`string`||!/^[a-z0-9][a-z0-9-]{0,31}$/.test(t)||typeof n!=`string`||!n.trim()||!ja(r)||r.startsWith(`/`)?null:{id:t,label:n.trim(),baseUrl:r.trim(),...typeof i==`string`&&i.trim()?{model:i.trim()}:{},...a===!0?{keyless:!0}:{},...typeof o==`string`&&o.trim()?{cors:o.trim()}:{}}}var Na=e=>({config:Oa,notice:`The assistant settings could not be used (${e}), so inference is off. The planner still works manually.`});function Pa(e,t){if(e===void 0)return[];if(!Array.isArray(e)||e.length===0)return null;let n=[];for(let r of e){if(typeof r!=`string`||!Ea.includes(r)||r===t||n.includes(r))return null;n.push(r)}return n}function Fa(e){if(e===void 0)return{};if(!Aa(e))return null;if(e.presets===void 0)return{};if(!Array.isArray(e.presets)||e.presets.length===0)return null;let t=[];for(let n of e.presets){if(typeof n==`string`&&n.trim()){t.push(n.trim());continue}let e=Ma(n);if(!e)return null;t.push(e)}return{presets:t}}function Ia(e){if(!Aa(e))return Na(`not an object`);let t=e.inference;if(t===void 0)return{config:Da};if(!Aa(t))return Na(`"inference" is not an object`);let n=t.mode;if(n===void 0)return{config:Da};if(!Ea.includes(n))return Na(`unknown mode "${String(n)}"`);let r=n,i=Pa(t.alternatives,r);if(!i)return Na(`alternatives must be unique supported modes other than mode`);let a=t.credentialPersistence;if(a!==void 0&&a!==`local`&&a!==`memory`)return Na(`credentialPersistence must be "local" or "memory"`);let o=[r,...i],s;if(o.includes(`host`)){let e=t.host;if(!Aa(e)||!ja(e.endpoint))return Na(`host mode needs host.endpoint, an http(s) URL or path`);s={endpoint:e.endpoint.trim()}}let c;return o.includes(`byo`)&&(c=Fa(t.byo)??void 0,!c)?Na(`byo.presets must be a non-empty valid list`):{config:{mode:r,...i.length?{alternatives:i}:{},...a?{credentialPersistence:a}:{},...s?{host:s}:{},...c?{byo:c}:{}}}}function La(e){try{let t=JSON.parse(e),n=Ia(t),r=Aa(t)?Ca(t.kitchen):void 0;return r?{...n,kitchen:r}:n}catch{return Na(`it is not valid JSON`)}}function Ra(e){return Ia({inference:e})}async function za(e=``,t=fetch){let n;try{n=await t(`${e.replace(/\/$/,``)}/${ka}`,{headers:{accept:`application/json`},cache:`no-cache`})}catch{return{config:Da}}if(n.status===404)return{config:Da};if(!n.ok)return Na(`the file answered ${n.status}`);let r=await n.text();return/^\s*</.test(r)?{config:Da}:La(r)}var Ba=1e3,Va=2e3,Ha=6e4,Ua=(e,t)=>e.length>t?e.slice(0,t):e;function Wa(e){let t=e.fetch??fetch;return{async message(n,r){let i=(r?.history??[]).filter(e=>e.role===`user`||e.role===`assistant`).slice(-6).map(e=>({role:e.role,content:Ua(e.content,Ba)})),a={version:1,message:Ua(n,Va),snapshot:e.snapshot(),...i.length?{history:i}:{}},o=AbortSignal.timeout(Ha),s=r?.signal?AbortSignal.any([r.signal,o]):o,c=await t(e.endpoint,{method:`POST`,headers:{"content-type":`application/json`,accept:`application/json`,...e.headers?.()},body:JSON.stringify(a),signal:s});if(!c.ok)throw Error(`the server answered ${c.status}`);return await c.text()}}}function Ga(e){return[Ka(e.think),Ja(e.hear),Ya(e.speak)]}function Ka(e){let t={id:`think`,name:`Think`};if(e.mode===`manual`)return{...t,state:`off`,label:`Think: inference off`,where:`Off`};if(e.mode===`host`)return{...t,state:e.status===`ready`?`ready`:`available`,label:`Think: Server`,where:`Server`};if(e.mode===`byo`){let n=e.remote?`Your model: ${e.remote}`:``;return e.status===`ready`&&e.remote?{...t,state:`ready`,label:`Think: ${n}`,where:n}:{...t,state:`available`,label:`Think: your own model not connected`,where:`Your model`}}return{...qa(e),where:`In browser`}}function qa(e){let t={id:`think`,name:`Think`};return e.status===`unsupported`?{...t,state:`off`,label:`Think: unavailable, this browser has no WebGPU`}:e.status===`ready`?{...t,state:`ready`,label:`Think: ${e.model} ready`}:e.status===`loading`?{...t,state:`available`,label:`Think: ${e.model} loading, ${Math.round(e.progress*100)}%`}:{...t,state:`available`,label:e.downloaded?`Think: ${e.model} downloaded, not loaded`:`Think: not set up`}}function Ja(e){let t={id:`hear`,name:`Hear`};return e.mic?e.status===`browser`?{...t,state:`ready`,label:`Hear: voice typing ready, using your browser`}:e.status===`ready`?{...t,state:`ready`,label:`Hear: voice typing ready, using the downloaded model`}:e.status===`downloading`?{...t,state:`available`,label:`Hear: downloading the speech model`}:{...t,state:`available`,label:`Hear: not set up`}:{...t,state:`off`,label:`Hear: unavailable, this browser has no microphone access`}}function Ya(e){let t={id:`speak`,name:`Speak`};return e.supported?e.readAloud?{...t,state:`ready`,label:`Speak: reading replies aloud with browser voices`}:{...t,state:`available`,label:`Speak: not switched on`}:{...t,state:`off`,label:`Speak: unavailable, this browser has no speech synthesis`}}function Xa(e){return e.dismissed||e.built?!1:!(e.thinkDownloaded||e.hearDownloaded||e.readAloud)}var Za=`smrt-planner:ai:v1`;function Qa(e){let t={dismissed:!1,readAloud:!1,handsFree:!1,sendOnPause:!1};try{let n=e?.getItem(Za);if(!n)return t;let r=JSON.parse(n);t.dismissed=r.dismissed===!0,t.readAloud=r.readAloud===!0,t.handsFree=r.handsFree===!0,t.sendOnPause=r.sendOnPause===!0}catch{}return t}function $a(e,t){try{e?.setItem(Za,JSON.stringify(t))}catch{}}var $=new class{session;voice;#e=A(w({dismissed:!1,readAloud:!1,handsFree:!1,sendOnPause:!1}));get prefs(){return h(this.#e)}set prefs(e){S(this.#e,e,!0)}#t=A(!1);get hydrated(){return h(this.#t)}set hydrated(e){S(this.#t,e,!0)}#n=A(!1);get firstRun(){return h(this.#n)}set firstRun(e){S(this.#n,e,!0)}#r=A(!1);get speaking(){return h(this.#r)}set speaking(e){S(this.#r,e,!0)}#i=A(w(Da));get inference(){return h(this.#i)}set inference(e){S(this.#i,e,!0)}#a=A(w([`browser`]));get availableModes(){return h(this.#a)}set availableModes(e){S(this.#a,e,!0)}#o=A(``);get notice(){return h(this.#o)}set notice(e){S(this.#o,e,!0)}#s=A(null);get byo(){return h(this.#s)}set byo(e){S(this.#s,e,!0)}pending=0;generation=0;options;pendingConfig=!1;builtAtHydrate=!1;synth;mic;constructor(e){this.options=e,this.session=new Li({...e.session,storage:e.storage,onReply:e=>this.speak(e)}),this.voice=new Yi({...e.voice,storage:e.storage}),this.synth=e.synth===void 0?typeof speechSynthesis<`u`?speechSynthesis:null:e.synth,this.mic=e.mic??(typeof navigator<`u`&&!!navigator.mediaDevices)}hydrate(e){this.hydrated||(this.prefs=Qa(this.options.storage),this.hydrated=!0,this.builtAtHydrate=e,this.pendingConfig||this.decideFirstRun(),this.voice.init())}awaitConfig(){this.pendingConfig=!0}configure(e){let{config:t,notice:n}=e;this.pendingConfig=!1,this.inference=t,this.notice=n??``;let r=[t.mode,...t.alternatives??[]];this.availableModes=[...r,...t.alternatives?.length&&!r.includes(`manual`)?[`manual`]:[]],this.byo=r.includes(`byo`)?new ha({storage:this.options.storage,credentialPersistence:t.credentialPersistence,presets:t.byo?.presets,fetch:this.options.fetch,onChange:()=>this.syncByo()}):null,this.applyMode(t.mode),this.hydrated&&this.decideFirstRun()}selectInference(e){this.availableModes.includes(e)&&e!==this.inference.mode&&(this.inference={...this.inference,mode:e},this.notice=``,this.applyMode(e))}applyMode(e){if(this.session.setMode(e),e===`host`&&this.inference.host){let{controller:e,store:t,settings:n,theme:r}=this.options.session,i=e??ir({store:t,settings:n,theme:r});this.session.useRemote(Wa({endpoint:this.inference.host.endpoint,snapshot:()=>i.snapshot(),fetch:this.options.fetch}),`Server`)}else e===`byo`?this.syncByo():e===`manual`&&this.session.useRemote(null,``)}syncByo(){let e=this.byo;e&&this.session.useRemote(e.active?e.chat():null,e.model)}decideFirstRun(){this.firstRun=this.inference.mode!==`host`&&this.inference.mode!==`manual`&&Xa({thinkDownloaded:this.session.prefs.consented.length>0||this.session.status===`ready`,hearDownloaded:Wi(this.options.storage),readAloud:this.prefs.readAloud,dismissed:this.prefs.dismissed,built:this.builtAtHydrate})}get capabilities(){let e=fr(this.session.prefs.modelId),t=this.hydrated;return Ga({think:{status:t?this.session.status:`idle`,model:e?mr(e):`model`,progress:this.session.progress.progress,downloaded:t&&this.session.prefs.consented.length>0,mode:this.session.mode,remote:this.session.remoteLabel},hear:{status:t?this.voice.status:`checking`,mic:!t||this.mic},speak:{supported:!t||this.synth!==null,readAloud:t&&this.prefs.readAloud}})}get privacyNote(){return this.inference.mode===`manual`?`Inference is off. Planning, validation and export still work without a model.`:this.inference.mode===`host`?`Your messages and a short summary of your plan go to this site's server. Voice typing and reading aloud stay on this device.`:this.inference.mode===`byo`?`Your messages and a short summary of your plan go to the model endpoint you choose, and nowhere else. Voice typing and reading aloud stay on this device.`:`Everything runs on this device. Nothing you type or say leaves the page.`}get speakSupported(){return this.synth!==null}continueFirstRun(){this.firstRun=!1}dismissFirstRun(){this.firstRun=!1,this.setPrefs({...this.prefs,dismissed:!0})}setReadAloud(e){(!e||this.synth)&&(e||this.cancelSpeech(),this.setPrefs({...this.prefs,readAloud:e}))}setHandsFree(e){this.setPrefs({...this.prefs,handsFree:e})}setSendOnPause(e){this.setPrefs({...this.prefs,sendOnPause:e})}get sendOnPauseActive(){return this.handsFreeActive&&this.prefs.sendOnPause}get handsFreeActive(){return this.prefs.handsFree&&this.voice.status===`ready`}speak(e){if(!this.prefs.readAloud||!this.synth||!e.trim())return;this.cancelSpeech();let t=e.split(/\n{2,}/).map(e=>e.trim()).filter(Boolean),n=this.generation;this.pending=t.length,this.speaking=!0;let r=()=>{n===this.generation&&(this.pending=Math.max(0,this.pending-1),this.pending===0&&(this.speaking=!1))};for(let e of t){let t=new SpeechSynthesisUtterance(e);t.onend=r,t.onerror=r,this.synth.speak(t)}}cancelSpeech(){this.generation+=1,this.pending=0,this.speaking=!1,this.synth?.cancel()}setPrefs(e){this.prefs=e,$a(this.options.storage,e)}}({storage:re(),session:{store:ce,recipes:oe,controller:lr,settings:{read:()=>F.settings(),write:e=>F.setSettings(e)},theme:{read:()=>F.snapshot().theme,write:e=>F.setTheme(e)}},voice:{createModel:rt}}),eo=`M11 4.2C10.4 3 8.6 2.8 7.6 3.8C6.2 3.6 5 4.8 5.2 6.1C3.8 6.6 3.3 8.2 4.1 9.3C3 10.2 3 11.9 4 12.8C3.6 14.2 4.4 15.6 5.8 15.9C6.2 17.3 7.6 18.2 9 17.9C9.7 19.2 11 19.6 11 19.6ZM13 4.2 C13.6 3 15.4 2.8 16.4 3.8 C17.8 3.6 19 4.8 18.8 6.1 C20.2 6.6 20.7 8.2 19.9 9.3 C21 10.2 21 11.9 20 12.8 C20.4 14.2 19.6 15.6 18.2 15.9 C17.8 17.3 16.4 18.2 15 17.9 C14.3 19.2 13 19.6 13 19.6 ZM10.2 7.4C8.6 7.8 7.5 7 7 6.2L7.7 5.8C8.2 6.5 9 6.8 10 6.5ZM10.3 11C8.4 11.6 6.6 10.8 5.9 9.6L6.6 9.2C7.2 10.2 8.6 10.7 10.1 10.2ZM10.2 15C8.5 15.6 6.8 15 6 13.9L6.7 13.5C7.4 14.3 8.6 14.6 10 14.2ZM13.8 7.4 C15.4 7.8 16.5 7 17 6.2 L16.3 5.8 C15.8 6.5 15 6.8 14 6.5 ZM13.7 11 C15.6 11.6 17.4 10.8 18.1 9.6 L17.4 9.2 C16.8 10.2 15.4 10.7 13.9 10.2 ZM13.8 15 C15.5 15.6 17.2 15 18 13.9 L17.3 13.5 C16.6 14.3 15.4 14.6 14 14.2 Z`,to=`M17 20c-.29 0-.56-.06-.76-.15-.71-.37-1.21-.88-1.71-2.38-.51-1.56-1.47-2.29-2.39-3-.79-.61-1.61-1.24-2.32-2.53C9.29 10.98 9 9.93 9 9c0-2.8 2.2-5 5-5s5 2.2 5 5h2c0-3.93-3.07-7-7-7S7 5.07 7 9c0 1.26.38 2.65 1.07 3.9.91 1.65 1.98 2.48 2.85 3.15.81.62 1.39 1.07 1.71 2.05.6 1.82 1.37 2.84 2.73 3.55.51.23 1.07.35 1.64.35 2.21 0 4-1.79 4-4h-2c0 1.1-.9 2-2 2zM7.64 2.64L6.22 1.22C4.23 3.21 3 5.96 3 9s1.23 5.79 3.22 7.78l1.41-1.41C6.01 13.74 5 11.49 5 9s1.01-4.74 2.64-6.36zM11.5 9c0 1.38 1.12 2.5 2.5 2.5s2.5-1.12 2.5-2.5-1.12-2.5-2.5-2.5-2.5 1.12-2.5 2.5z`,no=`M3 9v6h4l5 5V4L7 9H3zm13.5 3c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02zM14 3.23v2.06c2.89.86 5 3.54 5 6.71s-2.11 5.85-5 6.71v2.06c4.01-.91 7-4.49 7-8.77s-2.99-7.86-7-8.77z`,ro=p(`<p class="notice svelte-19u3zp7" role="status"> </p>`),io=p(`<option> </option>`),ao=p(`<label class="svelte-19u3zp7">Assistant mode <!></label> <p class="meta svelte-19u3zp7">Changing modes happens only when you choose it here.</p>`,1),oo=p(`<p class="status svelte-19u3zp7">Inference off</p> <p class="meta svelte-19u3zp7">Build, edit, validate and export your cookbook without a model. No
|
|
25
|
+
provider is contacted and no browser model is downloaded.</p>`,1),so=p(`<p class="status svelte-19u3zp7">Server</p> <p class="meta svelte-19u3zp7">This site's server answers the assistant. What you type, and a short
|
|
26
|
+
summary of your plan, is sent to it. Nothing is downloaded.</p>`,1),co=p(`<p class="meta svelte-19u3zp7">A key is saved for another address, so it is not used here. Paste it again for this address.</p>`),lo=p(`<div class="field svelte-19u3zp7"><!> <!></div> <!> <p class="meta svelte-19u3zp7"> <button class="link svelte-19u3zp7" type="button">Forget the key</button></p>`,1),uo=p(`<p class="meta svelte-19u3zp7"><strong>Browser access.</strong> </p>`),fo=p(`<p> </p>`),po=p(`<p class="status svelte-19u3zp7" role="status"> </p>`),mo=p(`<label class="svelte-19u3zp7">Model provider <!></label> <div class="field svelte-19u3zp7"><!> <!></div> <div class="field svelte-19u3zp7"><!> <!></div> <!> <!> <p class="meta svelte-19u3zp7">What you type, and a short summary of your plan, is sent to this
|
|
27
|
+
endpoint.</p> <!> <!> <div class="actions svelte-19u3zp7"><!> <!></div>`,1),ho=p(`<p role="status" class="svelte-19u3zp7">This browser has no WebGPU, which the model needs. Try a recent
|
|
28
|
+
Chrome, Edge or Safari on a computer. The Planner works without it.</p>`),go=p(`<p class="meta svelte-19u3zp7"> </p>`),_o=p(`<p class="meta svelte-19u3zp7"> <!></p>`),vo=p(`<p class="status svelte-19u3zp7" role="status"> </p> <div class="actions svelte-19u3zp7"><!></div>`,1),yo=p(`<div role="status" aria-live="polite"><progress max="100" aria-label="Model download progress" class="svelte-19u3zp7"> </progress> <p class="meta svelte-19u3zp7"> </p></div> <div class="actions svelte-19u3zp7"><!></div>`,1),bo=p(`<p class="error svelte-19u3zp7" role="alert"> </p>`),xo=p(`<p class="status svelte-19u3zp7"> </p> <!> <div class="actions svelte-19u3zp7"><!></div>`,1),So=p(`<label class="svelte-19u3zp7">Model <!></label> <!> <!> <!>`,1),Co=p(`<section class="card svelte-19u3zp7" aria-labelledby="ai-think"><header class="svelte-19u3zp7"><span class="badge svelte-19u3zp7"><!></span> <div><h2 id="ai-think" class="svelte-19u3zp7">Think</h2> <p class="sub svelte-19u3zp7"> </p></div></header> <!> <!></section>`),wo=p(`<p class="meta svelte-19u3zp7" role="status">Checking this browser.</p>`),To=p(`<p class="status svelte-19u3zp7">Built into your browser.</p>`),Eo=p(`<p class="meta svelte-19u3zp7">Getting ready…</p>`),Do=p(`<progress max="100" aria-label="Speech model download" class="svelte-19u3zp7"> </progress> <p class="meta svelte-19u3zp7"> </p>`,1),Oo=p(`<div role="status" aria-live="polite"><!></div> <div class="actions svelte-19u3zp7"><!></div>`,1),ko=p(`<p class="status svelte-19u3zp7"> </p>`),Ao=p(`<p class="meta svelte-19u3zp7"> </p> <!> <div class="actions svelte-19u3zp7"><!></div>`,1),jo=p(`<label class="svelte-19u3zp7">Speech model <!></label> <p class="meta svelte-19u3zp7"> </p>`,1),Mo=p(`<!> <p class="meta svelte-19u3zp7"> </p> <!> <p class="meta svelte-19u3zp7">Sends your message after a short pause. Needs Hands-free.</p>`,1),No=p(`<section class="card svelte-19u3zp7" aria-labelledby="ai-hear"><header class="svelte-19u3zp7"><span class="badge svelte-19u3zp7"><!></span> <div><h2 id="ai-hear" class="svelte-19u3zp7">Hear</h2> <p class="sub svelte-19u3zp7">Voice typing, speech to text</p></div></header> <!> <!> <!> <!></section>`),Po=p(`<p class="status svelte-19u3zp7">Browser voices</p> <!> <p class="meta svelte-19u3zp7">A better voice you can download is coming.</p>`,1),Fo=p(`<p role="status" class="svelte-19u3zp7">This browser has no speech synthesis.</p>`),Io=p(`<section class="card svelte-19u3zp7" aria-labelledby="ai-speak"><header class="svelte-19u3zp7"><span class="badge svelte-19u3zp7"><!></span> <div><h2 id="ai-speak" class="svelte-19u3zp7">Speak</h2> <p class="sub svelte-19u3zp7">Read replies aloud, text to speech</p></div></header> <!></section>`),Lo=p(`<!> <div class="cards svelte-19u3zp7"><!> <!> <!></div>`,1);function Ro(e,p){i(p,!0);let b=g(p,`show`,19,()=>[`think`,`hear`,`speak`]),C=j(()=>$.session),w=j(()=>$.voice),D=j(()=>$.capabilities),M=e=>h(D).find(t=>t.id===e)?.state??`available`,te=j(()=>$.inference.mode),P=j(()=>$.byo),ne=j(()=>h(D).find(e=>e.id===`think`)?.where??``),F={manual:`Manual planning`,byo:`Your model`,browser:`In-browser model (WebLLM)`,host:`This site's server`},I=j(()=>fr(h(C).prefs.modelId)),re=A(0);T(()=>{_r().then(e=>{S(re,e,!0)})});let L=j(()=>fr(hr)),oe=j(()=>!!h(L)&&h(C).prefs.modelId!==`Qwen3-4B-q4f16_1-MLC`&&h(C).status!==`loading`&&h(C).status!==`ready`&&gr(h(L),h(re))),se=j(()=>Math.round(h(C).progress.progress*100)),ce=j(()=>Math.round(h(w).progress*100)),le=j(()=>Math.round(h(w).size/1e6)),ue=j(()=>Bi(h(w).model)),fe=j(()=>h(w).status===`ready`);var pe=Lo(),me=y(pe),he=e=>{var n=ro(),r=x(n,!0);_(()=>t(r,$.notice)),m(e,n)};d(me,e=>{$.notice&&e(he)});var ge=E(me,2),_e=O(ge),ve=e=>{var i=Co(),f=O(i),p=O(f),g=O(p);de(g,{get path(){return eo},size:22}),u(p);var b=E(p,2),S=E(O(b),2),w=x(S);u(b),u(f);var T=E(f,2),D=e=>{var n=ao(),r=y(n),i=E(O(r));ie(i,{get value(){return h(te)},onchange:e=>$.selectInference(e.currentTarget.value),children:(e,n)=>{var r=o(),i=y(r);a(i,16,()=>$.availableModes,e=>e,(e,n)=>{var r=io(),i=x(r,!0),a={};_(()=>{t(i,F[n]),a!==(a=n)&&(r.value=(r.__value=a)??``)}),m(e,r)}),m(e,r)},$$slots:{default:!0}}),u(r),l(2),m(e,n)};d(T,e=>{$.availableModes.length>1&&e(D)});var A=E(T,2),re=e=>{var t=oo();l(2),m(e,t)},R=e=>{var t=so();l(2),m(e,t)},ce=e=>{let i=j(()=>h(P).preset);var f=mo(),p=y(f),g=E(O(p));ie(g,{get value(){return h(P).presetId},onchange:e=>h(P).select(e.currentTarget.value),children:(e,n)=>{var r=o(),i=y(r);a(i,17,()=>h(P).presets,e=>e.id,(e,n)=>{var r=io(),i=x(r,!0),a={};_(()=>{t(i,h(n).label),a!==(a=h(n).id)&&(r.value=(r.__value=a)??``)}),m(e,r)}),m(e,r)},$$slots:{default:!0}}),u(p);var v=E(p,2),b=O(v);ae(b,{for:`byo-url`,label:`Address`});var S=E(b,2);{let e=j(()=>!h(i)?.customUrl);ee(S,{id:`byo-url`,type:`url`,autocomplete:`off`,spellcheck:!1,placeholder:`https://example.com/v1`,get value(){return h(P).baseUrl},get readonly(){return h(e)},oninput:e=>h(P).setBaseUrl(e.currentTarget.value)})}u(v);var C=E(v,2),w=O(C);ae(w,{for:`byo-model`,label:`Model`});var T=E(w,2);ee(T,{id:`byo-model`,type:`text`,autocomplete:`off`,spellcheck:!1,get value(){return h(P).model},oninput:e=>h(P).setModel(e.currentTarget.value)}),u(C);var D=E(C,2),A=e=>{var n=lo(),r=y(n),i=O(r);ae(i,{for:`byo-key`,label:`Key`});var a=E(i,2);ee(a,{id:`byo-key`,type:`password`,autocomplete:`off`,spellcheck:!1,placeholder:`Paste your key`,get value(){return h(P).key},oninput:e=>h(P).setKey(e.currentTarget.value)}),u(r);var o=E(r,2),c=e=>{var t=co();m(e,t)};d(o,e=>{h(P).keyForOtherAddress&&e(c)});var l=E(o,2),f=O(l),p=E(f);u(l),_(()=>t(f,`${$.inference.credentialPersistence===`memory`?`Kept only in this tab until reload`:`Stored only in this browser`}, and sent only to ${(h(P).baseUrl||`the address above`)??``} (https, or this computer). `)),s(`click`,p,()=>h(P).forgetKey()),m(e,n)};d(D,e=>{h(i)?.keyless||e(A)});var M=E(D,2),te=e=>{var n=uo(),r=E(O(n));u(n),_(()=>t(r,` ${h(i).cors??``}`)),m(e,n)};d(M,e=>{h(i)?.cors&&e(te)});var ne=E(M,4),F=e=>{var i=fo(),a=x(i,!0);_(()=>{r(i,1,n(h(P).testStatus===`failed`?`error`:`status`),`svelte-19u3zp7`),k(i,`role`,h(P).testStatus===`failed`?`alert`:`status`),t(a,h(P).testStatus===`testing`?`Testing…`:h(P).testMessage)}),m(e,i)};d(ne,e=>{(h(P).testStatus===`ok`||h(P).testStatus===`failed`||h(P).testStatus===`testing`)&&e(F)});var I=E(ne,2),re=e=>{var n=po(),r=x(n);_(()=>t(r,`Using ${h(P).model??``}.`)),m(e,n)};d(I,e=>{h(P).active&&e(re)});var L=E(I,2),R=O(L);{let e=j(()=>h(P).testStatus===`testing`);N(R,{variant:`secondary`,get disabled(){return h(e)},onclick:()=>void h(P).test(),children:(e,t)=>{l();var n=c(`Test connection`);m(e,n)},$$slots:{default:!0}})}var oe=E(R,2),se=e=>{N(e,{variant:`secondary`,onclick:()=>h(P).stop(),children:(e,t)=>{l();var n=c(`Stop using`);m(e,n)},$$slots:{default:!0}})},ce=e=>{{let t=j(()=>!h(P).complete);N(e,{get disabled(){return h(t)},onclick:()=>h(P).use(),children:(e,t)=>{l();var n=c(`Use this model`);m(e,n)},$$slots:{default:!0}})}};d(oe,e=>{h(P).active?e(se):e(ce,-1)}),u(L),m(e,f)},le=e=>{var t=ho();m(e,t)},ue=e=>{var n=So(),r=y(n),i=E(O(r));{let e=j(()=>h(C).status===`loading`);ie(i,{get value(){return h(C).prefs.modelId},get disabled(){return h(e)},onchange:e=>h(C).select(e.currentTarget.value),children:(e,n)=>{var r=o(),i=y(r);a(i,17,()=>dr,e=>e.id,(e,n)=>{var r=io(),i=x(r,!0),a={};_(()=>{t(i,h(n).label),a!==(a=h(n).id)&&(r.value=(r.__value=a)??``)}),m(e,r)}),m(e,r)},$$slots:{default:!0}})}u(r);var s=E(r,2),f=e=>{var n=go(),r=x(n);_((e,n)=>t(r,`${e??``} to download once; needs
|
|
29
|
+
${n??``} of graphics memory. Use Wi-Fi on a
|
|
30
|
+
metered connection.`),[()=>pr(h(I).downloadMB),()=>pr(h(I).vramMB)]),m(e,n)};d(s,e=>{h(I)&&e(f)});var p=E(s,2),g=e=>{var n=_o(),r=O(n),i=E(r);N(i,{variant:`secondary`,onclick:()=>h(C).select(hr),children:(e,n)=>{l();var r=c();_(e=>t(r,`Use ${e??``}`),[()=>mr(h(L))]),m(e,r)},$$slots:{default:!0}}),u(n),_(e=>t(r,`Your graphics card has room for ${e??``}, which
|
|
31
|
+
understands more. `),[()=>mr(h(L))]),m(e,n)};d(p,e=>{h(oe)&&h(L)&&e(g)});var b=E(p,2),S=e=>{var n=vo(),r=y(n),i=x(r),a=E(r,2),o=O(a);N(o,{variant:`secondary`,onclick:()=>h(C).unload(),children:(e,t)=>{l();var n=c(`Unload`);m(e,n)},$$slots:{default:!0}}),u(a),_(e=>t(i,`${e??``} is ready.`),[()=>h(I)?mr(h(I)):`The model`]),m(e,n)},w=e=>{var n=yo(),r=y(n),i=O(r),a=x(i),o=E(i,2),s=x(o);u(r);var d=E(r,2),f=O(d);N(f,{variant:`secondary`,onclick:()=>h(C).cancel(),children:(e,t)=>{l();var n=c(`Cancel`);m(e,n)},$$slots:{default:!0}}),u(d),_(()=>{v(i,h(se)),t(a,`${h(se)??``}%`),t(s,`${h(se)??``}%. ${h(C).progress.text??``}`)}),m(e,n)},T=e=>{var n=xo(),r=y(n),i=x(r,!0),a=E(r,2),o=e=>{var n=bo(),r=x(n);_(()=>t(r,`The model could not start: ${h(C).error??``}`)),m(e,n)};d(a,e=>{h(C).status===`error`&&e(o)});var s=E(a,2),f=O(s);N(f,{onclick:()=>void h(C).start(),children:(e,n)=>{l();var r=c();_(()=>t(r,h(C).consented?`Load`:`Download`)),m(e,r)},$$slots:{default:!0}}),u(s),_(()=>t(i,h(C).consented?`Downloaded. Load it to start.`:`Not downloaded.`)),m(e,n)};d(b,e=>{h(C).status===`ready`?e(S):h(C).status===`loading`?e(w,1):e(T,-1)}),m(e,n)};d(A,e=>{h(te)===`manual`?e(re):h(te)===`host`?e(R,1):h(te)===`byo`&&h(P)?e(ce,2):h(C).status===`unsupported`?e(le,3):e(ue,-1)}),u(i),_(e=>{k(i,`data-state`,e),t(w,`The assistant's language model${h(ne)?`: ${h(ne)}`:``}`)},[()=>M(`think`)]),m(e,i)},ye=j(()=>b().includes(`think`));d(_e,e=>{h(ye)&&e(ve)});var be=E(_e,2),xe=e=>{var n=No(),r=O(n),i=O(r),s=O(i);de(s,{get path(){return to},size:22}),u(i),l(2),u(r);var f=E(r,2),p=e=>{var t=wo();m(e,t)},g=e=>{var t=To();m(e,t)},b=e=>{var n=Oo(),r=y(n),i=O(r),a=e=>{var t=Eo();m(e,t)},o=e=>{var n=Do(),r=y(n),i=x(r),a=E(r,2),o=x(a);_(()=>{v(r,h(ce)),t(i,`${h(ce)??``}%`),t(o,`${h(w).cached?`Turning on`:`Downloading`} ${h(ce)??``}%`)}),m(e,n)};d(i,e=>{h(w).preparing?e(a):e(o,-1)}),u(r);var s=E(r,2),f=O(s);N(f,{variant:`secondary`,onclick:()=>h(w).cancel(),children:(e,t)=>{l();var n=c(`Cancel`);m(e,n)},$$slots:{default:!0}}),u(s),m(e,n)},S=e=>{var n=ko(),r=x(n);_(()=>t(r,`${h(ue).label??``}, running on this device.`)),m(e,n)},C=e=>{var n=Ao(),r=y(n),i=x(r),a=E(r,2),o=e=>{var n=bo(),r=x(n);_(()=>t(r,`Voice typing could not start: ${h(w).error??``}`)),m(e,n)};d(a,e=>{h(w).status===`error`&&e(o)});var s=E(a,2),f=O(s);N(f,{onclick:()=>void h(w).enable(),children:(e,n)=>{l();var r=c();_(()=>t(r,h(w).cached?`Turn on`:`Download`)),m(e,r)},$$slots:{default:!0}}),u(s),_(e=>t(i,`${h(w).browserWorks?`You chose the downloadable model.`:`Your browser can't do voice typing on its own.`}
|
|
32
|
+
${e??``}, downloaded once.
|
|
33
|
+
${h(w).cached?`It is already on this device.`:``}`),[()=>pr(h(le))]),m(e,n)};d(f,e=>{h(w).status===`checking`?e(p):h(w).status===`browser`?e(g,1):h(w).status===`downloading`?e(b,2):h(w).status===`ready`?e(S,3):e(C,-1)});var T=E(f,2),D=e=>{var n=jo(),r=y(n),i=E(O(r));{let e=j(()=>h(w).status===`downloading`);ie(i,{get value(){return h(w).model},get disabled(){return h(e)},onchange:e=>void h(w).setModel(e.currentTarget.value),children:(e,n)=>{var r=o(),i=y(r);a(i,17,()=>Ri,e=>e.id,(e,n)=>{var r=io(),i=x(r),a={};_(e=>{t(i,`${h(n).label??``}, ${e??``}`),a!==(a=h(n).id)&&(r.value=(r.__value=a)??``)},[()=>pr(Math.round(h(n).bytes/1e6))]),m(e,r)}),m(e,r)},$$slots:{default:!0}})}u(r);var s=E(r,2),c=x(s);_(()=>t(c,`${h(ue).note??``}.`)),m(e,n)};d(T,e=>{h(w).status!==`browser`&&h(w).status!==`checking`&&e(D)});var A=E(T,2),ee=e=>{R(e,{get checked(){return h(w).preferLocal},label:`Use the downloadable model instead`,onchange:e=>void h(w).setPreferLocal(e.currentTarget.checked)})};d(A,e=>{h(w).browserWorks&&h(w).status!==`downloading`&&e(ee)});var te=E(A,2),P=e=>{var n=Mo(),r=y(n);{let e=j(()=>!h(fe)&&!$.prefs.handsFree);R(r,{get checked(){return $.prefs.handsFree},get disabled(){return h(e)},label:`Hands-free`,onchange:e=>$.setHandsFree(e.currentTarget.checked)})}var i=E(r,2),a=x(i),o=E(i,2);{let e=j(()=>!$.handsFreeActive);R(o,{get checked(){return $.prefs.sendOnPause},get disabled(){return h(e)},label:`Send when I stop talking`,onchange:e=>$.setSendOnPause(e.currentTarget.checked)})}l(2),_(()=>t(a,`Start when I talk, stop when I pause.
|
|
34
|
+
${h(fe)?``:`Needs the downloaded speech model.`}`)),m(e,n)};d(te,e=>{h(w).status!==`checking`&&e(P)}),u(n),_(e=>k(n,`data-state`,e),[()=>M(`hear`)]),m(e,n)},Se=j(()=>b().includes(`hear`));d(be,e=>{h(Se)&&e(xe)});var Ce=E(be,2),we=e=>{var t=Io(),n=O(t),r=O(n),i=O(r);de(i,{get path(){return no},size:22}),u(r),l(2),u(n);var a=E(n,2),o=e=>{var t=Po(),n=E(y(t),2);R(n,{get checked(){return $.prefs.readAloud},label:`Read replies aloud`,onchange:e=>$.setReadAloud(e.currentTarget.checked)}),l(2),m(e,t)},s=e=>{var t=Fo();m(e,t)};d(a,e=>{$.speakSupported?e(o):e(s,-1)}),u(t),_(e=>k(t,`data-state`,e),[()=>M(`speak`)]),m(e,t)},Te=j(()=>b().includes(`speak`));d(Ce,e=>{h(Te)&&e(we)}),u(ge),m(e,pe),f()}D([`click`]);export{Bn as C,Qn as S,xe as T,fr as _,$ as a,cr as b,za as c,ga as d,Fi as f,pr as g,Kr as h,eo as i,Ta as l,Qr as m,to as n,Wa as o,$r as p,no as r,Ra as s,Ro as t,ya as u,mr as v,nt as w,sr as x,lr as y};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{B as e,Et as t,F as n,Mt as r,Nt as i,R as a,Tt as o,U as s,V as c,Z as l,at as u,dt as d,ft as f,pt as p,ut as m,xt as h}from"./Chyo8rdT.js";import"./xihTtKlq.js";import{t as g}from"./CWtfVMDz.js";var _=s(`<li><code class="svelte-kxkftj"><b> </b> </code></li>`),v=s(`<li class="none svelte-kxkftj">None</li>`),y=s(`<li><code class="svelte-kxkftj"> </code></li>`),b=s(`<mark class="svelte-kxkftj">AI</mark>`),x=s(`<li><code class="svelte-kxkftj"> </code> <!></li>`),S=s(`<article class="svelte-kxkftj"><h3 class="svelte-kxkftj"> </h3> <div class="grid svelte-kxkftj"><div><h4 class="svelte-kxkftj">REST routes <span class="svelte-kxkftj"> </span></h4> <ul class="svelte-kxkftj"></ul></div> <div><h4 class="svelte-kxkftj">MCP tools <span class="svelte-kxkftj"> </span></h4> <ul class="svelte-kxkftj"></ul></div> <div><h4 class="svelte-kxkftj">CLI commands <span class="svelte-kxkftj"> </span></h4> <ul class="svelte-kxkftj"></ul></div> <div><h4 class="svelte-kxkftj">Methods <span class="svelte-kxkftj"> </span> AI-callable</h4> <ul class="svelte-kxkftj"></ul></div></div></article>`),C=s(`<p class="svelte-kxkftj">This app exposes no generated REST, MCP or CLI surface.</p>`),w=s(`<p class="lede svelte-kxkftj">For connecting other software or an AI assistant to this app. All of it is
|
|
2
|
+
generated by s-m-r-t from the model; none of it was written by hand.</p> <!>`,1),T=s(`<section class="panel svelte-kxkftj" aria-label="Connect other tools"><!></section>`);function E(s,E){t(E,!0);let D=h(()=>E.models.filter(e=>e.exposed));var O=T(),k=m(O);g(k,{title:`Connect other tools`,children:(t,o)=>{var s=w(),h=p(d(s),2);n(h,17,()=>l(D),e=>e.id,(t,o)=>{var s=S(),d=m(s),h=f(d,!0),g=p(d,2),C=m(g),w=m(C),T=p(m(w)),E=f(T,!0);i(w);var D=p(w,2);n(D,21,()=>l(o).rest,e=>e.method+e.path,(t,n)=>{var r=_(),a=m(r),o=m(a),s=f(o,!0),d=p(o);i(a),i(r),u(()=>{e(s,l(n).method),e(d,` /api${l(n).path??``}`)}),c(t,r)},e=>{var t=v();c(e,t)}),i(D),i(C);var O=p(C,2),k=m(O),A=p(m(k)),j=f(A,!0);i(k);var M=p(k,2);n(M,21,()=>l(o).mcp,e=>e.name,(t,n)=>{var r=y(),a=m(r),o=f(a,!0);i(r),u(()=>e(o,l(n).name)),c(t,r)},e=>{var t=v();c(e,t)}),i(M),i(O);var N=p(O,2),P=m(N),F=p(m(P)),I=f(F,!0);i(P);var L=p(P,2);n(L,21,()=>l(o).cli,e=>e.name,(t,n)=>{var r=y(),a=m(r),o=f(a,!0);i(r),u(()=>e(o,l(n).name)),c(t,r)},e=>{var t=v();c(e,t)}),i(L),i(N);var R=p(N,2),z=m(R),B=p(m(z)),V=f(B,!0);r(),i(z);var H=p(z,2);n(H,21,()=>l(o).methods,e=>e.name,(t,n)=>{var r=x(),o=m(r),s=f(o),d=p(o,2),h=e=>{var t=b();c(e,t)};a(d,e=>{l(n).aiCallable&&e(h)}),i(r),u(t=>e(s,`${l(n).name??``}(${t??``})`),[()=>l(n).parameters.join(`, `)]),c(t,r)},e=>{var t=v();c(e,t)}),i(H),i(R),i(g),i(s),u(t=>{e(h,l(o).name),e(E,l(o).rest.length),e(j,l(o).mcp.length),e(I,l(o).cli.length),e(V,t)},[()=>l(o).methods.filter(e=>e.aiCallable).length]),c(t,s)},e=>{var t=C();c(e,t)}),c(t,s)},$$slots:{default:!0}}),i(O),c(s,O),o()}export{E as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{Et as e,Tt as t,Z as n,a as r,xt as i}from"./Chyo8rdT.js";import"./xihTtKlq.js";import{t as a}from"./D0VgZnk1.js";import{t as o}from"./B4Kevpe0.js";function s(s,c){e(c,!0);let l=r(c,`dismissible`,3,!1),u=r(c,`class`,3,``),d=o(),f=i(()=>d.isAILoading),p=i(()=>d.aiLoading),m=i(()=>c.show??n(f));function h(e){switch(e){case`checking`:return`Checking AI capabilities...`;case`downloading`:return`Downloading AI models...`;case`initializing`:return`Initializing AI...`;case`ready`:return`AI Ready`;case`error`:return`Error loading AI`;default:return`Loading...`}}let g=i(()=>c.message??h(n(p).phase)),_=i(()=>n(p).overallProgress),v=i(()=>n(p).loaded),y=i(()=>n(p).error);a(s,{get show(){return n(m)},get message(){return n(g)},get progress(){return n(_)},get items(){return n(v)},get error(){return n(y)},get dismissible(){return l()},get class(){return u()},get ondismiss(){return c.ondismiss}}),t()}export{s as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{n as e}from"./Dd_uD5pT.js";import{n as t,o as n}from"./C7zBd-pD.js";var r=e({BrowserSpeechSTTAdapter:()=>a});function i(){return typeof window>`u`?null:window.SpeechRecognition||window.webkitSpeechRecognition||null}var a=class{type=`browser-speech`;_initState=`uninitialized`;recognition=null;options;_isListening=!1;aborting=!1;resultListeners=new Set;errorListeners=new Set;startListeners=new Set;endListeners=new Set;constructor(e={}){this.options={defaultLanguage:`en-US`,maxAlternatives:3,...e}}get initState(){return this._initState}async ensureInitialized(e){if(this._initState!==`ready`){if(this._initState===`initializing`)return new Promise((e,t)=>{let n=()=>{this._initState===`ready`?e():this._initState===`error`?t(Error(`Initialization failed`)):setTimeout(n,50)};n()});this._initState=`initializing`;try{let e=i();if(!e)throw new t(`Web Speech API (SpeechRecognition)`,`browser-speech`);this.recognition=new e,this.setupRecognitionHandlers(),this._initState=`ready`}catch(e){throw this._initState=`error`,e}}}setupRecognitionHandlers(){this.recognition&&(this.recognition.onresult=e=>{for(let t=e.resultIndex;t<e.results.length;t++){let n=e.results[t],r={text:n[0].transcript,confidence:n[0].confidence,isFinal:n.isFinal,timestamp:Date.now(),alternatives:Array.from({length:n.length},(e,t)=>n[t]).slice(1).map(e=>({text:e.transcript,confidence:e.confidence}))};for(let e of this.resultListeners)e(r)}},this.recognition.onerror=e=>{let t=e.error;if(t===`aborted`&&this.aborting)return;let r;switch(t){case`not-allowed`:case`service-not-allowed`:r=new n(`microphone`,`browser-speech`);break;case`no-speech`:r=Error(`No speech detected`);break;case`audio-capture`:r=Error(`Audio capture failed - check microphone`);break;case`network`:r=Error(`Network error during speech recognition`);break;case`aborted`:r=Error(`Speech recognition was aborted`);break;default:r=Error(`Speech recognition error: ${t}`)}r.speechError=t,e.message&&(r.speechMessage=e.message);for(let e of this.errorListeners)e(r)},this.recognition.onstart=()=>{this._isListening=!0;for(let e of this.startListeners)e()},this.recognition.onend=()=>{this._isListening=!1,this.aborting=!1;for(let e of this.endListeners)e()})}getCapabilities(){return{continuous:!0,interimResults:!0,languages:[`en-US`,`en-GB`,`en-AU`,`es-ES`,`es-MX`,`fr-FR`,`fr-CA`,`de-DE`,`it-IT`,`pt-BR`,`pt-PT`,`zh-CN`,`zh-TW`,`ja-JP`,`ko-KR`],accuracy:`medium`,requiresDownload:!1}}async start(e={}){if(await this.ensureInitialized(),!this.recognition)throw Error(`Recognition not initialized`);this._isListening||(this.recognition.lang=e.language||this.options.defaultLanguage||`en-US`,this.recognition.continuous=e.continuous??!1,this.recognition.interimResults=e.interimResults??!0,this.recognition.maxAlternatives=this.options.maxAlternatives||3,this.recognition.start())}async stop(){this.recognition&&this._isListening&&this.recognition.stop()}abort(){this.recognition&&this._isListening&&(this.aborting=!0,this.recognition.abort())}isListening(){return this._isListening}onResult(e){return this.resultListeners.add(e),()=>this.resultListeners.delete(e)}onError(e){return this.errorListeners.add(e),()=>this.errorListeners.delete(e)}onStart(e){return this.startListeners.add(e),()=>this.startListeners.delete(e)}onEnd(e){return this.endListeners.add(e),()=>this.endListeners.delete(e)}async dispose(){this.abort(),this.recognition=null,this.resultListeners.clear(),this.errorListeners.clear(),this.startListeners.clear(),this.endListeners.clear(),this._initState=`uninitialized`}};export{r as t};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./DkR8_Ws6.js","./Dd_uD5pT.js","./uBIymjUX.js","./C7zBd-pD.js","./D7hhQvDO.js","./CA-A9Ngs.js","./CyUMm_Wp.js","./CygC84VT.js","./Chyo8rdT.js","./xihTtKlq.js","./BWPhGFHl.js","./CPRHZZeW.js","../assets/Button.DkP0qkG9.css","./DVRKjN-E.js","../assets/SegmentedControl.B8SrQacd.css","../assets/forms.BChZ2RWM.css","./Ci0DUht6.js","./WxSPP8QW.js","./D0VgZnk1.js","../assets/feedback.BVKAwFck.css","./CWtfVMDz.js","../assets/ui.B1A1Zl2p.css","./p6bgzXiY.js","./D_J_XtJy.js","../assets/dist.C5nHBk_O.css","./BKwRT_1p.js","../assets/store.CGDwHkkF.css","./BQxY8kkL.js","./leQCwW2d.js","../assets/AiSetup.Cb22AigN.css","./B32EWqI8.js","./BYcBM-fh.js","./CrFNLK0f.js","./B4Kevpe0.js"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{Et as e,H as t,M as n,N as r,R as i,Tt as a,U as o,V as s,Z as c,a as l,dt as u,et as d,gt as f,mt as p,n as m,ot as h,pt as ee,vt as g,xt as _,z as te}from"./Chyo8rdT.js";import{t as v}from"./uBIymjUX.js";import"./xihTtKlq.js";import{n as ne,r as re}from"./BWPhGFHl.js";import"./DVRKjN-E.js";import{A as ie,P as ae,i as y,r as oe}from"./WxSPP8QW.js";import{h as se}from"./CygC84VT.js";import{B as ce,C as b,F as x,G as le,H as ue,N as S,S as de,b as fe,d as pe,i as me}from"./p6bgzXiY.js";import{g as C,m as he,r as ge,t as _e}from"./CRQ1Pmzr.js";import{n as ve}from"./B4Kevpe0.js";import{d as ye}from"./BKwRT_1p.js";import{a as be,i as xe,t as Se}from"./BYcBM-fh.js";import{l as Ce}from"./Ci0DUht6.js";import{A as we,K as Te}from"./D_J_XtJy.js";import{a as Ee,c as De,n as Oe}from"./CMhpRMKg.js";var ke=1e5,w=1e3,Ae=2048,je=16,T=1e3,Me=new Set([`__proto__`,`constructor`,`prototype`]),Ne=new Set([`table`,`list`,`report`,`custom`]),Pe=new Set([`public`,`personal`,`sensitive`,`secret`]),Fe=new Set([`read`,`search`,`filter`,`sort`,`project`]),Ie=new Set([`rows`,`count`,`facets`]),Le=new Set([`current-page`,`explicit-ids`,`all-matching`]),Re=new Set([`basic`,`advanced`,`hidden`]),ze=new Set([`data`,`status`,`computed`,`row-key`,`selection`,`action`]),Be=new Set([`tenant`,`tenantid`,`principalid`,`principal`,`actorid`,`auth`,`authtoken`,`authorization`,`authorizationtoken`,`authorizationheader`,`authentication`,`authenticationtoken`,`accesstoken`,`token`,`bearer`,`bearertoken`,`apikey`,`sessiontoken`,`credential`,`credentials`,`sql`,`rawsql`,`rawquery`,`where`]);function E(e,t){if(!e||typeof e!=`object`||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)throw TypeError(`${t} must be a plain object`);return e}function D(e,t,n){let r=new Set(t);for(let t of Object.keys(e))if(!r.has(t))throw TypeError(`${n} contains unsupported field: ${t}`)}function O(e,t){if(typeof e!=`string`||e.length===0)throw TypeError(`${t} must be a non-empty string`);return e}function k(e,t){let n=O(e,t);if(n.length>256)throw TypeError(`${t} cannot exceed 256 characters`);return n}function A(e,t){if(e!==void 0)return O(e,t)}function Ve(e,t){if(e!==void 0){if(typeof e!=`number`||!Number.isFinite(e))throw TypeError(`${t} must be a finite number`);return e}}function j(e,t){if(typeof e!=`number`||!Number.isSafeInteger(e)||e<=0)throw TypeError(`${t} must be a positive safe integer`);return e}function He(e){if(typeof e!=`number`||!Number.isSafeInteger(e)||e<0)throw TypeError(`DataSurface revision must be a non-negative safe integer`);return e}function M(e,t){e&&(Ue(e,t),e.used+=t)}function Ue(e,t,n=e?.used??0){if(e&&t>e.limit-n)throw TypeError(`${e.label} cannot exceed ${e.limit} UTF-8 bytes`)}function We(e,t,n=t?.used??0){let r=2;for(let i=0;i<e.length;i+=1){let a=e.charCodeAt(i);if(a===34||a===92)r+=2;else if(a===8||a===9||a===10||a===12||a===13)r+=2;else if(a<=31)r+=6;else if(a>=55296&&a<=56319){let t=e.charCodeAt(i+1);t>=56320&&t<=57343?(r+=4,i+=1):r+=6}else r+=a>=56320&&a<=57343?6:a<=127?1:a<=2047?2:3;Ue(t,r,n)}return r}function Ge(e,t){if(!t)return;let n=t.used,r=e.length===0?2:e.length*2+1;Ue(t,r,n),n+=r;for(let r of e)n+=We(r,t,n)}function N(e,t=new Set,n=0,r){if(n>je)throw TypeError(`DataSurface values cannot exceed ${je} nested levels`);if(e===null||typeof e==`string`||typeof e==`boolean`)return M(r,e===null?4:typeof e==`boolean`?e?4:5:We(e,r)),e;if(typeof e==`number`){if(!Number.isFinite(e))throw TypeError(`DataSurface values cannot contain non-finite numbers`);let t=e===0?0:e;return M(r,String(t).length),t}if(Array.isArray(e)){if(e.length>T)throw TypeError(`DataSurface arrays cannot contain more than ${T} items`);if(t.has(e))throw TypeError(`DataSurface values cannot be circular`);t.add(e),M(r,1);let i=[];for(let[a,o]of e.entries())a>0&&M(r,1),i.push(N(o,t,n+1,r));return M(r,1),t.delete(e),i}if(e&&typeof e==`object`){let i=E(e,`DataSurface value`);if(t.has(i))throw TypeError(`DataSurface values cannot be circular`);t.add(i);let a={},o=Object.keys(i);if(o.length>T)throw TypeError(`DataSurface objects cannot contain more than ${T} keys`);Ge(o,r),M(r,1);for(let[e,s]of o.sort().entries()){if(e>0&&M(r,1),Me.has(s))throw TypeError(`DataSurface values cannot contain prototype key: ${s}`);M(r,We(s,r)+1),a[s]=N(i[s],t,n+1,r)}return M(r,1),t.delete(i),a}throw TypeError(`DataSurface values must be JSON-safe plain data`)}function P(e){return JSON.stringify(N(e))}function Ke(e){let t={used:0,limit:2**53-1,label:`DataSurface query request`};return N(e,new Set,0,t),t.used}function F(e,t){N(e,new Set,0,{used:0,limit:ke,label:t})}function qe(e,t){let n=N(e),r=e=>{if(Array.isArray(e)){for(let t of e)r(t);return}if(e&&typeof e==`object`)for(let[n,i]of Object.entries(e)){let e=n.replaceAll(/[-_]/g,``).toLowerCase();if(Be.has(e))throw TypeError(`${t} cannot contain authority or SQL field: ${n}`);r(i)}};return r(n),n}function Je(e,t){let n=qe(e,t);if(Array.isArray(n)||typeof n!=`object`||!n)throw TypeError(`${t} must be a JSON object`);return n}function I(e){let t=E(e,`DataSurface identity`);D(t,[`surfaceId`,`kind`,`subject`],`DataSurface identity`);let n=O(t.kind,`DataSurface kind`);if(!Ne.has(n))throw TypeError(`Unsupported DataSurface kind: ${n}`);let r;if(t.subject!==void 0){let e=E(t.subject,`DataSurface subject`);D(e,[`type`,`id`,`label`],`DataSurface subject`);let n=A(e.label,`DataSurface subject label`);r={type:k(e.type,`DataSurface subject type`),id:k(e.id,`DataSurface subject id`),...n?{label:n}:{}}}return{surfaceId:k(t.surfaceId,`DataSurface surface id`),kind:n,...r?{subject:r}:{}}}function L(e){return JSON.stringify([e.kind,e.surfaceId,e.subject?[e.subject.type,e.subject.id]:null])}function R(e){return I(e)}function z(e,t,n={}){if(!Array.isArray(e))throw TypeError(`${t} must be an array`);if(e.length>T)throw TypeError(`${t} cannot contain more than ${T} items`);let r=e.map(e=>O(e,t));if(new Set(r).size!==r.length)throw TypeError(`${t} cannot contain duplicates`);return n.sort?r.sort():r}function Ye(e,t,n={}){return z(e,t,n).map(e=>k(e,t))}function Xe(e,t){let n=z(e,t,{sort:!0});for(let e of n)if(!Fe.has(e))throw TypeError(`Unsupported DataSurface column capability: ${e}`);return n}function Ze(e,t){if(e===void 0)return;let n=O(e,t);if(!Pe.has(n))throw TypeError(`Unsupported DataSurface sensitivity: ${n}`);return n}function Qe(e,t){if(e===void 0)return;let n=E(e,t);D(n,[`search`,`filter`,`sort`],t);let r=n.search===void 0?void 0:z(n.search,`${t} search operators`,{sort:!0}),i=n.filter===void 0?void 0:z(n.filter,`${t} filter operators`,{sort:!0}),a=n.sort===void 0?void 0:z(n.sort,`${t} sort operators`,{sort:!0});return!r&&!i&&!a?{}:{...r?{search:r}:{},...i?{filter:i}:{},...a?{sort:a}:{}}}function $e(e){let t=A(e.fieldName,`DataSurface column field name`),n=A(e.visibility,`DataSurface column visibility`);if(n&&!Re.has(n))throw TypeError(`Unsupported DataSurface column visibility: ${n}`);let r=A(e.role,`DataSurface column role`);if(r&&!ze.has(r))throw TypeError(`Unsupported DataSurface column role: ${r}`);if(e.readable!==void 0&&typeof e.readable!=`boolean`)throw TypeError(`DataSurface column readable must be boolean`);let i=t=>e[t]===void 0?void 0:z(e[t],`DataSurface column ${t}`,{sort:!0}),a=i(`searchOperators`),o=i(`filterOperators`),s=i(`sortOperators`);return{...t?{fieldName:t}:{},...n?{visibility:n}:{},...e.order===void 0?{}:{order:Ve(e.order,`DataSurface column order`)},...r?{role:r}:{},...e.responsivePriority===void 0?{}:{responsivePriority:Ve(e.responsivePriority,`DataSurface column responsive priority`)},...e.operators===void 0?{}:{operators:Qe(e.operators,`DataSurface column operators`)},...a?{searchOperators:a}:{},...o?{filterOperators:o}:{},...s?{sortOperators:s}:{},...e.readable===void 0?{}:{readable:e.readable}}}function et(e){let t=E(e,`DataSurface selection`),n=O(t.scope,`DataSurface selection scope`);if(!Le.has(n))throw TypeError(`Unsupported DataSurface selection scope: ${n}`);if(n===`current-page`)return D(t,[`scope`],`DataSurface current-page selection`),{scope:n};if(n===`explicit-ids`){if(D(t,[`scope`,`rowIds`],`DataSurface explicit selection`),!Array.isArray(t.rowIds))throw TypeError(`DataSurface explicit selection rowIds must be an array`);if(t.rowIds.length>T)throw TypeError(`DataSurface explicit selection cannot contain more than ${T} row ids`);let e=new Map;for(let n of t.rowIds){if(typeof n!=`string`&&(typeof n!=`number`||!Number.isFinite(n)))throw TypeError(`DataSurface row ids must be finite strings or numbers`);let t=typeof n==`string`?k(n,`DataSurface row id`):n===0?0:n;e.set(`${typeof t}:${String(t)}`,t)}return{scope:n,rowIds:[...e.values()].sort((e,t)=>typeof e==typeof t?typeof e==`number`&&typeof t==`number`?e-t:e<t?-1:+(e>t):typeof e==`number`?-1:1)}}return D(t,[`scope`,`queryFingerprint`],`DataSurface all-matching selection`),{scope:n,queryFingerprint:k(t.queryFingerprint,`DataSurface query fingerprint`)}}function tt(e){let t=E(e,`DataSurface descriptor`);if(D(t,[`version`,`identity`,`schemaVersion`,`label`,`description`,`rowKey`,`columns`,`query`,`controls`,`actions`,`limits`],`DataSurface descriptor`),t.version!==1)throw TypeError(`Unsupported DataSurface descriptor version`);if(!Array.isArray(t.columns))throw TypeError(`DataSurface descriptor columns must be an array`);let n=t.columns.map(e=>{let t=E(e,`DataSurface column`);D(t,[`id`,`label`,`description`,`sensitivity`,`capabilities`,`fieldName`,`visibility`,`order`,`role`,`responsivePriority`,`operators`,`searchOperators`,`filterOperators`,`sortOperators`,`readable`],`DataSurface column`);let n=Ze(t.sensitivity,`DataSurface column sensitivity`),r=A(t.description,`DataSurface column description`),i=$e(t);return{id:k(t.id,`DataSurface column id`),label:O(t.label,`DataSurface column label`),...r?{description:r}:{},...n?{sensitivity:n}:{},capabilities:Xe(t.capabilities,`DataSurface column capabilities`),...i}});if(new Set(n.map(e=>e.id)).size!==n.length)throw TypeError(`DataSurface descriptor column ids must be unique`);let r=E(t.query,`DataSurface query capabilities`);D(r,[`modes`,`projectableColumnIds`,`searchableColumnIds`,`filterableColumnIds`,`sortableColumnIds`],`DataSurface query capabilities`);let i=z(r.modes,`DataSurface query modes`,{sort:!0});for(let e of i)if(!Ie.has(e))throw TypeError(`Unsupported DataSurface query mode: ${e}`);let a=Ye(r.projectableColumnIds,`DataSurface projectable column ids`,{sort:!0}),o=new Set(n.map(e=>e.id));for(let e of a)if(!o.has(e))throw TypeError(`Unknown projectable DataSurface column: ${e}`);let s=(e,t)=>{if(e===void 0)return;let n=z(e,t,{sort:!0});for(let e of n)if(!o.has(e))throw TypeError(`Unknown ${t}: ${e}`);return n},c=s(r.searchableColumnIds,`searchable DataSurface column`),l=s(r.filterableColumnIds,`filterable DataSurface column`),u=s(r.sortableColumnIds,`sortable DataSurface column`);if(!Array.isArray(t.controls))throw TypeError(`DataSurface controls must be an array`);let d=t.controls.map(e=>{let t=E(e,`DataSurface control`);D(t,[`id`,`label`,`description`],`DataSurface control`);let n=A(t.description,`DataSurface control description`);return{id:k(t.id,`DataSurface control id`),label:O(t.label,`DataSurface control label`),...n?{description:n}:{}}});if(new Set(d.map(e=>e.id)).size!==d.length)throw TypeError(`DataSurface control ids must be unique`);if(!Array.isArray(t.actions))throw TypeError(`DataSurface actions must be an array`);let f=t.actions.map(e=>{let t=E(e,`DataSurface action`);if(D(t,[`id`,`label`,`description`,`sensitivity`,`selectionScopes`,`requiresConfirmation`,`columnIds`],`DataSurface action`),t.requiresConfirmation!==void 0&&typeof t.requiresConfirmation!=`boolean`)throw TypeError(`DataSurface action requiresConfirmation must be boolean`);let n=z(t.selectionScopes,`DataSurface action selection scopes`,{sort:!0});for(let e of n)if(!Le.has(e))throw TypeError(`Unsupported DataSurface action selection scope: ${e}`);let r=Ze(t.sensitivity,`DataSurface action sensitivity`),i=A(t.description,`DataSurface action description`),a=t.columnIds===void 0?void 0:z(t.columnIds,`DataSurface action column ids`,{sort:!0});if(a?.some(e=>!o.has(e))){let e=a.find(e=>!o.has(e));throw TypeError(`Unknown DataSurface action column id: ${e}`)}return{id:k(t.id,`DataSurface action id`),label:O(t.label,`DataSurface action label`),...i?{description:i}:{},...r?{sensitivity:r}:{},selectionScopes:n,...t.requiresConfirmation===void 0?{}:{requiresConfirmation:t.requiresConfirmation},...a?{columnIds:a}:{}}});if(new Set(f.map(e=>e.id)).size!==f.length)throw TypeError(`DataSurface action ids must be unique`);let p=E(t.limits,`DataSurface limits`);D(p,[`maxQueryRows`,`maxQueryBytes`,`maxSelectionSize`],`DataSurface limits`);let m=j(p.maxQueryRows,`DataSurface maxQueryRows`);if(m>w)throw TypeError(`DataSurface maxQueryRows cannot exceed ${w}`);let h=k(t.rowKey,`DataSurface row key`);if(!o.has(h))throw TypeError(`DataSurface rowKey must name a declared column`);let ee=A(t.description,`DataSurface description`);return{version:1,identity:I(t.identity),schemaVersion:j(t.schemaVersion,`DataSurface schema version`),label:O(t.label,`DataSurface label`),...ee?{description:ee}:{},rowKey:h,columns:n,query:{modes:i,projectableColumnIds:a,...c?{searchableColumnIds:c}:{},...l?{filterableColumnIds:l}:{},...u?{sortableColumnIds:u}:{}},controls:d,actions:f,limits:{maxQueryRows:m,maxQueryBytes:j(p.maxQueryBytes,`DataSurface maxQueryBytes`),maxSelectionSize:j(p.maxSelectionSize,`DataSurface maxSelectionSize`)}}}function nt(e){let t=E(e,`DataSurface snapshot`);if(D(t,[`version`,`descriptor`,`revision`,`state`,`selection`],`DataSurface snapshot`),t.version!==1)throw TypeError(`Unsupported DataSurface snapshot version`);return{version:1,descriptor:tt(t.descriptor),revision:He(t.revision),state:Je(t.state,`DataSurface snapshot state`),selection:t.selection===null||t.selection===void 0?null:et(t.selection)}}function B(e){let t=E(e,`DataSurface visible command`);if(D(t,[`version`,`commandId`,`identity`,`expectedRevision`,`controlId`,`payload`],`DataSurface visible command`),t.version!==1)throw TypeError(`Unsupported DataSurface visible command version`);let n=k(t.commandId,`DataSurface command id`),r=I(t.identity),i=He(t.expectedRevision),a=k(t.controlId,`DataSurface control id`);F(e,`DataSurface visible command`);let o={version:1,commandId:n,identity:r,expectedRevision:i,controlId:a,...t.payload===void 0?{}:{payload:qe(t.payload,`DataSurface command payload`)}};return F(o,`DataSurface visible command`),o}function rt(e){let t=E(e,`DataSurface query request`),n=O(t.kind,`DataSurface query kind`);if(t.version!==1)throw TypeError(`Unsupported DataSurface query request version`);let r=k(t.requestId,`DataSurface query request id`),i=I(t.identity);if(n===`rows`){D(t,[`version`,`requestId`,`identity`,`kind`,`limit`,`cursor`,`projection`],`DataSurface rows query request`),F(e,`DataSurface query request`);let a=j(t.limit,`DataSurface rows query limit`);if(a>w)throw TypeError(`DataSurface rows query limit cannot exceed ${w}`);let o=A(t.cursor,`DataSurface rows query cursor`);if(o&&o.length>Ae)throw TypeError(`DataSurface rows query cursor is too long`);return{version:1,requestId:r,identity:i,kind:n,limit:a,...o?{cursor:o}:{},...t.projection===void 0?{}:{projection:Ye(t.projection,`DataSurface query projection`,{sort:!0})}}}if(n===`count`)return D(t,[`version`,`requestId`,`identity`,`kind`],`DataSurface count query request`),F(e,`DataSurface query request`),{version:1,requestId:r,identity:i,kind:n};if(n===`facets`){D(t,[`version`,`requestId`,`identity`,`kind`,`columnId`,`limit`],`DataSurface facets query request`),F(e,`DataSurface query request`);let a=j(t.limit,`DataSurface facets query limit`);if(a>w)throw TypeError(`DataSurface facets query limit cannot exceed ${w}`);return{version:1,requestId:r,identity:i,kind:n,columnId:k(t.columnId,`DataSurface facets query column id`),limit:a}}throw TypeError(`Unsupported DataSurface query kind: ${n}`)}function it(e){let t=E(e,`DataSurface action request`);if(D(t,[`version`,`requestId`,`identity`,`actionId`,`phase`,`selection`,`payload`,`confirmationToken`],`DataSurface action request`),t.version!==1)throw TypeError(`Unsupported DataSurface action request version`);let n=k(t.requestId,`DataSurface action request id`),r=O(t.phase,`DataSurface action phase`);if(r!==`preview`&&r!==`apply`)throw TypeError(`Unsupported DataSurface action phase: ${r}`);let i=A(t.confirmationToken,`DataSurface confirmation token`),a=I(t.identity),o=k(t.actionId,`DataSurface action id`),s=et(t.selection);F(e,`DataSurface action request`);let c={version:1,requestId:n,identity:a,actionId:o,phase:r,selection:s,...t.payload===void 0?{}:{payload:qe(t.payload,`DataSurface action payload`)},...i?{confirmationToken:i}:{}};return F(c,`DataSurface action request`),c}function at(e,t){return nt({version:1,descriptor:e,revision:t.revision,state:t.state,selection:t.selection??null})}function V(e){return nt(e)}function H(e){return{ok:e.ok,commandId:e.commandId,identity:R(e.identity),...e.revision===void 0?{}:{revision:e.revision},...e.snapshot?{snapshot:V(e.snapshot)}:{},...e.reason?{reason:e.reason}:{}}}function ot(e,t){return L(e)===L(t)}function st(e,t){return U(e)===U(t)}function U(e){return P([e.state,e.selection])}function ct(){let e=new Map,t=new Set,n=0,r=e=>{let t=at(e.descriptor,e.registration.getSnapshot());if(t.revision<e.lastRevision)throw RangeError(`DataSurface revision must be monotonic`);let n=e.registration.redact?nt(e.registration.redact(V(t))):t;if(!ot(n.descriptor.identity,e.descriptor.identity)||n.revision!==t.revision)throw TypeError(`DataSurface redaction cannot change identity or revision`);let r=U(t),i=U(n);return e.lastSnapshotContentSignature!==void 0&&t.revision===e.lastRevision&&(e.lastSnapshotContentSignature!==r||e.lastExposedSnapshotContentSignature!==i)&&(e.commandBlockedAtRevision=t.revision),e.lastRevision=t.revision,e.lastSnapshotContentSignature=r,e.lastExposedSnapshotContentSignature=i,{raw:t,exposed:n}},i=(e,r,i,a,o)=>{let s={type:e,sequence:++n,identity:R(r.descriptor.identity),revision:i,...a?{command:B(a)}:{},...o?{result:H(o)}:{}};for(let e of t)try{e({...s,identity:R(s.identity),...s.command?{command:B(s.command)}:{},...s.result?{result:H(s.result)}:{}})}catch{}},a=(e,t,n)=>{for(e.replay.set(t.commandId,{signature:P(t),result:H(n)});e.replay.size>100;){let t=e.replay.keys().next().value;if(t===void 0)break;e.replay.delete(t)}return i(`command`,e,n.revision??e.lastRevision,t,n),H(n)},o=t=>e.get(L(t)),s=async(e,t)=>{let n=e.commandQueue,r;e.commandQueue=new Promise(e=>{r=e}),await n;try{return await t()}finally{r()}};return{register(t){let n=tt(t.descriptor),a=L(n.identity);if(e.has(a))throw Error(`DataSurface identity is already registered: ${a}`);let o={key:a,descriptor:n,registration:t,lastRevision:-1,replay:new Map,commandQueue:Promise.resolve()};e.set(a,o);try{let e=r(o);i(`registered`,o,e.exposed.revision)}catch(t){throw e.delete(a),t}return()=>{e.get(a)===o&&(e.delete(a),i(`unregistered`,o,Math.max(0,o.lastRevision)))}},unregister(t){let n=I(t),r=e.get(L(n));r&&(e.delete(r.key),i(`unregistered`,r,Math.max(0,r.lastRevision)))},list(){return[...e.values()].sort((e,t)=>e.key.localeCompare(t.key)).map(e=>tt(e.descriptor))},inspect(t){let n=I(t),i=e.get(L(n));return i?V(r(i).exposed):void 0},async execute(t){let n=B(t),o=e.get(L(n.identity)),c=()=>({ok:!1,commandId:n.commandId,identity:R(n.identity),reason:`not_found`});return o?s(o,async()=>{if(e.get(o.key)!==o)return c();let t=P(n),s=o.replay.get(n.commandId);if(s){if(s.signature===t)return o.replay.delete(n.commandId),o.replay.set(n.commandId,s),H(s.result);let e=r(o).exposed,a={ok:!1,commandId:n.commandId,identity:R(o.descriptor.identity),revision:e.revision,snapshot:e,reason:`idempotency_conflict`};return i(`command`,o,e.revision,n,a),H(a)}let l=r(o);if(o.commandBlockedAtRevision!==void 0&&l.raw.revision<=o.commandBlockedAtRevision)return a(o,n,{ok:!1,commandId:n.commandId,identity:R(o.descriptor.identity),revision:l.exposed.revision,snapshot:l.exposed,reason:`non_monotonic_revision`});if(o.commandBlockedAtRevision=void 0,l.raw.revision!==n.expectedRevision)return a(o,n,{ok:!1,commandId:n.commandId,identity:R(o.descriptor.identity),revision:l.exposed.revision,snapshot:l.exposed,reason:`stale_revision`});if(!o.descriptor.controls.some(e=>e.id===n.controlId)||!o.registration.execute)return a(o,n,{ok:!1,commandId:n.commandId,identity:R(o.descriptor.identity),revision:l.exposed.revision,snapshot:l.exposed,reason:`unsupported`});try{let t=await o.registration.execute(B(n));if(e.get(o.key)!==o)return c();let i=r(o);return st(l.raw,i.raw)===!1&&i.raw.revision<=l.raw.revision?(o.commandBlockedAtRevision=i.raw.revision,a(o,n,{ok:!1,commandId:n.commandId,identity:R(o.descriptor.identity),revision:i.exposed.revision,snapshot:i.exposed,reason:`non_monotonic_revision`})):t&&t.ok===!1?a(o,n,{ok:!1,commandId:n.commandId,identity:R(o.descriptor.identity),revision:i.exposed.revision,snapshot:i.exposed,reason:`denied`}):a(o,n,{ok:!0,commandId:n.commandId,identity:R(o.descriptor.identity),revision:i.exposed.revision,snapshot:i.exposed})}catch{if(e.get(o.key)!==o)return c();let t;try{t=r(o)}catch{}return t&&st(l.raw,t.raw)===!1&&t.raw.revision<=l.raw.revision?(o.commandBlockedAtRevision=t.raw.revision,a(o,n,{ok:!1,commandId:n.commandId,identity:R(o.descriptor.identity),revision:t.exposed.revision,snapshot:t.exposed,reason:`non_monotonic_revision`})):a(o,n,{ok:!1,commandId:n.commandId,identity:R(o.descriptor.identity),...t?{revision:t.exposed.revision,snapshot:t.exposed}:{},reason:`execution_failed`})}}):c()},validateQuery(e){try{let t=rt(e),n=o(t.identity);return n?n.descriptor.query.modes.includes(t.kind)?Ke(t)>n.descriptor.limits.maxQueryBytes||`limit`in t&&t.limit>n.descriptor.limits.maxQueryRows?{ok:!1,reason:`limit_exceeded`}:t.kind===`rows`&&t.projection&&t.projection.some(e=>!n.descriptor.query.projectableColumnIds.includes(e))||t.kind===`facets`&&!n.descriptor.query.projectableColumnIds.includes(t.columnId)?{ok:!1,reason:`projection_not_allowed`}:{ok:!0}:{ok:!1,reason:`unsupported`}:{ok:!1,reason:`not_found`}}catch{return{ok:!1,reason:`invalid_request`}}},validateAction(e){try{let t=it(e),n=o(t.identity);if(!n)return{ok:!1,reason:`not_found`};let r=n.descriptor.actions.find(e=>e.id===t.actionId);return r?r.selectionScopes.includes(t.selection.scope)?t.selection.scope===`explicit-ids`&&t.selection.rowIds.length>n.descriptor.limits.maxSelectionSize?{ok:!1,reason:`limit_exceeded`}:t.phase===`apply`&&r.requiresConfirmation!==!1&&!t.confirmationToken?{ok:!1,reason:`confirmation_required`}:{ok:!0}:{ok:!1,reason:`selection_not_supported`}:{ok:!1,reason:`unsupported`}}catch{return{ok:!1,reason:`invalid_request`}}},subscribe(e){return t.add(e),()=>t.delete(e)}}}function lt(){let e=ut();return{stt:ft(e),tts:pt(e),llm:mt(e),browser:e}}function ut(){return typeof window>`u`?{sharedArrayBuffer:!1,webWorkers:!1,indexedDB:!1,wasmSupport:!1,wasmSimd:!1}:{sharedArrayBuffer:typeof SharedArrayBuffer<`u`,webWorkers:typeof Worker<`u`,indexedDB:typeof indexedDB<`u`,wasmSupport:typeof WebAssembly<`u`,wasmSimd:dt()}}function dt(){if(typeof WebAssembly>`u`)return!1;try{let e=new Uint8Array([0,97,115,109,1,0,0,0,1,5,1,96,0,1,123,3,2,1,0,10,10,1,8,0,253,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11]);return WebAssembly.validate(e)}catch{return!1}}function ft(e){return{browserSpeechAPI:typeof window<`u`&&(`SpeechRecognition`in window||`webkitSpeechRecognition`in window),whisperWasm:e.wasmSupport}}function pt(e){return{browserSynthesisAPI:typeof window<`u`&&`speechSynthesis`in window,transformersTTS:e.wasmSupport}}function mt(e){let t=typeof window<`u`&&`gpu`in navigator;return{webllm:t||e.wasmSupport,transformersLLM:e.wasmSupport,webgpu:t}}function ht(e){return e.stt.browserSpeechAPI||e.stt.whisperWasm}function gt(e){return e.tts.browserSynthesisAPI||e.tts.transformersTTS}function _t(e){return e.llm.webllm||e.llm.transformersLLM}function vt(e){return ht(e)||gt(e)||_t(e)}function yt(){return{mode:`default`,modeSource:`auto`,session:{user:null,isAuthenticated:!1,permissions:[],preferences:{}},capabilities:null,ai:{stt:{adapter:null,initState:`uninitialized`,downloadProgress:null,isListening:!1,lastResult:``,interimResult:``,error:null},tts:{adapter:null,initState:`uninitialized`,downloadProgress:null,isSpeaking:!1,isPaused:!1,error:null},llm:{adapter:null,initState:`uninitialized`,downloadProgress:null,currentModel:null,isGenerating:!1,error:null}},aiLoading:{phase:`idle`,currentAdapter:null,overallProgress:0,message:``,loaded:[],failed:[],error:null},socket:{status:`disconnected`,reconnectAttempts:0,lastError:null},error:null,initialized:!1}}var W=new Map,bt=new Map,xt=new Map;function St(e){return W.get(e)}function Ct(e,t,n=`ready`,r=null){W.set(e,{adapter:t,cachedAt:Date.now(),initState:n,downloadProgress:null,error:r,type:e})}function wt(e,t){let n=W.get(e);n&&Object.assign(n,t)}function Tt(e){return bt.get(e)}function Et(e,t,n=`ready`,r=null){bt.set(e,{adapter:t,cachedAt:Date.now(),initState:n,downloadProgress:null,error:r,type:e})}function Dt(e,t){let n=bt.get(e);n&&Object.assign(n,t)}function Ot(e,t){let n=t?`${e}:${t}`:e;return xt.get(n)}function kt(e,t,n,r=`ready`,i=null){let a=n?`${e}:${n}`:e;xt.set(a,{adapter:t,cachedAt:Date.now(),initState:r,downloadProgress:null,error:i,type:e})}function G(e,t,n){let r=t?`${e}:${t}`:e,i=xt.get(r);i&&Object.assign(i,n)}var K=new WeakMap,q=new WeakMap;function At(e,t){if(e===t)return!0;try{return JSON.stringify(e)===JSON.stringify(t)}catch{return!1}}var jt=class{#e=g(p(yt()));get _state(){return c(this.#e)}set _state(e){f(this.#e,e,!0)}options;_aiConfig=null;_preloadScheduled=!1;_idleCallbackId=null;_preloadInFlight=!1;_socket=null;_socketConfig=null;_reconnectTimeout=null;_sttSubscriptions=new Map;_ttsSubscriptions=new Map;constructor(e={}){this.options=e,this._aiConfig=e.ai??null}get socketConfig(){return this._socketConfig}get state(){return this._state}get aiConfig(){return this._aiConfig}get aiLoading(){return this._state.aiLoading}async initialize(){if(this._state.initialized)return;if(typeof window>`u`){this._state.initialized=!0;return}let e=lt();this._state.capabilities=e,this.options.onCapabilitiesDetected?.(e),this.options.session&&(this._state.session={...this._state.session,...this.options.session}),this.options.initialMode?(this._state.mode=this.options.initialMode,this._state.modeSource=`explicit`):(this._state.session.preferences.autoEnableSmrt??!1)&&vt(e)&&(this._state.mode=`smrt`,this._state.modeSource=`auto`),this._state.initialized=!0,this.schedulePreload()}setAIConfig(e){if(this._aiConfig&&At(this._aiConfig,e)){this._aiConfig=e;return}this._aiConfig=e,this._idleCallbackId!==null&&typeof cancelIdleCallback<`u`&&(cancelIdleCallback(this._idleCallbackId),this._idleCallbackId=null),this._preloadScheduled=!1,this.schedulePreload()}schedulePreload(){if(!this._aiConfig||this._preloadScheduled)return;let e=this._aiConfig.preload??`idle`;if(e!==`none`){if(e===`eager`){this._preloadScheduled=!0,this.executePreload();return}if(e===`idle`){this._preloadScheduled=!0,typeof requestIdleCallback<`u`?this._idleCallbackId=requestIdleCallback(()=>this.executePreload(),{timeout:5e3}):setTimeout(()=>this.executePreload(),100);return}}}triggerPreload(){this._aiConfig&&!this._preloadScheduled&&this._aiConfig.preload===`on-visible`&&(this._preloadScheduled=!0,this.executePreload())}async executePreload(){if(this._aiConfig&&!this._preloadInFlight){this._preloadInFlight=!0;try{await this.runPreload()}finally{this._preloadInFlight=!1}}}async runPreload(){if(!this._aiConfig)return;let e=[];if(this._aiConfig.stt?.enabled!==!1&&this._aiConfig.stt?.type&&e.push(`stt:${this._aiConfig.stt.type}`),this._aiConfig.tts?.enabled!==!1&&this._aiConfig.tts?.type&&e.push(`tts:${this._aiConfig.tts.type}`),this._aiConfig.llm?.enabled!==!1&&this._aiConfig.llm?.type){let t=this._aiConfig.llm.model?`${this._aiConfig.llm.type}:${this._aiConfig.llm.model}`:this._aiConfig.llm.type;e.push(`llm:${t}`)}if(e.length===0){this.updateLoadingState({phase:`idle`,loaded:[],failed:[]});return}this.updateLoadingState({phase:`checking`,message:`Checking AI capabilities...`,loaded:[],failed:[]});for(let t of e){let[e,n]=t.split(`:`);this.updateLoadingState({phase:`downloading`,currentAdapter:n,message:`Loading ${n}...`});try{if(e===`stt`){let e=this._aiConfig.stt;await this.initializeSTT({type:n,allowLocalModels:e?.allowLocalModels})}else if(e===`tts`)await this.initializeTTS({type:n});else if(e===`llm`){let e=this._aiConfig.llm;e&&await this.initializeLLM(e.model,{type:e.type})}this.updateLoadingState({loaded:[...this._state.aiLoading.loaded,n]})}catch(e){console.error(`Failed to preload ${n}:`,e),this.updateLoadingState({failed:[...this._state.aiLoading.failed,n]})}}let t=this._state.aiLoading.failed.length>0;this._state.aiLoading.loaded.length===e.length?this.updateLoadingState({phase:`ready`,currentAdapter:null,overallProgress:100,message:`AI ready`}):t&&this._state.aiLoading.loaded.length===0?this.updateLoadingState({phase:`error`,currentAdapter:null,message:`Failed to load AI models`,error:Error(`All AI adapters failed to load`)}):this.updateLoadingState({phase:`ready`,currentAdapter:null,message:`Loaded with ${this._state.aiLoading.failed.length} failure(s)`}),this.options.onAILoadingChange?.(this._state.aiLoading)}updateLoadingState(e){this._state.aiLoading={...this._state.aiLoading,...e}}setMode(e,t=`toggled`){this._state.mode!==e&&(this._state.mode=e,this._state.modeSource=t,this.options.onModeChange?.(e,t),e===`smrt`&&this.initializeSTT({type:`whisper-cpp`,allowLocalModels:this._aiConfig?.stt?.allowLocalModels}).catch(()=>{}))}toggleMode(){let e=this._state.mode==="default"?`smrt`:`default`;this.setMode(e,`toggled`)}updateSession(e){this._state.session={...this._state.session,...e}}setPermissions(e){this._state.session.permissions=e}hasPermission(e){return this._state.session.permissions.includes(e)}hasAllPermissions(e){return e.every(e=>this._state.session.permissions.includes(e))}hasAnyPermission(e){return e.some(e=>this._state.session.permissions.includes(e))}setUser(e,t=[]){this._state.session.user=e,this._state.session.isAuthenticated=e!==null,this._state.session.permissions=t}connectSocket(e){this.disconnectSocket(),this._socketConfig=e,this._state.socket.status=`connecting`,this._state.socket.lastError=null;try{this._socket=new WebSocket(e.url),this._socket.onopen=()=>{this._state.socket.status=`connected`,this._state.socket.reconnectAttempts=0,e.onOpen?.()},this._socket.onmessage=t=>{try{let n=JSON.parse(t.data);e.onMessage?.(n)}catch{e.onMessage?.(t.data)}},this._socket.onclose=t=>{this._state.socket.status=`disconnected`,e.onClose?.(t),!t.wasClean&&e.reconnect?.enabled!==!1&&this.scheduleReconnect()},this._socket.onerror=t=>{this._state.socket.lastError=t,e.onError?.(t)}}catch(e){this._state.socket.status=`disconnected`,this._state.socket.lastError=e}}disconnectSocket(){this._reconnectTimeout&&=(clearTimeout(this._reconnectTimeout),null),this._socket&&=(this._socket.close(),null),this._state.socket.status=`disconnected`}sendMessage(e){this._socket?.readyState===WebSocket.OPEN?this._socket.send(JSON.stringify(e)):console.warn(`[Socket] Cannot send message - socket not connected`)}scheduleReconnect(){if(!this._socketConfig)return;let{reconnect:e}=this._socketConfig,t=e?.maxAttempts??5,n=e?.baseDelay??1e3;if(this._state.socket.reconnectAttempts>=t){console.warn(`[Socket] Max reconnection attempts reached`);return}this._state.socket.status=`reconnecting`,this._state.socket.reconnectAttempts++;let r=Math.min(n*2**(this._state.socket.reconnectAttempts-1),3e4);console.log(`[Socket] Reconnecting in ${r}ms (attempt ${this._state.socket.reconnectAttempts}/${t})`),this._reconnectTimeout=setTimeout(()=>{this._socketConfig&&this.connectSocket(this._socketConfig)},r)}async initializeSTT(e){let t=e?.type??`browser-speech`,n=St(t);if(n&&n.initState===`ready`)return this._state.ai.stt.adapter=n.adapter,this._state.ai.stt.initState=`ready`,this._state.ai.stt.error=null,this.subscribeToSTTEvents(n.adapter),n.adapter;let r=this._state.ai.stt.adapter;if(r&&this._state.ai.stt.initState===`ready`){if(r.type===t)return r;console.log(`[STT] Switching adapter from ${r.type} to ${t}`),await r.dispose?.()}this._state.ai.stt.initState=`initializing`,this._state.ai.stt.error=null,wt(t,{initState:`initializing`});let i=e=>{this._state.ai.stt.downloadProgress=e,wt(t,{downloadProgress:e}),e.percent>0&&this.updateLoadingState({overallProgress:e.percent})};try{let{getSTT:n}=await v(async()=>{let{getSTT:e}=await import(`./DkR8_Ws6.js`).then(e=>e.t);return{getSTT:e}},__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29]),import.meta.url),r=await n(e);return await r.ensureInitialized(i),Ct(t,r,`ready`),this._state.ai.stt.adapter=r,this._state.ai.stt.initState=`ready`,this._state.ai.stt.downloadProgress=null,this.subscribeToSTTEvents(r),r}catch(e){let n=e instanceof Error?e:Error(String(e));throw this._state.ai.stt.initState=`error`,this._state.ai.stt.error=n,wt(t,{initState:`error`,error:n}),e}}subscribeToSTTEvents(e){if(this._sttSubscriptions.has(e))return;K.get(e)?.();let t=[e.onResult(e=>{if(e.isFinal){let t=this._state.ai.stt.lastResult;t?this._state.ai.stt.lastResult=`${t} ${e.text}`:this._state.ai.stt.lastResult=e.text,this._state.ai.stt.interimResult=``}else this._state.ai.stt.interimResult=e.text}),e.onStart(()=>{this._state.ai.stt.isListening=!0}),e.onEnd(()=>{this._state.ai.stt.isListening=!1}),e.onError(e=>{this._state.ai.stt.error=e})],n=()=>{for(let e of t)e();this._sttSubscriptions.delete(e),K.get(e)===n&&K.delete(e)};this._sttSubscriptions.set(e,n),K.set(e,n)}async startListening(e){let t=await this.initializeSTT();this._state.ai.stt.lastResult=``,this._state.ai.stt.interimResult=``,await t.start(e)}async stopListening(){await this._state.ai.stt.adapter?.stop(),this._state.ai.stt.interimResult=``}async initializeTTS(e){let t=e?.type??`browser-synthesis`,n=Tt(t);if(n&&n.initState===`ready`)return this._state.ai.tts.adapter=n.adapter,this._state.ai.tts.initState=`ready`,this._state.ai.tts.error=null,this.subscribeToTTSEvents(n.adapter),n.adapter;if(this._state.ai.tts.adapter&&this._state.ai.tts.initState===`ready`)return this._state.ai.tts.adapter;this._state.ai.tts.initState=`initializing`,this._state.ai.tts.error=null,Dt(t,{initState:`initializing`});let r=e=>{this._state.ai.tts.downloadProgress=e,Dt(t,{downloadProgress:e})};try{let{getTTS:n}=await v(async()=>{let{getTTS:e}=await import(`./DkR8_Ws6.js`).then(e=>e.t);return{getTTS:e}},__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29]),import.meta.url),i=await n(e);return await i.ensureInitialized(r),Et(t,i,`ready`),this._state.ai.tts.adapter=i,this._state.ai.tts.initState=`ready`,this._state.ai.tts.downloadProgress=null,this.subscribeToTTSEvents(i),i}catch(e){let n=e instanceof Error?e:Error(String(e));throw this._state.ai.tts.initState=`error`,this._state.ai.tts.error=n,Dt(t,{initState:`error`,error:n}),e}}subscribeToTTSEvents(e){if(this._ttsSubscriptions.has(e))return;q.get(e)?.();let t=[e.onStart(()=>{this._state.ai.tts.isSpeaking=!0,this._state.ai.tts.isPaused=!1}),e.onEnd(()=>{this._state.ai.tts.isSpeaking=!1,this._state.ai.tts.isPaused=!1}),e.onError(e=>{this._state.ai.tts.error=e,this._state.ai.tts.isSpeaking=!1})],n=()=>{for(let e of t)e();this._ttsSubscriptions.delete(e),q.get(e)===n&&q.delete(e)};this._ttsSubscriptions.set(e,n),q.set(e,n)}async speak(e,t){await(await this.initializeTTS()).speak(e,t)}stopSpeaking(){this._state.ai.tts.adapter?.stop()}pauseSpeaking(){this._state.ai.tts.adapter?.pause(),this._state.ai.tts.isSpeaking&&(this._state.ai.tts.isPaused=!0)}resumeSpeaking(){this._state.ai.tts.adapter?.resume(),this._state.ai.tts.isPaused&&(this._state.ai.tts.isPaused=!1)}getTTSVoices(){return this._state.ai.tts.adapter?.getVoices()??[]}async initializeLLM(e,t){let n=t?.type??`webllm`,r=Ot(n,e);if(r&&r.initState===`ready`)return this._state.ai.llm.adapter=r.adapter,this._state.ai.llm.initState=`ready`,this._state.ai.llm.currentModel=r.adapter.currentModel,this._state.ai.llm.error=null,r.adapter;if(this._state.ai.llm.adapter&&this._state.ai.llm.initState===`ready`&&(!e||this._state.ai.llm.currentModel===e))return this._state.ai.llm.adapter;this._state.ai.llm.initState=`initializing`,this._state.ai.llm.error=null,G(n,e,{initState:`initializing`});let i=t=>{this._state.ai.llm.downloadProgress=t,G(n,e,{downloadProgress:t}),t.percent>0&&this.updateLoadingState({overallProgress:t.percent})};try{let{getLLM:r}=await v(async()=>{let{getLLM:e}=await import(`./DkR8_Ws6.js`).then(e=>e.t);return{getLLM:e}},__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29]),import.meta.url),a=await r(t);return await a.ensureInitialized(e,i),kt(n,a,e,`ready`),this._state.ai.llm.adapter=a,this._state.ai.llm.initState=`ready`,this._state.ai.llm.currentModel=a.currentModel,this._state.ai.llm.downloadProgress=null,a}catch(t){let r=t instanceof Error?t:Error(String(t));throw this._state.ai.llm.initState=`error`,this._state.ai.llm.error=r,G(n,e,{initState:`error`,error:r}),t}}async chat(e,t){let n=await this.initializeLLM();this._state.ai.llm.isGenerating=!0;try{return await n.message(e,{systemPrompt:t?.systemPrompt,onToken:t?.onToken})}finally{this._state.ai.llm.isGenerating=!1}}async unloadLLM(){let e=this._state.ai.llm.adapter,t=e?.currentModel??void 0;await e?.unloadModel(),e&&G(e.type,t,{initState:`uninitialized`,downloadProgress:null,error:null}),this._state.ai.llm.adapter=null,this._state.ai.llm.initState=`uninitialized`,this._state.ai.llm.currentModel=null}unsubscribeAllAdapterEvents(){for(let e of[...this._sttSubscriptions.values()])e();for(let e of[...this._ttsSubscriptions.values()])e();this._sttSubscriptions.clear(),this._ttsSubscriptions.clear()}async dispose(){this._idleCallbackId!==null&&typeof cancelIdleCallback<`u`&&(cancelIdleCallback(this._idleCallbackId),this._idleCallbackId=null),this._preloadInFlight=!1,this.disconnectSocket(),this.unsubscribeAllAdapterEvents();let e=this._state.ai.stt.adapter;e&&!St(e.type)&&await e.dispose?.();let t=this._state.ai.tts.adapter;t&&!Tt(t.type)&&await t.dispose?.();let n=this._state.ai.llm.adapter;n&&!Ot(n.type,n.currentModel??void 0)&&await n.dispose?.(),this._state=yt()}get isAIReady(){return this._state.aiLoading.phase===`ready`||this._state.aiLoading.phase===`idle`}get isAILoading(){return this._state.aiLoading.phase===`checking`||this._state.aiLoading.phase===`downloading`||this._state.aiLoading.phase===`initializing`}};function Mt(e){return new jt(e)}var Nt=new Set([`focus`,`reveal`,`highlight`,`explain`,`validate`,`stage`,`apply`,`clear`,`undo`]),Pt=`smrt_ui_`,Ft=/^[A-Za-z][A-Za-z0-9_-]{0,63}$/,It=new Set([`invalid_request`,`invalid_identifier`,`limit_exceeded`,`not_found`]),Lt=new Set([`not_found`,`consent_required`,`human_confirmation_required`,`sensitive_control`,`control_not_writable`,`control_not_editable`,`nothing_to_undo`,`denied`]),Rt=new WeakMap,zt=class extends Error{reason;details;constructor(e,t){super(e),this.reason=e,this.details=t}};function J(e,t){return new zt(e,t)}function Bt(e){return JSON.stringify({ok:!0,result:e})}function Vt(e,t){return JSON.stringify({ok:!1,reason:e,...t?{details:t}:{}})}function Ht(e){return new TextEncoder().encode(JSON.stringify(e)).byteLength}function Y(e){if(Ht(e)>1e5)throw J(`limit_exceeded`)}function X(e,t,n=256){if(typeof e!=`string`||e.length===0||e.length>n||Array.from(e).some(e=>{let t=e.charCodeAt(0);return t<32||t===127}))throw J(`invalid_identifier`,t);return e}function Ut(e,t){return e===void 0?void 0:X(e,t)}function Z(e){if(!e||typeof e!=`object`||Array.isArray(e))throw J(`invalid_request`);return e}function Wt(e){let t=Z(e),n=t.subject,r=n===void 0?void 0:(()=>{let e=Z(n);return{type:X(e.type,`subject.type`),id:X(e.id,`subject.id`),...e.label===void 0?{}:{label:X(e.label,`subject.label`)}}})();return{formId:X(t.formId,`formId`),controlId:X(t.controlId,`controlId`),...r?{subject:r}:{}}}function Gt(e){let t=Z(e),n=t.kind;if(![`table`,`list`,`report`,`custom`].includes(String(n)))throw J(`invalid_request`,`identity.kind`);let r=t.subject,i=r===void 0?void 0:(()=>{let e=Z(r);return{type:X(e.type,`subject.type`),id:X(e.id,`subject.id`),...e.label===void 0?{}:{label:X(e.label,`subject.label`)}}})();return{surfaceId:X(t.surfaceId,`surfaceId`),kind:n,...i?{subject:i}:{}}}function Kt(e){let t=e.metadata.sensitivity===`sensitive`||e.metadata.sensitivity===`secret`,n=t||e.state.valueRedacted,r=t||e.state.stagedValueRedacted||e.state.staged?.valueRedacted===!0,i=e.state.staged?{...e.state.staged,...r?{value:void 0,valueRedacted:!0}:{},validationMessage:void 0}:void 0;return{...e,identity:{...e.identity},metadata:{...e.metadata,constraints:e.metadata.constraints?{...e.metadata.constraints}:void 0,options:e.metadata.options?.map(e=>({...e}))},state:{...e.state,...n?{value:void 0,valueRedacted:!0}:{},...r?{stagedValue:void 0,stagedValueRedacted:!0}:{},...i?{staged:i}:{},validationMessage:void 0}}}function qt(e){let t=e.reason?Lt.has(e.reason)?e.reason:`execution_failed`:void 0;return{ok:e.ok,action:e.action,identity:{...e.identity},...t?{reason:t}:{},...e.snapshot?{snapshot:Kt(e.snapshot)}:{}}}function Jt(e,t,n,r){if(Array.isArray(e))return e.filter(e=>r!==`columnOrder`||typeof e!=`string`||!t.has(e)).map(e=>Jt(e,t,n,r)).filter(e=>e!==void 0);if(!e||typeof e!=`object`)return e;let i=e;if(!(typeof i.columnId==`string`&&t.has(i.columnId)))return Object.fromEntries(Object.entries(i).flatMap(([e,r])=>{if(t.has(e)||n&&(e===`selection`||e===`selectedRowIds`||e===`expandedRowIds`))return[];let i=Jt(r,t,n,e);return i===void 0?[]:[[e,i]]}))}function Yt(e){let t=e.columns.filter(e=>e.visibility!==`hidden`),n=new Set(t.map(e=>e.id)),{rowKey:r,...i}=e;return{...i,identity:{...e.identity},...n.has(r)?{rowKey:r}:{},columns:t,query:{...e.query,projectableColumnIds:e.query.projectableColumnIds.filter(e=>n.has(e)),searchableColumnIds:e.query.searchableColumnIds?.filter(e=>n.has(e)),filterableColumnIds:e.query.filterableColumnIds?.filter(e=>n.has(e)),sortableColumnIds:e.query.sortableColumnIds?.filter(e=>n.has(e))},actions:e.actions.filter(e=>(e.columnIds??[]).every(e=>n.has(e)))}}function Xt(e){let t=new Set(e.descriptor.columns.filter(e=>e.visibility===`hidden`).map(e=>e.id)),n=t.has(e.descriptor.rowKey),r=Jt(e.state,t,n);return{...e,descriptor:Yt(e.descriptor),state:r,selection:n?null:e.selection}}function Q(e){return Promise.resolve().then(e).then(Bt).catch(e=>e instanceof zt&&It.has(e.reason)?Vt(e.reason,e.details):Vt(`execution_failed`))}function $(e,t,n,r){return{name:e,description:t,inputSchema:n,annotations:{readOnlyHint:!0,untrustedContentHint:!0},execute:r}}function Zt(e,t,n){let r={type:`object`,required:[`formId`,`controlId`],additionalProperties:!1,properties:{formId:{type:`string`,minLength:1,maxLength:256},controlId:{type:`string`,minLength:1,maxLength:256},subject:{type:`object`}}},i={type:`object`,required:[`surfaceId`,`kind`],additionalProperties:!1,properties:{surfaceId:{type:`string`,minLength:1,maxLength:256},kind:{type:`string`,enum:[`table`,`list`,`report`,`custom`]},subject:{type:`object`}}};return[$(`${e}list_form_controls`,`List the controls currently mounted in SMRT forms.`,{type:`object`,additionalProperties:!1,properties:{formId:{type:`string`,minLength:1,maxLength:256}}},e=>Q(()=>{Y(e);let n=Ut(Z(e).formId,`formId`);return t.list(n).map(Kt)})),$(`${e}inspect_form_control`,`Inspect one currently mounted SMRT form control.`,{type:`object`,required:[`identity`],additionalProperties:!1,properties:{identity:r}},e=>Q(()=>{Y(e);let n=Z(e),r=t.get(Wt(n.identity));if(!r)throw J(`not_found`);return Kt(r)})),{name:`${e}execute_form_control`,description:"Execute an allowed command on a mounted SMRT form control. Agent mutations are consent-gated. An agent never moves keyboard focus: `focus` scrolls the control into view and highlights it.",inputSchema:{type:`object`,required:[`action`,`identity`],additionalProperties:!1,properties:{action:{type:`string`,enum:[...Nt]},identity:r,value:{},durationMs:{type:`number`,minimum:0,maximum:6e4}}},annotations:{readOnlyHint:!1,untrustedContentHint:!0},execute:e=>Q(async()=>{Y(e);let n=Z(e);if(`confirmed`in n)throw J(`invalid_request`,`confirmed`);if(!Nt.has(n.action))throw J(`invalid_request`,`action`);let r=n.action,i=Wt(n.identity),a;if(r===`stage`){if(!(`value`in n))throw J(`invalid_request`,`value`);a={action:r,identity:i,value:n.value}}else if(r===`apply`)a=`value`in n?{action:r,identity:i,value:n.value}:{action:r,identity:i};else if(r===`highlight`){if(n.durationMs!==void 0&&(typeof n.durationMs!=`number`||n.durationMs<0||n.durationMs>6e4))throw J(`invalid_request`,`durationMs`);a={action:r,identity:i,durationMs:n.durationMs}}else a={action:r,identity:i};return qt(await t.execute(a,{source:`agent`}))})},$(`${e}list_data_surfaces`,`List the data surfaces currently mounted in this SMRT Provider.`,{type:`object`,additionalProperties:!1,properties:{}},e=>Q(()=>(Y(e),Z(e),n.list().map(Yt)))),$(`${e}inspect_data_surface`,`Inspect one currently mounted SMRT data surface.`,{type:`object`,required:[`identity`],additionalProperties:!1,properties:{identity:i}},e=>Q(()=>{Y(e);let t=Z(e),r=n.inspect(Gt(t.identity));if(!r)throw J(`not_found`);return Xt(r)})),{name:`${e}execute_data_surface_control`,description:`Execute a bounded visible-state command on a mounted SMRT data surface.`,inputSchema:{type:`object`,required:[`version`,`commandId`,`identity`,`expectedRevision`,`controlId`],additionalProperties:!1,properties:{version:{type:`number`,const:1},commandId:{type:`string`,minLength:1,maxLength:256},identity:i,expectedRevision:{type:`number`,minimum:0},controlId:{type:`string`,minLength:1,maxLength:256},payload:{}}},annotations:{readOnlyHint:!1,untrustedContentHint:!0},execute:e=>Q(async()=>{Y(e);let t=Z(e);if(t.version!==1)throw J(`invalid_request`,`version`);if(typeof t.expectedRevision!=`number`||!Number.isSafeInteger(t.expectedRevision)||t.expectedRevision<0)throw J(`invalid_request`,`expectedRevision`);let r={version:1,commandId:X(t.commandId,`commandId`),identity:Gt(t.identity),expectedRevision:t.expectedRevision,controlId:X(t.controlId,`controlId`),...`payload`in t?{payload:t.payload}:{}},i=await n.execute(r);return i.snapshot?{...i,snapshot:Xt(i.snapshot)}:i})}]}function Qt(e){let t=e.prefix??Pt;if(!Ft.test(t))throw TypeError(`Invalid WebMCP UI tool prefix`);let n=e.document??globalThis.document,r=n?.modelContext;if(!r||typeof r.registerTool!=`function`)return()=>{};let i=Rt.get(n),a;if(i&&i.modelContext===r?a=i.prefixes:(a=new Set,Rt.set(n,{modelContext:r,prefixes:a})),a.has(t))throw Error(`WebMCP UI prefix is already registered: ${t}`);a.add(t);let o=Zt(t,e.controlRegistry,e.dataSurfaceRegistry),s;try{s=be(o.map(e=>e.name),`ui`,{document:n})}catch(e){throw a.delete(t),e}let c=new AbortController,l=!1,u=()=>{l||(l=!0,c.abort(),a.delete(t),s.release())};try{for(let e of o){let t=Object.assign({[Se]:e.annotations?.readOnlyHint?`read`:`write`},e,{execute:xe(e.execute)}),n=r.registerTool(t,{signal:c.signal});n&&Promise.resolve(n).catch(u)}}catch(e){throw u(),e}return u}var $t=o(`<!> <!>`,1);function en(o,f){e(f,!0);let p=l(f,`autoEnableSmrt`,3,!1),g=l(f,`user`,3,null),ie=l(f,`permissions`,19,()=>[]),ae=_(()=>f.ai?.showLoadingOverlay??!0),y=d(()=>Mt({initialMode:f.mode,session:{preferences:{autoEnableSmrt:p()}},onCapabilitiesDetected:()=>{f.onReady?.()},onModeChange:e=>{f.onModeChange?.(e)},onAILoadingChange:e=>{f.onAILoadingChange?.(e)}})),oe=se(),ce=ct(),b=_(()=>typeof f.webmcp==`object`?f.webmcp:void 0),x=_(()=>f.webmcp===!0?{}:typeof c(b)?.ui==`object`?c(b).ui:void 0),le=_(()=>c(x)?.controlRegistry??oe),ue=_(()=>c(x)?.dataSurfaceRegistry??ce);he({get enabled(){return c(x)!==void 0},get controlRegistry(){return c(le)},get dataSurfaceRegistry(){return c(ue)}}),ye({get effects(){return c(b)?.effects}}),h(()=>{let e=d(()=>y.state.session.preferences);e.autoEnableSmrt!==p()&&y.updateSession({preferences:{...e,autoEnableSmrt:p()}})}),h(()=>{if(typeof window<`u`&&f.webmcp&&c(x))try{return Qt({controlRegistry:c(le),dataSurfaceRegistry:c(ue),...c(x).prefix?{prefix:c(x).prefix}:{}})}catch(e){C.warn(`Provider: WebMCP UI tool registration rejected`,{error:e})}}),h(()=>{if(typeof window>`u`||!f.webmcp)return;let e=typeof f.webmcp==`object`?f.webmcp:{},t=!1,n=()=>{};return v(async()=>{let{registerWebMcpTools:e}=await import(`./B32EWqI8.js`).then(e=>e.t);return{registerWebMcpTools:e}},__vite__mapDeps([30,1,31]),import.meta.url).then(({registerWebMcpTools:r})=>{if(t)return;let i=r(e.definitions??[],{client:e.client,basePath:e.basePath,fetchFn:e.fetchFn,scope:e.scope,filter:e.filter,filterTool:e.filterTool,resolveFetchers:e.resolveFetchers,resolveToolFetchers:e.resolveToolFetchers,effects:e.effects,namespace:e.namespace,maxTools:e.maxTools});n=i,i.ready.catch(e=>{t||C.warn(`Provider: WebMCP data tool registration rejected`,{error:e})})}).catch(e=>{t||C.warn(`Provider: WebMCP data tool registration rejected`,{error:e})}),()=>{t=!0,n()}}),h(()=>{f.mode&&y.setMode(f.mode,`explicit`)}),ve(y);let S=d(()=>ne(f.i18n));re(S),h(()=>{f.i18n&&(S.snapshot=f.i18n)}),h(()=>{typeof window<`u`&&d(()=>{y.initialize()})}),h(()=>{y.setUser(g(),ie())}),h(()=>{if(typeof window<`u`&&f.socket)return y.connectSocket(f.socket),()=>{y.disconnectSocket()}}),h(()=>{typeof window<`u`&&f.ai&&d(()=>{y.setAIConfig(f.ai)})}),m(()=>{y.dispose().catch(e=>{C.error(`AppState dispose failed during Provider teardown`,{error:e})})});var de=$t(),fe=u(de),pe=e=>{var r=t(),i=u(r);te(i,()=>v(()=>import(`./CrFNLK0f.js`),__vite__mapDeps([32,8,1,9,18,10,19,33]),import.meta.url),null,(e,r)=>{var i=t(),a=u(i);n(a,()=>c(r).default,(e,t)=>{t(e,{get message(){return f.ai.loadingMessage},dismissible:!0})}),s(e,i)}),s(e,r)};i(fe,e=>{f.ai&&c(ae)&&e(pe)});var me=ee(fe,2);r(me,()=>f.children),s(o,de),a()}function tn(e){return e.recipes.length===0&&e.features.length===0&&e.policies.length===0&&Object.keys(e.exposure??{}).length===0&&e.theme===void 0&&ae(e.layout)}function nn(e,t,n){return t(n?pe(structuredClone(e.document),n):e.document)}function rn(e){return!tn(e.snapshot())}function an(e,t,n){let r=nn(e,y,n);if(r.ok){let n=r.cookbook.theme?void 0:t.theme;t.replace(r.cookbook),n&&(t.theme=n),we(e.id)}return r}function on(e,t){return e.document.recipes.every(e=>t.recipes.includes(e))&&e.document.features.every(e=>t.features.includes(e))}function sn(e){let t=e.recipes.flatMap(e=>{let t=b.get(e);return t?[t]:[]}),n=ce(t).map(e=>{let t=new Set,n=[];for(let r of e.recipes)for(let e of fe(r)){let r=ue(e.packageId,e.model.name,e.key);t.has(r)||(t.add(r),n.push({id:r,href:`#`,label:e.label,icon:e.icon,description:e.description}))}return{id:`section:${e.id}`,heading:e.label,items:n}}).filter(e=>e.items.length>0),r=x(e.features).map(e=>({id:e.id,href:`#`,label:e.label,icon:e.icon,description:e.description}));return r.length&&n.push({id:`section:${S.id}`,heading:S.label,items:r}),n}function cn(e){let t=e.layout;return ie([],sn(e),void 0,t).groups.map(e=>({id:e.id??String(e.heading),label:e.heading??``,entries:e.items.map(e=>({id:e.id??e.href,label:t?.items?.[e.id??e.href]?.label?.trim()||e.label}))}))}var ln={live:`Live`,mock:`Mock`,sample:`Sample`,server:`Server`},un={live:`Runs for real in your browser.`,mock:`Runs in your browser, but a provider is faked.`,sample:`Shows sample data only; it cannot reach what it needs.`,server:`Needs a server, which this browser-only demo does not have.`},dn={live:`success`,mock:`info`,sample:`warning`,server:`default`};function fn(e){return e.effectiveDemo??e.demo}function pn(e){if(e)return{mode:e.mode,label:ln[e.mode],meaning:un[e.mode],variant:dn[e.mode],reasons:e.reasons,mocked:e.mocked??[]}}function mn(e){if(!e)return;if(e.status===`browser-safe`)return`Its package builds for a browser.`;let t=[`Its package does not build for a browser yet`];return e.reason&&t.push(`(${e.reason})`),e.issues?.length&&t.push(`and is tracked in ${e.issues.join(`, `)}`),`${t.join(` `)}.`}function hn(){return _e({storage:oe(),defaults:e=>me.apply(e).background,empty:[Ee,Oe],samples:De(ge),children:{models:Te.packages.flatMap(e=>e.models),links:e=>le(Te,de,e)}})}var gn=new class{#e=g(void 0);get endpoint(){return c(this.#e)}set endpoint(e){f(this.#e,e,!0)}#t=g(!1);get tokenInConfig(){return c(this.#t)}set tokenInConfig(e){f(this.#t,e,!0)}#n=g(void 0);get token(){return c(this.#n)}set token(e){f(this.#n,e,!0)}#r=g(`idle`);get status(){return c(this.#r)}set status(e){f(this.#r,e,!0)}#i=g(void 0);get outcome(){return c(this.#i)}set outcome(e){f(this.#i,e,!0)}get config(){return this.endpoint&&this.token&&!this.tokenInConfig?{endpoint:this.endpoint,token:this.token}:void 0}get needsLink(){return!!this.endpoint&&!this.token&&!this.tokenInConfig}configure(e,t){this.endpoint=e?.endpoint,this.tokenInConfig=e?.tokenInConfig===!0,this.token=e?t:void 0,this.status=`idle`,this.outcome=void 0}async send(e,t){let n=this.config;if(!n||this.status===`sending`)return;this.status=`sending`,this.outcome=void 0;let r=await Ce(n,e,t);this.outcome=r,this.status=r.ok?`sent`:`failed`}};export{it as _,fn as a,an as c,en as d,vt as f,gt as g,ht as h,pn as i,on as l,_t as m,hn as n,sn as o,lt as p,mn as r,cn as s,gn as t,rn as u};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{n as e}from"./Dd_uD5pT.js";import{y as t}from"./CygC84VT.js";import{a as n,r}from"./C7zBd-pD.js";import{t as i}from"./CA-A9Ngs.js";function a(e){return t=>{t.allowLocalModels=e,t.useBrowserCache=!0;let n=globalThis.crossOriginIsolated===!0,r=t.backends?.onnx?.wasm;r&&!n&&(r.numThreads=1)}}var o=`onnx-community/whisper-tiny.en`,s={"moonshine-tiny":{id:`onnx-community/moonshine-tiny-ONNX`,bytes:322e5,englishOnly:!0,label:`Moonshine tiny`},"moonshine-base":{id:`onnx-community/moonshine-base-ONNX`,bytes:67e6,englishOnly:!0,label:`Moonshine base`},"whisper-tiny.en":{id:o,bytes:451e5,englishOnly:!0,label:`Whisper tiny (English)`},"whisper-base.en":{id:`onnx-community/whisper-base.en`,bytes:85e6,englishOnly:!0,label:`Whisper base (English)`},"whisper-small.en":{id:`onnx-community/whisper-small.en`,bytes:26e7,englishOnly:!0,label:`Whisper small (English)`}};function c(e){return e?s[e]?.id??e:o}function l(e){return Object.values(s).some(t=>t.id===e&&t.englishOnly)||/\.en$|moonshine/i.test(e)}var u=`audio/pcm;rate=16000;channels=1;encoding=f32le`;function d(){let e=Error(`Download cancelled`);return e.name=`AbortError`,e}function f(e){return e?.split(/[-_]/)[0]?.toLowerCase()||void 0}function p(e){return{data:new Uint8Array(e.slice().buffer),mimeType:u}}async function m(e){try{return await(e?e():i(`@happyvertical/speech/local`))}catch{throw new r(`local-speech`,'@happyvertical/speech could not be loaded. Install it (and @huggingface/transformers) and pass `loadSpeech: () => import("@happyvertical/speech/local")`.')}}var h=class{createWorker;loadSpeech;progress;worker=null;client=null;constructor(e,t,n){this.createWorker=e,this.loadSpeech=t,this.progress=n}ensure(){return this.client??=m(this.loadSpeech).then(e=>{let t=this.createWorker();return this.worker=t,new e.LocalTranscriberWorkerClient(t,{onProgress:this.progress})}),this.client}async isCached(e){return(await this.ensure()).isCached(e)}async preload(e,t){if(t?.aborted)throw d();let n=await this.ensure();if(!t)return n.preload(e);let r=()=>this.dispose();t.addEventListener(`abort`,r,{once:!0});try{await Promise.race([n.preload(e),new Promise((e,n)=>t.addEventListener(`abort`,()=>n(d()),{once:!0}))])}finally{t.removeEventListener(`abort`,r)}}async transcribe(e,t,n){return(await(await this.ensure()).transcribe({audio:p(e),model:t,language:f(n)})).text.trim()}dispose(){this.client?.then(e=>e.close()).catch(()=>void 0),this.worker?.terminate(),this.worker=null,this.client=null}},g=class{options;model;progress;transcriber=null;constructor(e,t,n){this.options=e,this.model=t,this.progress=n}ensure(){return this.transcriber??=m(this.options.loadSpeech).then(e=>new e.LocalTranscriber({model:this.model,device:this.options.device??`auto`,dtype:this.options.dtype??`q8`,...this.options.loadModule?{transformers:this.options.loadModule}:{},onProgress:this.progress,configureEnv:a(this.options.allowLocalModels??!1)})),this.transcriber}async isCached(e){return(await this.ensure()).isCached(e)}async preload(e,t){if(t?.aborted)throw d();await(await this.ensure()).preload(e,t).catch(e=>{throw t?.aborted?d():e})}async transcribe(e,t,n){return(await(await this.ensure()).transcribe({audio:p(e),model:t,language:f(n)})).text.trim()}dispose(){this.transcriber?.then(e=>e.dispose()).catch(()=>void 0),this.transcriber=null}},_=class{options;modelId;backend=null;loadPromise=null;listeners=new Set;_state=`idle`;constructor(e={}){this.options=e,this.modelId=c(e.model??e.modelId)}get state(){return this._state}get ready(){return this._state===`ready`}get englishOnly(){return l(this.modelId)}estimateSize(){return Object.values(s).find(e=>e.id===this.modelId)?.bytes??451e5}emit(e){for(let t of this.listeners)t(e)}onEngineProgress=e=>{if(e.status!==`progress_total`||typeof e.loaded!=`number`||typeof e.total!=`number`)return;let t=this.estimateSize(),n=e.total||t,r=e.total>0&&e.loaded>=e.total;this.emit({state:r?`extracting`:`downloading`,bytesLoaded:e.loaded,bytesTotal:n,percent:e.total?Math.round(e.loaded/e.total*100):0,currentFile:e.file})};getBackend(){if(this.backend)return this.backend;let{createWorker:e,loadSpeech:t}=this.options;return this.backend=e?new h(e,t,this.onEngineProgress):new g(this.options,this.modelId,this.onEngineProgress),this.backend}async isCached(){if(this._state===`ready`)return!0;try{return await this.getBackend().isCached(this.modelId)}catch{return!1}}load(e={}){let{onProgress:t,signal:n}=e;if(this._state===`ready`)return Promise.resolve();if(t&&this.listeners.add(t),!this.loadPromise){this._state=`loading`;let e=this.estimateSize();this.emit({state:`downloading`,bytesLoaded:0,bytesTotal:e,percent:0}),this.loadPromise=this.getBackend().preload(this.modelId,n).then(()=>{this._state=`ready`,this.emit({state:`complete`,bytesLoaded:e,bytesTotal:e,percent:100})}).catch(t=>{this._state=`idle`,this.backend?.dispose(),this.backend=null;let n=t instanceof Error?t:Error(String(t));throw n.name!==`AbortError`&&(this._state=`error`,this.emit({state:`error`,bytesLoaded:0,bytesTotal:e,percent:0,error:n.message})),n}).finally(()=>{this.loadPromise=null,this.listeners.clear()})}let r=this.loadPromise;return n?new Promise((e,t)=>{if(n.aborted)return t(d());n.addEventListener(`abort`,()=>t(d()),{once:!0}),r.then(e,t)}):r}transcribe(e,t){return this._state===`ready`?this.getBackend().transcribe(e,this.modelId,t):Promise.reject(Error(`The speech model is not loaded`))}dispose(){this.backend?.dispose(),this.backend=null,this.loadPromise=null,this.listeners.clear(),this._state=`idle`}};function v(e={}){return new _(e)}var y=e({LocalSpeechSTTAdapter:()=>w,WhisperLocalSTTAdapter:()=>w,WhisperWasmSTTAdapter:()=>w}),b={tiny:`onnx-community/whisper-tiny.en`,base:`onnx-community/whisper-base.en`,small:`onnx-community/whisper-small.en`},x=16e3,S=9e4;async function C(e){let t=await e.arrayBuffer(),n=new AudioContext({sampleRate:x});try{return(await n.decodeAudioData(t)).getChannelData(0).slice()}finally{n.close().catch(()=>void 0)}}var w=class{type;stopTimeoutMs=S;options;_model;makeCapture;capture=null;captureOff=null;_isListening=!1;language=`en`;session=0;starting=!1;stopping=null;resultListeners=new Set;errorListeners=new Set;startListeners=new Set;endListeners=new Set;constructor(e={}){this.options={type:`whisper-local`,defaultLanguage:`en`,...e},this.type=this.options.type,this.language=this.options.defaultLanguage??`en`,this.makeCapture=e.capture??t;let n=this.options.model??this.options.modelId??(this.options.modelSize?b[this.options.modelSize]:this.type===`moonshine`?`moonshine-tiny`:void 0);this._model=this.options.modelHandle??v({model:n,device:this.options.device,dtype:this.options.dtype,createWorker:this.options.createWorker,loadSpeech:this.options.loadSpeech,loadModule:this.options.loadModule,allowLocalModels:this.options.allowLocalModels})}get model(){return this._model}get initState(){switch(this._model.state){case`ready`:return`ready`;case`loading`:return`initializing`;case`error`:return`error`;default:return`uninitialized`}}estimateSize(){return this._model.estimateSize()}isCached(){return this._model.isCached()}load(e){return this._model.load(e)}async ensureInitialized(e){await this._model.load({onProgress:e??this.options.onProgress})}async prepare(){if(this._model.state!==`ready`){if(!await this._model.isCached())throw new n(this._model.modelId,this.type);await this.ensureInitialized()}}getCapabilities(){return{continuous:!1,interimResults:!1,languages:this._model.englishOnly?[`en`]:[`en`,`es`,`fr`,`de`,`it`,`pt`,`nl`,`pl`,`ru`,`zh`,`ja`,`ko`],accuracy:`medium`,requiresDownload:!0,downloadSize:this._model.estimateSize()}}async transcribePcm(e,t={}){return await this.prepare(),this._model.transcribe(e,t.language??this.options.defaultLanguage??`en`)}async start(e={}){if(this._isListening||this.starting)return;let t=++this.session;this.starting=!0;try{await this.prepare()}finally{this.starting=!1}if(t!==this.session||this._isListening)return;this.language=e.language??this.options.defaultLanguage??`en`;let n=this.makeCapture({maxDurationMs:this.options.maxDurationMs});try{await n.start()}catch(e){let t=e instanceof Error?e:Error(String(e));throw this.emitError(t),t}if(t!==this.session){n.cancel();return}this.capture=n,this.captureOff=n.onLimit(e=>{e===`time`?this.stop():(this.captureOff?.(),this.finish(t,null,Error(`The recording is too long`)))}),this._isListening=!0;for(let e of this.startListeners)e()}stop(){if(this.stopping)return this.stopping;let e=this.capture;if(this.starting&&this.session++,!e||!this._isListening)return Promise.resolve();let t=this.session;return this.stopping=(async()=>{let n=null,r=null;try{let r=await e.stop();if(t!==this.session)return;let i=await C(r.audio);n=await this._model.transcribe(i,this.language)}catch(e){r=e instanceof Error?e:Error(String(e))}await this.finish(t,n,r)})(),this.stopping}async finish(e,t,n){if(e===this.session){if(this.captureOff?.(),this.captureOff=null,this.capture=null,this._isListening=!1,this.stopping=null,n)this.emitError(n);else if(t){let e={text:t,confidence:1,isFinal:!0,timestamp:Date.now()};for(let t of this.resultListeners)t(e)}for(let e of this.endListeners)e()}}emitError(e){for(let t of this.errorListeners)t(e)}abort(){if(this.starting&&this.session++,this._isListening){this.session++,this.captureOff?.(),this.captureOff=null,this.capture?.cancel(),this.capture=null,this._isListening=!1,this.stopping=null;for(let e of this.endListeners)e()}}isListening(){return this._isListening}onResult(e){return this.resultListeners.add(e),()=>this.resultListeners.delete(e)}onError(e){return this.errorListeners.add(e),()=>this.errorListeners.delete(e)}onStart(e){return this.startListeners.add(e),()=>this.startListeners.delete(e)}onEnd(e){return this.endListeners.add(e),()=>this.endListeners.delete(e)}async dispose(){this.abort(),this.options.modelHandle||this._model.dispose(),this.resultListeners.clear(),this.errorListeners.clear(),this.startListeners.clear(),this.endListeners.clear()}};export{s as n,v as r,y as t};
|