@happyvertical/smrt-planner 0.0.0-stage → 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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/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/BYde9M_U.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/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/CV-2zt0K.js +2 -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/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/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/D333l2GL.js +2 -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/DJtH-lRi.js +3 -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/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/DyGfbRG-.js +1 -0
- package/app/_app/immutable/chunks/FbOxj-PF.js +69 -0
- package/app/_app/immutable/chunks/OJ_lLTHH.js +1 -0
- package/app/_app/immutable/chunks/QukgIHDX.js +1 -0
- package/app/_app/immutable/chunks/WxSPP8QW.js +4 -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/ufuM4XBq.js +33 -0
- package/app/_app/immutable/chunks/xihTtKlq.js +1 -0
- package/app/_app/immutable/entry/app.D5JJain6.js +2 -0
- package/app/_app/immutable/entry/start.CH9DJLgI.js +1 -0
- package/app/_app/immutable/nodes/0.CL1MxOva.js +10 -0
- package/app/_app/immutable/nodes/1.BO731RRg.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.BmZyLHbM.js +1 -0
- package/app/_app/immutable/nodes/2.BEw046av.js +17 -0
- package/app/_app/immutable/nodes/3.DvwpTAQA.js +1 -0
- package/app/_app/immutable/nodes/4.qrT4bnmS.js +1 -0
- package/app/_app/immutable/nodes/5.DDLa2uhV.js +1 -0
- package/app/_app/immutable/nodes/6.DN0QTY6z.js +1 -0
- package/app/_app/immutable/nodes/7.C_8N82Wq.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 +125 -0
- package/dist/ai/state.svelte.js +286 -0
- package/dist/ai/status.d.ts +67 -0
- package/dist/ai/status.js +117 -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 +73 -0
- package/dist/assistant/session.svelte.js +163 -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 +499 -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 +314 -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 +12 -0
- package/dist/core/app.js +15 -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 +86 -0
- package/dist/inference/byo.svelte.js +267 -0
- package/dist/inference/config.d.ts +70 -0
- package/dist/inference/config.js +149 -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 +202 -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 +109 -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 +80 -3
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
import { getModel, shortLabel } from "../assistant/models.js";
|
|
2
|
+
import { AssistantSession, } from "../assistant/session.svelte.js";
|
|
3
|
+
import { loadVoiceConsent, VoiceSession, } from "../assistant/voice.svelte.js";
|
|
4
|
+
import { ByoModel } from "../inference/byo.svelte.js";
|
|
5
|
+
import { DEFAULT_INFERENCE, } from "../inference/config.js";
|
|
6
|
+
import { createHostChat } from "../inference/host.js";
|
|
7
|
+
import { createSliceController } from "../planner/commands/index.js";
|
|
8
|
+
import { deriveCapabilities, needsFirstRunSetup, } from "./status.js";
|
|
9
|
+
export const AI_PREFS_KEY = 'smrt-planner:ai:v1';
|
|
10
|
+
export function loadAiPrefs(storage) {
|
|
11
|
+
const prefs = {
|
|
12
|
+
dismissed: false,
|
|
13
|
+
readAloud: false,
|
|
14
|
+
handsFree: false,
|
|
15
|
+
sendOnPause: false,
|
|
16
|
+
};
|
|
17
|
+
try {
|
|
18
|
+
const raw = storage?.getItem(AI_PREFS_KEY);
|
|
19
|
+
if (!raw)
|
|
20
|
+
return prefs;
|
|
21
|
+
const value = JSON.parse(raw);
|
|
22
|
+
prefs.dismissed = value.dismissed === true;
|
|
23
|
+
prefs.readAloud = value.readAloud === true;
|
|
24
|
+
prefs.handsFree = value.handsFree === true;
|
|
25
|
+
prefs.sendOnPause = value.sendOnPause === true;
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
// Unreadable or unavailable: the defaults.
|
|
29
|
+
}
|
|
30
|
+
return prefs;
|
|
31
|
+
}
|
|
32
|
+
export function saveAiPrefs(storage, prefs) {
|
|
33
|
+
try {
|
|
34
|
+
storage?.setItem(AI_PREFS_KEY, JSON.stringify(prefs));
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
// Not saved; the choice still holds for this visit.
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* The one store behind the sidebar icons, the AI models page, the first-visit
|
|
42
|
+
* form and the assistant: it owns the language-model session, the voice-typing
|
|
43
|
+
* session and the read-aloud choice, and reads them as three capabilities.
|
|
44
|
+
*/
|
|
45
|
+
export class AiState {
|
|
46
|
+
session;
|
|
47
|
+
voice;
|
|
48
|
+
prefs = $state({
|
|
49
|
+
dismissed: false,
|
|
50
|
+
readAloud: false,
|
|
51
|
+
handsFree: false,
|
|
52
|
+
sendOnPause: false,
|
|
53
|
+
});
|
|
54
|
+
/** True once the browser has read its saved state (nothing before). */
|
|
55
|
+
hydrated = $state(false);
|
|
56
|
+
/** The first-visit setup form is showing. */
|
|
57
|
+
firstRun = $state(false);
|
|
58
|
+
/**
|
|
59
|
+
* A reply is being read aloud, from the moment it is queued until the last
|
|
60
|
+
* utterance ends, errors or is cancelled. Hands-free listening pauses
|
|
61
|
+
* while this is true, so the microphone does not transcribe the voice.
|
|
62
|
+
*/
|
|
63
|
+
speaking = $state(false);
|
|
64
|
+
/** Where the model runs, from `planner.config.json` or the `inference` prop. */
|
|
65
|
+
inference = $state(DEFAULT_INFERENCE);
|
|
66
|
+
/** Set when the config was unusable and `browser` is used instead. */
|
|
67
|
+
notice = $state('');
|
|
68
|
+
/** The visitor's own endpoint (byo mode only). */
|
|
69
|
+
byo = $state(null);
|
|
70
|
+
/** Utterances queued and not yet ended; `speaking` is `pending > 0`. */
|
|
71
|
+
pending = 0;
|
|
72
|
+
/** Bumped on cancel so late events from cancelled utterances are ignored. */
|
|
73
|
+
generation = 0;
|
|
74
|
+
options;
|
|
75
|
+
/** The config is still being fetched: leave the first-run decision to `configure`. */
|
|
76
|
+
pendingConfig = false;
|
|
77
|
+
builtAtHydrate = false;
|
|
78
|
+
synth;
|
|
79
|
+
mic;
|
|
80
|
+
constructor(options) {
|
|
81
|
+
this.options = options;
|
|
82
|
+
this.session = new AssistantSession({
|
|
83
|
+
...options.session,
|
|
84
|
+
storage: options.storage,
|
|
85
|
+
onReply: (text) => this.speak(text),
|
|
86
|
+
});
|
|
87
|
+
this.voice = new VoiceSession({
|
|
88
|
+
...options.voice,
|
|
89
|
+
storage: options.storage,
|
|
90
|
+
});
|
|
91
|
+
this.synth =
|
|
92
|
+
options.synth !== undefined
|
|
93
|
+
? options.synth
|
|
94
|
+
: typeof speechSynthesis !== 'undefined'
|
|
95
|
+
? speechSynthesis
|
|
96
|
+
: null;
|
|
97
|
+
this.mic =
|
|
98
|
+
options.mic ??
|
|
99
|
+
(typeof navigator !== 'undefined' && !!navigator.mediaDevices);
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Read the saved choices, probe the browser's speech, and decide whether
|
|
103
|
+
* this is a first visit. Call once, in the browser, after the cookbook.
|
|
104
|
+
*/
|
|
105
|
+
hydrate(built) {
|
|
106
|
+
if (this.hydrated)
|
|
107
|
+
return;
|
|
108
|
+
this.prefs = loadAiPrefs(this.options.storage);
|
|
109
|
+
this.hydrated = true;
|
|
110
|
+
this.builtAtHydrate = built;
|
|
111
|
+
if (!this.pendingConfig)
|
|
112
|
+
this.decideFirstRun();
|
|
113
|
+
void this.voice.init();
|
|
114
|
+
}
|
|
115
|
+
/** The layout is fetching `planner.config.json`; `configure` follows. */
|
|
116
|
+
awaitConfig() {
|
|
117
|
+
this.pendingConfig = true;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Apply the inference config. `host` is ready at once (nothing to download);
|
|
121
|
+
* `byo` is ready once the visitor has connected an endpoint on the AI page;
|
|
122
|
+
* `browser` is today's WebLLM. An unusable config arrives as `browser` with
|
|
123
|
+
* a `notice`.
|
|
124
|
+
*/
|
|
125
|
+
configure(result) {
|
|
126
|
+
const { config, notice } = result;
|
|
127
|
+
this.pendingConfig = false;
|
|
128
|
+
this.inference = config;
|
|
129
|
+
this.notice = notice ?? '';
|
|
130
|
+
this.session.setMode(config.mode);
|
|
131
|
+
this.byo = null;
|
|
132
|
+
if (config.mode === 'host' && config.host) {
|
|
133
|
+
const { controller, store, settings, theme } = this.options.session;
|
|
134
|
+
const plan = controller ?? createSliceController({ store, settings, theme });
|
|
135
|
+
this.session.useRemote(createHostChat({
|
|
136
|
+
endpoint: config.host.endpoint,
|
|
137
|
+
snapshot: () => plan.snapshot(),
|
|
138
|
+
fetch: this.options.fetch,
|
|
139
|
+
}), 'Server');
|
|
140
|
+
}
|
|
141
|
+
else if (config.mode === 'byo') {
|
|
142
|
+
this.byo = new ByoModel({
|
|
143
|
+
storage: this.options.storage,
|
|
144
|
+
presets: config.byo?.presets,
|
|
145
|
+
fetch: this.options.fetch,
|
|
146
|
+
onChange: () => this.syncByo(),
|
|
147
|
+
});
|
|
148
|
+
this.syncByo();
|
|
149
|
+
}
|
|
150
|
+
if (this.hydrated)
|
|
151
|
+
this.decideFirstRun();
|
|
152
|
+
}
|
|
153
|
+
syncByo() {
|
|
154
|
+
const byo = this.byo;
|
|
155
|
+
if (!byo)
|
|
156
|
+
return;
|
|
157
|
+
this.session.useRemote(byo.active ? byo.chat() : null, byo.model);
|
|
158
|
+
}
|
|
159
|
+
decideFirstRun() {
|
|
160
|
+
// A host's server needs nothing set up, so the form has nothing to ask for.
|
|
161
|
+
this.firstRun =
|
|
162
|
+
this.inference.mode !== 'host' &&
|
|
163
|
+
needsFirstRunSetup({
|
|
164
|
+
thinkDownloaded: this.session.prefs.consented.length > 0 ||
|
|
165
|
+
this.session.status === 'ready',
|
|
166
|
+
hearDownloaded: loadVoiceConsent(this.options.storage),
|
|
167
|
+
readAloud: this.prefs.readAloud,
|
|
168
|
+
dismissed: this.prefs.dismissed,
|
|
169
|
+
built: this.builtAtHydrate,
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
/** Before hydration every capability reads as not set up, as on the server. */
|
|
173
|
+
get capabilities() {
|
|
174
|
+
const model = getModel(this.session.prefs.modelId);
|
|
175
|
+
const ready = this.hydrated;
|
|
176
|
+
return deriveCapabilities({
|
|
177
|
+
think: {
|
|
178
|
+
status: ready ? this.session.status : 'idle',
|
|
179
|
+
model: model ? shortLabel(model) : 'model',
|
|
180
|
+
progress: this.session.progress.progress,
|
|
181
|
+
downloaded: ready && this.session.prefs.consented.length > 0,
|
|
182
|
+
mode: this.session.mode,
|
|
183
|
+
remote: this.session.remoteLabel,
|
|
184
|
+
},
|
|
185
|
+
hear: {
|
|
186
|
+
status: ready ? this.voice.status : 'checking',
|
|
187
|
+
mic: !ready || this.mic,
|
|
188
|
+
},
|
|
189
|
+
speak: {
|
|
190
|
+
supported: !ready || this.synth !== null,
|
|
191
|
+
readAloud: ready && this.prefs.readAloud,
|
|
192
|
+
},
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
/** One sentence on where what the visitor types goes, for the AI page. */
|
|
196
|
+
get privacyNote() {
|
|
197
|
+
if (this.inference.mode === 'host') {
|
|
198
|
+
return "Your messages and a short summary of your plan go to this site's server. Voice typing and reading aloud stay on this device.";
|
|
199
|
+
}
|
|
200
|
+
if (this.inference.mode === 'byo') {
|
|
201
|
+
return '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.';
|
|
202
|
+
}
|
|
203
|
+
return 'Everything runs on this device. Nothing you type or say leaves the page.';
|
|
204
|
+
}
|
|
205
|
+
get speakSupported() {
|
|
206
|
+
return this.synth !== null;
|
|
207
|
+
}
|
|
208
|
+
/** "Continue": leave the first-visit form for now. */
|
|
209
|
+
continueFirstRun() {
|
|
210
|
+
this.firstRun = false;
|
|
211
|
+
}
|
|
212
|
+
/** "I don't need AI": remembered, so the form never leads again. */
|
|
213
|
+
dismissFirstRun() {
|
|
214
|
+
this.firstRun = false;
|
|
215
|
+
this.setPrefs({ ...this.prefs, dismissed: true });
|
|
216
|
+
}
|
|
217
|
+
setReadAloud(on) {
|
|
218
|
+
if (on && !this.synth)
|
|
219
|
+
return;
|
|
220
|
+
if (!on)
|
|
221
|
+
this.cancelSpeech();
|
|
222
|
+
this.setPrefs({ ...this.prefs, readAloud: on });
|
|
223
|
+
}
|
|
224
|
+
/** "Start when I talk, stop when I pause": remembered across visits. */
|
|
225
|
+
setHandsFree(on) {
|
|
226
|
+
this.setPrefs({ ...this.prefs, handsFree: on });
|
|
227
|
+
}
|
|
228
|
+
/** "Send when I stop talking": remembered across visits. */
|
|
229
|
+
setSendOnPause(on) {
|
|
230
|
+
this.setPrefs({ ...this.prefs, sendOnPause: on });
|
|
231
|
+
}
|
|
232
|
+
/** Hands-free is active and the visitor asked for a send on each pause. */
|
|
233
|
+
get sendOnPauseActive() {
|
|
234
|
+
return this.handsFreeActive && this.prefs.sendOnPause;
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Hands-free dictation is on and possible: the downloaded model is what
|
|
238
|
+
* writes the sentences down (the browser's own recogniser cannot).
|
|
239
|
+
*/
|
|
240
|
+
get handsFreeActive() {
|
|
241
|
+
return this.prefs.handsFree && this.voice.status === 'ready';
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Speak a reply when the visitor switched read-aloud on. Paragraphs are
|
|
245
|
+
* separate utterances; `speaking` stays true until the last one ends.
|
|
246
|
+
*/
|
|
247
|
+
speak(text) {
|
|
248
|
+
if (!this.prefs.readAloud || !this.synth || !text.trim())
|
|
249
|
+
return;
|
|
250
|
+
this.cancelSpeech();
|
|
251
|
+
const chunks = text
|
|
252
|
+
.split(/\n{2,}/)
|
|
253
|
+
.map((chunk) => chunk.trim())
|
|
254
|
+
.filter(Boolean);
|
|
255
|
+
const generation = this.generation;
|
|
256
|
+
this.pending = chunks.length;
|
|
257
|
+
this.speaking = true;
|
|
258
|
+
const settle = () => {
|
|
259
|
+
if (generation !== this.generation)
|
|
260
|
+
return;
|
|
261
|
+
this.pending = Math.max(0, this.pending - 1);
|
|
262
|
+
if (this.pending === 0)
|
|
263
|
+
this.speaking = false;
|
|
264
|
+
};
|
|
265
|
+
for (const chunk of chunks) {
|
|
266
|
+
const utterance = new SpeechSynthesisUtterance(chunk);
|
|
267
|
+
utterance.onend = settle;
|
|
268
|
+
utterance.onerror = settle;
|
|
269
|
+
this.synth.speak(utterance);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Stop talking now (typing, the microphone, read-aloud switched off).
|
|
274
|
+
* Clears `speaking` at once rather than waiting for the browser's events.
|
|
275
|
+
*/
|
|
276
|
+
cancelSpeech() {
|
|
277
|
+
this.generation += 1;
|
|
278
|
+
this.pending = 0;
|
|
279
|
+
this.speaking = false;
|
|
280
|
+
this.synth?.cancel();
|
|
281
|
+
}
|
|
282
|
+
setPrefs(prefs) {
|
|
283
|
+
this.prefs = prefs;
|
|
284
|
+
saveAiPrefs(this.options.storage, prefs);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import type { SessionStatus } from '../assistant/session.svelte.ts';
|
|
2
|
+
import type { VoiceStatus } from '../assistant/voice.svelte.ts';
|
|
3
|
+
import type { InferenceMode } from '../inference/config.ts';
|
|
4
|
+
/**
|
|
5
|
+
* What the three capabilities look like to the visitor, derived from the
|
|
6
|
+
* session states. Pure, so the sidebar icons, the setup page and the tests
|
|
7
|
+
* share one reading.
|
|
8
|
+
*
|
|
9
|
+
* - ready: set up and working right now
|
|
10
|
+
* - available: can be set up (or switched on) here
|
|
11
|
+
* - off: this browser cannot do it
|
|
12
|
+
*/
|
|
13
|
+
export type CapabilityId = 'think' | 'hear' | 'speak';
|
|
14
|
+
export type CapabilityState = 'ready' | 'available' | 'off';
|
|
15
|
+
export interface CapabilitySummary {
|
|
16
|
+
id: CapabilityId;
|
|
17
|
+
/** "Think", "Hear", "Speak". */
|
|
18
|
+
name: string;
|
|
19
|
+
state: CapabilityState;
|
|
20
|
+
/** The accessible name and tooltip: "Think: Qwen3 1.7B ready". */
|
|
21
|
+
label: string;
|
|
22
|
+
/** Where it runs: "In browser", "Server", "Your model: gpt-4o-mini". Think only. */
|
|
23
|
+
where?: string;
|
|
24
|
+
}
|
|
25
|
+
export interface CapabilityInput {
|
|
26
|
+
think: {
|
|
27
|
+
status: SessionStatus;
|
|
28
|
+
/** The selected model's short name. */
|
|
29
|
+
model: string;
|
|
30
|
+
/** Loading progress, 0 to 1. */
|
|
31
|
+
progress: number;
|
|
32
|
+
/** A model has been downloaded before. */
|
|
33
|
+
downloaded: boolean;
|
|
34
|
+
/** Where the model runs; default `browser`. */
|
|
35
|
+
mode?: InferenceMode;
|
|
36
|
+
/** Remote modes: the model's name, e.g. `gpt-4o-mini`. */
|
|
37
|
+
remote?: string;
|
|
38
|
+
};
|
|
39
|
+
hear: {
|
|
40
|
+
status: VoiceStatus;
|
|
41
|
+
/** The browser has a microphone API at all. */
|
|
42
|
+
mic: boolean;
|
|
43
|
+
};
|
|
44
|
+
speak: {
|
|
45
|
+
/** The browser has speech synthesis. */
|
|
46
|
+
supported: boolean;
|
|
47
|
+
readAloud: boolean;
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
export declare function deriveCapabilities(input: CapabilityInput): CapabilitySummary[];
|
|
51
|
+
/** What the visitor has set up, for the first-visit decision. */
|
|
52
|
+
export interface SetupFacts {
|
|
53
|
+
/** They downloaded a language model before. */
|
|
54
|
+
thinkDownloaded: boolean;
|
|
55
|
+
/** They downloaded the speech model before. */
|
|
56
|
+
hearDownloaded: boolean;
|
|
57
|
+
readAloud: boolean;
|
|
58
|
+
/** They chose "I don't need AI". */
|
|
59
|
+
dismissed: boolean;
|
|
60
|
+
/** They already built something (recipes or features). */
|
|
61
|
+
built: boolean;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Whether the first thing shown is the AI setup form: only for a visitor who
|
|
65
|
+
* has set nothing up, has not said they do not need AI, and has nothing built.
|
|
66
|
+
*/
|
|
67
|
+
export declare function needsFirstRunSetup(facts: SetupFacts): boolean;
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
export function deriveCapabilities(input) {
|
|
2
|
+
return [
|
|
3
|
+
thinkSummary(input.think),
|
|
4
|
+
hearSummary(input.hear),
|
|
5
|
+
speakSummary(input.speak),
|
|
6
|
+
];
|
|
7
|
+
}
|
|
8
|
+
function thinkSummary(t) {
|
|
9
|
+
const base = { id: 'think', name: 'Think' };
|
|
10
|
+
if (t.mode === 'host') {
|
|
11
|
+
return {
|
|
12
|
+
...base,
|
|
13
|
+
state: t.status === 'ready' ? 'ready' : 'available',
|
|
14
|
+
label: 'Think: Server',
|
|
15
|
+
where: 'Server',
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
if (t.mode === 'byo') {
|
|
19
|
+
const where = t.remote ? `Your model: ${t.remote}` : '';
|
|
20
|
+
return t.status === 'ready' && t.remote
|
|
21
|
+
? { ...base, state: 'ready', label: `Think: ${where}`, where }
|
|
22
|
+
: {
|
|
23
|
+
...base,
|
|
24
|
+
state: 'available',
|
|
25
|
+
label: 'Think: your own model not connected',
|
|
26
|
+
where: 'Your model',
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
const browser = thinkInBrowser(t);
|
|
30
|
+
return { ...browser, where: 'In browser' };
|
|
31
|
+
}
|
|
32
|
+
function thinkInBrowser(t) {
|
|
33
|
+
const base = { id: 'think', name: 'Think' };
|
|
34
|
+
if (t.status === 'unsupported') {
|
|
35
|
+
return {
|
|
36
|
+
...base,
|
|
37
|
+
state: 'off',
|
|
38
|
+
label: 'Think: unavailable, this browser has no WebGPU',
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
if (t.status === 'ready') {
|
|
42
|
+
return { ...base, state: 'ready', label: `Think: ${t.model} ready` };
|
|
43
|
+
}
|
|
44
|
+
if (t.status === 'loading') {
|
|
45
|
+
return {
|
|
46
|
+
...base,
|
|
47
|
+
state: 'available',
|
|
48
|
+
label: `Think: ${t.model} loading, ${Math.round(t.progress * 100)}%`,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
return {
|
|
52
|
+
...base,
|
|
53
|
+
state: 'available',
|
|
54
|
+
label: t.downloaded
|
|
55
|
+
? `Think: ${t.model} downloaded, not loaded`
|
|
56
|
+
: 'Think: not set up',
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
function hearSummary(h) {
|
|
60
|
+
const base = { id: 'hear', name: 'Hear' };
|
|
61
|
+
if (!h.mic) {
|
|
62
|
+
return {
|
|
63
|
+
...base,
|
|
64
|
+
state: 'off',
|
|
65
|
+
label: 'Hear: unavailable, this browser has no microphone access',
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
if (h.status === 'browser') {
|
|
69
|
+
return {
|
|
70
|
+
...base,
|
|
71
|
+
state: 'ready',
|
|
72
|
+
label: 'Hear: voice typing ready, using your browser',
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
if (h.status === 'ready') {
|
|
76
|
+
return {
|
|
77
|
+
...base,
|
|
78
|
+
state: 'ready',
|
|
79
|
+
label: 'Hear: voice typing ready, using the downloaded model',
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
if (h.status === 'downloading') {
|
|
83
|
+
return {
|
|
84
|
+
...base,
|
|
85
|
+
state: 'available',
|
|
86
|
+
label: 'Hear: downloading the speech model',
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
return { ...base, state: 'available', label: 'Hear: not set up' };
|
|
90
|
+
}
|
|
91
|
+
function speakSummary(s) {
|
|
92
|
+
const base = { id: 'speak', name: 'Speak' };
|
|
93
|
+
if (!s.supported) {
|
|
94
|
+
return {
|
|
95
|
+
...base,
|
|
96
|
+
state: 'off',
|
|
97
|
+
label: 'Speak: unavailable, this browser has no speech synthesis',
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
if (s.readAloud) {
|
|
101
|
+
return {
|
|
102
|
+
...base,
|
|
103
|
+
state: 'ready',
|
|
104
|
+
label: 'Speak: reading replies aloud with browser voices',
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
return { ...base, state: 'available', label: 'Speak: not switched on' };
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Whether the first thing shown is the AI setup form: only for a visitor who
|
|
111
|
+
* has set nothing up, has not said they do not need AI, and has nothing built.
|
|
112
|
+
*/
|
|
113
|
+
export function needsFirstRunSetup(facts) {
|
|
114
|
+
if (facts.dismissed || facts.built)
|
|
115
|
+
return false;
|
|
116
|
+
return !(facts.thinkDownloaded || facts.hearDownloaded || facts.readAloud);
|
|
117
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" role="img">
|
|
2
|
+
<defs>
|
|
3
|
+
<linearGradient id="flame" x1="26" y1="16" x2="101" y2="112" gradientUnits="userSpaceOnUse">
|
|
4
|
+
<stop stop-color="#f05b2b"/>
|
|
5
|
+
<stop offset="1" stop-color="#c9381e"/>
|
|
6
|
+
</linearGradient>
|
|
7
|
+
<linearGradient id="heat" x1="51" y1="49" x2="72" y2="111" gradientUnits="userSpaceOnUse">
|
|
8
|
+
<stop stop-color="#ffd33d"/>
|
|
9
|
+
<stop offset="1" stop-color="#f2a817"/>
|
|
10
|
+
</linearGradient>
|
|
11
|
+
</defs>
|
|
12
|
+
<path
|
|
13
|
+
fill="url(#flame)"
|
|
14
|
+
d="M64 5c-3 18-15 26-13 43-9-5-13-13-13-22C20 43 15 62 22 82c7 22 23 37 42 41 22-4 39-21 43-43 3-17-3-32-18-45 2 11 0 18-6 25C84 36 75 19 64 5Z"
|
|
15
|
+
/>
|
|
16
|
+
<path
|
|
17
|
+
fill="url(#heat)"
|
|
18
|
+
d="M64 45c-2 15-14 22-13 38-5-4-8-9-9-15-7 10-8 20-4 30 5 12 14 20 26 23 13-3 23-12 27-25 3-11 0-20-8-29 0 7-2 12-6 16 1-16-5-27-13-38Z"
|
|
19
|
+
/>
|
|
20
|
+
<!--
|
|
21
|
+
The glasses render as two stacked stroke groups: a pale warm casing under
|
|
22
|
+
a dark warm-charcoal stroke. The casing keeps the dark strokes legible
|
|
23
|
+
where they leave the flame body (temple tips, lower rims) on dark
|
|
24
|
+
backgrounds, and reads as a rim light against the flame on light ones.
|
|
25
|
+
-->
|
|
26
|
+
<g fill="none" stroke="#ffe3ae" stroke-opacity="0.85" stroke-linecap="round" stroke-linejoin="round">
|
|
27
|
+
<path stroke-width="14" d="M7 63c12-4 27-5 43-1M78 62c16-4 31-3 43 1"/>
|
|
28
|
+
<rect x="12" y="58" width="46" height="35" rx="13" stroke-width="14"/>
|
|
29
|
+
<rect x="70" y="58" width="46" height="35" rx="13" stroke-width="14"/>
|
|
30
|
+
<path stroke-width="13" d="M57 66c5-4 9-4 14 0"/>
|
|
31
|
+
</g>
|
|
32
|
+
<g fill="none" stroke="#33221b" stroke-linecap="round" stroke-linejoin="round">
|
|
33
|
+
<path stroke-width="8" d="M7 63c12-4 27-5 43-1M78 62c16-4 31-3 43 1"/>
|
|
34
|
+
<rect x="12" y="58" width="46" height="35" rx="13" stroke-width="8"/>
|
|
35
|
+
<rect x="70" y="58" width="46" height="35" rx="13" stroke-width="8"/>
|
|
36
|
+
<path stroke-width="7" d="M57 66c5-4 9-4 14 0"/>
|
|
37
|
+
</g>
|
|
38
|
+
</svg>
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import type { Recipe } from '../recipes/types.ts';
|
|
2
|
+
import type { AppSettings } from '../settings/app-settings.ts';
|
|
3
|
+
import { type ColorSchemeSetting, type ThemeSetting } from '../theme/theme.ts';
|
|
4
|
+
/** Settings as the model states them: tax in percent. All optional. */
|
|
5
|
+
export interface SettingsPatch {
|
|
6
|
+
currency?: string;
|
|
7
|
+
/** Percent, 0 to 100. */
|
|
8
|
+
taxRate?: number;
|
|
9
|
+
paymentTerms?: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* A look as the model states it: a preset, or a brand colour (hex), and
|
|
13
|
+
* optionally light or dark. Tokens only; there is no way to ask for CSS.
|
|
14
|
+
*/
|
|
15
|
+
export interface ThemePatch {
|
|
16
|
+
preset?: string;
|
|
17
|
+
/** `#rrggbb`. */
|
|
18
|
+
primary?: string;
|
|
19
|
+
colorScheme?: ColorSchemeSetting;
|
|
20
|
+
}
|
|
21
|
+
/** Longest payment terms the assistant will write. */
|
|
22
|
+
export declare const MAX_TERMS_LENGTH = 40;
|
|
23
|
+
/** Longest reply the schema allows; bounds a model that starts to loop. */
|
|
24
|
+
export declare const MAX_REPLY_LENGTH = 200;
|
|
25
|
+
/** Shown when the model's answer cannot be read; never the raw output. */
|
|
26
|
+
export declare const FALLBACK_REPLY = "Sorry, say that again?";
|
|
27
|
+
/**
|
|
28
|
+
* What the model returns each turn: a reply, recipe ids to add or remove, an
|
|
29
|
+
* optional cookbook to offer (never applied without a click) and optional
|
|
30
|
+
* settings to change.
|
|
31
|
+
*/
|
|
32
|
+
export interface AssistantChange {
|
|
33
|
+
reply: string;
|
|
34
|
+
add: string[];
|
|
35
|
+
remove: string[];
|
|
36
|
+
cookbook: string | null;
|
|
37
|
+
settings: SettingsPatch;
|
|
38
|
+
theme: ThemePatch;
|
|
39
|
+
/**
|
|
40
|
+
* Command calls a trusted host server asked for (`parseChange` with
|
|
41
|
+
* `commands: true`); the controller validates each one. Absent otherwise.
|
|
42
|
+
*/
|
|
43
|
+
commands?: {
|
|
44
|
+
name: string;
|
|
45
|
+
input: unknown;
|
|
46
|
+
}[];
|
|
47
|
+
}
|
|
48
|
+
/** Most command calls one reply may carry. */
|
|
49
|
+
export declare const MAX_COMMANDS = 8;
|
|
50
|
+
/** The slice of the cookbook store that holds the app theme. */
|
|
51
|
+
export interface ThemeStore {
|
|
52
|
+
read(): ThemeSetting | undefined;
|
|
53
|
+
write(theme: ThemeSetting | undefined): void;
|
|
54
|
+
}
|
|
55
|
+
/** The slice of the cookbook store that holds the app settings. */
|
|
56
|
+
export interface SettingsStore {
|
|
57
|
+
read(): AppSettings;
|
|
58
|
+
write(settings: AppSettings): void;
|
|
59
|
+
}
|
|
60
|
+
/** The slice of the recipe store the assistant drives (the Planner cards use the same). */
|
|
61
|
+
export interface RecipeStore {
|
|
62
|
+
readonly ids: readonly string[];
|
|
63
|
+
add(...ids: string[]): void;
|
|
64
|
+
remove(...ids: string[]): void;
|
|
65
|
+
}
|
|
66
|
+
/** The result of applying a change, after `requires` and `requiresAny` ran. */
|
|
67
|
+
export interface AppliedChange {
|
|
68
|
+
/** Newly on, including recipes pulled in because another needs them. */
|
|
69
|
+
added: string[];
|
|
70
|
+
/** Newly off. */
|
|
71
|
+
removed: string[];
|
|
72
|
+
/** Asked to remove, but another added recipe needs them. */
|
|
73
|
+
kept: string[];
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* The JSON Schema for one turn. `add` and `remove` are enums of recipe ids,
|
|
77
|
+
* so grammar-constrained decoding cannot produce an id that does not exist.
|
|
78
|
+
*/
|
|
79
|
+
export declare function buildResponseSchema(recipes: readonly Pick<Recipe, 'id'>[], cookbooks?: readonly {
|
|
80
|
+
id: string;
|
|
81
|
+
}[], withSettings?: boolean, withTheme?: boolean): Record<string, unknown>;
|
|
82
|
+
/** Keep only valid settings: circulating currency, tax 0-100, short terms. */
|
|
83
|
+
export declare function parseSettings(value: unknown): SettingsPatch;
|
|
84
|
+
/** Keep only a known preset, a hex colour and light or dark. */
|
|
85
|
+
export declare function parseThemePatch(value: unknown): ThemePatch;
|
|
86
|
+
/** Remove Qwen3-style thinking, including a block cut off before it closed. */
|
|
87
|
+
export declare function stripThinking(raw: string): string;
|
|
88
|
+
/**
|
|
89
|
+
* Read a model reply. Thinking tags are dropped. Malformed JSON still yields
|
|
90
|
+
* its `reply` text when one can be found, otherwise a short fallback: raw model
|
|
91
|
+
* output is never shown. Prose with no JSON in it is kept as the reply.
|
|
92
|
+
* Unknown ids are dropped, an id that is both added and removed is ignored,
|
|
93
|
+
* and repeats collapse.
|
|
94
|
+
*/
|
|
95
|
+
export declare function parseChange(input: string, recipes: readonly Pick<Recipe, 'id'>[], cookbooks?: readonly {
|
|
96
|
+
id: string;
|
|
97
|
+
}[], options?: {
|
|
98
|
+
commands?: boolean;
|
|
99
|
+
}): AssistantChange;
|
|
100
|
+
/** A sentence for the chat saying what changed, by recipe label. */
|
|
101
|
+
export declare function describeChange(applied: AppliedChange, recipes: readonly Pick<Recipe, 'id' | 'label'>[]): string;
|