@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,209 @@
|
|
|
1
|
+
import { CURRENCY_CODES } from "../settings/currencies.js";
|
|
2
|
+
import { normalizeHex, THEME_PRESETS, } from "../theme/theme.js";
|
|
3
|
+
/** Longest payment terms the assistant will write. */
|
|
4
|
+
export const MAX_TERMS_LENGTH = 40;
|
|
5
|
+
/** Longest reply the schema allows; bounds a model that starts to loop. */
|
|
6
|
+
export const MAX_REPLY_LENGTH = 200;
|
|
7
|
+
/** Shown when the model's answer cannot be read; never the raw output. */
|
|
8
|
+
export const FALLBACK_REPLY = 'Sorry, say that again?';
|
|
9
|
+
/** Most command calls one reply may carry. */
|
|
10
|
+
export const MAX_COMMANDS = 8;
|
|
11
|
+
/**
|
|
12
|
+
* The JSON Schema for one turn. `add` and `remove` are enums of recipe ids,
|
|
13
|
+
* so grammar-constrained decoding cannot produce an id that does not exist.
|
|
14
|
+
*/
|
|
15
|
+
export function buildResponseSchema(recipes, cookbooks = [], withSettings = false, withTheme = false) {
|
|
16
|
+
const ids = recipes.map((recipe) => recipe.id);
|
|
17
|
+
const list = { type: 'array', items: { enum: ids }, maxItems: ids.length };
|
|
18
|
+
const properties = {
|
|
19
|
+
reply: { type: 'string', maxLength: MAX_REPLY_LENGTH },
|
|
20
|
+
add: list,
|
|
21
|
+
remove: list,
|
|
22
|
+
};
|
|
23
|
+
if (cookbooks.length) {
|
|
24
|
+
properties.cookbook = { enum: [...cookbooks.map((c) => c.id), null] };
|
|
25
|
+
}
|
|
26
|
+
if (withSettings) {
|
|
27
|
+
properties.settings = {
|
|
28
|
+
type: 'object',
|
|
29
|
+
properties: {
|
|
30
|
+
currency: { type: 'string', pattern: '^[A-Z]{3}$' },
|
|
31
|
+
taxRate: { type: 'number', minimum: 0, maximum: 100 },
|
|
32
|
+
paymentTerms: { type: 'string', maxLength: MAX_TERMS_LENGTH },
|
|
33
|
+
},
|
|
34
|
+
additionalProperties: false,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
if (withTheme) {
|
|
38
|
+
properties.theme = {
|
|
39
|
+
type: 'object',
|
|
40
|
+
properties: {
|
|
41
|
+
preset: { enum: [...THEME_PRESETS] },
|
|
42
|
+
primary: { type: 'string', pattern: '^#[0-9a-fA-F]{6}$' },
|
|
43
|
+
colorScheme: { enum: ['light', 'dark'] },
|
|
44
|
+
},
|
|
45
|
+
additionalProperties: false,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
return {
|
|
49
|
+
type: 'object',
|
|
50
|
+
properties,
|
|
51
|
+
required: ['reply', 'add', 'remove'],
|
|
52
|
+
additionalProperties: false,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
/** Keep only valid settings: circulating currency, tax 0-100, short terms. */
|
|
56
|
+
export function parseSettings(value) {
|
|
57
|
+
const out = {};
|
|
58
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
59
|
+
return out;
|
|
60
|
+
const object = value;
|
|
61
|
+
if (typeof object.currency === 'string') {
|
|
62
|
+
const code = object.currency.trim().toUpperCase();
|
|
63
|
+
if (CURRENCY_CODES.has(code))
|
|
64
|
+
out.currency = code;
|
|
65
|
+
}
|
|
66
|
+
const tax = object.taxRate;
|
|
67
|
+
if (typeof tax === 'number' &&
|
|
68
|
+
Number.isFinite(tax) &&
|
|
69
|
+
tax >= 0 &&
|
|
70
|
+
tax <= 100) {
|
|
71
|
+
out.taxRate = tax;
|
|
72
|
+
}
|
|
73
|
+
if (typeof object.paymentTerms === 'string') {
|
|
74
|
+
const terms = [...object.paymentTerms]
|
|
75
|
+
.map((ch) => ch.charCodeAt(0) < 32 || ch.charCodeAt(0) === 127 ? ' ' : ch)
|
|
76
|
+
.join('')
|
|
77
|
+
.trim();
|
|
78
|
+
if (terms && terms.length <= MAX_TERMS_LENGTH)
|
|
79
|
+
out.paymentTerms = terms;
|
|
80
|
+
}
|
|
81
|
+
return out;
|
|
82
|
+
}
|
|
83
|
+
/** Keep only a known preset, a hex colour and light or dark. */
|
|
84
|
+
export function parseThemePatch(value) {
|
|
85
|
+
const out = {};
|
|
86
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
87
|
+
return out;
|
|
88
|
+
const object = value;
|
|
89
|
+
if (typeof object.preset === 'string' &&
|
|
90
|
+
THEME_PRESETS.includes(object.preset)) {
|
|
91
|
+
out.preset = object.preset;
|
|
92
|
+
}
|
|
93
|
+
const primary = normalizeHex(object.primary);
|
|
94
|
+
if (primary)
|
|
95
|
+
out.primary = primary;
|
|
96
|
+
if (object.colorScheme === 'light' ||
|
|
97
|
+
object.colorScheme === 'dark' ||
|
|
98
|
+
object.colorScheme === 'system') {
|
|
99
|
+
out.colorScheme = object.colorScheme;
|
|
100
|
+
}
|
|
101
|
+
return out;
|
|
102
|
+
}
|
|
103
|
+
/** Remove Qwen3-style thinking, including a block cut off before it closed. */
|
|
104
|
+
export function stripThinking(raw) {
|
|
105
|
+
return raw
|
|
106
|
+
.replace(/<think>[\s\S]*?<\/think>/gi, '')
|
|
107
|
+
.replace(/<think>[\s\S]*$/i, '')
|
|
108
|
+
.trim();
|
|
109
|
+
}
|
|
110
|
+
/** Pull a `reply` string out of JSON that does not parse (e.g. cut short). */
|
|
111
|
+
function lenientReply(raw) {
|
|
112
|
+
const match = /"reply"\s*:\s*"((?:[^"\\]|\\.)*)/.exec(raw);
|
|
113
|
+
if (!match)
|
|
114
|
+
return null;
|
|
115
|
+
let text = match[1];
|
|
116
|
+
// A cut-off escape at the very end would make JSON.parse throw.
|
|
117
|
+
text = text.replace(/\\$/, '');
|
|
118
|
+
try {
|
|
119
|
+
text = JSON.parse(`"${text}"`);
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
text = text.replace(/\\n/g, ' ').replace(/\\"/g, '"');
|
|
123
|
+
}
|
|
124
|
+
return text.trim() || null;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Read a model reply. Thinking tags are dropped. Malformed JSON still yields
|
|
128
|
+
* its `reply` text when one can be found, otherwise a short fallback: raw model
|
|
129
|
+
* output is never shown. Prose with no JSON in it is kept as the reply.
|
|
130
|
+
* Unknown ids are dropped, an id that is both added and removed is ignored,
|
|
131
|
+
* and repeats collapse.
|
|
132
|
+
*/
|
|
133
|
+
export function parseChange(input, recipes, cookbooks = [], options = {}) {
|
|
134
|
+
const known = new Set(recipes.map((recipe) => recipe.id));
|
|
135
|
+
const raw = stripThinking(input);
|
|
136
|
+
const plain = (reply) => ({
|
|
137
|
+
reply,
|
|
138
|
+
add: [],
|
|
139
|
+
remove: [],
|
|
140
|
+
cookbook: null,
|
|
141
|
+
settings: {},
|
|
142
|
+
theme: {},
|
|
143
|
+
});
|
|
144
|
+
const looksLikeJson = /^[\s`]*[{[]/.test(raw) || /"reply"\s*:/.test(raw);
|
|
145
|
+
const unreadable = () => plain(looksLikeJson ? (lenientReply(raw) ?? FALLBACK_REPLY) : raw);
|
|
146
|
+
let value;
|
|
147
|
+
try {
|
|
148
|
+
value = JSON.parse(raw);
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
return unreadable();
|
|
152
|
+
}
|
|
153
|
+
if (!value || typeof value !== 'object' || Array.isArray(value)) {
|
|
154
|
+
return unreadable();
|
|
155
|
+
}
|
|
156
|
+
const object = value;
|
|
157
|
+
const pick = (field) => Array.isArray(field)
|
|
158
|
+
? [
|
|
159
|
+
...new Set(field.filter((id) => typeof id === 'string' && known.has(id))),
|
|
160
|
+
]
|
|
161
|
+
: [];
|
|
162
|
+
const add = pick(object.add);
|
|
163
|
+
const remove = pick(object.remove);
|
|
164
|
+
const both = new Set(add.filter((id) => remove.includes(id)));
|
|
165
|
+
const commands = options.commands ? pickCommands(object.commands) : [];
|
|
166
|
+
return {
|
|
167
|
+
reply: typeof object.reply === 'string' ? object.reply.trim() : '',
|
|
168
|
+
add: add.filter((id) => !both.has(id)),
|
|
169
|
+
remove: remove.filter((id) => !both.has(id)),
|
|
170
|
+
cookbook: typeof object.cookbook === 'string' &&
|
|
171
|
+
cookbooks.some((c) => c.id === object.cookbook)
|
|
172
|
+
? object.cookbook
|
|
173
|
+
: null,
|
|
174
|
+
settings: parseSettings(object.settings),
|
|
175
|
+
theme: parseThemePatch(object.theme),
|
|
176
|
+
...(commands.length ? { commands } : {}),
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
/** `{ name, input }` entries; the controller rejects unknown names and bad input. */
|
|
180
|
+
function pickCommands(value) {
|
|
181
|
+
if (!Array.isArray(value))
|
|
182
|
+
return [];
|
|
183
|
+
const out = [];
|
|
184
|
+
for (const entry of value) {
|
|
185
|
+
if (out.length >= MAX_COMMANDS)
|
|
186
|
+
break;
|
|
187
|
+
if (!entry || typeof entry !== 'object')
|
|
188
|
+
continue;
|
|
189
|
+
const { name, input } = entry;
|
|
190
|
+
if (typeof name !== 'string')
|
|
191
|
+
continue;
|
|
192
|
+
out.push({ name, input: input ?? {} });
|
|
193
|
+
}
|
|
194
|
+
return out;
|
|
195
|
+
}
|
|
196
|
+
/** A sentence for the chat saying what changed, by recipe label. */
|
|
197
|
+
export function describeChange(applied, recipes) {
|
|
198
|
+
const label = (id) => recipes.find((recipe) => recipe.id === id)?.label ?? id;
|
|
199
|
+
const names = (ids) => ids.map(label).join(', ');
|
|
200
|
+
const parts = [];
|
|
201
|
+
if (applied.added.length)
|
|
202
|
+
parts.push(`Added ${names(applied.added)}.`);
|
|
203
|
+
if (applied.removed.length)
|
|
204
|
+
parts.push(`Removed ${names(applied.removed)}.`);
|
|
205
|
+
if (applied.kept.length) {
|
|
206
|
+
parts.push(`Kept ${names(applied.kept)} (needed).`);
|
|
207
|
+
}
|
|
208
|
+
return parts.join(' ');
|
|
209
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { WebLLMEngineLike, WebLLMLoadProgress } from '@happyvertical/ai/local';
|
|
2
|
+
export type LoadProgress = Pick<WebLLMLoadProgress, 'progress' | 'text'>;
|
|
3
|
+
/** A model held in a Web Worker, with a way to stop and free it. */
|
|
4
|
+
export interface LoadedModel {
|
|
5
|
+
engine: WebLLMEngineLike;
|
|
6
|
+
/** Free the GPU memory and end the worker. */
|
|
7
|
+
dispose(): void;
|
|
8
|
+
}
|
|
9
|
+
/** What `loadModel` needs from the browser; swapped out in tests. */
|
|
10
|
+
export interface EngineHost {
|
|
11
|
+
createWorker(): Worker;
|
|
12
|
+
createEngine(worker: Worker, modelId: string, onProgress: (report: LoadProgress) => void): Promise<WebLLMEngineLike>;
|
|
13
|
+
}
|
|
14
|
+
/** The real host: a module worker running WebLLM. */
|
|
15
|
+
export declare const browserHost: EngineHost;
|
|
16
|
+
/**
|
|
17
|
+
* Download (or read from the browser cache) and compile a model in a worker.
|
|
18
|
+
* Aborting ends the worker, which stops the download, and rejects.
|
|
19
|
+
*/
|
|
20
|
+
export declare function loadModel(modelId: string, onProgress: (report: LoadProgress) => void, signal?: AbortSignal, host?: EngineHost): Promise<LoadedModel>;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/** The real host: a module worker running WebLLM. */
|
|
2
|
+
export const browserHost = {
|
|
3
|
+
createWorker: () => new Worker(new URL('./llm.worker.ts', import.meta.url), { type: 'module' }),
|
|
4
|
+
createEngine: async (worker, modelId, onProgress) => {
|
|
5
|
+
const { CreateWebWorkerMLCEngine } = await import('@mlc-ai/web-llm');
|
|
6
|
+
return CreateWebWorkerMLCEngine(worker, modelId, {
|
|
7
|
+
initProgressCallback: (report) => onProgress(report),
|
|
8
|
+
});
|
|
9
|
+
},
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Download (or read from the browser cache) and compile a model in a worker.
|
|
13
|
+
* Aborting ends the worker, which stops the download, and rejects.
|
|
14
|
+
*/
|
|
15
|
+
export async function loadModel(modelId, onProgress, signal, host = browserHost) {
|
|
16
|
+
if (signal?.aborted)
|
|
17
|
+
throw new DOMException('Cancelled', 'AbortError');
|
|
18
|
+
const worker = host.createWorker();
|
|
19
|
+
const dispose = () => worker.terminate();
|
|
20
|
+
let onAbort;
|
|
21
|
+
const cancelled = new Promise((_, reject) => {
|
|
22
|
+
onAbort = () => {
|
|
23
|
+
dispose();
|
|
24
|
+
reject(new DOMException('Cancelled', 'AbortError'));
|
|
25
|
+
};
|
|
26
|
+
signal?.addEventListener('abort', onAbort, { once: true });
|
|
27
|
+
});
|
|
28
|
+
try {
|
|
29
|
+
const engine = await Promise.race([
|
|
30
|
+
host.createEngine(worker, modelId, onProgress),
|
|
31
|
+
cancelled,
|
|
32
|
+
]);
|
|
33
|
+
return { engine, dispose };
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
dispose();
|
|
37
|
+
throw error;
|
|
38
|
+
}
|
|
39
|
+
finally {
|
|
40
|
+
if (onAbort)
|
|
41
|
+
signal?.removeEventListener('abort', onAbort);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { WebWorkerMLCEngineHandler } from '@mlc-ai/web-llm';
|
|
2
|
+
// Runs the model off the UI thread; the page talks to it through
|
|
3
|
+
// `CreateWebWorkerMLCEngine` (see engine.ts).
|
|
4
|
+
const handler = new WebWorkerMLCEngineHandler();
|
|
5
|
+
self.onmessage = (message) => {
|
|
6
|
+
handler.onmessage(message);
|
|
7
|
+
};
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type { LibraryCookbook } from '../library/types.ts';
|
|
2
|
+
import type { Recipe } from '../recipes/types.ts';
|
|
3
|
+
/**
|
|
4
|
+
* Keyword matching: what the person typed, mapped to the cookbooks and recipes
|
|
5
|
+
* it probably means. Deterministic, local and fast. The model still decides
|
|
6
|
+
* what to do; matches only focus its prompt and back up a cookbook offer.
|
|
7
|
+
*/
|
|
8
|
+
export type MatchKind = 'recipe' | 'cookbook' | 'theme';
|
|
9
|
+
export type Confidence = 'strong' | 'weak';
|
|
10
|
+
export interface Match {
|
|
11
|
+
kind: MatchKind;
|
|
12
|
+
id: string;
|
|
13
|
+
score: number;
|
|
14
|
+
confidence: Confidence;
|
|
15
|
+
/** The terms found in the text, as written in the index. */
|
|
16
|
+
terms: string[];
|
|
17
|
+
}
|
|
18
|
+
type Tier = 'name' | 'synonym' | 'keyword';
|
|
19
|
+
interface Term {
|
|
20
|
+
/** Normalised, space-separated words. */
|
|
21
|
+
text: string;
|
|
22
|
+
tier: Tier;
|
|
23
|
+
/** Weak terms count towards the score but never make a match strong. */
|
|
24
|
+
weak: boolean;
|
|
25
|
+
words: number;
|
|
26
|
+
}
|
|
27
|
+
interface Entry {
|
|
28
|
+
kind: MatchKind;
|
|
29
|
+
id: string;
|
|
30
|
+
terms: Term[];
|
|
31
|
+
/**
|
|
32
|
+
* The normalised label or name. A message that is exactly this ranks the
|
|
33
|
+
* entry first, ahead of another whose id merely ends in the same word
|
|
34
|
+
* (`Reports` is `reports.materialized`, not `analytics.reports`).
|
|
35
|
+
*/
|
|
36
|
+
exact?: string;
|
|
37
|
+
}
|
|
38
|
+
export interface MatchIndex {
|
|
39
|
+
entries: Entry[];
|
|
40
|
+
}
|
|
41
|
+
/** Lowercase, strip accents and punctuation, fold plurals and possessives. */
|
|
42
|
+
export declare function normalize(text: string): string;
|
|
43
|
+
/**
|
|
44
|
+
* Extra words for the recipes, where the synonyms in the catalog are thin.
|
|
45
|
+
* Keyed by recipe id; a recipe without an entry still matches its label,
|
|
46
|
+
* id and synonyms.
|
|
47
|
+
*/
|
|
48
|
+
export declare const RECIPE_KEYWORDS: Readonly<Record<string, readonly string[]>>;
|
|
49
|
+
/** Words that mean the person is talking about how the app looks. */
|
|
50
|
+
export declare const THEME_KEYWORDS: readonly string[];
|
|
51
|
+
/** Build the index for a set of recipes and cookbooks (and theming, when asked). */
|
|
52
|
+
export declare function buildMatchIndex(recipes: readonly Pick<Recipe, 'id' | 'label' | 'synonyms'>[], cookbooks?: readonly (Pick<LibraryCookbook, 'id' | 'name'> & Partial<Pick<LibraryCookbook, 'keywords'>>)[], options?: {
|
|
53
|
+
theme?: boolean;
|
|
54
|
+
}): MatchIndex;
|
|
55
|
+
/** Distinct match terms an item has; the coverage tests count these. */
|
|
56
|
+
export declare function termsOf(index: MatchIndex, kind: MatchKind, id: string): string[];
|
|
57
|
+
/** Ranked matches for a message, best first. Empty when nothing matches. */
|
|
58
|
+
export declare function matchText(index: MatchIndex, text: string): Match[];
|
|
59
|
+
export {};
|
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
const TIER_WEIGHT = { name: 10, synonym: 6, keyword: 4 };
|
|
2
|
+
/** A phrase says more than one of its words does. */
|
|
3
|
+
const PHRASE_FACTOR = 1.5;
|
|
4
|
+
/** Too common to point at anything, in labels and ids. */
|
|
5
|
+
const STOPWORDS = new Set([
|
|
6
|
+
'a',
|
|
7
|
+
'an',
|
|
8
|
+
'and',
|
|
9
|
+
'the',
|
|
10
|
+
'of',
|
|
11
|
+
'for',
|
|
12
|
+
'to',
|
|
13
|
+
'in',
|
|
14
|
+
'on',
|
|
15
|
+
'or',
|
|
16
|
+
'general',
|
|
17
|
+
'simple',
|
|
18
|
+
]);
|
|
19
|
+
/**
|
|
20
|
+
* Words that fit more than one trade or recipe. They add to a score but a
|
|
21
|
+
* match made only of them stays weak, so they never trigger a cookbook offer.
|
|
22
|
+
*/
|
|
23
|
+
const WEAK_WORDS = [
|
|
24
|
+
'car',
|
|
25
|
+
'vehicle',
|
|
26
|
+
'metal',
|
|
27
|
+
'steel',
|
|
28
|
+
'gates',
|
|
29
|
+
'studio',
|
|
30
|
+
'classes',
|
|
31
|
+
'members',
|
|
32
|
+
'shop',
|
|
33
|
+
'order',
|
|
34
|
+
'item',
|
|
35
|
+
'material',
|
|
36
|
+
'customer',
|
|
37
|
+
'sales',
|
|
38
|
+
'stock',
|
|
39
|
+
'schedule',
|
|
40
|
+
'terms',
|
|
41
|
+
];
|
|
42
|
+
/** Fold the way the text is folded, so index and message always agree. */
|
|
43
|
+
function foldWord(word) {
|
|
44
|
+
if (word.length <= 3)
|
|
45
|
+
return word;
|
|
46
|
+
if (word.endsWith('ies'))
|
|
47
|
+
return `${word.slice(0, -3)}y`;
|
|
48
|
+
if (word.endsWith('sses'))
|
|
49
|
+
return word.slice(0, -2);
|
|
50
|
+
if (/(us|ss|is)$/.test(word))
|
|
51
|
+
return word;
|
|
52
|
+
if (word.endsWith('s'))
|
|
53
|
+
return word.slice(0, -1);
|
|
54
|
+
return word;
|
|
55
|
+
}
|
|
56
|
+
/** Lowercase, strip accents and punctuation, fold plurals and possessives. */
|
|
57
|
+
export function normalize(text) {
|
|
58
|
+
return text
|
|
59
|
+
.normalize('NFD')
|
|
60
|
+
.replace(/\p{M}/gu, '')
|
|
61
|
+
.toLowerCase()
|
|
62
|
+
.replace(/['’]s\b/g, '')
|
|
63
|
+
.replace(/['’]/g, '')
|
|
64
|
+
.replace(/[^a-z0-9]+/g, ' ')
|
|
65
|
+
.trim()
|
|
66
|
+
.split(' ')
|
|
67
|
+
.filter(Boolean)
|
|
68
|
+
.map(foldWord)
|
|
69
|
+
.join(' ');
|
|
70
|
+
}
|
|
71
|
+
const WEAK = new Set(WEAK_WORDS.map(normalize));
|
|
72
|
+
/**
|
|
73
|
+
* Extra words for the recipes, where the synonyms in the catalog are thin.
|
|
74
|
+
* Keyed by recipe id; a recipe without an entry still matches its label,
|
|
75
|
+
* id and synonyms.
|
|
76
|
+
*/
|
|
77
|
+
export const RECIPE_KEYWORDS = {
|
|
78
|
+
'commerce.customers': ['customer', 'client', 'contacts', 'patrons'],
|
|
79
|
+
'commerce.purchases': [
|
|
80
|
+
'purchase',
|
|
81
|
+
'buy supplies',
|
|
82
|
+
'reorder',
|
|
83
|
+
'order from suppliers',
|
|
84
|
+
],
|
|
85
|
+
'commerce.sales': ['sell', 'sale', 'sales order', 'point of sale'],
|
|
86
|
+
'commerce.vendors': ['vendor', 'supplier', 'who we buy from'],
|
|
87
|
+
'inventory.stock': [
|
|
88
|
+
'inventory',
|
|
89
|
+
'track stock',
|
|
90
|
+
'stock levels',
|
|
91
|
+
'warehouse',
|
|
92
|
+
'count stock',
|
|
93
|
+
],
|
|
94
|
+
'products.simple': ['product', 'price list', 'menu', 'things we sell'],
|
|
95
|
+
'products.clothing': ['clothes', 'shirts', 'fashion', 'sizes and colours'],
|
|
96
|
+
'products.ingredients': [
|
|
97
|
+
'ingredient',
|
|
98
|
+
'recipe',
|
|
99
|
+
'raw material',
|
|
100
|
+
'flour',
|
|
101
|
+
'components',
|
|
102
|
+
],
|
|
103
|
+
'commerce.estimates': [
|
|
104
|
+
'estimate',
|
|
105
|
+
'quote',
|
|
106
|
+
'quotes for customers',
|
|
107
|
+
'price quote',
|
|
108
|
+
'bid',
|
|
109
|
+
],
|
|
110
|
+
'commerce.wholesale': ['wholesale', 'bulk', 'trade customers', 'resellers'],
|
|
111
|
+
'commerce.invoicing': [
|
|
112
|
+
'invoice',
|
|
113
|
+
'send invoices',
|
|
114
|
+
'bill customers',
|
|
115
|
+
'get paid',
|
|
116
|
+
'receipts',
|
|
117
|
+
],
|
|
118
|
+
'commerce.fulfillment': ['ship', 'shipping', 'courier', 'parcels', 'deliver'],
|
|
119
|
+
'commerce.agreements': ['contract', 'agreement', 'sign contracts'],
|
|
120
|
+
'commerce.leases': ['lease', 'rent out', 'equipment hire'],
|
|
121
|
+
'commerce.licenses': ['licence', 'licence sales', 'software licenses'],
|
|
122
|
+
'ledgers.bookkeeping': [
|
|
123
|
+
'books',
|
|
124
|
+
'keep the books',
|
|
125
|
+
'bookkeeper',
|
|
126
|
+
'accountant',
|
|
127
|
+
'expenses',
|
|
128
|
+
],
|
|
129
|
+
'projects.tracker': ['project', 'task', 'to do list', 'bug', 'ticket'],
|
|
130
|
+
'events.calendar': [
|
|
131
|
+
'appointment',
|
|
132
|
+
'schedule appointments',
|
|
133
|
+
'event',
|
|
134
|
+
'meeting',
|
|
135
|
+
'reservation',
|
|
136
|
+
],
|
|
137
|
+
'sales.pipeline': [
|
|
138
|
+
'lead',
|
|
139
|
+
'pipeline',
|
|
140
|
+
'prospect',
|
|
141
|
+
'follow up',
|
|
142
|
+
'sales funnel',
|
|
143
|
+
],
|
|
144
|
+
};
|
|
145
|
+
function makeTerm(raw, tier) {
|
|
146
|
+
const text = normalize(raw);
|
|
147
|
+
if (!text)
|
|
148
|
+
return null;
|
|
149
|
+
const words = text.split(' ');
|
|
150
|
+
if (words.length === 1 && STOPWORDS.has(text))
|
|
151
|
+
return null;
|
|
152
|
+
const weak = tier !== 'name' && words.every((w) => WEAK.has(w));
|
|
153
|
+
return { text, tier, weak, words: words.length };
|
|
154
|
+
}
|
|
155
|
+
function collect(entry, raw, tier) {
|
|
156
|
+
const term = makeTerm(raw, tier);
|
|
157
|
+
if (!term)
|
|
158
|
+
return;
|
|
159
|
+
const existing = entry.terms.find((t) => t.text === term.text);
|
|
160
|
+
if (existing) {
|
|
161
|
+
if (TIER_WEIGHT[term.tier] > TIER_WEIGHT[existing.tier]) {
|
|
162
|
+
existing.tier = term.tier;
|
|
163
|
+
existing.weak = term.weak;
|
|
164
|
+
}
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
entry.terms.push(term);
|
|
168
|
+
}
|
|
169
|
+
function wordsOf(raw) {
|
|
170
|
+
return normalize(raw)
|
|
171
|
+
.split(' ')
|
|
172
|
+
.filter((w) => w && !STOPWORDS.has(w));
|
|
173
|
+
}
|
|
174
|
+
/** Words that mean the person is talking about how the app looks. */
|
|
175
|
+
export const THEME_KEYWORDS = [
|
|
176
|
+
'theme',
|
|
177
|
+
'colour',
|
|
178
|
+
'color',
|
|
179
|
+
'colour scheme',
|
|
180
|
+
'dark mode',
|
|
181
|
+
'light mode',
|
|
182
|
+
'brand',
|
|
183
|
+
'branding',
|
|
184
|
+
'style',
|
|
185
|
+
'warmer',
|
|
186
|
+
'cooler',
|
|
187
|
+
'font',
|
|
188
|
+
];
|
|
189
|
+
/** Build the index for a set of recipes and cookbooks (and theming, when asked). */
|
|
190
|
+
export function buildMatchIndex(recipes, cookbooks = [], options = {}) {
|
|
191
|
+
const entries = [];
|
|
192
|
+
for (const recipe of recipes) {
|
|
193
|
+
const entry = {
|
|
194
|
+
kind: 'recipe',
|
|
195
|
+
id: recipe.id,
|
|
196
|
+
terms: [],
|
|
197
|
+
exact: normalize(recipe.label),
|
|
198
|
+
};
|
|
199
|
+
collect(entry, recipe.label, 'name');
|
|
200
|
+
// The last id segment (`pipeline` of `sales.pipeline`), not the package.
|
|
201
|
+
const last = recipe.id.split('.').pop() ?? '';
|
|
202
|
+
collect(entry, last.replace(/[-_]/g, ' '), 'name');
|
|
203
|
+
for (const word of wordsOf(recipe.label))
|
|
204
|
+
collect(entry, word, 'synonym');
|
|
205
|
+
for (const synonym of recipe.synonyms)
|
|
206
|
+
collect(entry, synonym, 'synonym');
|
|
207
|
+
for (const extra of RECIPE_KEYWORDS[recipe.id] ?? []) {
|
|
208
|
+
collect(entry, extra, 'keyword');
|
|
209
|
+
}
|
|
210
|
+
entries.push(entry);
|
|
211
|
+
}
|
|
212
|
+
for (const cookbook of cookbooks) {
|
|
213
|
+
const entry = {
|
|
214
|
+
kind: 'cookbook',
|
|
215
|
+
id: cookbook.id,
|
|
216
|
+
terms: [],
|
|
217
|
+
exact: normalize(cookbook.name),
|
|
218
|
+
};
|
|
219
|
+
collect(entry, cookbook.name, 'name');
|
|
220
|
+
collect(entry, cookbook.id.replace(/[-_]/g, ' '), 'name');
|
|
221
|
+
for (const keyword of cookbook.keywords ?? []) {
|
|
222
|
+
collect(entry, keyword, 'keyword');
|
|
223
|
+
}
|
|
224
|
+
entries.push(entry);
|
|
225
|
+
}
|
|
226
|
+
if (options.theme) {
|
|
227
|
+
const entry = { kind: 'theme', id: 'theme', terms: [] };
|
|
228
|
+
for (const word of THEME_KEYWORDS)
|
|
229
|
+
collect(entry, word, 'keyword');
|
|
230
|
+
entries.push(entry);
|
|
231
|
+
}
|
|
232
|
+
return { entries };
|
|
233
|
+
}
|
|
234
|
+
/** Distinct match terms an item has; the coverage tests count these. */
|
|
235
|
+
export function termsOf(index, kind, id) {
|
|
236
|
+
return (index.entries.find((e) => e.kind === kind && e.id === id)?.terms ?? []).map((t) => t.text);
|
|
237
|
+
}
|
|
238
|
+
/** Ranked matches for a message, best first. Empty when nothing matches. */
|
|
239
|
+
export function matchText(index, text) {
|
|
240
|
+
const normalized = normalize(text);
|
|
241
|
+
const haystack = ` ${normalized} `;
|
|
242
|
+
const out = [];
|
|
243
|
+
for (const entry of index.entries) {
|
|
244
|
+
let score = 0;
|
|
245
|
+
let strong = false;
|
|
246
|
+
const found = [];
|
|
247
|
+
for (const term of entry.terms) {
|
|
248
|
+
if (!haystack.includes(` ${term.text} `))
|
|
249
|
+
continue;
|
|
250
|
+
found.push(term.text);
|
|
251
|
+
score +=
|
|
252
|
+
TIER_WEIGHT[term.tier] *
|
|
253
|
+
(term.words > 1 ? PHRASE_FACTOR : 1) *
|
|
254
|
+
(term.weak ? 0.5 : 1);
|
|
255
|
+
if (!term.weak)
|
|
256
|
+
strong ||= true;
|
|
257
|
+
}
|
|
258
|
+
if (!found.length)
|
|
259
|
+
continue;
|
|
260
|
+
if (entry.exact && entry.exact === normalized)
|
|
261
|
+
score += 1;
|
|
262
|
+
out.push({
|
|
263
|
+
kind: entry.kind,
|
|
264
|
+
id: entry.id,
|
|
265
|
+
score,
|
|
266
|
+
confidence: strong ? 'strong' : 'weak',
|
|
267
|
+
terms: found,
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
return out.sort((a, b) => b.score - a.score || a.id.localeCompare(b.id));
|
|
271
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/** A WebLLM prebuilt model the assistant offers. */
|
|
2
|
+
export interface AssistantModel {
|
|
3
|
+
/** A model id in WebLLM's prebuilt list. */
|
|
4
|
+
id: string;
|
|
5
|
+
label: string;
|
|
6
|
+
/** Approximate one-time download, in megabytes (cached afterwards). */
|
|
7
|
+
downloadMB: number;
|
|
8
|
+
/** GPU memory the model needs while running, in megabytes. */
|
|
9
|
+
vramMB: number;
|
|
10
|
+
}
|
|
11
|
+
export declare const DEFAULT_MODEL_ID = "Qwen3-1.7B-q4f16_1-MLC";
|
|
12
|
+
/** Small instruction-tuned models; the first is the default. */
|
|
13
|
+
export declare const ASSISTANT_MODELS: readonly AssistantModel[];
|
|
14
|
+
export declare function getModel(id: string): AssistantModel | undefined;
|
|
15
|
+
/** "about 1.1 GB" / "about 700 MB". */
|
|
16
|
+
export declare function formatSize(megabytes: number): string;
|
|
17
|
+
/** The label without its advice: "Qwen3 1.7B (recommended)" -> "Qwen3 1.7B". */
|
|
18
|
+
export declare function shortLabel(model: AssistantModel): string;
|
|
19
|
+
/** The model to suggest when the graphics card has room for it. */
|
|
20
|
+
export declare const ROOMY_MODEL_ID = "Qwen3-4B-q4f16_1-MLC";
|
|
21
|
+
/**
|
|
22
|
+
* Whether a graphics card whose largest single buffer is `maxBufferBytes` has
|
|
23
|
+
* room for the model (with some headroom). The default stays the default for
|
|
24
|
+
* small cards.
|
|
25
|
+
*/
|
|
26
|
+
export declare function hasRoomFor(model: AssistantModel, maxBufferBytes: number): boolean;
|
|
27
|
+
interface GpuNavigator {
|
|
28
|
+
gpu?: {
|
|
29
|
+
requestAdapter(): Promise<{
|
|
30
|
+
limits?: {
|
|
31
|
+
maxBufferSize?: number;
|
|
32
|
+
};
|
|
33
|
+
} | null>;
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/** The largest buffer the graphics card allows, or 0 when unknown. */
|
|
37
|
+
export declare function graphicsBufferLimit(nav?: GpuNavigator | undefined): Promise<number>;
|
|
38
|
+
export {};
|