@happyvertical/smrt-planner 0.0.0-stage → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +170 -2
- package/app/404.html +80 -0
- package/app/_app/immutable/assets/0.B5zXkXe_.css +1 -0
- package/app/_app/immutable/assets/10.hpcnxvK1.css +1 -0
- package/app/_app/immutable/assets/11.D7zoXfVV.css +1 -0
- package/app/_app/immutable/assets/12.CPobm1ED.css +1 -0
- package/app/_app/immutable/assets/2.CyaWdRdI.css +1 -0
- package/app/_app/immutable/assets/3.BlPQOes8.css +1 -0
- package/app/_app/immutable/assets/8.2gQeKBp_.css +1 -0
- package/app/_app/immutable/assets/9.HOPT4xtg.css +1 -0
- package/app/_app/immutable/assets/AiSetup.Cb22AigN.css +1 -0
- package/app/_app/immutable/assets/Button.DkP0qkG9.css +1 -0
- package/app/_app/immutable/assets/ConnectTools.BgIJOOGW.css +1 -0
- package/app/_app/immutable/assets/FieldMapForm.BCU-4pO4.css +1 -0
- package/app/_app/immutable/assets/ModelPage.Dd3LcMta.css +1 -0
- package/app/_app/immutable/assets/SectionActions.CTkVuNMF.css +1 -0
- package/app/_app/immutable/assets/SectionIcons.5Udq9vN-.css +1 -0
- package/app/_app/immutable/assets/SegmentedControl.B8SrQacd.css +1 -0
- package/app/_app/immutable/assets/dist.C5nHBk_O.css +1 -0
- package/app/_app/immutable/assets/feedback.BVKAwFck.css +1 -0
- package/app/_app/immutable/assets/forms.BChZ2RWM.css +1 -0
- package/app/_app/immutable/assets/inter-latin-ext.B_-bZUTo.woff2 +0 -0
- package/app/_app/immutable/assets/inter-latin.8kRkwJBP.woff2 +0 -0
- package/app/_app/immutable/assets/jetbrains-mono-latin-ext.Bnd2h4Br.woff2 +0 -0
- package/app/_app/immutable/assets/jetbrains-mono-latin.Db4Uuiha.woff2 +0 -0
- package/app/_app/immutable/assets/ort-wasm-simd-threaded.asyncify.CxOG5pUO.wasm +0 -0
- package/app/_app/immutable/assets/percent.LH0z-ozZ.css +1 -0
- package/app/_app/immutable/assets/space-grotesk-latin-ext.wJGaI8U0.woff2 +0 -0
- package/app/_app/immutable/assets/space-grotesk-latin.DPT1xrvW.woff2 +0 -0
- package/app/_app/immutable/assets/store.CGDwHkkF.css +1 -0
- package/app/_app/immutable/assets/ui.B1A1Zl2p.css +1 -0
- package/app/_app/immutable/assets/workspace.BIMkuZDb.css +1 -0
- package/app/_app/immutable/chunks/1okeBSoq.js +1 -0
- package/app/_app/immutable/chunks/2jFBkS1C.js +1 -0
- package/app/_app/immutable/chunks/6P9zxrzU.js +1 -0
- package/app/_app/immutable/chunks/B32EWqI8.js +9 -0
- package/app/_app/immutable/chunks/B4Kevpe0.js +1 -0
- package/app/_app/immutable/chunks/BJfAXhak.js +3 -0
- package/app/_app/immutable/chunks/BKwRT_1p.js +1 -0
- package/app/_app/immutable/chunks/BQxY8kkL.js +1 -0
- package/app/_app/immutable/chunks/BS4h9ES-.js +1 -0
- package/app/_app/immutable/chunks/BWPhGFHl.js +1 -0
- package/app/_app/immutable/chunks/BYcBM-fh.js +1 -0
- package/app/_app/immutable/chunks/BegKiy2G.js +1 -0
- package/app/_app/immutable/chunks/Bjy-W4x2.js +81 -0
- package/app/_app/immutable/chunks/BnRri03M.js +1 -0
- package/app/_app/immutable/chunks/C7zBd-pD.js +1 -0
- package/app/_app/immutable/chunks/CA-A9Ngs.js +1 -0
- package/app/_app/immutable/chunks/CMhpRMKg.js +1 -0
- package/app/_app/immutable/chunks/CPRHZZeW.js +1 -0
- package/app/_app/immutable/chunks/CRQ1Pmzr.js +1 -0
- package/app/_app/immutable/chunks/CWtfVMDz.js +1 -0
- package/app/_app/immutable/chunks/CgAkqYsL.js +1 -0
- package/app/_app/immutable/chunks/Chyo8rdT.js +3 -0
- package/app/_app/immutable/chunks/Ci0DUht6.js +34 -0
- package/app/_app/immutable/chunks/CmmuWmp6.js +2 -0
- package/app/_app/immutable/chunks/CrFNLK0f.js +1 -0
- package/app/_app/immutable/chunks/CrO3W89x.js +1 -0
- package/app/_app/immutable/chunks/CsprTb3f.js +2 -0
- package/app/_app/immutable/chunks/CyUMm_Wp.js +1 -0
- package/app/_app/immutable/chunks/CygC84VT.js +2 -0
- package/app/_app/immutable/chunks/D0VgZnk1.js +1 -0
- package/app/_app/immutable/chunks/D71UrO5c.js +1 -0
- package/app/_app/immutable/chunks/D7hhQvDO.js +1 -0
- package/app/_app/immutable/chunks/DD7gpKb2.js +1 -0
- package/app/_app/immutable/chunks/DNRgqfTx.js +1 -0
- package/app/_app/immutable/chunks/DRByVC-c.js +1 -0
- package/app/_app/immutable/chunks/DVRKjN-E.js +1 -0
- package/app/_app/immutable/chunks/D_J_XtJy.js +846 -0
- package/app/_app/immutable/chunks/Dbjm4OuC.js +1 -0
- package/app/_app/immutable/chunks/Dc4q22LH.js +42 -0
- package/app/_app/immutable/chunks/Dd_uD5pT.js +1 -0
- package/app/_app/immutable/chunks/DkR8_Ws6.js +2 -0
- package/app/_app/immutable/chunks/Dp9GVO-9.js +1 -0
- package/app/_app/immutable/chunks/DqcD-WtP.js +1 -0
- package/app/_app/immutable/chunks/Dt-HX3Vu.js +1 -0
- package/app/_app/immutable/chunks/FbOxj-PF.js +69 -0
- package/app/_app/immutable/chunks/QukgIHDX.js +1 -0
- package/app/_app/immutable/chunks/WxSPP8QW.js +4 -0
- package/app/_app/immutable/chunks/Xp1g1t4n.js +3 -0
- package/app/_app/immutable/chunks/iET62IRm.js +2 -0
- package/app/_app/immutable/chunks/leQCwW2d.js +1 -0
- package/app/_app/immutable/chunks/p6bgzXiY.js +1 -0
- package/app/_app/immutable/chunks/uBIymjUX.js +1 -0
- package/app/_app/immutable/chunks/xihTtKlq.js +1 -0
- package/app/_app/immutable/entry/app.IZIJXhgq.js +2 -0
- package/app/_app/immutable/entry/start.BuaYHD1N.js +1 -0
- package/app/_app/immutable/nodes/0.m_U8WC7E.js +10 -0
- package/app/_app/immutable/nodes/1.Crw8ULhB.js +1 -0
- package/app/_app/immutable/nodes/10.1nQxyH9H.js +4 -0
- package/app/_app/immutable/nodes/11.Cw0JnQF3.js +1 -0
- package/app/_app/immutable/nodes/12.BIocA1aI.js +1 -0
- package/app/_app/immutable/nodes/2.CR5BwGnt.js +17 -0
- package/app/_app/immutable/nodes/3.1B56hgAG.js +1 -0
- package/app/_app/immutable/nodes/4.SSIC7sUh.js +1 -0
- package/app/_app/immutable/nodes/5.DgdwleDQ.js +1 -0
- package/app/_app/immutable/nodes/6.DmD9rqLU.js +1 -0
- package/app/_app/immutable/nodes/7.DdngsBmo.js +1 -0
- package/app/_app/immutable/nodes/8.D2Mszsua.js +3 -0
- package/app/_app/immutable/nodes/9.CLYsywul.js +1 -0
- package/app/_app/immutable/workers/assets/ort-wasm-simd-threaded.asyncify-CxOG5pUO.wasm +0 -0
- package/app/_app/immutable/workers/llm.worker-wfCOG_uk.js +69 -0
- package/app/_app/immutable/workers/local-speech.worker-DWbfmFUk.js +51 -0
- package/app/_app/version.json +1 -0
- package/app/ai/index.html +89 -0
- package/app/blueprint/index.html +87 -0
- package/app/cookbook/index.html +87 -0
- package/app/index.html +103 -0
- package/app/m/ads/AdDeliveryTier/index.html +96 -0
- package/app/m/ads/AdEvent/index.html +96 -0
- package/app/m/ads/AdFormat/index.html +96 -0
- package/app/m/ads/AdGroup/index.html +96 -0
- package/app/m/ads/AdVariation/index.html +96 -0
- package/app/m/analytics/AnalyticsDataStream/index.html +96 -0
- package/app/m/analytics/AnalyticsEvent/index.html +96 -0
- package/app/m/analytics/AnalyticsProperty/index.html +96 -0
- package/app/m/analytics/AnalyticsReport/index.html +96 -0
- package/app/m/approvals/ApprovalEvent/index.html +96 -0
- package/app/m/approvals/ApprovalPolicy/index.html +96 -0
- package/app/m/approvals/ApprovalRequest/index.html +96 -0
- package/app/m/assets/Asset/index.html +96 -0
- package/app/m/assets/AssetAssociation/index.html +97 -0
- package/app/m/assets/AssetMetafield/index.html +96 -0
- package/app/m/assets/AssetStatus/index.html +96 -0
- package/app/m/assets/AssetType/index.html +96 -0
- package/app/m/assets/Folder/index.html +96 -0
- package/app/m/chat/AgentSession/index.html +96 -0
- package/app/m/chat/ChatMessage/index.html +97 -0
- package/app/m/chat/ChatParticipant/index.html +97 -0
- package/app/m/chat/ChatReaction/index.html +96 -0
- package/app/m/chat/ChatRoom/index.html +96 -0
- package/app/m/chat/ChatThread/index.html +97 -0
- package/app/m/chat/VoiceGatewayTurn/index.html +96 -0
- package/app/m/chat/VoiceSession/index.html +96 -0
- package/app/m/commerce/Agreement/index.html +96 -0
- package/app/m/commerce/Cart/index.html +96 -0
- package/app/m/commerce/Contract/index.html +96 -0
- package/app/m/commerce/ContractLineItem/index.html +97 -0
- package/app/m/commerce/Customer/index.html +96 -0
- package/app/m/commerce/Estimate/index.html +96 -0
- package/app/m/commerce/Fulfillment/index.html +96 -0
- package/app/m/commerce/FulfillmentLineItem/index.html +97 -0
- package/app/m/commerce/Invoice/index.html +96 -0
- package/app/m/commerce/InvoiceLineItem/index.html +97 -0
- package/app/m/commerce/Lease/index.html +96 -0
- package/app/m/commerce/LicenseSale/index.html +96 -0
- package/app/m/commerce/Order/index.html +96 -0
- package/app/m/commerce/Payment/index.html +96 -0
- package/app/m/commerce/PaymentAllocation/index.html +97 -0
- package/app/m/commerce/PaymentInstrument/index.html +96 -0
- package/app/m/commerce/PaymentIntent/index.html +96 -0
- package/app/m/commerce/Payout/index.html +96 -0
- package/app/m/commerce/ProductionOrder/index.html +96 -0
- package/app/m/commerce/PurchaseOrder/index.html +96 -0
- package/app/m/commerce/Vendor/index.html +96 -0
- package/app/m/commerce/WholesaleOrder/index.html +96 -0
- package/app/m/content/Content/index.html +96 -0
- package/app/m/content/ContentContribution/index.html +96 -0
- package/app/m/content/ContentContributionAttachment/index.html +96 -0
- package/app/m/content/ContentContributionRevision/index.html +96 -0
- package/app/m/content/ContentContributionType/index.html +96 -0
- package/app/m/content/ContentContributor/index.html +96 -0
- package/app/m/content/ContentCorrection/index.html +96 -0
- package/app/m/content/ContentFeedSource/index.html +96 -0
- package/app/m/content/ContentGovernanceAssignment/index.html +96 -0
- package/app/m/content/ContentGovernancePolicy/index.html +96 -0
- package/app/m/content/ContentGovernanceProfile/index.html +96 -0
- package/app/m/content/ContentReference/index.html +96 -0
- package/app/m/content/ContentReview/index.html +96 -0
- package/app/m/content/ContentVersion/index.html +96 -0
- package/app/m/content/Contents/index.html +96 -0
- package/app/m/events/Event/index.html +96 -0
- package/app/m/events/EventParticipant/index.html +97 -0
- package/app/m/events/EventSeries/index.html +96 -0
- package/app/m/events/EventType/index.html +96 -0
- package/app/m/facts/Fact/index.html +96 -0
- package/app/m/facts/FactContent/index.html +96 -0
- package/app/m/facts/FactEvidence/index.html +96 -0
- package/app/m/facts/FactSource/index.html +96 -0
- package/app/m/facts/FactSubject/index.html +96 -0
- package/app/m/facts/FactTag/index.html +96 -0
- package/app/m/fields/FieldPolicy/index.html +96 -0
- package/app/m/fields/FieldPolicySuggestion/index.html +96 -0
- package/app/m/fields/FieldUsageCounter/index.html +96 -0
- package/app/m/images/Image/index.html +96 -0
- package/app/m/inventory/InventoryLocation/index.html +96 -0
- package/app/m/inventory/StockLevel/index.html +96 -0
- package/app/m/inventory/StockMovement/index.html +96 -0
- package/app/m/ledgers/Account/index.html +96 -0
- package/app/m/ledgers/Journal/index.html +96 -0
- package/app/m/ledgers/JournalEntry/index.html +97 -0
- package/app/m/manufacturing/Assembly/index.html +96 -0
- package/app/m/manufacturing/BillOfMaterials/index.html +96 -0
- package/app/m/manufacturing/BomLine/index.html +96 -0
- package/app/m/manufacturing/Operation/index.html +96 -0
- package/app/m/manufacturing/ProductionRun/index.html +96 -0
- package/app/m/manufacturing/ProductionRunCompletion/index.html +96 -0
- package/app/m/manufacturing/RoutingStep/index.html +96 -0
- package/app/m/marketing/Campaign/index.html +96 -0
- package/app/m/marketing/CampaignChannel/index.html +96 -0
- package/app/m/marketing/CampaignMetricSnapshot/index.html +96 -0
- package/app/m/messages/Account/index.html +96 -0
- package/app/m/messages/Attachment/index.html +96 -0
- package/app/m/messages/Blacklist/index.html +96 -0
- package/app/m/messages/Email/failed-sends/index.html +96 -0
- package/app/m/messages/Email/index.html +96 -0
- package/app/m/messages/Email/mailbox/index.html +96 -0
- package/app/m/messages/EmailAccount/index.html +96 -0
- package/app/m/messages/EmailFolder/index.html +96 -0
- package/app/m/messages/Message/index.html +96 -0
- package/app/m/messages/MessagingEndpoint/index.html +96 -0
- package/app/m/messages/PersonaMessageRoute/index.html +96 -0
- package/app/m/messages/SlackAccount/index.html +96 -0
- package/app/m/messages/SlackMessage/index.html +96 -0
- package/app/m/messages/TelegramAccount/index.html +96 -0
- package/app/m/messages/Tweet/index.html +96 -0
- package/app/m/messages/TwitterAccount/index.html +96 -0
- package/app/m/messages/Whitelist/index.html +96 -0
- package/app/m/messages/ZulipAccount/index.html +96 -0
- package/app/m/places/Place/index.html +96 -0
- package/app/m/places/PlaceType/index.html +96 -0
- package/app/m/preferences/UiPreferenceRecord/index.html +96 -0
- package/app/m/products/Category/index.html +96 -0
- package/app/m/products/Material/index.html +96 -0
- package/app/m/products/Product/index.html +96 -0
- package/app/m/products/Product/ingredients/index.html +96 -0
- package/app/m/products/ProductVariant/index.html +97 -0
- package/app/m/products/Sku/index.html +97 -0
- package/app/m/profiles/ApiKey/index.html +96 -0
- package/app/m/profiles/Bot/index.html +96 -0
- package/app/m/profiles/MagicLinkToken/index.html +96 -0
- package/app/m/profiles/NostrIdentity/index.html +96 -0
- package/app/m/profiles/OidcIdentity/index.html +96 -0
- package/app/m/profiles/Organization/index.html +96 -0
- package/app/m/profiles/Person/index.html +96 -0
- package/app/m/profiles/Profile/index.html +96 -0
- package/app/m/profiles/ProfileMetadata/index.html +96 -0
- package/app/m/profiles/ProfileMetafield/index.html +96 -0
- package/app/m/profiles/ProfileRelationship/index.html +96 -0
- package/app/m/profiles/ProfileRelationshipTerm/index.html +96 -0
- package/app/m/profiles/ProfileRelationshipType/index.html +96 -0
- package/app/m/profiles/ProfileType/index.html +96 -0
- package/app/m/projects/Comment/index.html +97 -0
- package/app/m/projects/Issue/index.html +96 -0
- package/app/m/projects/Label/index.html +96 -0
- package/app/m/projects/Project/index.html +96 -0
- package/app/m/projects/ProjectIntegration/index.html +96 -0
- package/app/m/projects/PullRequest/index.html +96 -0
- package/app/m/projects/Repository/index.html +96 -0
- package/app/m/properties/Property/index.html +96 -0
- package/app/m/properties/Zone/index.html +96 -0
- package/app/m/reports/RuntimeReport/index.html +96 -0
- package/app/m/reports/SmrtPrincipalReportRefreshTask/index.html +96 -0
- package/app/m/reports/SmrtReportLock/index.html +96 -0
- package/app/m/reports/SmrtReportRefreshTask/index.html +96 -0
- package/app/m/reports/SmrtReportRun/index.html +96 -0
- package/app/m/reports/SmrtReportSchedule/index.html +96 -0
- package/app/m/reports/SmrtReportWatermark/index.html +96 -0
- package/app/m/sales/AttributionException/index.html +96 -0
- package/app/m/sales/AttributionPolicy/index.html +96 -0
- package/app/m/sales/Commission/index.html +96 -0
- package/app/m/sales/CommissionAdjustment/index.html +96 -0
- package/app/m/sales/CommissionPayout/index.html +96 -0
- package/app/m/sales/CommissionPlan/index.html +96 -0
- package/app/m/sales/Earner/index.html +96 -0
- package/app/m/sales/EarnerSourceAttribution/index.html +96 -0
- package/app/m/sales/EarningEvent/index.html +96 -0
- package/app/m/sales/ExecutedAgreement/index.html +96 -0
- package/app/m/sales/Lead/index.html +96 -0
- package/app/m/sales/Opportunity/index.html +96 -0
- package/app/m/sales/OpportunityConversion/index.html +96 -0
- package/app/m/sales/PipelineDefinition/index.html +96 -0
- package/app/m/sales/PipelineStage/index.html +97 -0
- package/app/m/sales/Referral/index.html +96 -0
- package/app/m/sales/ReferralAgreement/index.html +96 -0
- package/app/m/sales/ReferralLink/index.html +96 -0
- package/app/m/sales/ReferralProgram/index.html +96 -0
- package/app/m/sales/ReferralTermSnapshot/index.html +96 -0
- package/app/m/sales/ReferralTouch/index.html +96 -0
- package/app/m/sales/Referrer/index.html +96 -0
- package/app/m/sales/SalesActivity/index.html +96 -0
- package/app/m/sales/SalesRepresentative/index.html +96 -0
- package/app/m/sites/Site/index.html +96 -0
- package/app/m/sites/SiteAgentBinding/index.html +96 -0
- package/app/m/social/OAuthState/index.html +96 -0
- package/app/m/social/SocialAccount/index.html +96 -0
- package/app/m/social/SocialPost/index.html +96 -0
- package/app/m/social/SocialPostAnalyticsSnapshot/index.html +96 -0
- package/app/m/subscriptions/BillingAdjustment/index.html +96 -0
- package/app/m/subscriptions/ClientCharge/index.html +96 -0
- package/app/m/subscriptions/CreditGrant/index.html +96 -0
- package/app/m/subscriptions/PricingRule/index.html +96 -0
- package/app/m/subscriptions/RetailCharge/index.html +96 -0
- package/app/m/subscriptions/SpendingPolicy/index.html +96 -0
- package/app/m/subscriptions/SubscriptionPlan/index.html +96 -0
- package/app/m/subscriptions/TenantSubscription/index.html +96 -0
- package/app/m/subscriptions/TenantUsageMetric/index.html +96 -0
- package/app/m/support/ServiceTimeEntry/index.html +96 -0
- package/app/m/support/SupportAiRun/index.html +96 -0
- package/app/m/support/SupportAvailability/index.html +96 -0
- package/app/m/support/SupportCase/index.html +96 -0
- package/app/m/support/SupportCaseEvent/index.html +96 -0
- package/app/m/support/SupportChannelBinding/index.html +96 -0
- package/app/m/support/SupportCharge/index.html +96 -0
- package/app/m/support/SupportCompensation/index.html +96 -0
- package/app/m/support/SupportCompensationPlan/index.html +96 -0
- package/app/m/support/SupportEscalation/index.html +96 -0
- package/app/m/support/SupportInteraction/index.html +96 -0
- package/app/m/support/SupportPlan/index.html +96 -0
- package/app/m/support/SupportPolicy/index.html +96 -0
- package/app/m/support/SupportQualification/index.html +96 -0
- package/app/m/support/SupportServiceTarget/index.html +96 -0
- package/app/m/support/SupportSpecialist/index.html +96 -0
- package/app/m/support/SupportWorkLink/index.html +96 -0
- package/app/m/tags/Tag/index.html +96 -0
- package/app/m/tags/TagAlias/index.html +96 -0
- package/app/m/timesheets/AttendanceBreak/index.html +96 -0
- package/app/m/timesheets/AttendancePunch/index.html +96 -0
- package/app/m/timesheets/ServiceChargeSnapshot/index.html +96 -0
- package/app/m/timesheets/ServiceCompensationSnapshot/index.html +96 -0
- package/app/m/timesheets/ServiceTimeEntry/index.html +96 -0
- package/app/m/users/AccessRequest/index.html +96 -0
- package/app/m/users/Group/index.html +96 -0
- package/app/m/users/GroupMember/index.html +96 -0
- package/app/m/users/GroupRole/index.html +96 -0
- package/app/m/users/Membership/index.html +97 -0
- package/app/m/users/MembershipOverride/index.html +96 -0
- package/app/m/users/Permission/index.html +96 -0
- package/app/m/users/ResourceGrant/index.html +96 -0
- package/app/m/users/Role/index.html +96 -0
- package/app/m/users/RolePermission/index.html +96 -0
- package/app/m/users/Session/index.html +96 -0
- package/app/m/users/Tenant/index.html +96 -0
- package/app/m/users/TenantIntegration/index.html +96 -0
- package/app/m/users/TenantPermissionOverride/index.html +96 -0
- package/app/m/users/User/index.html +96 -0
- package/app/m/users/UsersCliAuthRequest/index.html +96 -0
- package/app/m/users/UsersMagicLinkToken/index.html +96 -0
- package/app/m/video/Character/index.html +96 -0
- package/app/m/video/CharacterAsset/index.html +96 -0
- package/app/m/video/CompositeJob/index.html +96 -0
- package/app/m/video/Performer/index.html +96 -0
- package/app/m/video/PerformerAsset/index.html +96 -0
- package/app/m/video/Scene/index.html +96 -0
- package/app/m/video/SceneAsset/index.html +96 -0
- package/app/m/video/VideoComposition/index.html +96 -0
- package/app/m/video/VideoCompositionAsset/index.html +96 -0
- package/app/m/video/VideoSequence/index.html +96 -0
- package/app/m/video/VideoSequenceAsset/index.html +96 -0
- package/app/m/video/VideoShot/index.html +96 -0
- package/app/m/video/VideoShotAsset/index.html +96 -0
- package/app/m/video/VideoShotCharacter/index.html +96 -0
- package/app/m/video/VideoWorkflow/index.html +96 -0
- package/app/m/voice/VoiceOutput/index.html +96 -0
- package/app/m/voice/VoiceProfile/index.html +96 -0
- package/app/m/voice/VoiceSample/index.html +96 -0
- package/app/packages/ads/index.html +92 -0
- package/app/packages/analytics/index.html +92 -0
- package/app/packages/approvals/index.html +92 -0
- package/app/packages/assets/index.html +92 -0
- package/app/packages/chat/index.html +92 -0
- package/app/packages/comments/index.html +92 -0
- package/app/packages/commerce/index.html +92 -0
- package/app/packages/content/index.html +92 -0
- package/app/packages/events/index.html +92 -0
- package/app/packages/expenses/index.html +92 -0
- package/app/packages/facts/index.html +92 -0
- package/app/packages/fields/index.html +92 -0
- package/app/packages/human-resources/index.html +92 -0
- package/app/packages/images/index.html +92 -0
- package/app/packages/index.html +90 -0
- package/app/packages/inventory/index.html +92 -0
- package/app/packages/ledgers/index.html +92 -0
- package/app/packages/manufacturing/index.html +92 -0
- package/app/packages/marketing/index.html +92 -0
- package/app/packages/messages/index.html +92 -0
- package/app/packages/places/index.html +92 -0
- package/app/packages/preferences/index.html +92 -0
- package/app/packages/products/index.html +92 -0
- package/app/packages/profiles/index.html +92 -0
- package/app/packages/projects/index.html +92 -0
- package/app/packages/properties/index.html +92 -0
- package/app/packages/reports/index.html +92 -0
- package/app/packages/sales/index.html +92 -0
- package/app/packages/sites/index.html +92 -0
- package/app/packages/social/index.html +92 -0
- package/app/packages/subscriptions/index.html +92 -0
- package/app/packages/support/index.html +92 -0
- package/app/packages/tags/index.html +92 -0
- package/app/packages/timesheets/index.html +92 -0
- package/app/packages/users/index.html +92 -0
- package/app/packages/video/index.html +92 -0
- package/app/packages/voice/index.html +92 -0
- package/app/recipes/account-access/help/index.html +93 -0
- package/app/recipes/account-access/index.html +95 -0
- package/app/recipes/activity/help/index.html +93 -0
- package/app/recipes/activity/index.html +94 -0
- package/app/recipes/agreements/help/index.html +93 -0
- package/app/recipes/agreements/index.html +96 -0
- package/app/recipes/analytics.reports/help/index.html +93 -0
- package/app/recipes/analytics.reports/index.html +94 -0
- package/app/recipes/assets/help/index.html +93 -0
- package/app/recipes/assets/index.html +95 -0
- package/app/recipes/billing/help/index.html +93 -0
- package/app/recipes/billing/index.html +95 -0
- package/app/recipes/chat.assistant/help/index.html +93 -0
- package/app/recipes/chat.assistant/index.html +94 -0
- package/app/recipes/comments/help/index.html +93 -0
- package/app/recipes/comments/index.html +94 -0
- package/app/recipes/commerce.customers/help/index.html +93 -0
- package/app/recipes/commerce.customers/index.html +94 -0
- package/app/recipes/commerce.estimates/help/index.html +93 -0
- package/app/recipes/commerce.estimates/index.html +94 -0
- package/app/recipes/commerce.purchases/help/index.html +93 -0
- package/app/recipes/commerce.purchases/index.html +94 -0
- package/app/recipes/commerce.sales/help/index.html +93 -0
- package/app/recipes/commerce.sales/index.html +94 -0
- package/app/recipes/commerce.vendors/help/index.html +93 -0
- package/app/recipes/commerce.vendors/index.html +94 -0
- package/app/recipes/commerce.wholesale/help/index.html +93 -0
- package/app/recipes/commerce.wholesale/index.html +94 -0
- package/app/recipes/events.calendar/help/index.html +93 -0
- package/app/recipes/events.calendar/index.html +94 -0
- package/app/recipes/fields.form-customization/help/index.html +93 -0
- package/app/recipes/fields.form-customization/index.html +94 -0
- package/app/recipes/inventory.stock/help/index.html +93 -0
- package/app/recipes/inventory.stock/index.html +94 -0
- package/app/recipes/ledgers.bookkeeping/help/index.html +93 -0
- package/app/recipes/ledgers.bookkeeping/index.html +94 -0
- package/app/recipes/messages/help/index.html +93 -0
- package/app/recipes/messages/index.html +95 -0
- package/app/recipes/products/help/index.html +93 -0
- package/app/recipes/products/index.html +96 -0
- package/app/recipes/projects.tracker/help/index.html +93 -0
- package/app/recipes/projects.tracker/index.html +94 -0
- package/app/recipes/reports.materialized/help/index.html +93 -0
- package/app/recipes/reports.materialized/index.html +94 -0
- package/app/recipes/sales.pipeline/help/index.html +93 -0
- package/app/recipes/sales.pipeline/index.html +94 -0
- package/app/recipes/tags.taxonomy/help/index.html +93 -0
- package/app/recipes/tags.taxonomy/index.html +94 -0
- package/app/recipes/team-collaboration/help/index.html +93 -0
- package/app/recipes/team-collaboration/index.html +94 -0
- package/app/s/custom-billing/index.html +89 -0
- package/app/s/custom-buying/index.html +89 -0
- package/app/s/custom-classes/index.html +89 -0
- package/app/s/custom-jobs/index.html +89 -0
- package/app/s/custom-kitchen/index.html +89 -0
- package/app/s/custom-material/index.html +89 -0
- package/app/s/custom-members/index.html +89 -0
- package/app/s/custom-parts/index.html +89 -0
- package/app/s/custom-schedule/index.html +89 -0
- package/app/s/custom-shop/index.html +89 -0
- package/app/s/custom-wholesale/index.html +89 -0
- package/app/s/section-access-control/index.html +89 -0
- package/app/s/section-account-security/index.html +89 -0
- package/app/s/section-accounting/index.html +89 -0
- package/app/s/section-activity/index.html +89 -0
- package/app/s/section-agreements/index.html +89 -0
- package/app/s/section-analytics/index.html +89 -0
- package/app/s/section-assets/index.html +89 -0
- package/app/s/section-billing/index.html +89 -0
- package/app/s/section-calendar/index.html +89 -0
- package/app/s/section-catalog/index.html +89 -0
- package/app/s/section-chat.assistant/index.html +89 -0
- package/app/s/section-comments/index.html +89 -0
- package/app/s/section-fields.form-customization/index.html +89 -0
- package/app/s/section-messages/index.html +89 -0
- package/app/s/section-more/index.html +89 -0
- package/app/s/section-operations/index.html +89 -0
- package/app/s/section-projects/index.html +89 -0
- package/app/s/section-purchasing/index.html +89 -0
- package/app/s/section-reports.materialized/index.html +89 -0
- package/app/s/section-sales/index.html +89 -0
- package/app/s/section-taxonomy/index.html +89 -0
- package/app/s/section-team/index.html +89 -0
- package/dist/ai/echo-gate.d.ts +13 -0
- package/dist/ai/echo-gate.js +21 -0
- package/dist/ai/icons.d.ts +9 -0
- package/dist/ai/icons.js +9 -0
- package/dist/ai/instance.d.ts +3 -0
- package/dist/ai/instance.js +25 -0
- package/dist/ai/state.svelte.d.ts +130 -0
- package/dist/ai/state.svelte.js +316 -0
- package/dist/ai/status.d.ts +67 -0
- package/dist/ai/status.js +125 -0
- package/dist/assets/smrt-mark.svg +38 -0
- package/dist/assistant/change.d.ts +101 -0
- package/dist/assistant/change.js +209 -0
- package/dist/assistant/engine.d.ts +20 -0
- package/dist/assistant/engine.js +43 -0
- package/dist/assistant/llm.worker.d.ts +1 -0
- package/dist/assistant/llm.worker.js +7 -0
- package/dist/assistant/match.d.ts +59 -0
- package/dist/assistant/match.js +271 -0
- package/dist/assistant/models.d.ts +38 -0
- package/dist/assistant/models.js +57 -0
- package/dist/assistant/offers.svelte.d.ts +36 -0
- package/dist/assistant/offers.svelte.js +59 -0
- package/dist/assistant/prefs.d.ts +14 -0
- package/dist/assistant/prefs.js +32 -0
- package/dist/assistant/prompt.d.ts +23 -0
- package/dist/assistant/prompt.js +163 -0
- package/dist/assistant/session.svelte.d.ts +74 -0
- package/dist/assistant/session.svelte.js +181 -0
- package/dist/assistant/theme-undo.svelte.d.ts +38 -0
- package/dist/assistant/theme-undo.svelte.js +50 -0
- package/dist/assistant/transport.d.ts +73 -0
- package/dist/assistant/transport.js +231 -0
- package/dist/assistant/voice-host.d.ts +10 -0
- package/dist/assistant/voice-host.js +17 -0
- package/dist/assistant/voice.svelte.d.ts +107 -0
- package/dist/assistant/voice.svelte.js +261 -0
- package/dist/catalog/catalog.json +89663 -0
- package/dist/catalog/generate/build.d.ts +33 -0
- package/dist/catalog/generate/build.js +131 -0
- package/dist/catalog/generate/exclusions.d.ts +18 -0
- package/dist/catalog/generate/exclusions.js +33 -0
- package/dist/catalog/generate/extract.d.ts +90 -0
- package/dist/catalog/generate/extract.js +326 -0
- package/dist/catalog/generate/local.d.ts +8 -0
- package/dist/catalog/generate/local.js +45 -0
- package/dist/catalog/generate/recipe-demo.d.ts +11 -0
- package/dist/catalog/generate/recipe-demo.js +29 -0
- package/dist/catalog/generate/recipe-metadata.d.ts +12 -0
- package/dist/catalog/generate/recipe-metadata.js +138 -0
- package/dist/catalog/generate/registry.d.ts +14 -0
- package/dist/catalog/generate/registry.js +83 -0
- package/dist/catalog/index.d.ts +21 -0
- package/dist/catalog/index.js +53 -0
- package/dist/catalog/types.d.ts +141 -0
- package/dist/catalog/types.js +8 -0
- package/dist/components/AiSetup.svelte +528 -0
- package/dist/components/AiSetup.svelte.d.ts +8 -0
- package/dist/components/AiStatusIcons.svelte +86 -0
- package/dist/components/AiStatusIcons.svelte.d.ts +18 -0
- package/dist/components/AppSettings.svelte +100 -0
- package/dist/components/AppSettings.svelte.d.ts +10 -0
- package/dist/components/BrowserAssistant.svelte +318 -0
- package/dist/components/BrowserAssistant.svelte.d.ts +8 -0
- package/dist/components/ChildRecords.svelte +331 -0
- package/dist/components/ChildRecords.svelte.d.ts +15 -0
- package/dist/components/ConnectTools.svelte +145 -0
- package/dist/components/ConnectTools.svelte.d.ts +8 -0
- package/dist/components/CookbooksPanel.svelte +308 -0
- package/dist/components/CookbooksPanel.svelte.d.ts +3 -0
- package/dist/components/ExportPanel.svelte +217 -0
- package/dist/components/ExportPanel.svelte.d.ts +3 -0
- package/dist/components/FeatureCard.svelte +197 -0
- package/dist/components/FeatureCard.svelte.d.ts +13 -0
- package/dist/components/FeaturesPanel.svelte +155 -0
- package/dist/components/FeaturesPanel.svelte.d.ts +3 -0
- package/dist/components/FieldInput.svelte +307 -0
- package/dist/components/FieldInput.svelte.d.ts +24 -0
- package/dist/components/FieldMapForm.svelte +173 -0
- package/dist/components/FieldMapForm.svelte.d.ts +18 -0
- package/dist/components/FormWorkspace.svelte +274 -0
- package/dist/components/FormWorkspace.svelte.d.ts +19 -0
- package/dist/components/HelpView.svelte +129 -0
- package/dist/components/HelpView.svelte.d.ts +12 -0
- package/dist/components/ModelOptions.svelte +239 -0
- package/dist/components/ModelOptions.svelte.d.ts +12 -0
- package/dist/components/ModelPage.svelte +295 -0
- package/dist/components/ModelPage.svelte.d.ts +9 -0
- package/dist/components/ModelWorkspace.svelte +488 -0
- package/dist/components/ModelWorkspace.svelte.d.ts +32 -0
- package/dist/components/PlannerEditBridge.svelte +36 -0
- package/dist/components/PlannerEditBridge.svelte.d.ts +3 -0
- package/dist/components/PlannerPalette.svelte +38 -0
- package/dist/components/PlannerPalette.svelte.d.ts +18 -0
- package/dist/components/RecipeCards.svelte +145 -0
- package/dist/components/RecipeCards.svelte.d.ts +3 -0
- package/dist/components/RecipeHelp.svelte +54 -0
- package/dist/components/RecipeHelp.svelte.d.ts +9 -0
- package/dist/components/RecipeOptions.svelte +160 -0
- package/dist/components/RecipeOptions.svelte.d.ts +9 -0
- package/dist/components/RecordFeatures.svelte +240 -0
- package/dist/components/RecordFeatures.svelte.d.ts +3 -0
- package/dist/components/RelationField.svelte +175 -0
- package/dist/components/RelationField.svelte.d.ts +16 -0
- package/dist/components/SectionActions.svelte +91 -0
- package/dist/components/SectionActions.svelte.d.ts +12 -0
- package/dist/components/SectionIcons.svelte +98 -0
- package/dist/components/SectionIcons.svelte.d.ts +15 -0
- package/dist/components/SectionOverview.svelte +65 -0
- package/dist/components/SectionOverview.svelte.d.ts +14 -0
- package/dist/components/SectionPage.svelte +230 -0
- package/dist/components/SectionPage.svelte.d.ts +7 -0
- package/dist/components/SettingsPanel.svelte +60 -0
- package/dist/components/SettingsPanel.svelte.d.ts +7 -0
- package/dist/components/ThemeBridge.svelte +56 -0
- package/dist/components/ThemeBridge.svelte.d.ts +3 -0
- package/dist/components/ThemeSection.svelte +167 -0
- package/dist/components/ThemeSection.svelte.d.ts +11 -0
- package/dist/components/VariantGridForm.svelte +309 -0
- package/dist/components/VariantGridForm.svelte.d.ts +12 -0
- package/dist/components/VoiceTyping.svelte +108 -0
- package/dist/components/VoiceTyping.svelte.d.ts +7 -0
- package/dist/cookbook/assemble.d.ts +16 -0
- package/dist/cookbook/assemble.js +29 -0
- package/dist/cookbook/file.d.ts +7 -0
- package/dist/cookbook/file.js +25 -0
- package/dist/cookbook/legacy.d.ts +9 -0
- package/dist/cookbook/legacy.js +87 -0
- package/dist/cookbook/migrate.d.ts +22 -0
- package/dist/cookbook/migrate.js +106 -0
- package/dist/cookbook/parse.d.ts +16 -0
- package/dist/cookbook/parse.js +246 -0
- package/dist/cookbook/storage.d.ts +45 -0
- package/dist/cookbook/storage.js +98 -0
- package/dist/cookbook/store.svelte.d.ts +94 -0
- package/dist/cookbook/store.svelte.js +231 -0
- package/dist/cookbook/types.d.ts +76 -0
- package/dist/cookbook/types.js +11 -0
- package/dist/cookbook/validate.d.ts +14 -0
- package/dist/cookbook/validate.js +29 -0
- package/dist/core/app.d.ts +37 -0
- package/dist/core/app.js +119 -0
- package/dist/core/catalog.d.ts +19 -0
- package/dist/core/catalog.js +9 -0
- package/dist/core/headless.d.ts +52 -0
- package/dist/core/headless.js +39 -0
- package/dist/core/index.d.ts +28 -0
- package/dist/core/index.js +28 -0
- package/dist/core/prompt.d.ts +38 -0
- package/dist/core/prompt.js +95 -0
- package/dist/core/reply.d.ts +60 -0
- package/dist/core/reply.js +89 -0
- package/dist/core/request.d.ts +15 -0
- package/dist/core/request.js +55 -0
- package/dist/data/children.d.ts +20 -0
- package/dist/data/children.js +80 -0
- package/dist/data/columns.d.ts +56 -0
- package/dist/data/columns.js +150 -0
- package/dist/data/context.d.ts +8 -0
- package/dist/data/context.js +19 -0
- package/dist/data/derived.d.ts +79 -0
- package/dist/data/derived.js +139 -0
- package/dist/data/display.d.ts +23 -0
- package/dist/data/display.js +84 -0
- package/dist/data/fakes.d.ts +52 -0
- package/dist/data/fakes.js +443 -0
- package/dist/data/format.d.ts +48 -0
- package/dist/data/format.js +121 -0
- package/dist/data/labels.d.ts +45 -0
- package/dist/data/labels.js +179 -0
- package/dist/data/packs.d.ts +95 -0
- package/dist/data/packs.js +830 -0
- package/dist/data/payments.d.ts +17 -0
- package/dist/data/payments.js +60 -0
- package/dist/data/planner-source.d.ts +7 -0
- package/dist/data/planner-source.js +32 -0
- package/dist/data/source.d.ts +119 -0
- package/dist/data/source.js +432 -0
- package/dist/features/catalogue.d.ts +96 -0
- package/dist/features/catalogue.js +225 -0
- package/dist/features/demo.d.ts +36 -0
- package/dist/features/demo.js +66 -0
- package/dist/features/palette.d.ts +39 -0
- package/dist/features/palette.js +53 -0
- package/dist/fields/address.d.ts +23 -0
- package/dist/fields/address.js +39 -0
- package/dist/fields/invalid.d.ts +2 -0
- package/dist/fields/invalid.js +8 -0
- package/dist/fields/modal.d.ts +7 -0
- package/dist/fields/modal.js +14 -0
- package/dist/fields/percent.d.ts +8 -0
- package/dist/fields/percent.js +16 -0
- package/dist/fields/renderer.d.ts +17 -0
- package/dist/fields/renderer.js +43 -0
- package/dist/forms/active.d.ts +16 -0
- package/dist/forms/active.js +24 -0
- package/dist/forms/fieldMap.d.ts +44 -0
- package/dist/forms/fieldMap.js +134 -0
- package/dist/forms/shared.d.ts +41 -0
- package/dist/forms/shared.js +138 -0
- package/dist/forms/stock.d.ts +28 -0
- package/dist/forms/stock.js +104 -0
- package/dist/forms/variantGrid.d.ts +83 -0
- package/dist/forms/variantGrid.js +283 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.js +16 -0
- package/dist/inference/byo.svelte.d.ts +90 -0
- package/dist/inference/byo.svelte.js +295 -0
- package/dist/inference/config.d.ts +77 -0
- package/dist/inference/config.js +205 -0
- package/dist/inference/host.d.ts +40 -0
- package/dist/inference/host.js +57 -0
- package/dist/inference/openai.d.ts +59 -0
- package/dist/inference/openai.js +207 -0
- package/dist/inference/presets.d.ts +5 -0
- package/dist/inference/presets.js +46 -0
- package/dist/kitchen/client.d.ts +39 -0
- package/dist/kitchen/client.js +115 -0
- package/dist/kitchen/fragment.d.ts +30 -0
- package/dist/kitchen/fragment.js +49 -0
- package/dist/kitchen/state.svelte.d.ts +26 -0
- package/dist/kitchen/state.svelte.js +45 -0
- package/dist/library/apply.d.ts +17 -0
- package/dist/library/apply.js +32 -0
- package/dist/library/document.d.ts +12 -0
- package/dist/library/document.js +27 -0
- package/dist/library/icons.d.ts +6 -0
- package/dist/library/icons.js +26 -0
- package/dist/library/index.d.ts +8 -0
- package/dist/library/index.js +12 -0
- package/dist/library/library.json +788 -0
- package/dist/library/menu.d.ts +18 -0
- package/dist/library/menu.js +72 -0
- package/dist/library/state.svelte.d.ts +10 -0
- package/dist/library/state.svelte.js +28 -0
- package/dist/library/types.d.ts +57 -0
- package/dist/library/types.js +1 -0
- package/dist/overviews/definitions.d.ts +24 -0
- package/dist/overviews/definitions.js +97 -0
- package/dist/overviews/page.d.ts +21 -0
- package/dist/overviews/page.js +36 -0
- package/dist/overviews/registry.d.ts +44 -0
- package/dist/overviews/registry.js +191 -0
- package/dist/overviews/validate.d.ts +32 -0
- package/dist/overviews/validate.js +91 -0
- package/dist/planner/Planner.svelte +204 -0
- package/dist/planner/Planner.svelte.d.ts +4 -0
- package/dist/planner/app.svelte.d.ts +6 -0
- package/dist/planner/app.svelte.js +23 -0
- package/dist/planner/assistant.d.ts +46 -0
- package/dist/planner/assistant.js +122 -0
- package/dist/planner/commands/adapter.d.ts +121 -0
- package/dist/planner/commands/adapter.js +597 -0
- package/dist/planner/commands/catalog.d.ts +19 -0
- package/dist/planner/commands/catalog.js +54 -0
- package/dist/planner/commands/controller.svelte.d.ts +13 -0
- package/dist/planner/commands/controller.svelte.js +77 -0
- package/dist/planner/commands/index.d.ts +15 -0
- package/dist/planner/commands/index.js +15 -0
- package/dist/planner/commands/schemas.d.ts +25 -0
- package/dist/planner/commands/schemas.js +67 -0
- package/dist/planner/commands/slices.d.ts +18 -0
- package/dist/planner/commands/slices.js +49 -0
- package/dist/planner/commands/types.d.ts +80 -0
- package/dist/planner/commands/types.js +18 -0
- package/dist/planner/create.d.ts +4 -0
- package/dist/planner/create.js +22 -0
- package/dist/planner/instance.d.ts +15 -0
- package/dist/planner/instance.js +22 -0
- package/dist/planner/query.d.ts +16 -0
- package/dist/planner/query.js +28 -0
- package/dist/planner/selection.d.ts +15 -0
- package/dist/planner/selection.js +38 -0
- package/dist/planner/selection.svelte.d.ts +29 -0
- package/dist/planner/selection.svelte.js +54 -0
- package/dist/planner/tab.svelte.d.ts +11 -0
- package/dist/planner/tab.svelte.js +22 -0
- package/dist/planner/types.d.ts +41 -0
- package/dist/planner/types.js +1 -0
- package/dist/recipes/cards.d.ts +55 -0
- package/dist/recipes/cards.js +80 -0
- package/dist/recipes/features.d.ts +53 -0
- package/dist/recipes/features.js +97 -0
- package/dist/recipes/help/descriptions.json +373 -0
- package/dist/recipes/help.d.ts +121 -0
- package/dist/recipes/help.js +262 -0
- package/dist/recipes/index.d.ts +65 -0
- package/dist/recipes/index.js +95 -0
- package/dist/recipes/merge.d.ts +26 -0
- package/dist/recipes/merge.js +21 -0
- package/dist/recipes/overlay.json +409 -0
- package/dist/recipes/plan-data.d.ts +41 -0
- package/dist/recipes/plan-data.js +97 -0
- package/dist/recipes/plumbing.d.ts +70 -0
- package/dist/recipes/plumbing.js +185 -0
- package/dist/recipes/policy.d.ts +118 -0
- package/dist/recipes/policy.js +268 -0
- package/dist/recipes/resolve.d.ts +19 -0
- package/dist/recipes/resolve.js +65 -0
- package/dist/recipes/scope.d.ts +25 -0
- package/dist/recipes/scope.js +31 -0
- package/dist/recipes/sections.d.ts +49 -0
- package/dist/recipes/sections.js +84 -0
- package/dist/recipes/state.svelte.d.ts +67 -0
- package/dist/recipes/state.svelte.js +112 -0
- package/dist/recipes/types.d.ts +322 -0
- package/dist/recipes/types.js +8 -0
- package/dist/sections/entries.d.ts +30 -0
- package/dist/sections/entries.js +57 -0
- package/dist/sections/info.d.ts +16 -0
- package/dist/sections/info.js +39 -0
- package/dist/sections/path.d.ts +12 -0
- package/dist/sections/path.js +18 -0
- package/dist/settings/app-settings.d.ts +44 -0
- package/dist/settings/app-settings.js +138 -0
- package/dist/settings/currencies.d.ts +2 -0
- package/dist/settings/currencies.js +8 -0
- package/dist/theme/runtime.d.ts +14 -0
- package/dist/theme/runtime.js +27 -0
- package/dist/theme/theme.d.ts +47 -0
- package/dist/theme/theme.js +122 -0
- package/dist/upstream/CustomerSelect.svelte +60 -0
- package/dist/upstream/CustomerSelect.svelte.d.ts +17 -0
- package/dist/upstream/VendorSelect.svelte +60 -0
- package/dist/upstream/VendorSelect.svelte.d.ts +17 -0
- package/dist/upstream/overlay.d.ts +10 -0
- package/dist/upstream/overlay.js +49 -0
- package/dist/upstream/partySelect.d.ts +8 -0
- package/dist/upstream/partySelect.js +21 -0
- package/dist/upstream/partyTypes.d.ts +64 -0
- package/dist/upstream/partyTypes.js +8 -0
- package/dist/upstream/relations.d.ts +2 -0
- package/dist/upstream/relations.js +24 -0
- package/dist/upstream/selects.d.ts +26 -0
- package/dist/upstream/selects.js +20 -0
- package/dist/upstream/widgets.d.ts +20 -0
- package/dist/upstream/widgets.js +30 -0
- package/package.json +81 -3
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import type { CatalogPackage } from '../catalog/types.ts';
|
|
2
|
+
import type { Recipe, RecipeSurface } from '../recipes/types.ts';
|
|
3
|
+
import { type DemoBadge } from './demo.ts';
|
|
4
|
+
/**
|
|
5
|
+
* The Features catalogue: every recipe the catalog carries, presented as a
|
|
6
|
+
* feature (what it is, where it runs, what it needs, what you get) and
|
|
7
|
+
* browsable by the recipe's `group`. Pure and data-driven: a recipe a smrt
|
|
8
|
+
* release adds shows up with no change here.
|
|
9
|
+
*/
|
|
10
|
+
/** Browse facet. A recipe without a `group` falls under its package. */
|
|
11
|
+
export interface FeatureGroup {
|
|
12
|
+
id: string;
|
|
13
|
+
label: string;
|
|
14
|
+
summary?: string;
|
|
15
|
+
}
|
|
16
|
+
/** What a recipe adds that is not a model: one line each. */
|
|
17
|
+
export interface FeatureGets {
|
|
18
|
+
/** `menu` for a list-and-form entry, else the surface kind. */
|
|
19
|
+
kind: 'menu' | RecipeSurface['kind'] | 'data';
|
|
20
|
+
/** The kind in words, e.g. "Shell widget". */
|
|
21
|
+
kindLabel: string;
|
|
22
|
+
/** The thing's name, e.g. "Assistant". */
|
|
23
|
+
label: string;
|
|
24
|
+
/** Where it lands, e.g. "header, right side" or "/analytics/summary". */
|
|
25
|
+
where?: string;
|
|
26
|
+
}
|
|
27
|
+
/** A provider need with the secret NAMES (never values). */
|
|
28
|
+
export interface FeatureProvider {
|
|
29
|
+
id: string;
|
|
30
|
+
kind: string;
|
|
31
|
+
kindLabel: string;
|
|
32
|
+
required: boolean;
|
|
33
|
+
options: string[];
|
|
34
|
+
/** Options that run in a browser with none of the secrets. */
|
|
35
|
+
browserOptions: string[];
|
|
36
|
+
secrets: string[];
|
|
37
|
+
}
|
|
38
|
+
export interface FeatureCard {
|
|
39
|
+
recipe: Recipe;
|
|
40
|
+
id: string;
|
|
41
|
+
label: string;
|
|
42
|
+
/** The one-line help. */
|
|
43
|
+
summary: string;
|
|
44
|
+
group: FeatureGroup;
|
|
45
|
+
packageId: string;
|
|
46
|
+
/** Browser-demo label including what the recipe requires; absent if unreported. */
|
|
47
|
+
demo: DemoBadge | undefined;
|
|
48
|
+
/** The recipe's own mode when it differs from the effective one. */
|
|
49
|
+
ownMode: DemoBadge['mode'] | undefined;
|
|
50
|
+
/** What the package's own browser capability says, when reported. */
|
|
51
|
+
packageNote: string | undefined;
|
|
52
|
+
providers: FeatureProvider[];
|
|
53
|
+
gets: FeatureGets[];
|
|
54
|
+
/** Ids of recipes it requires. */
|
|
55
|
+
requires: string[];
|
|
56
|
+
runtime: Recipe['runtime'];
|
|
57
|
+
}
|
|
58
|
+
/** An option id in words (`webllm` -> "WebLLM", `mock` -> "Mock"). */
|
|
59
|
+
export declare function optionLabel(option: string): string;
|
|
60
|
+
/** `a, b or c` / `a and b`: option ids as a readable list. */
|
|
61
|
+
export declare function optionList(options: readonly string[], joiner?: 'and' | 'or'): string;
|
|
62
|
+
/** One surface as a line of "what you get". */
|
|
63
|
+
export declare function describeSurface(surface: RecipeSurface): FeatureGets;
|
|
64
|
+
/**
|
|
65
|
+
* What adding the recipe gives: its menu entries (a list and form each), then
|
|
66
|
+
* its surfaces. A recipe with neither stores records only.
|
|
67
|
+
*/
|
|
68
|
+
export declare function featureGets(recipe: Recipe): FeatureGets[];
|
|
69
|
+
/**
|
|
70
|
+
* The browse group of a recipe: its declared `group`, else its package (so a
|
|
71
|
+
* feature that declares no group is still found next to its siblings).
|
|
72
|
+
*/
|
|
73
|
+
export declare function groupOf(recipe: Recipe, packageId: string): FeatureGroup;
|
|
74
|
+
/**
|
|
75
|
+
* One card per recipe, in the recipes' order. `packages` says which package
|
|
76
|
+
* declared each recipe (a recipe the catalog does not place falls back to the
|
|
77
|
+
* package of its first model).
|
|
78
|
+
*/
|
|
79
|
+
export declare function buildFeatureCards(recipes: readonly Recipe[], packages: readonly CatalogPackage[]): FeatureCard[];
|
|
80
|
+
/** Groups present in `cards`, by label. */
|
|
81
|
+
export declare function featureGroups(cards: readonly FeatureCard[]): FeatureGroup[];
|
|
82
|
+
/** Cards matching every search term, and the group when one is chosen. */
|
|
83
|
+
export declare function filterFeatureCards(cards: readonly FeatureCard[], query: string, groupId?: string | null): FeatureCard[];
|
|
84
|
+
/** Cards by group, groups by label, cards in their given order. */
|
|
85
|
+
export declare function cardsByGroup(cards: readonly FeatureCard[]): {
|
|
86
|
+
group: FeatureGroup;
|
|
87
|
+
cards: FeatureCard[];
|
|
88
|
+
}[];
|
|
89
|
+
/**
|
|
90
|
+
* The recipes switching `id` on would add besides itself, i.e. its
|
|
91
|
+
* `requires` (transitively) and the first alternative of an unmet
|
|
92
|
+
* `requiresAny`; the same resolution the Recipes tab applies.
|
|
93
|
+
*/
|
|
94
|
+
export declare function alsoAdds(id: string, selected: readonly string[], recipes: ReadonlyMap<string, Recipe>): string[];
|
|
95
|
+
/** The secrets a card needs by name, deduplicated across its providers. */
|
|
96
|
+
export declare function secretNames(card: FeatureCard): string[];
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
import { humanize } from "../data/format.js";
|
|
2
|
+
import { withRequirements } from "../recipes/resolve.js";
|
|
3
|
+
import { browserNote, demoBadge, effectiveDemo, } from "./demo.js";
|
|
4
|
+
const SLOT_WORDS = {
|
|
5
|
+
'header.start': 'header, left side',
|
|
6
|
+
'header.center': 'header, middle',
|
|
7
|
+
'header.end': 'header, right side',
|
|
8
|
+
'footer.start': 'footer, left side',
|
|
9
|
+
'footer.center': 'footer, middle',
|
|
10
|
+
'footer.end': 'footer, right side',
|
|
11
|
+
'leftSidebar.header': 'left sidebar, top',
|
|
12
|
+
'leftSidebar.footer': 'left sidebar, bottom',
|
|
13
|
+
'rightSidebar.header': 'right sidebar, top',
|
|
14
|
+
'rightSidebar.footer': 'right sidebar, bottom',
|
|
15
|
+
};
|
|
16
|
+
const PROVIDER_KIND_WORDS = {
|
|
17
|
+
llm: 'Language model',
|
|
18
|
+
email: 'Email',
|
|
19
|
+
oauth: 'Sign-in (OAuth)',
|
|
20
|
+
storage: 'File storage',
|
|
21
|
+
sms: 'Text messages',
|
|
22
|
+
payments: 'Payments',
|
|
23
|
+
};
|
|
24
|
+
const OPTION_WORDS = {
|
|
25
|
+
openai: 'OpenAI',
|
|
26
|
+
anthropic: 'Anthropic',
|
|
27
|
+
gemini: 'Gemini',
|
|
28
|
+
webllm: 'WebLLM',
|
|
29
|
+
bitgpu: 'BitGPU',
|
|
30
|
+
smtp: 'SMTP',
|
|
31
|
+
imap: 'IMAP',
|
|
32
|
+
s3: 'S3',
|
|
33
|
+
github: 'GitHub',
|
|
34
|
+
};
|
|
35
|
+
/** An option id in words (`webllm` -> "WebLLM", `mock` -> "Mock"). */
|
|
36
|
+
export function optionLabel(option) {
|
|
37
|
+
return OPTION_WORDS[option] ?? humanize(option);
|
|
38
|
+
}
|
|
39
|
+
/** `a, b or c` / `a and b`: option ids as a readable list. */
|
|
40
|
+
export function optionList(options, joiner = 'or') {
|
|
41
|
+
const labels = options.map(optionLabel);
|
|
42
|
+
if (labels.length <= 1)
|
|
43
|
+
return labels.join('');
|
|
44
|
+
if (labels.length === 2)
|
|
45
|
+
return `${labels[0]} ${joiner} ${labels[1]}`;
|
|
46
|
+
return `${labels.slice(0, -1).join(', ')} ${joiner} ${labels[labels.length - 1]}`;
|
|
47
|
+
}
|
|
48
|
+
/** One surface as a line of "what you get". */
|
|
49
|
+
export function describeSurface(surface) {
|
|
50
|
+
switch (surface.kind) {
|
|
51
|
+
case 'shell-widget':
|
|
52
|
+
return {
|
|
53
|
+
kind: surface.kind,
|
|
54
|
+
kindLabel: 'Shell widget',
|
|
55
|
+
label: surface.label,
|
|
56
|
+
where: SLOT_WORDS[surface.slot] ?? humanize(surface.slot),
|
|
57
|
+
};
|
|
58
|
+
case 'route':
|
|
59
|
+
return {
|
|
60
|
+
kind: surface.kind,
|
|
61
|
+
kindLabel: 'Page',
|
|
62
|
+
label: surface.label,
|
|
63
|
+
where: surface.path,
|
|
64
|
+
};
|
|
65
|
+
case 'settings-panel':
|
|
66
|
+
return {
|
|
67
|
+
kind: surface.kind,
|
|
68
|
+
kindLabel: 'Settings panel',
|
|
69
|
+
label: surface.label,
|
|
70
|
+
};
|
|
71
|
+
case 'playground':
|
|
72
|
+
return {
|
|
73
|
+
kind: surface.kind,
|
|
74
|
+
kindLabel: 'Playground',
|
|
75
|
+
label: surface.label ?? 'Try it',
|
|
76
|
+
};
|
|
77
|
+
case 'widget':
|
|
78
|
+
return {
|
|
79
|
+
kind: surface.kind,
|
|
80
|
+
kindLabel: 'Overview widget',
|
|
81
|
+
label: surface.label,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
function describeProvider(provider) {
|
|
86
|
+
return {
|
|
87
|
+
id: provider.id,
|
|
88
|
+
kind: provider.kind,
|
|
89
|
+
kindLabel: PROVIDER_KIND_WORDS[provider.kind] ?? humanize(provider.kind),
|
|
90
|
+
required: provider.required,
|
|
91
|
+
options: provider.options,
|
|
92
|
+
browserOptions: provider.browserOptions ?? [],
|
|
93
|
+
secrets: provider.secrets ?? [],
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* What adding the recipe gives: its menu entries (a list and form each), then
|
|
98
|
+
* its surfaces. A recipe with neither stores records only.
|
|
99
|
+
*/
|
|
100
|
+
export function featureGets(recipe) {
|
|
101
|
+
const menu = recipe.nav.map((entry) => ({
|
|
102
|
+
kind: 'menu',
|
|
103
|
+
kindLabel: 'List and form',
|
|
104
|
+
label: entry.label,
|
|
105
|
+
}));
|
|
106
|
+
const surfaces = (recipe.surfaces ?? []).map(describeSurface);
|
|
107
|
+
const gets = [...menu, ...surfaces];
|
|
108
|
+
if (gets.length > 0)
|
|
109
|
+
return gets;
|
|
110
|
+
return [
|
|
111
|
+
{
|
|
112
|
+
kind: 'data',
|
|
113
|
+
kindLabel: 'Records only',
|
|
114
|
+
label: `${recipe.models.length} ${recipe.models.length === 1 ? 'model' : 'models'}, no screens of their own`,
|
|
115
|
+
},
|
|
116
|
+
];
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* The browse group of a recipe: its declared `group`, else its package (so a
|
|
120
|
+
* feature that declares no group is still found next to its siblings).
|
|
121
|
+
*/
|
|
122
|
+
export function groupOf(recipe, packageId) {
|
|
123
|
+
if (recipe.group) {
|
|
124
|
+
return {
|
|
125
|
+
id: `group:${recipe.group.id}`,
|
|
126
|
+
label: recipe.group.label,
|
|
127
|
+
...(recipe.group.summary ? { summary: recipe.group.summary } : {}),
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
return { id: `package:${packageId}`, label: humanize(packageId) };
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* One card per recipe, in the recipes' order. `packages` says which package
|
|
134
|
+
* declared each recipe (a recipe the catalog does not place falls back to the
|
|
135
|
+
* package of its first model).
|
|
136
|
+
*/
|
|
137
|
+
export function buildFeatureCards(recipes, packages) {
|
|
138
|
+
const declaredBy = new Map();
|
|
139
|
+
for (const pkg of packages) {
|
|
140
|
+
for (const recipe of pkg.recipes ?? [])
|
|
141
|
+
declaredBy.set(recipe.id, pkg);
|
|
142
|
+
}
|
|
143
|
+
const owner = (recipe) => declaredBy.get(recipe.id) ??
|
|
144
|
+
packages.find((pkg) => pkg.models.some((m) => m.id === recipe.models[0]));
|
|
145
|
+
return recipes.map((recipe) => {
|
|
146
|
+
const pkg = owner(recipe);
|
|
147
|
+
const packageId = pkg?.id ?? recipe.id.split('.')[0];
|
|
148
|
+
const effective = effectiveDemo(recipe);
|
|
149
|
+
const badge = demoBadge(effective);
|
|
150
|
+
return {
|
|
151
|
+
recipe,
|
|
152
|
+
id: recipe.id,
|
|
153
|
+
label: recipe.label,
|
|
154
|
+
summary: recipe.summary,
|
|
155
|
+
group: groupOf(recipe, packageId),
|
|
156
|
+
packageId,
|
|
157
|
+
demo: badge,
|
|
158
|
+
ownMode: recipe.demo && effective && recipe.demo.mode !== effective.mode
|
|
159
|
+
? recipe.demo.mode
|
|
160
|
+
: undefined,
|
|
161
|
+
packageNote: browserNote(pkg?.browser),
|
|
162
|
+
providers: (recipe.providers ?? []).map(describeProvider),
|
|
163
|
+
gets: featureGets(recipe),
|
|
164
|
+
requires: recipe.requires,
|
|
165
|
+
runtime: recipe.runtime,
|
|
166
|
+
};
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
/** Groups present in `cards`, by label. */
|
|
170
|
+
export function featureGroups(cards) {
|
|
171
|
+
const groups = new Map();
|
|
172
|
+
for (const card of cards) {
|
|
173
|
+
const existing = groups.get(card.group.id);
|
|
174
|
+
if (!existing)
|
|
175
|
+
groups.set(card.group.id, card.group);
|
|
176
|
+
else if (!existing.summary && card.group.summary) {
|
|
177
|
+
groups.set(card.group.id, { ...existing, summary: card.group.summary });
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
return [...groups.values()].sort((a, b) => a.label.localeCompare(b.label));
|
|
181
|
+
}
|
|
182
|
+
/** Cards matching every search term, and the group when one is chosen. */
|
|
183
|
+
export function filterFeatureCards(cards, query, groupId) {
|
|
184
|
+
const terms = query.toLowerCase().split(/\s+/).filter(Boolean);
|
|
185
|
+
return cards.filter((card) => {
|
|
186
|
+
if (groupId && card.group.id !== groupId)
|
|
187
|
+
return false;
|
|
188
|
+
if (terms.length === 0)
|
|
189
|
+
return true;
|
|
190
|
+
const haystack = [
|
|
191
|
+
card.label,
|
|
192
|
+
card.summary,
|
|
193
|
+
card.id,
|
|
194
|
+
card.group.label,
|
|
195
|
+
card.packageId,
|
|
196
|
+
...card.recipe.synonyms,
|
|
197
|
+
...card.gets.flatMap((g) => [g.kindLabel, g.label, g.where ?? '']),
|
|
198
|
+
...card.providers.flatMap((p) => [p.kindLabel, ...p.options]),
|
|
199
|
+
card.demo?.label ?? '',
|
|
200
|
+
]
|
|
201
|
+
.join(' ')
|
|
202
|
+
.toLowerCase();
|
|
203
|
+
return terms.every((term) => haystack.includes(term));
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
/** Cards by group, groups by label, cards in their given order. */
|
|
207
|
+
export function cardsByGroup(cards) {
|
|
208
|
+
return featureGroups(cards).map((group) => ({
|
|
209
|
+
group,
|
|
210
|
+
cards: cards.filter((card) => card.group.id === group.id),
|
|
211
|
+
}));
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* The recipes switching `id` on would add besides itself, i.e. its
|
|
215
|
+
* `requires` (transitively) and the first alternative of an unmet
|
|
216
|
+
* `requiresAny`; the same resolution the Recipes tab applies.
|
|
217
|
+
*/
|
|
218
|
+
export function alsoAdds(id, selected, recipes) {
|
|
219
|
+
const before = new Set(withRequirements(selected, recipes));
|
|
220
|
+
return withRequirements([...selected, id], recipes).filter((other) => other !== id && !before.has(other));
|
|
221
|
+
}
|
|
222
|
+
/** The secrets a card needs by name, deduplicated across its providers. */
|
|
223
|
+
export function secretNames(card) {
|
|
224
|
+
return [...new Set(card.providers.flatMap((p) => p.secrets))];
|
|
225
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { PackageBrowserCapability, Recipe, RecipeDemo, RecipeDemoMode } from '../recipes/types.ts';
|
|
2
|
+
/**
|
|
3
|
+
* How the Features catalogue labels a feature by how far it runs in this
|
|
4
|
+
* browser-only demo (smrt#3709). The mode and its reasons come from the
|
|
5
|
+
* manifest as emitted; nothing here decides, softens or upgrades one. What a
|
|
6
|
+
* feature requires is already folded in by the catalog generator (smrt-core's
|
|
7
|
+
* `effectiveRecipeDemo`, stored as the recipe's `effectiveDemo`).
|
|
8
|
+
*/
|
|
9
|
+
export declare const DEMO_MODE_LABEL: Readonly<Record<RecipeDemoMode, string>>;
|
|
10
|
+
/** What each mode means for a visitor, in one line. */
|
|
11
|
+
export declare const DEMO_MODE_MEANING: Readonly<Record<RecipeDemoMode, string>>;
|
|
12
|
+
/** Badge variant (smrt-ui) per mode; the word always accompanies the colour. */
|
|
13
|
+
export declare const DEMO_MODE_VARIANT: Readonly<Record<RecipeDemoMode, 'success' | 'info' | 'warning' | 'default'>>;
|
|
14
|
+
export interface DemoBadge {
|
|
15
|
+
mode: RecipeDemoMode;
|
|
16
|
+
label: string;
|
|
17
|
+
meaning: string;
|
|
18
|
+
variant: 'success' | 'info' | 'warning' | 'default';
|
|
19
|
+
/** Plain sentences from the manifest saying why, plus what folds in. */
|
|
20
|
+
reasons: string[];
|
|
21
|
+
/** Ids of providers a demo fakes. */
|
|
22
|
+
mocked: string[];
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* The recipe's demo mode including what it requires: the generator's
|
|
26
|
+
* `effectiveDemo` when that differs from the recipe's own, else its `demo`.
|
|
27
|
+
* Undefined when the manifest reports no `demo` for it.
|
|
28
|
+
*/
|
|
29
|
+
export declare function effectiveDemo(recipe: Pick<Recipe, 'demo' | 'effectiveDemo'>): RecipeDemo | undefined;
|
|
30
|
+
/** The label data for a demo, or undefined when the manifest gave none. */
|
|
31
|
+
export declare function demoBadge(demo: RecipeDemo | undefined): DemoBadge | undefined;
|
|
32
|
+
/**
|
|
33
|
+
* The package's own browser capability in a sentence, shown on expand as
|
|
34
|
+
* context for the label. Undefined when the manifest reports none.
|
|
35
|
+
*/
|
|
36
|
+
export declare function browserNote(capability: PackageBrowserCapability | undefined): string | undefined;
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How the Features catalogue labels a feature by how far it runs in this
|
|
3
|
+
* browser-only demo (smrt#3709). The mode and its reasons come from the
|
|
4
|
+
* manifest as emitted; nothing here decides, softens or upgrades one. What a
|
|
5
|
+
* feature requires is already folded in by the catalog generator (smrt-core's
|
|
6
|
+
* `effectiveRecipeDemo`, stored as the recipe's `effectiveDemo`).
|
|
7
|
+
*/
|
|
8
|
+
export const DEMO_MODE_LABEL = {
|
|
9
|
+
live: 'Live',
|
|
10
|
+
mock: 'Mock',
|
|
11
|
+
sample: 'Sample',
|
|
12
|
+
server: 'Server',
|
|
13
|
+
};
|
|
14
|
+
/** What each mode means for a visitor, in one line. */
|
|
15
|
+
export const DEMO_MODE_MEANING = {
|
|
16
|
+
live: 'Runs for real in your browser.',
|
|
17
|
+
mock: 'Runs in your browser, but a provider is faked.',
|
|
18
|
+
sample: 'Shows sample data only; it cannot reach what it needs.',
|
|
19
|
+
server: 'Needs a server, which this browser-only demo does not have.',
|
|
20
|
+
};
|
|
21
|
+
/** Badge variant (smrt-ui) per mode; the word always accompanies the colour. */
|
|
22
|
+
export const DEMO_MODE_VARIANT = {
|
|
23
|
+
live: 'success',
|
|
24
|
+
mock: 'info',
|
|
25
|
+
sample: 'warning',
|
|
26
|
+
server: 'default',
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* The recipe's demo mode including what it requires: the generator's
|
|
30
|
+
* `effectiveDemo` when that differs from the recipe's own, else its `demo`.
|
|
31
|
+
* Undefined when the manifest reports no `demo` for it.
|
|
32
|
+
*/
|
|
33
|
+
export function effectiveDemo(recipe) {
|
|
34
|
+
return recipe.effectiveDemo ?? recipe.demo;
|
|
35
|
+
}
|
|
36
|
+
/** The label data for a demo, or undefined when the manifest gave none. */
|
|
37
|
+
export function demoBadge(demo) {
|
|
38
|
+
if (!demo)
|
|
39
|
+
return undefined;
|
|
40
|
+
return {
|
|
41
|
+
mode: demo.mode,
|
|
42
|
+
label: DEMO_MODE_LABEL[demo.mode],
|
|
43
|
+
meaning: DEMO_MODE_MEANING[demo.mode],
|
|
44
|
+
variant: DEMO_MODE_VARIANT[demo.mode],
|
|
45
|
+
reasons: demo.reasons,
|
|
46
|
+
mocked: demo.mocked ?? [],
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* The package's own browser capability in a sentence, shown on expand as
|
|
51
|
+
* context for the label. Undefined when the manifest reports none.
|
|
52
|
+
*/
|
|
53
|
+
export function browserNote(capability) {
|
|
54
|
+
if (!capability)
|
|
55
|
+
return undefined;
|
|
56
|
+
if (capability.status === 'browser-safe') {
|
|
57
|
+
return 'Its package builds for a browser.';
|
|
58
|
+
}
|
|
59
|
+
const parts = ['Its package does not build for a browser yet'];
|
|
60
|
+
if (capability.reason)
|
|
61
|
+
parts.push(`(${capability.reason})`);
|
|
62
|
+
if (capability.issues?.length) {
|
|
63
|
+
parts.push(`and is tracked in ${capability.issues.join(', ')}`);
|
|
64
|
+
}
|
|
65
|
+
return `${parts.join(' ')}.`;
|
|
66
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { PaletteProvider } from '@happyvertical/smrt-svelte/command-palette';
|
|
2
|
+
import type { Recipe } from '../recipes/types.ts';
|
|
3
|
+
/** The Planner page's tabs, as the palette offers them. */
|
|
4
|
+
export declare const PLANNER_TAB_COMMANDS: readonly [{
|
|
5
|
+
readonly id: "cookbooks";
|
|
6
|
+
readonly title: "Open Cookbooks";
|
|
7
|
+
}, {
|
|
8
|
+
readonly id: "recipes";
|
|
9
|
+
readonly title: "Open Recipes";
|
|
10
|
+
}, {
|
|
11
|
+
readonly id: "features";
|
|
12
|
+
readonly title: "Browse features";
|
|
13
|
+
}, {
|
|
14
|
+
readonly id: "layout";
|
|
15
|
+
readonly title: "Open Layout";
|
|
16
|
+
}, {
|
|
17
|
+
readonly id: "settings";
|
|
18
|
+
readonly title: "Open Settings";
|
|
19
|
+
}, {
|
|
20
|
+
readonly id: "export";
|
|
21
|
+
readonly title: "Open Export";
|
|
22
|
+
}];
|
|
23
|
+
export interface PlannerPaletteOptions {
|
|
24
|
+
recipes: readonly Recipe[];
|
|
25
|
+
/** Whether the recipe is already in the cookbook. */
|
|
26
|
+
isOn: (id: string) => boolean;
|
|
27
|
+
/** Add the recipe, with what it requires. */
|
|
28
|
+
add: (id: string) => void;
|
|
29
|
+
/** In-app path of a Planner tab, with the app query. */
|
|
30
|
+
href: (tab: string) => string;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* The planner's own providers: its tabs, and "Add <feature>" for every recipe
|
|
34
|
+
* not yet on (the palette's items are re-read each time it opens, so a recipe
|
|
35
|
+
* added elsewhere drops out). Choosing one adds it and lands on the Features
|
|
36
|
+
* tab, where the card shows it on. The subtitle carries the same demo label
|
|
37
|
+
* the card does, so a server-only feature is not offered as if it were live.
|
|
38
|
+
*/
|
|
39
|
+
export declare function plannerProviders(options: PlannerPaletteOptions): PaletteProvider[];
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { demoBadge, effectiveDemo } from "./demo.js";
|
|
2
|
+
/** The Planner page's tabs, as the palette offers them. */
|
|
3
|
+
export const PLANNER_TAB_COMMANDS = [
|
|
4
|
+
{ id: 'cookbooks', title: 'Open Cookbooks' },
|
|
5
|
+
{ id: 'recipes', title: 'Open Recipes' },
|
|
6
|
+
{ id: 'features', title: 'Browse features' },
|
|
7
|
+
{ id: 'layout', title: 'Open Layout' },
|
|
8
|
+
{ id: 'settings', title: 'Open Settings' },
|
|
9
|
+
{ id: 'export', title: 'Open Export' },
|
|
10
|
+
];
|
|
11
|
+
/**
|
|
12
|
+
* The planner's own providers: its tabs, and "Add <feature>" for every recipe
|
|
13
|
+
* not yet on (the palette's items are re-read each time it opens, so a recipe
|
|
14
|
+
* added elsewhere drops out). Choosing one adds it and lands on the Features
|
|
15
|
+
* tab, where the card shows it on. The subtitle carries the same demo label
|
|
16
|
+
* the card does, so a server-only feature is not offered as if it were live.
|
|
17
|
+
*/
|
|
18
|
+
export function plannerProviders(options) {
|
|
19
|
+
return [
|
|
20
|
+
{
|
|
21
|
+
id: 'planner-tabs',
|
|
22
|
+
label: 'Planner',
|
|
23
|
+
order: 20,
|
|
24
|
+
items: () => PLANNER_TAB_COMMANDS.map((tab) => ({
|
|
25
|
+
id: tab.id,
|
|
26
|
+
title: tab.title,
|
|
27
|
+
kind: 'navigation',
|
|
28
|
+
href: options.href(tab.id),
|
|
29
|
+
})),
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
id: 'planner-features',
|
|
33
|
+
label: 'Add a feature',
|
|
34
|
+
order: 30,
|
|
35
|
+
items: () => options.recipes
|
|
36
|
+
.filter((recipe) => !options.isOn(recipe.id))
|
|
37
|
+
.map((recipe) => {
|
|
38
|
+
const label = demoBadge(effectiveDemo(recipe))?.label;
|
|
39
|
+
return {
|
|
40
|
+
id: recipe.id,
|
|
41
|
+
title: `Add ${recipe.label}`,
|
|
42
|
+
subtitle: label ? `${label}: ${recipe.summary}` : recipe.summary,
|
|
43
|
+
keywords: recipe.synonyms,
|
|
44
|
+
kind: 'command',
|
|
45
|
+
run: ({ navigate }) => {
|
|
46
|
+
options.add(recipe.id);
|
|
47
|
+
return navigate(options.href('features'));
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
}),
|
|
51
|
+
},
|
|
52
|
+
];
|
|
53
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Conversions between the Address JSON commerce stores (`PartyAddressData`:
|
|
3
|
+
* `street1`, `street2`, `city`, `state`, `postalCode`, `country`) and the
|
|
4
|
+
* `AddressValue` smrt-svelte `AddressInput` edits (`street`, `province`, ...).
|
|
5
|
+
* `AddressInput` prefixes its US subdivisions with `US-` to keep them apart
|
|
6
|
+
* from country codes; the stored `state` is the bare code.
|
|
7
|
+
*/
|
|
8
|
+
import type { PartyAddressData } from '../upstream/partyTypes.ts';
|
|
9
|
+
/** What `AddressInput` edits. */
|
|
10
|
+
export interface AddressFormValue {
|
|
11
|
+
street?: string;
|
|
12
|
+
city?: string;
|
|
13
|
+
province?: string;
|
|
14
|
+
postalCode?: string;
|
|
15
|
+
country?: string;
|
|
16
|
+
}
|
|
17
|
+
/** A stored address (any JSON) as the input's value. */
|
|
18
|
+
export declare function toAddressInput(stored: unknown): AddressFormValue;
|
|
19
|
+
/**
|
|
20
|
+
* The input's value as the stored address. Keeps what the input does not
|
|
21
|
+
* edit (`street2`, anything else already stored) and drops emptied parts.
|
|
22
|
+
*/
|
|
23
|
+
export declare function fromAddressInput(edited: AddressFormValue, previous: unknown): PartyAddressData;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
const text = (value) => typeof value === 'string' && value !== '' ? value : undefined;
|
|
2
|
+
/** A stored address (any JSON) as the input's value. */
|
|
3
|
+
export function toAddressInput(stored) {
|
|
4
|
+
const a = stored !== null && typeof stored === 'object' && !Array.isArray(stored)
|
|
5
|
+
? stored
|
|
6
|
+
: {};
|
|
7
|
+
const country = text(a.country);
|
|
8
|
+
const state = text(a.state);
|
|
9
|
+
return {
|
|
10
|
+
...(text(a.street1) ? { street: a.street1 } : {}),
|
|
11
|
+
...(text(a.city) ? { city: a.city } : {}),
|
|
12
|
+
...(state ? { province: country === 'US' ? `US-${state}` : state } : {}),
|
|
13
|
+
...(text(a.postalCode) ? { postalCode: a.postalCode } : {}),
|
|
14
|
+
...(country ? { country } : {}),
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* The input's value as the stored address. Keeps what the input does not
|
|
19
|
+
* edit (`street2`, anything else already stored) and drops emptied parts.
|
|
20
|
+
*/
|
|
21
|
+
export function fromAddressInput(edited, previous) {
|
|
22
|
+
const kept = previous !== null &&
|
|
23
|
+
typeof previous === 'object' &&
|
|
24
|
+
!Array.isArray(previous)
|
|
25
|
+
? { ...previous }
|
|
26
|
+
: {};
|
|
27
|
+
for (const key of ['street1', 'city', 'state', 'postalCode', 'country']) {
|
|
28
|
+
delete kept[key];
|
|
29
|
+
}
|
|
30
|
+
const state = text(edited.province);
|
|
31
|
+
return {
|
|
32
|
+
...kept,
|
|
33
|
+
...(text(edited.street) ? { street1: edited.street } : {}),
|
|
34
|
+
...(text(edited.city) ? { city: edited.city } : {}),
|
|
35
|
+
...(state ? { state: state.replace(/^US-/, '') } : {}),
|
|
36
|
+
...(text(edited.postalCode) ? { postalCode: edited.postalCode } : {}),
|
|
37
|
+
...(text(edited.country) ? { country: edited.country } : {}),
|
|
38
|
+
};
|
|
39
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/** Moves focus to the first control of a form whose field is marked invalid. */
|
|
2
|
+
export function focusFirstInvalid(form) {
|
|
3
|
+
if (!(form instanceof HTMLElement))
|
|
4
|
+
return;
|
|
5
|
+
form
|
|
6
|
+
.querySelector('[data-invalid] :is(input, select, textarea, button):not([type="hidden"])')
|
|
7
|
+
?.focus();
|
|
8
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A Svelte attachment for a `<dialog>` that holds a `<form>`: it moves the
|
|
3
|
+
* element to `document.body`, so the form is not nested inside another
|
|
4
|
+
* `<form>` (whose submit would bubble to the outer one), then opens it as a
|
|
5
|
+
* modal (focus is trapped and Escape closes it).
|
|
6
|
+
*/
|
|
7
|
+
export declare function modalInBody(node: HTMLDialogElement): () => void;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A Svelte attachment for a `<dialog>` that holds a `<form>`: it moves the
|
|
3
|
+
* element to `document.body`, so the form is not nested inside another
|
|
4
|
+
* `<form>` (whose submit would bubble to the outer one), then opens it as a
|
|
5
|
+
* modal (focus is trapped and Escape closes it).
|
|
6
|
+
*/
|
|
7
|
+
export function modalInBody(node) {
|
|
8
|
+
document.body.appendChild(node);
|
|
9
|
+
node.showModal();
|
|
10
|
+
return () => {
|
|
11
|
+
node.close();
|
|
12
|
+
node.remove();
|
|
13
|
+
};
|
|
14
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rates such as tax and discount are stored as fractions (0.05 is 5%) but
|
|
3
|
+
* typed as percentages (5): people think in percent, the model keeps fractions.
|
|
4
|
+
*/
|
|
5
|
+
/** A stored fraction as the percentage a person types: `0.0825` -> `8.25`. */
|
|
6
|
+
export declare function fractionToPercent(fraction: unknown): number | null;
|
|
7
|
+
/** A typed percentage as the stored fraction: `8.25` -> `0.0825`. */
|
|
8
|
+
export declare function percentToFraction(percent: number | null): number | null;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rates such as tax and discount are stored as fractions (0.05 is 5%) but
|
|
3
|
+
* typed as percentages (5): people think in percent, the model keeps fractions.
|
|
4
|
+
*/
|
|
5
|
+
/** A stored fraction as the percentage a person types: `0.0825` -> `8.25`. */
|
|
6
|
+
export function fractionToPercent(fraction) {
|
|
7
|
+
if (typeof fraction !== 'number' || !Number.isFinite(fraction))
|
|
8
|
+
return null;
|
|
9
|
+
return Number((fraction * 100).toFixed(4));
|
|
10
|
+
}
|
|
11
|
+
/** A typed percentage as the stored fraction: `8.25` -> `0.0825`. */
|
|
12
|
+
export function percentToFraction(percent) {
|
|
13
|
+
if (percent === null || !Number.isFinite(percent))
|
|
14
|
+
return null;
|
|
15
|
+
return Number((percent / 100).toFixed(6));
|
|
16
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Which input a field gets. Pure so the choice is testable without rendering:
|
|
3
|
+
* `FieldInput.svelte` switches on the result and owns nothing else about it.
|
|
4
|
+
*
|
|
5
|
+
* Order matters: a field that references another model is a relation however
|
|
6
|
+
* it is typed; a declared enum beats a widget hint; a hint beats the plain
|
|
7
|
+
* type; money is an integer field whose name says so (`isMoneyField`).
|
|
8
|
+
*/
|
|
9
|
+
import type { CatalogField } from '../catalog/types.ts';
|
|
10
|
+
export type FieldRenderer = 'boolean' | 'relation' | 'enum' | 'textarea' | 'currency' | 'email' | 'url' | 'phone' | 'address' | 'money' | 'datetime' | 'percent' | 'integer' | 'decimal' | 'json' | 'text';
|
|
11
|
+
/** A field that references another model, by manifest type or `related`. */
|
|
12
|
+
export declare function isRelation(field: CatalogField): boolean;
|
|
13
|
+
/**
|
|
14
|
+
* @param modelId the qualified name of the model that owns the field, which
|
|
15
|
+
* the address hint is keyed by (see `upstream/widgets.ts`).
|
|
16
|
+
*/
|
|
17
|
+
export declare function chooseRenderer(field: CatalogField, modelId?: string): FieldRenderer;
|