@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,33 @@
|
|
|
1
|
+
import type { Catalog, CatalogPackage } from '../types.ts';
|
|
2
|
+
import { type RawPackage } from './extract.ts';
|
|
3
|
+
export interface BuildOptions {
|
|
4
|
+
registry: string;
|
|
5
|
+
/**
|
|
6
|
+
* Path to a smrt checkout: read its built `packages/*\/dist/manifest.json`
|
|
7
|
+
* instead of the registry, to preview unreleased manifests. Opt-in.
|
|
8
|
+
*/
|
|
9
|
+
source?: string;
|
|
10
|
+
log?: (message: string) => void;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Turn raw packages into the catalog: drop the documented exclusions and
|
|
14
|
+
* packages with no models, extract the rest, and sort. A package on the
|
|
15
|
+
* exclusion list that declares recipes stays: a recipe is a feature a visitor
|
|
16
|
+
* can pick (the assistant is `smrt-chat`'s), whatever else the package is.
|
|
17
|
+
* Output order is sorted, with no timestamps, so a run against the same inputs
|
|
18
|
+
* is byte-identical. Pure: no network or disk access.
|
|
19
|
+
*/
|
|
20
|
+
export declare function assembleCatalog(raws: readonly RawPackage[], registry: string, log?: (message: string) => void): Catalog;
|
|
21
|
+
/**
|
|
22
|
+
* Drop the recipes a browser mock-up cannot show: one that lists a model no
|
|
23
|
+
* catalog package declares, or whose menu opens a model with no screen (not
|
|
24
|
+
* exposed), or that needs a recipe dropped for either reason. A package left
|
|
25
|
+
* with no recipe and no exposed model has nothing to pick and goes too. Every
|
|
26
|
+
* drop is logged; the reasons are the manifest's, so the fix is upstream.
|
|
27
|
+
*/
|
|
28
|
+
export declare function dropUnrenderableRecipes(packages: readonly CatalogPackage[], log?: (message: string) => void): CatalogPackage[];
|
|
29
|
+
/**
|
|
30
|
+
* Build the catalog from the registry (discover every `smrt-*` package), or,
|
|
31
|
+
* when `source` is set, from a local smrt checkout's built manifests.
|
|
32
|
+
*/
|
|
33
|
+
export declare function buildCatalog(options: BuildOptions): Promise<Catalog>;
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { EXCLUDED_PACKAGES } from "./exclusions.js";
|
|
2
|
+
import { extractPackage, packageId, resolveDependencies, } from "./extract.js";
|
|
3
|
+
import { readLocalPackages } from "./local.js";
|
|
4
|
+
import { withEffectiveDemo } from "./recipe-demo.js";
|
|
5
|
+
import { discoverPackageNames, fetchPackage } from "./registry.js";
|
|
6
|
+
/**
|
|
7
|
+
* Turn raw packages into the catalog: drop the documented exclusions and
|
|
8
|
+
* packages with no models, extract the rest, and sort. A package on the
|
|
9
|
+
* exclusion list that declares recipes stays: a recipe is a feature a visitor
|
|
10
|
+
* can pick (the assistant is `smrt-chat`'s), whatever else the package is.
|
|
11
|
+
* Output order is sorted, with no timestamps, so a run against the same inputs
|
|
12
|
+
* is byte-identical. Pure: no network or disk access.
|
|
13
|
+
*/
|
|
14
|
+
export function assembleCatalog(raws, registry, log = () => { }) {
|
|
15
|
+
const extracted = [];
|
|
16
|
+
for (const raw of raws) {
|
|
17
|
+
const excluded = EXCLUDED_PACKAGES[packageId(raw.packageName)];
|
|
18
|
+
const pkg = extractPackage(raw);
|
|
19
|
+
if (excluded && !pkg.recipes) {
|
|
20
|
+
log(`exclude ${raw.packageName}: ${excluded}`);
|
|
21
|
+
continue;
|
|
22
|
+
}
|
|
23
|
+
if (pkg.models.length === 0) {
|
|
24
|
+
log(`skip ${pkg.packageName}: no models`);
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
log(`include ${pkg.packageName}@${pkg.version}${excluded ? ' (declares recipes)' : ''}`);
|
|
28
|
+
extracted.push(pkg);
|
|
29
|
+
}
|
|
30
|
+
extracted.sort((a, b) => (a.id < b.id ? -1 : a.id > b.id ? 1 : 0));
|
|
31
|
+
return {
|
|
32
|
+
schema: 1,
|
|
33
|
+
registry,
|
|
34
|
+
packages: withEffectiveDemo(resolveDependencies(extracted)),
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
function renderable(catalog, log) {
|
|
38
|
+
return {
|
|
39
|
+
...catalog,
|
|
40
|
+
packages: dropUnrenderableRecipes(catalog.packages, log),
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Drop the recipes a browser mock-up cannot show: one that lists a model no
|
|
45
|
+
* catalog package declares, or whose menu opens a model with no screen (not
|
|
46
|
+
* exposed), or that needs a recipe dropped for either reason. A package left
|
|
47
|
+
* with no recipe and no exposed model has nothing to pick and goes too. Every
|
|
48
|
+
* drop is logged; the reasons are the manifest's, so the fix is upstream.
|
|
49
|
+
*/
|
|
50
|
+
export function dropUnrenderableRecipes(packages, log = () => { }) {
|
|
51
|
+
const models = new Map();
|
|
52
|
+
for (const pkg of packages) {
|
|
53
|
+
for (const model of pkg.models)
|
|
54
|
+
models.set(model.id, model.exposed);
|
|
55
|
+
}
|
|
56
|
+
const dropped = new Set();
|
|
57
|
+
const why = (recipe) => {
|
|
58
|
+
for (const id of recipe.models) {
|
|
59
|
+
if (!models.has(id))
|
|
60
|
+
return `lists ${id}, which no package declares`;
|
|
61
|
+
}
|
|
62
|
+
for (const entry of recipe.nav) {
|
|
63
|
+
if (models.get(entry.model) === false) {
|
|
64
|
+
return `opens ${entry.model} from the menu, which is not exposed`;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
for (const id of recipe.requires) {
|
|
68
|
+
if (dropped.has(id))
|
|
69
|
+
return `needs ${id}`;
|
|
70
|
+
}
|
|
71
|
+
for (const group of recipe.requiresAny ?? []) {
|
|
72
|
+
if (group.length > 0 && group.every((id) => dropped.has(id))) {
|
|
73
|
+
return `needs one of ${group.join(', ')}`;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return undefined;
|
|
77
|
+
};
|
|
78
|
+
for (let changed = true; changed;) {
|
|
79
|
+
changed = false;
|
|
80
|
+
for (const pkg of packages) {
|
|
81
|
+
for (const recipe of pkg.recipes ?? []) {
|
|
82
|
+
if (dropped.has(recipe.id))
|
|
83
|
+
continue;
|
|
84
|
+
const reason = why(recipe);
|
|
85
|
+
if (!reason)
|
|
86
|
+
continue;
|
|
87
|
+
dropped.add(recipe.id);
|
|
88
|
+
changed = true;
|
|
89
|
+
log(`drop recipe ${recipe.id}: ${reason}`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
if (dropped.size === 0)
|
|
94
|
+
return [...packages];
|
|
95
|
+
const out = [];
|
|
96
|
+
for (const pkg of packages) {
|
|
97
|
+
const all = pkg.recipes ?? [];
|
|
98
|
+
const kept = all.filter((r) => !dropped.has(r.id));
|
|
99
|
+
if (kept.length < all.length &&
|
|
100
|
+
kept.length === 0 &&
|
|
101
|
+
!pkg.models.some((m) => m.exposed)) {
|
|
102
|
+
log(`skip ${pkg.packageName}: nothing left to pick`);
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
const { recipes: _recipes, ...rest } = pkg;
|
|
106
|
+
out.push(kept.length > 0 ? { ...rest, recipes: kept } : rest);
|
|
107
|
+
}
|
|
108
|
+
return out;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Build the catalog from the registry (discover every `smrt-*` package), or,
|
|
112
|
+
* when `source` is set, from a local smrt checkout's built manifests.
|
|
113
|
+
*/
|
|
114
|
+
export async function buildCatalog(options) {
|
|
115
|
+
const log = options.log ?? (() => { });
|
|
116
|
+
if (options.source) {
|
|
117
|
+
const raws = await readLocalPackages(options.source);
|
|
118
|
+
return renderable(assembleCatalog(raws, `file://${options.source}`, log), log);
|
|
119
|
+
}
|
|
120
|
+
const names = await discoverPackageNames(options.registry);
|
|
121
|
+
// Excluded packages are fetched too: one that declares recipes stays, and
|
|
122
|
+
// only its manifest says (see `assembleCatalog`).
|
|
123
|
+
const raws = [];
|
|
124
|
+
for (let i = 0; i < names.length; i += 6) {
|
|
125
|
+
const batch = await Promise.all(names.slice(i, i + 6).map((name) => fetchPackage(options.registry, name)));
|
|
126
|
+
for (const raw of batch)
|
|
127
|
+
if (raw)
|
|
128
|
+
raws.push(raw);
|
|
129
|
+
}
|
|
130
|
+
return renderable(assembleCatalog(raws, options.registry, log), log);
|
|
131
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Packages that are s-m-r-t infrastructure, not domain modules a visitor would
|
|
3
|
+
* "pick": they publish a `manifest.json` (or none) but carry no business models
|
|
4
|
+
* worth mocking up. Everything else that exports `./manifest.json` and declares
|
|
5
|
+
* at least one model is a catalog package, discovered from the registry.
|
|
6
|
+
*
|
|
7
|
+
* A listed package that declares recipes is NOT excluded: its recipes are
|
|
8
|
+
* features a visitor can pick (`chat.assistant`, `fields.form-customization`),
|
|
9
|
+
* so `assembleCatalog` keeps it and the exclusion applies only to a package
|
|
10
|
+
* with none.
|
|
11
|
+
*
|
|
12
|
+
* Packages without a `./manifest.json` export (cli, app-runtime, svelte, ui,
|
|
13
|
+
* vitest, ...) never need listing; they are skipped by discovery itself.
|
|
14
|
+
* Short names, without the `smrt-` prefix.
|
|
15
|
+
*/
|
|
16
|
+
export declare const EXCLUDED_PACKAGES: Readonly<Record<string, string>>;
|
|
17
|
+
export declare const PACKAGE_SCOPE = "@happyvertical/";
|
|
18
|
+
export declare const PACKAGE_PREFIX = "@happyvertical/smrt-";
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Packages that are s-m-r-t infrastructure, not domain modules a visitor would
|
|
3
|
+
* "pick": they publish a `manifest.json` (or none) but carry no business models
|
|
4
|
+
* worth mocking up. Everything else that exports `./manifest.json` and declares
|
|
5
|
+
* at least one model is a catalog package, discovered from the registry.
|
|
6
|
+
*
|
|
7
|
+
* A listed package that declares recipes is NOT excluded: its recipes are
|
|
8
|
+
* features a visitor can pick (`chat.assistant`, `fields.form-customization`),
|
|
9
|
+
* so `assembleCatalog` keeps it and the exclusion applies only to a package
|
|
10
|
+
* with none.
|
|
11
|
+
*
|
|
12
|
+
* Packages without a `./manifest.json` export (cli, app-runtime, svelte, ui,
|
|
13
|
+
* vitest, ...) never need listing; they are skipped by discovery itself.
|
|
14
|
+
* Short names, without the `smrt-` prefix.
|
|
15
|
+
*/
|
|
16
|
+
export const EXCLUDED_PACKAGES = {
|
|
17
|
+
affiliates: 'deprecated compatibility shim over smrt-sales; no models',
|
|
18
|
+
agents: 'agent framework (infrastructure)',
|
|
19
|
+
chat: 'chat runtime and conversation infrastructure',
|
|
20
|
+
core: 'the framework itself',
|
|
21
|
+
features: 'feature-flag infrastructure',
|
|
22
|
+
fields: 'field-policy infrastructure',
|
|
23
|
+
gnode: 'federation library; no models',
|
|
24
|
+
jobs: 'background-job infrastructure',
|
|
25
|
+
languages: 'string-table infrastructure',
|
|
26
|
+
personas: 'agent-persona infrastructure',
|
|
27
|
+
playbooks: 'agent-playbook infrastructure',
|
|
28
|
+
prompts: 'prompt-registry infrastructure',
|
|
29
|
+
secrets: 'secret storage infrastructure',
|
|
30
|
+
tenancy: 'multi-tenancy infrastructure',
|
|
31
|
+
};
|
|
32
|
+
export const PACKAGE_SCOPE = '@happyvertical/';
|
|
33
|
+
export const PACKAGE_PREFIX = `${PACKAGE_SCOPE}smrt-`;
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import type { CatalogPackage } from '../types.ts';
|
|
2
|
+
/** The subset of a s-m-r-t `manifest.json` the catalog reads. */
|
|
3
|
+
export interface RawManifest {
|
|
4
|
+
packageName: string;
|
|
5
|
+
smrtDependencies?: string[];
|
|
6
|
+
objects: Record<string, RawObject>;
|
|
7
|
+
/** Recipes the package declares (`SmrtRecipe`, smrt#3590/#3604). */
|
|
8
|
+
recipes?: unknown;
|
|
9
|
+
/** Whether the package builds for a browser (smrt#3709). */
|
|
10
|
+
browser?: unknown;
|
|
11
|
+
}
|
|
12
|
+
interface RawParameter {
|
|
13
|
+
name: string;
|
|
14
|
+
type: string;
|
|
15
|
+
optional?: boolean;
|
|
16
|
+
}
|
|
17
|
+
interface RawMethod {
|
|
18
|
+
name: string;
|
|
19
|
+
async?: boolean;
|
|
20
|
+
parameters?: RawParameter[];
|
|
21
|
+
returnType?: string;
|
|
22
|
+
isStatic?: boolean;
|
|
23
|
+
isPublic?: boolean;
|
|
24
|
+
}
|
|
25
|
+
interface RawField {
|
|
26
|
+
type: string;
|
|
27
|
+
required?: boolean;
|
|
28
|
+
description?: string;
|
|
29
|
+
default?: unknown;
|
|
30
|
+
related?: string;
|
|
31
|
+
enum?: unknown;
|
|
32
|
+
_meta?: {
|
|
33
|
+
ui?: unknown;
|
|
34
|
+
description?: unknown;
|
|
35
|
+
[key: string]: unknown;
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
interface RawObject {
|
|
39
|
+
className: string;
|
|
40
|
+
qualifiedName: string;
|
|
41
|
+
collection: string;
|
|
42
|
+
extends?: string;
|
|
43
|
+
extendsTypeArg?: string;
|
|
44
|
+
/** The class's doc description (emitted by newer scanners only). */
|
|
45
|
+
description?: string;
|
|
46
|
+
/** The own field that labels a record in pickers (smrt#3611). */
|
|
47
|
+
displayLabelField?: string;
|
|
48
|
+
/** Models and their collections may both carry the generated table schema. */
|
|
49
|
+
schema?: {
|
|
50
|
+
tableName?: string;
|
|
51
|
+
};
|
|
52
|
+
fields: Record<string, RawField>;
|
|
53
|
+
methods: Record<string, RawMethod>;
|
|
54
|
+
decoratorConfig: Record<string, unknown>;
|
|
55
|
+
}
|
|
56
|
+
/** The subset of a `smrt-knowledge.json` the catalog reads. */
|
|
57
|
+
export interface RawKnowledge {
|
|
58
|
+
surfaces?: RawSurface[];
|
|
59
|
+
/** Recipes the package declares; also in the manifest. */
|
|
60
|
+
recipes?: unknown;
|
|
61
|
+
/** Browser capability; also in the manifest. */
|
|
62
|
+
browser?: unknown;
|
|
63
|
+
}
|
|
64
|
+
interface RawSurface {
|
|
65
|
+
kind: 'api' | 'mcp' | 'cli' | (string & {});
|
|
66
|
+
name: string;
|
|
67
|
+
operation: string;
|
|
68
|
+
objectName: string;
|
|
69
|
+
path?: string;
|
|
70
|
+
method?: string;
|
|
71
|
+
}
|
|
72
|
+
export interface RawPackage {
|
|
73
|
+
packageName: string;
|
|
74
|
+
version: string;
|
|
75
|
+
description: string;
|
|
76
|
+
manifest: RawManifest;
|
|
77
|
+
knowledge: RawKnowledge | null;
|
|
78
|
+
}
|
|
79
|
+
/** `@happyvertical/smrt-products` -> `products`. */
|
|
80
|
+
export declare function packageId(packageName: string): string;
|
|
81
|
+
/** Turn one package's raw manifest and knowledge into a catalog entry. */
|
|
82
|
+
export declare function extractPackage(raw: RawPackage): CatalogPackage;
|
|
83
|
+
/**
|
|
84
|
+
* Resolve each package's dependencies: the other catalog packages named in its
|
|
85
|
+
* manifest's `smrtDependencies` or pointed at by its models' foreign keys and
|
|
86
|
+
* cross-package references. Packages outside the catalog (excluded
|
|
87
|
+
* infrastructure) are not dependencies.
|
|
88
|
+
*/
|
|
89
|
+
export declare function resolveDependencies(packages: CatalogPackage[]): CatalogPackage[];
|
|
90
|
+
export {};
|
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
import { PACKAGE_PREFIX } from "./exclusions.js";
|
|
2
|
+
import { extractBrowser, extractRecipeMetadata } from "./recipe-metadata.js";
|
|
3
|
+
/** Fields the framework manages; shown in the catalog, hidden from forms. */
|
|
4
|
+
const SYSTEM_FIELDS = new Set([
|
|
5
|
+
'id',
|
|
6
|
+
'created_at',
|
|
7
|
+
'updated_at',
|
|
8
|
+
'createdAt',
|
|
9
|
+
'updatedAt',
|
|
10
|
+
'tenantId',
|
|
11
|
+
]);
|
|
12
|
+
/** Field types that hold other rows, not a value a form can edit. */
|
|
13
|
+
const NON_VALUE_TYPES = new Set(['oneToMany', 'meta']);
|
|
14
|
+
const CRUD_VERBS = ['list', 'get', 'create', 'update', 'delete'];
|
|
15
|
+
const byName = (a, b) => a.name < b.name ? -1 : a.name > b.name ? 1 : 0;
|
|
16
|
+
/** `@happyvertical/smrt-products` -> `products`. */
|
|
17
|
+
export function packageId(packageName) {
|
|
18
|
+
return packageName.startsWith(PACKAGE_PREFIX)
|
|
19
|
+
? packageName.slice(PACKAGE_PREFIX.length)
|
|
20
|
+
: packageName;
|
|
21
|
+
}
|
|
22
|
+
function primitiveDefault(value) {
|
|
23
|
+
return typeof value === 'string' ||
|
|
24
|
+
typeof value === 'number' ||
|
|
25
|
+
typeof value === 'boolean' ||
|
|
26
|
+
value === null
|
|
27
|
+
? value
|
|
28
|
+
: undefined;
|
|
29
|
+
}
|
|
30
|
+
const WIDGETS = new Set([
|
|
31
|
+
'textarea',
|
|
32
|
+
'currency',
|
|
33
|
+
'email',
|
|
34
|
+
'url',
|
|
35
|
+
'phone',
|
|
36
|
+
]);
|
|
37
|
+
/** Keep only the known `ui` keys, with their expected primitive types. */
|
|
38
|
+
function extractUi(value) {
|
|
39
|
+
if (!value || typeof value !== 'object' || Array.isArray(value)) {
|
|
40
|
+
return undefined;
|
|
41
|
+
}
|
|
42
|
+
const raw = value;
|
|
43
|
+
const ui = {
|
|
44
|
+
...(typeof raw.basic === 'boolean' ? { basic: raw.basic } : {}),
|
|
45
|
+
...(typeof raw.group === 'string' ? { group: raw.group } : {}),
|
|
46
|
+
...(typeof raw.order === 'number' && Number.isFinite(raw.order)
|
|
47
|
+
? { order: raw.order }
|
|
48
|
+
: {}),
|
|
49
|
+
...(typeof raw.locked === 'boolean' ? { locked: raw.locked } : {}),
|
|
50
|
+
...(typeof raw.widget === 'string' && WIDGETS.has(raw.widget)
|
|
51
|
+
? { widget: raw.widget }
|
|
52
|
+
: {}),
|
|
53
|
+
};
|
|
54
|
+
return Object.keys(ui).length > 0 ? ui : undefined;
|
|
55
|
+
}
|
|
56
|
+
function extractEnum(value) {
|
|
57
|
+
return Array.isArray(value) &&
|
|
58
|
+
value.length > 0 &&
|
|
59
|
+
value.every((v) => typeof v === 'string')
|
|
60
|
+
? value
|
|
61
|
+
: undefined;
|
|
62
|
+
}
|
|
63
|
+
function extractFields(raw) {
|
|
64
|
+
const fields = [];
|
|
65
|
+
for (const [name, field] of Object.entries(raw.fields)) {
|
|
66
|
+
if (NON_VALUE_TYPES.has(field.type))
|
|
67
|
+
continue;
|
|
68
|
+
const entry = {
|
|
69
|
+
name,
|
|
70
|
+
type: field.type,
|
|
71
|
+
required: field.required === true,
|
|
72
|
+
};
|
|
73
|
+
const fallback = primitiveDefault(field.default);
|
|
74
|
+
if (fallback !== undefined)
|
|
75
|
+
entry.default = fallback;
|
|
76
|
+
if (field.related)
|
|
77
|
+
entry.related = field.related;
|
|
78
|
+
const values = extractEnum(field.enum);
|
|
79
|
+
if (values)
|
|
80
|
+
entry.enum = values;
|
|
81
|
+
const ui = extractUi(field._meta?.ui);
|
|
82
|
+
if (ui)
|
|
83
|
+
entry.ui = ui;
|
|
84
|
+
const described = field.description ?? field._meta?.description;
|
|
85
|
+
if (typeof described === 'string' && described.trim()) {
|
|
86
|
+
entry.description = described.trim();
|
|
87
|
+
}
|
|
88
|
+
if (SYSTEM_FIELDS.has(name))
|
|
89
|
+
entry.system = true;
|
|
90
|
+
fields.push(entry);
|
|
91
|
+
}
|
|
92
|
+
return fields;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* The surfaces a model gets when the knowledge artifact is absent: derived
|
|
96
|
+
* from `decoratorConfig` the way the generators do (an omitted `api`/`mcp`/
|
|
97
|
+
* `cli` key means full CRUD; `false` means none; `include` narrows it).
|
|
98
|
+
*/
|
|
99
|
+
function derivedVerbs(config) {
|
|
100
|
+
if (config === false)
|
|
101
|
+
return [];
|
|
102
|
+
if (config && typeof config === 'object') {
|
|
103
|
+
const { include, exclude } = config;
|
|
104
|
+
const base = include ?? [...CRUD_VERBS];
|
|
105
|
+
return base.filter((verb) => !exclude?.includes(verb));
|
|
106
|
+
}
|
|
107
|
+
return [...CRUD_VERBS];
|
|
108
|
+
}
|
|
109
|
+
const REST_VERB = {
|
|
110
|
+
list: { method: 'GET', path: '' },
|
|
111
|
+
get: { method: 'GET', path: '/[id]' },
|
|
112
|
+
create: { method: 'POST', path: '' },
|
|
113
|
+
update: { method: 'PATCH', path: '/[id]' },
|
|
114
|
+
delete: { method: 'DELETE', path: '/[id]' },
|
|
115
|
+
};
|
|
116
|
+
function derivedSurfaces(raw) {
|
|
117
|
+
const lower = raw.className.toLowerCase();
|
|
118
|
+
const surfaces = [];
|
|
119
|
+
const add = (kind, config) => {
|
|
120
|
+
for (const verb of derivedVerbs(config)) {
|
|
121
|
+
const route = REST_VERB[verb];
|
|
122
|
+
if (kind === 'api' && !route)
|
|
123
|
+
continue;
|
|
124
|
+
surfaces.push({
|
|
125
|
+
kind,
|
|
126
|
+
name: kind === 'api' ? `${raw.collection}.${verb}` : `${lower}_${verb}`,
|
|
127
|
+
operation: verb,
|
|
128
|
+
objectName: raw.qualifiedName,
|
|
129
|
+
...(kind === 'api' && route
|
|
130
|
+
? { method: route.method, path: `/${raw.collection}${route.path}` }
|
|
131
|
+
: {}),
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
};
|
|
135
|
+
add('api', raw.decoratorConfig.api);
|
|
136
|
+
add('mcp', raw.decoratorConfig.mcp);
|
|
137
|
+
add('cli', raw.decoratorConfig.cli);
|
|
138
|
+
return surfaces;
|
|
139
|
+
}
|
|
140
|
+
/** Collection classes carry the custom actions; they belong to their model. */
|
|
141
|
+
function ownerName(raw) {
|
|
142
|
+
return raw.extendsTypeArg ?? raw.className.replace(/Collection$/, '');
|
|
143
|
+
}
|
|
144
|
+
function isModel(raw, objects) {
|
|
145
|
+
// A derived collection may inherit a table schema without carrying its own
|
|
146
|
+
// type argument. Resolve ancestry before accepting schema/field evidence.
|
|
147
|
+
const seen = new Set();
|
|
148
|
+
let ancestor = raw;
|
|
149
|
+
while (ancestor && !seen.has(ancestor)) {
|
|
150
|
+
seen.add(ancestor);
|
|
151
|
+
if (ancestor.extends === 'SmrtCollection' ||
|
|
152
|
+
ancestor.extendsTypeArg !== undefined) {
|
|
153
|
+
return false;
|
|
154
|
+
}
|
|
155
|
+
if (ancestor.extends === 'SmrtObject')
|
|
156
|
+
return true;
|
|
157
|
+
if (!ancestor.extends)
|
|
158
|
+
break;
|
|
159
|
+
const namespace = ancestor.qualifiedName.slice(0, ancestor.qualifiedName.lastIndexOf(':'));
|
|
160
|
+
const parent = ancestor.extends.includes(':')
|
|
161
|
+
? ancestor.extends
|
|
162
|
+
: `${namespace}:${ancestor.extends}`;
|
|
163
|
+
ancestor = objects.get(parent);
|
|
164
|
+
}
|
|
165
|
+
return (!!raw.schema?.tableName ||
|
|
166
|
+
Object.values(raw.fields).some((f) => !NON_VALUE_TYPES.has(f.type)));
|
|
167
|
+
}
|
|
168
|
+
function qualify(related, packageName, models) {
|
|
169
|
+
if (related.includes(':'))
|
|
170
|
+
return related;
|
|
171
|
+
const local = `${packageName}:${related}`;
|
|
172
|
+
return models.has(local) ? local : related;
|
|
173
|
+
}
|
|
174
|
+
const RECIPE_METADATA_KEYS = [
|
|
175
|
+
'surfaces',
|
|
176
|
+
'providers',
|
|
177
|
+
'runtime',
|
|
178
|
+
'demoSeed',
|
|
179
|
+
'demo',
|
|
180
|
+
];
|
|
181
|
+
/**
|
|
182
|
+
* The recipes a package declares, in declaration order, from its knowledge
|
|
183
|
+
* artifact (else its manifest). Dropped when they are not an array of
|
|
184
|
+
* objects with a string `id`. `className` is a source detail, not catalog data.
|
|
185
|
+
* The non-model parts (surfaces, providers, runtime, demo seed, demo) are
|
|
186
|
+
* validated by `recipe-metadata.ts` and carried as authored.
|
|
187
|
+
*/
|
|
188
|
+
function extractRecipes(raw) {
|
|
189
|
+
const found = raw.knowledge?.recipes ?? raw.manifest.recipes;
|
|
190
|
+
if (!Array.isArray(found))
|
|
191
|
+
return [];
|
|
192
|
+
return found
|
|
193
|
+
.filter((r) => !!r &&
|
|
194
|
+
typeof r === 'object' &&
|
|
195
|
+
typeof r.id === 'string')
|
|
196
|
+
.map((entry) => {
|
|
197
|
+
const { className: _className, ...recipe } = entry;
|
|
198
|
+
for (const key of RECIPE_METADATA_KEYS)
|
|
199
|
+
delete recipe[key];
|
|
200
|
+
return {
|
|
201
|
+
...recipe,
|
|
202
|
+
...extractRecipeMetadata(entry),
|
|
203
|
+
};
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
/** Turn one package's raw manifest and knowledge into a catalog entry. */
|
|
207
|
+
export function extractPackage(raw) {
|
|
208
|
+
const { manifest, knowledge, packageName } = raw;
|
|
209
|
+
const recipes = extractRecipes(raw);
|
|
210
|
+
const browser = extractBrowser(knowledge?.browser ?? manifest.browser);
|
|
211
|
+
const objects = Object.values(manifest.objects);
|
|
212
|
+
const objectMap = new Map(objects.map((o) => [o.qualifiedName, o]));
|
|
213
|
+
const rawModels = objects.filter((o) => isModel(o, objectMap));
|
|
214
|
+
const modelMap = new Map(rawModels.map((m) => [m.qualifiedName, m]));
|
|
215
|
+
const collections = objects.filter((o) => !modelMap.has(o.qualifiedName));
|
|
216
|
+
const knowledgeSurfaces = knowledge?.surfaces ?? null;
|
|
217
|
+
const models = rawModels.map((model) => {
|
|
218
|
+
const owned = [
|
|
219
|
+
model,
|
|
220
|
+
...collections.filter((c) => ownerName(c) === model.className),
|
|
221
|
+
];
|
|
222
|
+
const ownedNames = new Set(owned.map((o) => o.qualifiedName));
|
|
223
|
+
const surfaces = knowledgeSurfaces
|
|
224
|
+
? knowledgeSurfaces.filter((s) => ownedNames.has(s.objectName))
|
|
225
|
+
: derivedSurfaces(model);
|
|
226
|
+
const seen = new Set();
|
|
227
|
+
const unique = surfaces.filter((s) => {
|
|
228
|
+
const key = `${s.kind}:${s.name}`;
|
|
229
|
+
if (seen.has(key))
|
|
230
|
+
return false;
|
|
231
|
+
seen.add(key);
|
|
232
|
+
return true;
|
|
233
|
+
});
|
|
234
|
+
const rest = unique
|
|
235
|
+
.filter((s) => s.kind === 'api' && s.path && s.method)
|
|
236
|
+
.map((s) => ({ method: s.method, path: s.path }));
|
|
237
|
+
const operations = (kind) => unique
|
|
238
|
+
.filter((s) => s.kind === kind)
|
|
239
|
+
.map((s) => ({ operation: s.operation, name: s.name }))
|
|
240
|
+
.sort(byName);
|
|
241
|
+
const mcp = operations('mcp');
|
|
242
|
+
const cli = operations('cli');
|
|
243
|
+
const mcpOps = new Set(mcp.map((t) => t.operation));
|
|
244
|
+
const methods = owned
|
|
245
|
+
.flatMap((o) => Object.values(o.methods))
|
|
246
|
+
.filter((m) => m.isPublic !== false && !m.isStatic)
|
|
247
|
+
.filter((m, i, all) => all.findIndex((x) => x.name === m.name) === i)
|
|
248
|
+
.map((m) => ({
|
|
249
|
+
name: m.name,
|
|
250
|
+
async: m.async === true,
|
|
251
|
+
parameters: (m.parameters ?? []).map((p) => `${p.name}${p.optional ? '?' : ''}: ${p.type}`),
|
|
252
|
+
returnType: m.returnType ?? 'unknown',
|
|
253
|
+
aiCallable: mcpOps.has(m.name),
|
|
254
|
+
}))
|
|
255
|
+
.sort(byName);
|
|
256
|
+
const fields = extractFields(model);
|
|
257
|
+
const references = [
|
|
258
|
+
...new Set(fields
|
|
259
|
+
.filter((f) => f.related && ['foreignKey', 'crossPackageRef'].includes(f.type))
|
|
260
|
+
.map((f) => qualify(f.related, packageName, modelMap))),
|
|
261
|
+
].sort();
|
|
262
|
+
for (const field of fields) {
|
|
263
|
+
if (field.related) {
|
|
264
|
+
field.related = qualify(field.related, packageName, modelMap);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
return {
|
|
268
|
+
id: model.qualifiedName,
|
|
269
|
+
name: model.className,
|
|
270
|
+
collection: model.collection,
|
|
271
|
+
...(model.extends && modelMap.has(`${packageName}:${model.extends}`)
|
|
272
|
+
? { extends: `${packageName}:${model.extends}` }
|
|
273
|
+
: {}),
|
|
274
|
+
...(model.description?.trim()
|
|
275
|
+
? { description: model.description.trim() }
|
|
276
|
+
: {}),
|
|
277
|
+
...(model.displayLabelField &&
|
|
278
|
+
fields.some((f) => f.name === model.displayLabelField)
|
|
279
|
+
? { display: { label: model.displayLabelField } }
|
|
280
|
+
: {}),
|
|
281
|
+
fields,
|
|
282
|
+
rest,
|
|
283
|
+
mcp,
|
|
284
|
+
cli,
|
|
285
|
+
methods,
|
|
286
|
+
references,
|
|
287
|
+
exposed: rest.length + mcp.length + cli.length > 0,
|
|
288
|
+
};
|
|
289
|
+
});
|
|
290
|
+
models.sort((a, b) => (a.id < b.id ? -1 : a.id > b.id ? 1 : 0));
|
|
291
|
+
return {
|
|
292
|
+
id: packageId(packageName),
|
|
293
|
+
packageName,
|
|
294
|
+
version: raw.version,
|
|
295
|
+
description: raw.description,
|
|
296
|
+
models,
|
|
297
|
+
dependencies: (manifest.smrtDependencies ?? []).map(packageId).sort(),
|
|
298
|
+
surfaceSource: knowledgeSurfaces ? 'knowledge' : 'manifest',
|
|
299
|
+
...(browser ? { browser } : {}),
|
|
300
|
+
...(recipes.length > 0 ? { recipes } : {}),
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
/**
|
|
304
|
+
* Resolve each package's dependencies: the other catalog packages named in its
|
|
305
|
+
* manifest's `smrtDependencies` or pointed at by its models' foreign keys and
|
|
306
|
+
* cross-package references. Packages outside the catalog (excluded
|
|
307
|
+
* infrastructure) are not dependencies.
|
|
308
|
+
*/
|
|
309
|
+
export function resolveDependencies(packages) {
|
|
310
|
+
const ids = new Set(packages.map((p) => p.id));
|
|
311
|
+
return packages.map((pkg) => {
|
|
312
|
+
const deps = new Set(pkg.dependencies.filter((id) => ids.has(id)));
|
|
313
|
+
for (const model of pkg.models) {
|
|
314
|
+
for (const ref of model.references) {
|
|
315
|
+
const colon = ref.indexOf(':');
|
|
316
|
+
if (colon < 0)
|
|
317
|
+
continue;
|
|
318
|
+
const id = packageId(ref.slice(0, colon));
|
|
319
|
+
if (ids.has(id))
|
|
320
|
+
deps.add(id);
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
deps.delete(pkg.id);
|
|
324
|
+
return { ...pkg, dependencies: [...deps].sort() };
|
|
325
|
+
});
|
|
326
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { RawPackage } from './extract.ts';
|
|
2
|
+
/**
|
|
3
|
+
* Read every `@happyvertical/smrt-*` package of a local smrt checkout that has
|
|
4
|
+
* been built (the file its `./manifest` export names, usually
|
|
5
|
+
* `dist/manifest.json`, plus the `smrt-knowledge.json` beside it). Packages that are not built are skipped.
|
|
6
|
+
* This is the opt-in `CATALOG_SOURCE` path for previewing unreleased manifests.
|
|
7
|
+
*/
|
|
8
|
+
export declare function readLocalPackages(checkout: string): Promise<RawPackage[]>;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { readdir, readFile } from 'node:fs/promises';
|
|
2
|
+
import { dirname, join, resolve } from 'node:path';
|
|
3
|
+
import { PACKAGE_PREFIX } from "./exclusions.js";
|
|
4
|
+
async function readJson(path) {
|
|
5
|
+
try {
|
|
6
|
+
return JSON.parse(await readFile(path, 'utf8'));
|
|
7
|
+
}
|
|
8
|
+
catch {
|
|
9
|
+
return null;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
/** The manifest path a package publishes as `./manifest`, else `dist/manifest.json`. */
|
|
13
|
+
function manifestPath(pkg) {
|
|
14
|
+
const target = pkg.exports?.['./manifest'];
|
|
15
|
+
return typeof target === 'string' ? target : './dist/manifest.json';
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Read every `@happyvertical/smrt-*` package of a local smrt checkout that has
|
|
19
|
+
* been built (the file its `./manifest` export names, usually
|
|
20
|
+
* `dist/manifest.json`, plus the `smrt-knowledge.json` beside it). Packages that are not built are skipped.
|
|
21
|
+
* This is the opt-in `CATALOG_SOURCE` path for previewing unreleased manifests.
|
|
22
|
+
*/
|
|
23
|
+
export async function readLocalPackages(checkout) {
|
|
24
|
+
const packagesDir = join(resolve(checkout), 'packages');
|
|
25
|
+
const dirs = (await readdir(packagesDir)).sort();
|
|
26
|
+
const raws = [];
|
|
27
|
+
for (const dir of dirs) {
|
|
28
|
+
const pkgDir = join(packagesDir, dir);
|
|
29
|
+
const pkg = await readJson(join(pkgDir, 'package.json'));
|
|
30
|
+
if (!pkg?.name?.startsWith(PACKAGE_PREFIX))
|
|
31
|
+
continue;
|
|
32
|
+
const manifestFile = join(pkgDir, manifestPath(pkg));
|
|
33
|
+
const manifest = await readJson(manifestFile);
|
|
34
|
+
if (!manifest)
|
|
35
|
+
continue;
|
|
36
|
+
raws.push({
|
|
37
|
+
packageName: pkg.name,
|
|
38
|
+
version: pkg.version ?? '0.0.0',
|
|
39
|
+
description: pkg.description ?? '',
|
|
40
|
+
manifest,
|
|
41
|
+
knowledge: await readJson(join(dirname(manifestFile), 'smrt-knowledge.json')),
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
return raws;
|
|
45
|
+
}
|