@happyvertical/smrt-planner 0.0.1 → 0.1.0
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/README.md +81 -8
- package/app/404.html +42 -49
- package/app/_app/immutable/assets/0.BvXq1Svw.css +1 -0
- package/app/_app/immutable/assets/10.CdYxvH4G.css +1 -0
- package/app/_app/immutable/assets/11.nOT5Z4Fv.css +1 -0
- package/app/_app/immutable/assets/12.F7A7zP4J.css +1 -0
- package/app/_app/immutable/assets/13.JoySu8W5.css +1 -0
- package/app/_app/immutable/assets/14.nsp62-4b.css +1 -0
- package/app/_app/immutable/assets/2.CbPiqdz5.css +1 -0
- package/app/_app/immutable/assets/3.D518dbB5.css +1 -0
- package/app/_app/immutable/assets/4.B3vt1gMJ.css +1 -0
- package/app/_app/immutable/assets/AiSetup.4fXjMpTZ.css +1 -0
- package/app/_app/immutable/assets/AppShell.DKPbJFmw.css +1 -0
- package/app/_app/immutable/assets/ConnectTools.DTleL8YA.css +1 -0
- package/app/_app/immutable/assets/FieldMapForm.C8SZ3t4N.css +1 -0
- package/app/_app/immutable/assets/ModelPage.DzDhJQz3.css +1 -0
- package/app/_app/immutable/assets/SectionActions.BE1CPmxk.css +1 -0
- package/app/_app/immutable/assets/SectionIcons.BGFcFuOf.css +1 -0
- package/app/_app/immutable/assets/SegmentedControl.T_hJQXHk.css +1 -0
- package/app/_app/immutable/assets/app.BS7nbUi0.css +1 -0
- package/app/_app/immutable/assets/currency-metadata.CJIy0Dzm.css +1 -0
- package/app/_app/immutable/assets/data.DQcbQG_b.css +1 -0
- package/app/_app/immutable/assets/feedback.FjY5wqsa.css +1 -0
- package/app/_app/immutable/assets/forms.DA06CFM9.css +1 -0
- package/app/_app/immutable/assets/labels.Dny6zd23.css +1 -0
- package/app/_app/immutable/assets/percent.CBivq97O.css +1 -0
- package/app/_app/immutable/assets/state.C9Put0ur.css +1 -0
- package/app/_app/immutable/assets/webmcp-ui-context.CC5pQLNE.css +1 -0
- package/app/_app/immutable/assets/workspace.Dtoe2fRU.css +1 -0
- package/app/_app/immutable/chunks/3ouNUakh.js +1 -0
- package/app/_app/immutable/chunks/B3FAegW4.js +4 -0
- package/app/_app/immutable/chunks/B8iReL-r.js +1 -0
- package/app/_app/immutable/chunks/BCmdRE3j.js +4 -0
- package/app/_app/immutable/chunks/BV3NwM01.js +1 -0
- package/app/_app/immutable/chunks/BVicq_6F.js +1 -0
- package/app/_app/immutable/chunks/Ba1g71Sq.js +1 -0
- package/app/_app/immutable/chunks/BdjvgMW6.js +1 -0
- package/app/_app/immutable/chunks/BiO_bqNH.js +2 -0
- package/app/_app/immutable/chunks/{DyGfbRG-.js → BrorvU4B.js} +1 -1
- package/app/_app/immutable/chunks/By-QJdbA.js +980 -0
- package/app/_app/immutable/chunks/{CyUMm_Wp.js → BzITuwgY.js} +1 -1
- package/app/_app/immutable/chunks/BzMfoxBk.js +1 -0
- package/app/_app/immutable/chunks/C-AoRalq.js +1 -0
- package/app/_app/immutable/chunks/CGKL_Nlh.js +1 -0
- package/app/_app/immutable/chunks/CNj-_B0j.js +1 -0
- package/app/_app/immutable/chunks/CU8cbxOZ.js +1 -0
- package/app/_app/immutable/chunks/CZGhPAoL.js +2 -0
- package/app/_app/immutable/chunks/CaEdOwVf.js +1 -0
- package/app/_app/immutable/chunks/Cas1hq-y.js +1 -0
- package/app/_app/immutable/chunks/CfOMUCNN.js +1 -0
- package/app/_app/immutable/chunks/Cm0VMWZu.js +1 -0
- package/app/_app/immutable/chunks/CsmXMAyE.js +1 -0
- package/app/_app/immutable/chunks/{BWPhGFHl.js → D0FW0z6R.js} +1 -1
- package/app/_app/immutable/chunks/D3nyL-ZK.js +1 -0
- package/app/_app/immutable/chunks/DEe2Vsu9.js +1 -0
- package/app/_app/immutable/chunks/DTs3DOB0.js +10 -0
- package/app/_app/immutable/chunks/Dm6R8q7G.js +1 -0
- package/app/_app/immutable/chunks/Dreozana.js +1 -0
- package/app/_app/immutable/chunks/Dx8H44Wq.js +2 -0
- package/app/_app/immutable/chunks/DxR35SQx.js +24 -0
- package/app/_app/immutable/chunks/EcFojPiU.js +11 -0
- package/app/_app/immutable/chunks/JBS2nHGN.js +1 -0
- package/app/_app/immutable/chunks/TjbilXEg.js +1 -0
- package/app/_app/immutable/chunks/ZLqixH7j.js +9 -0
- package/app/_app/immutable/chunks/auwiz8v4.js +1 -0
- package/app/_app/immutable/chunks/dbZ3U29n.js +1 -0
- package/app/_app/immutable/chunks/{D333l2GL.js → gHjidpzw.js} +2 -2
- package/app/_app/immutable/chunks/vNEnXNLV.js +3 -0
- package/app/_app/immutable/entry/app.vuScBcN4.js +2 -0
- package/app/_app/immutable/entry/start.C_vMied2.js +1 -0
- package/app/_app/immutable/nodes/0.BeNJfVow.js +9 -0
- package/app/_app/immutable/nodes/1.huiLmf4w.js +1 -0
- package/app/_app/immutable/nodes/10.B3buyRS-.js +3 -0
- package/app/_app/immutable/nodes/11.FNeDQehr.js +1 -0
- package/app/_app/immutable/nodes/12.umrKgKLQ.js +4 -0
- package/app/_app/immutable/nodes/13.DFr7i0IY.js +1 -0
- package/app/_app/immutable/nodes/14.BNgJ8cEq.js +1 -0
- package/app/_app/immutable/nodes/2.B3v0JtfB.js +24 -0
- package/app/_app/immutable/nodes/3.FLW3AkwU.js +1 -0
- package/app/_app/immutable/nodes/4.50B7EkB9.js +1 -0
- package/app/_app/immutable/nodes/5.Din7W_Et.js +1 -0
- package/app/_app/immutable/nodes/6.7dOUE7nr.js +1 -0
- package/app/_app/immutable/nodes/7.C4XsW0qI.js +1 -0
- package/app/_app/immutable/nodes/8.D_MREd8V.js +1 -0
- package/app/_app/immutable/nodes/9.cn87hhI-.js +1 -0
- package/app/_app/version.json +1 -1
- package/app/advanced-styles/index.html +84 -0
- package/app/ai/index.html +60 -52
- package/app/blueprint/index.html +46 -53
- package/app/cookbook/index.html +46 -53
- package/app/index.html +92 -64
- package/app/m/ads/AdDeliveryTier/index.html +52 -59
- package/app/m/ads/AdEvent/index.html +52 -59
- package/app/m/ads/AdFormat/index.html +52 -59
- package/app/m/ads/AdGroup/index.html +52 -59
- package/app/m/ads/AdVariation/index.html +52 -59
- package/app/m/analytics/AnalyticsDataStream/index.html +52 -59
- package/app/m/analytics/AnalyticsEvent/index.html +52 -59
- package/app/m/analytics/AnalyticsProperty/index.html +52 -59
- package/app/m/analytics/AnalyticsReport/index.html +52 -59
- package/app/m/approvals/ApprovalEvent/index.html +52 -59
- package/app/m/approvals/ApprovalPolicy/index.html +52 -59
- package/app/m/approvals/ApprovalRequest/index.html +52 -59
- package/app/m/assets/Asset/attachments/index.html +91 -0
- package/app/m/assets/Asset/index.html +52 -59
- package/app/m/assets/AssetAssociation/index.html +53 -60
- package/app/m/assets/AssetMetafield/index.html +52 -59
- package/app/m/assets/AssetStatus/index.html +52 -59
- package/app/m/assets/AssetType/index.html +52 -59
- package/app/m/assets/Folder/index.html +52 -59
- package/app/m/chat/AgentSession/index.html +52 -59
- package/app/m/chat/ChatMessage/index.html +53 -60
- package/app/m/chat/ChatParticipant/index.html +53 -60
- package/app/m/chat/ChatReaction/index.html +52 -59
- package/app/m/chat/ChatRoom/index.html +52 -59
- package/app/m/chat/ChatThread/index.html +53 -60
- package/app/m/chat/VoiceGatewayTurn/index.html +52 -59
- package/app/m/chat/VoiceSession/index.html +52 -59
- package/app/m/commerce/Agreement/index.html +52 -59
- package/app/m/commerce/Cart/index.html +52 -59
- package/app/m/commerce/Contract/index.html +52 -59
- package/app/m/commerce/ContractLineItem/index.html +53 -60
- package/app/m/commerce/Customer/index.html +52 -59
- package/app/m/commerce/DocumentTax/index.html +89 -0
- package/app/m/commerce/Estimate/index.html +52 -59
- package/app/m/commerce/Fulfillment/index.html +52 -59
- package/app/m/commerce/FulfillmentLineItem/index.html +53 -60
- package/app/m/commerce/Invoice/index.html +52 -59
- package/app/m/commerce/InvoiceLineItem/index.html +53 -60
- package/app/m/commerce/Lease/index.html +52 -59
- package/app/m/commerce/LicenseSale/index.html +52 -59
- package/app/m/commerce/Order/index.html +52 -59
- package/app/m/commerce/Payment/index.html +52 -59
- package/app/m/commerce/PaymentAllocation/index.html +53 -60
- package/app/m/commerce/PaymentInstrument/index.html +52 -59
- package/app/m/commerce/PaymentIntent/index.html +52 -59
- package/app/m/commerce/Payout/index.html +52 -59
- package/app/m/commerce/ProductionOrder/index.html +52 -59
- package/app/m/commerce/PurchaseContract/index.html +89 -0
- package/app/m/commerce/PurchaseOrder/index.html +52 -59
- package/app/m/commerce/SalesContract/index.html +89 -0
- package/app/m/commerce/SupplierQuote/index.html +89 -0
- package/app/m/commerce/TaxCode/index.html +89 -0
- package/app/m/commerce/TaxComponent/index.html +89 -0
- package/app/m/commerce/TaxSettings/index.html +89 -0
- package/app/m/commerce/TaxSummaryReport/index.html +89 -0
- package/app/m/commerce/Vendor/index.html +52 -59
- package/app/m/commerce/WholesaleOrder/index.html +52 -59
- package/app/m/content/Content/index.html +52 -59
- package/app/m/content/ContentContribution/index.html +52 -59
- package/app/m/content/ContentContributionAttachment/index.html +52 -59
- package/app/m/content/ContentContributionRevision/index.html +52 -59
- package/app/m/content/ContentContributionType/index.html +52 -59
- package/app/m/content/ContentContributor/index.html +52 -59
- package/app/m/content/ContentCorrection/index.html +52 -59
- package/app/m/content/ContentFeedSource/index.html +52 -59
- package/app/m/content/ContentGovernanceAssignment/index.html +52 -59
- package/app/m/content/ContentGovernancePolicy/index.html +52 -59
- package/app/m/content/ContentGovernanceProfile/index.html +52 -59
- package/app/m/content/ContentReference/index.html +52 -59
- package/app/m/content/ContentReview/index.html +52 -59
- package/app/m/content/ContentVersion/index.html +52 -59
- package/app/m/events/Event/index.html +52 -59
- package/app/m/events/EventParticipant/index.html +53 -60
- package/app/m/events/EventSeries/index.html +52 -59
- package/app/m/events/EventType/index.html +52 -59
- package/app/m/expenses/Expense/index.html +89 -0
- package/app/m/facts/Fact/index.html +52 -59
- package/app/m/facts/FactContent/index.html +52 -59
- package/app/m/facts/FactEvidence/index.html +52 -59
- package/app/m/facts/FactSource/index.html +52 -59
- package/app/m/facts/FactSubject/index.html +52 -59
- package/app/m/facts/FactTag/index.html +52 -59
- package/app/m/fields/FieldPolicy/index.html +52 -59
- package/app/m/fields/FieldPolicySuggestion/index.html +52 -59
- package/app/m/fields/FieldUsageCounter/index.html +52 -59
- package/app/m/images/Image/index.html +52 -59
- package/app/m/inventory/InventoryLocation/index.html +52 -59
- package/app/m/inventory/StockLevel/index.html +52 -59
- package/app/m/inventory/StockMovement/index.html +52 -59
- package/app/m/ledgers/Account/index.html +52 -59
- package/app/m/ledgers/Journal/index.html +52 -59
- package/app/m/ledgers/JournalEntry/index.html +53 -60
- package/app/m/manufacturing/Assembly/index.html +52 -59
- package/app/m/manufacturing/BillOfMaterials/index.html +52 -59
- package/app/m/manufacturing/BomLine/index.html +52 -59
- package/app/m/manufacturing/Operation/index.html +52 -59
- package/app/m/manufacturing/ProductionRun/index.html +52 -59
- package/app/m/manufacturing/ProductionRunCompletion/index.html +52 -59
- package/app/m/manufacturing/RoutingStep/index.html +52 -59
- package/app/m/marketing/Campaign/index.html +52 -59
- package/app/m/marketing/CampaignChannel/index.html +52 -59
- package/app/m/marketing/CampaignMetricSnapshot/index.html +52 -59
- package/app/m/messages/Account/index.html +52 -59
- package/app/m/messages/Attachment/index.html +52 -59
- package/app/m/messages/Blacklist/index.html +52 -59
- package/app/m/messages/Email/failed-sends/index.html +54 -59
- package/app/m/messages/Email/index.html +52 -59
- package/app/m/messages/Email/mailbox/index.html +54 -59
- package/app/m/messages/EmailAccount/index.html +52 -59
- package/app/m/messages/EmailAttachment/index.html +89 -0
- package/app/m/messages/EmailFolder/index.html +52 -59
- package/app/m/messages/Message/index.html +52 -59
- package/app/m/messages/MessagingEndpoint/index.html +52 -59
- package/app/m/messages/PersonaMessageRoute/index.html +52 -59
- package/app/m/messages/SlackAccount/index.html +52 -59
- package/app/m/messages/SlackMessage/index.html +52 -59
- package/app/m/messages/TelegramAccount/index.html +52 -59
- package/app/m/messages/Tweet/index.html +52 -59
- package/app/m/messages/TwitterAccount/index.html +52 -59
- package/app/m/messages/Whitelist/index.html +52 -59
- package/app/m/messages/ZulipAccount/index.html +52 -59
- package/app/m/places/Place/index.html +52 -59
- package/app/m/places/PlaceType/index.html +52 -59
- package/app/m/products/Category/index.html +52 -59
- package/app/m/products/Material/index.html +52 -59
- package/app/m/products/Product/index.html +52 -59
- package/app/m/products/Product/ingredients/index.html +54 -59
- package/app/m/products/ProductVariant/index.html +53 -60
- package/app/m/products/Sku/index.html +53 -60
- package/app/m/profiles/ApiKey/index.html +52 -59
- package/app/m/profiles/Bot/index.html +52 -59
- package/app/m/profiles/MagicLinkToken/index.html +52 -59
- package/app/m/profiles/NostrIdentity/index.html +52 -59
- package/app/m/profiles/OidcIdentity/index.html +52 -59
- package/app/m/profiles/Organization/index.html +52 -59
- package/app/m/profiles/Person/index.html +52 -59
- package/app/m/profiles/Profile/index.html +52 -59
- package/app/m/profiles/ProfileMetadata/index.html +52 -59
- package/app/m/profiles/ProfileMetafield/index.html +52 -59
- package/app/m/profiles/ProfileRelationship/index.html +52 -59
- package/app/m/profiles/ProfileRelationshipTerm/index.html +52 -59
- package/app/m/profiles/ProfileRelationshipType/index.html +52 -59
- package/app/m/profiles/ProfileType/index.html +52 -59
- package/app/m/projects/Comment/index.html +53 -60
- package/app/m/projects/Issue/index.html +52 -59
- package/app/m/projects/Label/index.html +52 -59
- package/app/m/projects/Project/index.html +52 -59
- package/app/m/projects/ProjectIntegration/index.html +52 -59
- package/app/m/projects/PullRequest/index.html +52 -59
- package/app/m/projects/Repository/index.html +52 -59
- package/app/m/properties/Property/index.html +52 -59
- package/app/m/properties/Zone/index.html +52 -59
- package/app/m/reports/RuntimeReport/index.html +52 -59
- package/app/m/reports/SmrtPrincipalReportRefreshTask/index.html +52 -59
- package/app/m/reports/SmrtReportLock/index.html +52 -59
- package/app/m/reports/SmrtReportRefreshTask/index.html +52 -59
- package/app/m/reports/SmrtReportRun/index.html +52 -59
- package/app/m/reports/SmrtReportSchedule/index.html +52 -59
- package/app/m/reports/SmrtReportWatermark/index.html +52 -59
- package/app/m/sales/AttributionException/index.html +52 -59
- package/app/m/sales/AttributionPolicy/index.html +52 -59
- package/app/m/sales/Commission/index.html +52 -59
- package/app/m/sales/CommissionAdjustment/index.html +52 -59
- package/app/m/sales/CommissionPayout/index.html +52 -59
- package/app/m/sales/CommissionPlan/index.html +52 -59
- package/app/m/sales/Earner/index.html +52 -59
- package/app/m/sales/EarnerSourceAttribution/index.html +52 -59
- package/app/m/sales/EarningEvent/index.html +52 -59
- package/app/m/sales/ExecutedAgreement/index.html +52 -59
- package/app/m/sales/Lead/index.html +52 -59
- package/app/m/sales/Opportunity/index.html +52 -59
- package/app/m/sales/OpportunityConversion/index.html +52 -59
- package/app/m/sales/PipelineDefinition/index.html +52 -59
- package/app/m/sales/PipelineStage/index.html +53 -60
- package/app/m/sales/Referral/index.html +52 -59
- package/app/m/sales/ReferralAgreement/index.html +52 -59
- package/app/m/sales/ReferralLink/index.html +52 -59
- package/app/m/sales/ReferralProgram/index.html +52 -59
- package/app/m/sales/ReferralTermSnapshot/index.html +52 -59
- package/app/m/sales/ReferralTouch/index.html +52 -59
- package/app/m/sales/Referrer/index.html +52 -59
- package/app/m/sales/SalesActivity/index.html +52 -59
- package/app/m/sales/SalesRepresentative/index.html +52 -59
- package/app/m/sites/Site/index.html +52 -59
- package/app/m/sites/SiteAgentBinding/index.html +52 -59
- package/app/m/social/OAuthState/index.html +52 -59
- package/app/m/social/SocialAccount/index.html +52 -59
- package/app/m/social/SocialPost/index.html +52 -59
- package/app/m/social/SocialPostAnalyticsSnapshot/index.html +52 -59
- package/app/m/subscriptions/BillingAdjustment/index.html +52 -59
- package/app/m/subscriptions/ClientCharge/index.html +52 -59
- package/app/m/subscriptions/CreditGrant/index.html +52 -59
- package/app/m/subscriptions/PricingRule/index.html +52 -59
- package/app/m/subscriptions/RetailCharge/index.html +52 -59
- package/app/m/subscriptions/SpendingPolicy/index.html +52 -59
- package/app/m/subscriptions/SubscriptionPlan/index.html +52 -59
- package/app/m/subscriptions/TenantSubscription/index.html +52 -59
- package/app/m/subscriptions/TenantUsageMetric/index.html +52 -59
- package/app/m/support/ServiceTimeEntry/index.html +52 -59
- package/app/m/support/SupportAiRun/index.html +52 -59
- package/app/m/support/SupportAvailability/index.html +52 -59
- package/app/m/support/SupportCase/index.html +52 -59
- package/app/m/support/SupportCaseEvent/index.html +52 -59
- package/app/m/support/SupportChannelBinding/index.html +52 -59
- package/app/m/support/SupportCharge/index.html +52 -59
- package/app/m/support/SupportCompensation/index.html +52 -59
- package/app/m/support/SupportCompensationPlan/index.html +52 -59
- package/app/m/support/SupportEscalation/index.html +52 -59
- package/app/m/support/SupportInteraction/index.html +52 -59
- package/app/m/support/SupportPlan/index.html +52 -59
- package/app/m/support/SupportPolicy/index.html +52 -59
- package/app/m/support/SupportQualification/index.html +52 -59
- package/app/m/support/SupportServiceTarget/index.html +52 -59
- package/app/m/support/SupportSpecialist/index.html +52 -59
- package/app/m/support/SupportWorkLink/index.html +52 -59
- package/app/m/tags/Tag/index.html +52 -59
- package/app/m/tags/TagAlias/index.html +52 -59
- package/app/m/timesheets/AttendanceBreak/index.html +52 -59
- package/app/m/timesheets/AttendancePunch/index.html +52 -59
- package/app/m/timesheets/AttendanceSegment/index.html +89 -0
- package/app/m/timesheets/ServiceChargeSnapshot/index.html +52 -59
- package/app/m/timesheets/ServiceCompensationSnapshot/index.html +52 -59
- package/app/m/timesheets/ServiceTimeEntry/index.html +52 -59
- package/app/m/users/Group/index.html +52 -59
- package/app/m/users/GroupMember/index.html +52 -59
- package/app/m/users/GroupRole/index.html +52 -59
- package/app/m/users/Membership/index.html +53 -60
- package/app/m/users/MembershipOverride/index.html +52 -59
- package/app/m/users/Permission/index.html +52 -59
- package/app/m/users/Role/index.html +52 -59
- package/app/m/users/RolePermission/index.html +52 -59
- package/app/m/users/Session/index.html +52 -59
- package/app/m/users/Tenant/index.html +52 -59
- package/app/m/users/TenantIntegration/index.html +52 -59
- package/app/m/users/TenantPermissionOverride/index.html +52 -59
- package/app/m/users/User/index.html +52 -59
- package/app/m/video/Character/index.html +52 -59
- package/app/m/video/CharacterAsset/index.html +52 -59
- package/app/m/video/CompositeJob/index.html +52 -59
- package/app/m/video/Performer/index.html +52 -59
- package/app/m/video/PerformerAsset/index.html +52 -59
- package/app/m/video/Scene/index.html +52 -59
- package/app/m/video/SceneAsset/index.html +52 -59
- package/app/m/video/VideoComposition/index.html +52 -59
- package/app/m/video/VideoCompositionAsset/index.html +52 -59
- package/app/m/video/VideoSequence/index.html +52 -59
- package/app/m/video/VideoSequenceAsset/index.html +52 -59
- package/app/m/video/VideoShot/index.html +52 -59
- package/app/m/video/VideoShotAsset/index.html +52 -59
- package/app/m/video/VideoShotCharacter/index.html +52 -59
- package/app/m/video/VideoWorkflow/index.html +52 -59
- package/app/m/voice/VoiceOutput/index.html +52 -59
- package/app/m/voice/VoiceProfile/index.html +52 -59
- package/app/m/voice/VoiceSample/index.html +52 -59
- package/app/packages/ads/index.html +50 -57
- package/app/packages/analytics/index.html +50 -57
- package/app/packages/approvals/index.html +50 -57
- package/app/packages/assets/index.html +50 -57
- package/app/packages/chat/index.html +50 -57
- package/app/packages/comments/index.html +50 -57
- package/app/packages/commerce/index.html +50 -57
- package/app/packages/content/index.html +50 -57
- package/app/packages/events/index.html +50 -57
- package/app/packages/expenses/index.html +50 -57
- package/app/packages/facts/index.html +50 -57
- package/app/packages/fields/index.html +50 -57
- package/app/packages/human-resources/index.html +50 -57
- package/app/packages/images/index.html +50 -57
- package/app/packages/index.html +49 -55
- package/app/packages/ingestion/index.html +85 -0
- package/app/packages/inventory/index.html +50 -57
- package/app/packages/ledgers/index.html +50 -57
- package/app/packages/manufacturing/index.html +50 -57
- package/app/packages/marketing/index.html +50 -57
- package/app/packages/messages/index.html +50 -57
- package/app/packages/places/index.html +50 -57
- package/app/packages/preferences/index.html +50 -57
- package/app/packages/products/index.html +50 -57
- package/app/packages/profiles/index.html +50 -57
- package/app/packages/projects/index.html +50 -57
- package/app/packages/properties/index.html +50 -57
- package/app/packages/reports/index.html +50 -57
- package/app/packages/sales/index.html +50 -57
- package/app/packages/sites/index.html +50 -57
- package/app/packages/social/index.html +50 -57
- package/app/packages/subscriptions/index.html +50 -57
- package/app/packages/support/index.html +50 -57
- package/app/packages/tags/index.html +50 -57
- package/app/packages/timesheets/index.html +50 -57
- package/app/packages/users/index.html +50 -57
- package/app/packages/video/index.html +50 -57
- package/app/packages/voice/index.html +50 -57
- package/app/packages/webhooks/index.html +85 -0
- package/app/recipes/account-access/help/index.html +52 -57
- package/app/recipes/account-access/index.html +57 -59
- package/app/recipes/activity/help/index.html +52 -57
- package/app/recipes/activity/index.html +57 -59
- package/app/recipes/agreements/help/index.html +52 -57
- package/app/recipes/agreements/index.html +57 -59
- package/app/recipes/analytics.reports/help/index.html +52 -57
- package/app/recipes/analytics.reports/index.html +57 -59
- package/app/recipes/assets/help/index.html +52 -57
- package/app/recipes/assets/index.html +57 -59
- package/app/recipes/billing/help/index.html +52 -57
- package/app/recipes/billing/index.html +57 -59
- package/app/recipes/chat.assistant/help/index.html +52 -57
- package/app/recipes/chat.assistant/index.html +57 -59
- package/app/recipes/comments/help/index.html +52 -57
- package/app/recipes/comments/index.html +57 -59
- package/app/recipes/commerce.customers/help/index.html +52 -57
- package/app/recipes/commerce.customers/index.html +57 -59
- package/app/recipes/commerce.estimates/help/index.html +52 -57
- package/app/recipes/commerce.estimates/index.html +57 -59
- package/app/recipes/commerce.purchases/help/index.html +52 -57
- package/app/recipes/commerce.purchases/index.html +57 -59
- package/app/recipes/commerce.sales/help/index.html +52 -57
- package/app/recipes/commerce.sales/index.html +57 -59
- package/app/recipes/commerce.vendors/help/index.html +52 -57
- package/app/recipes/commerce.vendors/index.html +57 -59
- package/app/recipes/commerce.wholesale/help/index.html +52 -57
- package/app/recipes/commerce.wholesale/index.html +57 -59
- package/app/recipes/events.calendar/help/index.html +52 -57
- package/app/recipes/events.calendar/index.html +57 -59
- package/app/recipes/expenses.tracking/help/index.html +88 -0
- package/app/recipes/expenses.tracking/index.html +92 -0
- package/app/recipes/fields.form-customization/help/index.html +52 -57
- package/app/recipes/fields.form-customization/index.html +57 -59
- package/app/recipes/ingestion/help/index.html +88 -0
- package/app/recipes/ingestion/index.html +93 -0
- package/app/recipes/integrations/help/index.html +88 -0
- package/app/recipes/integrations/index.html +92 -0
- package/app/recipes/inventory.stock/help/index.html +52 -57
- package/app/recipes/inventory.stock/index.html +57 -59
- package/app/recipes/ledgers.bookkeeping/help/index.html +52 -57
- package/app/recipes/ledgers.bookkeeping/index.html +57 -59
- package/app/recipes/messages/help/index.html +52 -57
- package/app/recipes/messages/index.html +57 -59
- package/app/recipes/products/help/index.html +52 -57
- package/app/recipes/products/index.html +57 -59
- package/app/recipes/projects.tracker/help/index.html +52 -57
- package/app/recipes/projects.tracker/index.html +57 -59
- package/app/recipes/reports.materialized/help/index.html +52 -57
- package/app/recipes/reports.materialized/index.html +57 -59
- package/app/recipes/reports.runtime/help/index.html +88 -0
- package/app/recipes/reports.runtime/index.html +92 -0
- package/app/recipes/sales.pipeline/help/index.html +52 -57
- package/app/recipes/sales.pipeline/index.html +57 -59
- package/app/recipes/tags.taxonomy/help/index.html +52 -57
- package/app/recipes/tags.taxonomy/index.html +57 -59
- package/app/recipes/team-collaboration/help/index.html +52 -57
- package/app/recipes/team-collaboration/index.html +57 -59
- package/app/recipes/timesheets.time-entries/help/index.html +88 -0
- package/app/recipes/timesheets.time-entries/index.html +92 -0
- package/app/s/custom-accounts/index.html +82 -0
- package/app/s/custom-appointments/index.html +82 -0
- package/app/s/custom-billing/index.html +47 -54
- package/app/s/custom-buying/index.html +47 -54
- package/app/s/custom-checkout/index.html +82 -0
- package/app/s/custom-classes/index.html +47 -54
- package/app/s/custom-clients/index.html +82 -0
- package/app/s/custom-events/index.html +82 -0
- package/app/s/custom-fleet/index.html +82 -0
- package/app/s/custom-giving/index.html +82 -0
- package/app/s/custom-jobs/index.html +47 -54
- package/app/s/custom-kitchen/index.html +47 -54
- package/app/s/custom-material/index.html +47 -54
- package/app/s/custom-meetings/index.html +82 -0
- package/app/s/custom-members/index.html +47 -54
- package/app/s/custom-parts/index.html +47 -54
- package/app/s/custom-rentals/index.html +82 -0
- package/app/s/custom-roastery/index.html +82 -0
- package/app/s/custom-schedule/index.html +47 -54
- package/app/s/custom-shelf/index.html +82 -0
- package/app/s/custom-shop/index.html +47 -54
- package/app/s/custom-wholesale/index.html +47 -54
- package/app/s/custom-work/index.html +82 -0
- package/app/s/custom-yard/index.html +82 -0
- package/app/s/section-access-control/index.html +47 -54
- package/app/s/section-account-security/index.html +47 -54
- package/app/s/section-accounting/index.html +47 -54
- package/app/s/section-activity/index.html +47 -54
- package/app/s/section-agreements/index.html +47 -54
- package/app/s/section-analytics/index.html +47 -54
- package/app/s/section-assets/index.html +47 -54
- package/app/s/section-billing/index.html +47 -54
- package/app/s/section-calendar/index.html +47 -54
- package/app/s/section-catalog/index.html +47 -54
- package/app/s/section-chat.assistant/index.html +47 -54
- package/app/s/section-comments/index.html +47 -54
- package/app/s/section-fields.form-customization/index.html +47 -54
- package/app/s/section-ingestion/index.html +82 -0
- package/app/s/section-integrations/index.html +82 -0
- package/app/s/section-messages/index.html +47 -54
- package/app/s/section-more/index.html +47 -54
- package/app/s/section-operations/index.html +47 -54
- package/app/s/section-projects/index.html +47 -54
- package/app/s/section-purchasing/index.html +47 -54
- package/app/s/section-reports.materialized/index.html +47 -54
- package/app/s/section-reports.runtime/index.html +82 -0
- package/app/s/section-sales/index.html +47 -54
- package/app/s/section-taxonomy/index.html +47 -54
- package/app/s/section-team/index.html +47 -54
- package/app/s/section-work/index.html +82 -0
- package/dist/ai/state.svelte.d.ts +22 -4
- package/dist/ai/state.svelte.js +78 -15
- package/dist/ai/status.js +8 -0
- package/dist/assistant/change.d.ts +14 -3
- package/dist/assistant/change.js +26 -3
- package/dist/assistant/engine.js +5 -1
- package/dist/assistant/prompt.js +7 -3
- package/dist/assistant/session.svelte.d.ts +1 -0
- package/dist/assistant/session.svelte.js +22 -4
- package/dist/catalog/catalog.json +11244 -14189
- package/dist/catalog/generate/exclusions.d.ts +8 -0
- package/dist/catalog/generate/exclusions.js +29 -0
- package/dist/catalog/generate/extract.js +29 -8
- package/dist/catalog/types.d.ts +7 -0
- package/dist/components/AdvancedStyles.svelte +138 -0
- package/dist/components/AdvancedStyles.svelte.d.ts +6 -0
- package/dist/components/AiModelsPage.svelte +40 -0
- package/dist/components/AiModelsPage.svelte.d.ts +7 -0
- package/dist/components/AiSetup.svelte +40 -8
- package/dist/components/AiStatusIcons.svelte +8 -5
- package/dist/components/AppSettings.svelte +105 -1
- package/dist/components/BrowserAssistant.svelte +25 -22
- package/dist/components/BrowserAssistant.svelte.d.ts +2 -0
- package/dist/components/ChildRecords.svelte +61 -14
- package/dist/components/ChildRecords.svelte.d.ts +1 -0
- package/dist/components/ConnectTools.svelte +5 -2
- package/dist/components/CookbooksPanel.svelte +56 -33
- package/dist/components/CopyButton.svelte +65 -0
- package/dist/components/CopyButton.svelte.d.ts +24 -0
- package/dist/components/ExportPanel.svelte +292 -57
- package/dist/components/ExportPanel.svelte.d.ts +10 -1
- package/dist/components/FeatureCard.svelte +21 -10
- package/dist/components/FeaturesPanel.svelte +4 -1
- package/dist/components/FieldInput.svelte +6 -3
- package/dist/components/FieldMapForm.svelte +6 -10
- package/dist/components/FieldMapForm.svelte.d.ts +1 -0
- package/dist/components/FormWorkspace.svelte +80 -9
- package/dist/components/FormWorkspace.svelte.d.ts +1 -0
- package/dist/components/HeaderIconLink.svelte +86 -0
- package/dist/components/HeaderIconLink.svelte.d.ts +14 -0
- package/dist/components/HelpView.svelte +3 -0
- package/dist/components/ModelOptions.svelte +13 -2
- package/dist/components/ModelPage.svelte +33 -5
- package/dist/components/ModelPage.svelte.d.ts +4 -0
- package/dist/components/ModelWorkspace.svelte +148 -50
- package/dist/components/ModelWorkspace.svelte.d.ts +4 -0
- package/dist/components/PackagePage.svelte +96 -0
- package/dist/components/PackagePage.svelte.d.ts +9 -0
- package/dist/components/ProductMedia.svelte +95 -0
- package/dist/components/ProductMedia.svelte.d.ts +10 -0
- package/dist/components/RecipeCards.svelte +13 -1
- package/dist/components/RecipeHelp.svelte +3 -0
- package/dist/components/RecipeOptions.svelte +13 -1
- package/dist/components/RecordFeatures.svelte +22 -8
- package/dist/components/RecordView.svelte +354 -0
- package/dist/components/RecordView.svelte.d.ts +14 -0
- package/dist/components/RelationField.svelte +5 -2
- package/dist/components/SectionActions.svelte +8 -5
- package/dist/components/SectionHeading.svelte +63 -0
- package/dist/components/SectionHeading.svelte.d.ts +11 -0
- package/dist/components/SectionIcons.svelte +15 -3
- package/dist/components/SectionOverview.svelte +33 -3
- package/dist/components/SectionOverview.svelte.d.ts +4 -0
- package/dist/components/SectionPage.svelte +25 -165
- package/dist/components/SectionView.svelte +172 -0
- package/dist/components/SectionView.svelte.d.ts +18 -0
- package/dist/components/SettingsPanel.svelte +3 -9
- package/dist/components/SettingsPanel.svelte.d.ts +1 -5
- package/dist/components/ThemeBridge.svelte +80 -4
- package/dist/components/ThemeBridge.svelte.d.ts +5 -1
- package/dist/components/ThemeSection.svelte +208 -117
- package/dist/components/ThemeSection.svelte.d.ts +3 -7
- package/dist/components/VariantGridForm.svelte +9 -13
- package/dist/components/VariantGridForm.svelte.d.ts +1 -0
- package/dist/components/VoiceTyping.svelte +3 -0
- package/dist/cookbook/describe.d.ts +29 -0
- package/dist/cookbook/describe.js +164 -0
- package/dist/cookbook/file.d.ts +6 -0
- package/dist/cookbook/file.js +18 -4
- package/dist/cookbook/prompt.d.ts +49 -0
- package/dist/cookbook/prompt.js +100 -0
- package/dist/cookbook/store.svelte.d.ts +13 -0
- package/dist/cookbook/store.svelte.js +36 -8
- package/dist/core/app.d.ts +33 -8
- package/dist/core/app.js +112 -8
- package/dist/core/prompt.js +10 -1
- package/dist/core/reply.d.ts +6 -1
- package/dist/data/children.d.ts +50 -6
- package/dist/data/children.js +146 -16
- package/dist/data/derived.d.ts +37 -29
- package/dist/data/derived.js +49 -30
- package/dist/data/display.d.ts +21 -8
- package/dist/data/display.js +74 -11
- package/dist/data/fakes.d.ts +48 -9
- package/dist/data/fakes.js +146 -22
- package/dist/data/labels.d.ts +7 -2
- package/dist/data/labels.js +12 -2
- package/dist/data/list-sort.d.ts +8 -0
- package/dist/data/list-sort.js +45 -0
- package/dist/data/money.d.ts +227 -0
- package/dist/data/money.js +413 -0
- package/dist/data/packs.d.ts +13 -0
- package/dist/data/packs.js +1224 -0
- package/dist/data/planner-source.js +123 -3
- package/dist/data/source.d.ts +13 -2
- package/dist/data/source.js +274 -40
- package/dist/features/palette.d.ts +2 -0
- package/dist/features/palette.js +1 -1
- package/dist/forms/stock.d.ts +1 -1
- package/dist/forms/stock.js +3 -1
- package/dist/index.d.ts +8 -3
- package/dist/index.js +6 -1
- package/dist/inference/byo.svelte.d.ts +8 -4
- package/dist/inference/byo.svelte.js +36 -8
- package/dist/inference/config.d.ts +12 -5
- package/dist/inference/config.js +96 -40
- package/dist/inference/openai.js +5 -0
- package/dist/kitchen/LiveKitchenBridge.svelte +73 -0
- package/dist/kitchen/LiveKitchenBridge.svelte.d.ts +8 -0
- package/dist/kitchen/client.js +10 -4
- package/dist/kitchen/live.d.ts +7 -0
- package/dist/kitchen/live.js +51 -0
- package/dist/library/icons.js +34 -0
- package/dist/library/library.json +1546 -15
- package/dist/library/pending.json +5 -0
- package/dist/library/types.d.ts +4 -0
- package/dist/motion/tokens.d.ts +6 -0
- package/dist/motion/tokens.js +32 -0
- package/dist/motion/view-transition.d.ts +13 -0
- package/dist/motion/view-transition.js +17 -0
- package/dist/overviews/definitions.d.ts +41 -2
- package/dist/overviews/definitions.js +111 -4
- package/dist/overviews/models.d.ts +10 -0
- package/dist/overviews/models.js +19 -0
- package/dist/overviews/registry.d.ts +92 -5
- package/dist/overviews/registry.js +468 -58
- package/dist/overviews/validate.js +2 -2
- package/dist/planner/Planner.svelte +374 -166
- package/dist/planner/PlannerControls.svelte +255 -0
- package/dist/planner/PlannerControls.svelte.d.ts +17 -0
- package/dist/planner/PlannerLifecycle.svelte +73 -0
- package/dist/planner/PlannerLifecycle.svelte.d.ts +9 -0
- package/dist/planner/app.svelte.d.ts +12 -2
- package/dist/planner/app.svelte.js +13 -3
- package/dist/planner/assistant.js +21 -3
- package/dist/planner/commands/adapter.js +9 -2
- package/dist/planner/commands/types.d.ts +1 -1
- package/dist/planner/commands/types.js +1 -0
- package/dist/planner/header-icons.d.ts +12 -0
- package/dist/planner/header-icons.js +12 -0
- package/dist/planner/host/HostPlanner.svelte +70 -0
- package/dist/planner/host/HostPlanner.svelte.d.ts +17 -0
- package/dist/planner/host/session.svelte.d.ts +28 -0
- package/dist/planner/host/session.svelte.js +186 -0
- package/dist/planner/routes.d.ts +49 -0
- package/dist/planner/routes.js +64 -0
- package/dist/planner/shell.d.ts +40 -0
- package/dist/planner/shell.js +56 -0
- package/dist/planner/tab.svelte.d.ts +6 -3
- package/dist/planner/tab.svelte.js +11 -4
- package/dist/planner/title.d.ts +15 -0
- package/dist/planner/title.js +21 -0
- package/dist/planner/title.svelte.d.ts +6 -0
- package/dist/planner/title.svelte.js +11 -0
- package/dist/planner/types.d.ts +39 -7
- package/dist/products/media.d.ts +20 -0
- package/dist/products/media.js +65 -0
- package/dist/recipes/help/descriptions.json +1 -3
- package/dist/recipes/index.d.ts +2 -0
- package/dist/recipes/index.js +6 -0
- package/dist/recipes/plumbing.d.ts +35 -1
- package/dist/recipes/plumbing.js +74 -0
- package/dist/screens/definition.d.ts +35 -0
- package/dist/screens/definition.js +132 -0
- package/dist/screens/relations.d.ts +17 -0
- package/dist/screens/relations.js +98 -0
- package/dist/screens/totals.d.ts +37 -0
- package/dist/screens/totals.js +65 -0
- package/dist/sections/info.d.ts +1 -1
- package/dist/sections/info.js +2 -2
- package/dist/settings/app-settings.d.ts +17 -1
- package/dist/settings/app-settings.js +40 -3
- package/dist/smrt-version.d.ts +2 -0
- package/dist/smrt-version.js +4 -0
- package/dist/styles/planner-forms.css +53 -0
- package/dist/styles/planner-lists.css +43 -0
- package/dist/theme/css-highlight.d.ts +6 -0
- package/dist/theme/css-highlight.js +34 -0
- package/dist/theme/custom-css.svelte.d.ts +34 -0
- package/dist/theme/custom-css.svelte.js +246 -0
- package/dist/theme/runtime.js +25 -5
- package/dist/theme/theme.d.ts +26 -3
- package/dist/theme/theme.js +70 -2
- package/dist/upstream/overlay.d.ts +14 -5
- package/dist/upstream/overlay.js +20 -2
- package/package.json +13 -6
- package/app/_app/immutable/assets/0.B5zXkXe_.css +0 -1
- package/app/_app/immutable/assets/10.hpcnxvK1.css +0 -1
- package/app/_app/immutable/assets/11.D7zoXfVV.css +0 -1
- package/app/_app/immutable/assets/12.CPobm1ED.css +0 -1
- package/app/_app/immutable/assets/2.CyaWdRdI.css +0 -1
- package/app/_app/immutable/assets/3.BlPQOes8.css +0 -1
- package/app/_app/immutable/assets/8.2gQeKBp_.css +0 -1
- package/app/_app/immutable/assets/9.HOPT4xtg.css +0 -1
- package/app/_app/immutable/assets/AiSetup.Cb22AigN.css +0 -1
- package/app/_app/immutable/assets/Button.DkP0qkG9.css +0 -1
- package/app/_app/immutable/assets/ConnectTools.BgIJOOGW.css +0 -1
- package/app/_app/immutable/assets/FieldMapForm.BCU-4pO4.css +0 -1
- package/app/_app/immutable/assets/ModelPage.Dd3LcMta.css +0 -1
- package/app/_app/immutable/assets/SectionActions.CTkVuNMF.css +0 -1
- package/app/_app/immutable/assets/SectionIcons.5Udq9vN-.css +0 -1
- package/app/_app/immutable/assets/SegmentedControl.B8SrQacd.css +0 -1
- package/app/_app/immutable/assets/dist.C5nHBk_O.css +0 -1
- package/app/_app/immutable/assets/feedback.BVKAwFck.css +0 -1
- package/app/_app/immutable/assets/forms.BChZ2RWM.css +0 -1
- package/app/_app/immutable/assets/percent.LH0z-ozZ.css +0 -1
- package/app/_app/immutable/assets/store.CGDwHkkF.css +0 -1
- package/app/_app/immutable/assets/ui.B1A1Zl2p.css +0 -1
- package/app/_app/immutable/assets/workspace.BIMkuZDb.css +0 -1
- package/app/_app/immutable/chunks/1okeBSoq.js +0 -1
- package/app/_app/immutable/chunks/B32EWqI8.js +0 -9
- package/app/_app/immutable/chunks/B4Kevpe0.js +0 -1
- package/app/_app/immutable/chunks/BKwRT_1p.js +0 -1
- package/app/_app/immutable/chunks/BS4h9ES-.js +0 -1
- package/app/_app/immutable/chunks/BYde9M_U.js +0 -1
- package/app/_app/immutable/chunks/CMhpRMKg.js +0 -1
- package/app/_app/immutable/chunks/CPRHZZeW.js +0 -1
- package/app/_app/immutable/chunks/CRQ1Pmzr.js +0 -1
- package/app/_app/immutable/chunks/CV-2zt0K.js +0 -2
- package/app/_app/immutable/chunks/CWtfVMDz.js +0 -1
- package/app/_app/immutable/chunks/Chyo8rdT.js +0 -3
- package/app/_app/immutable/chunks/CmmuWmp6.js +0 -2
- package/app/_app/immutable/chunks/CrFNLK0f.js +0 -1
- package/app/_app/immutable/chunks/CygC84VT.js +0 -2
- package/app/_app/immutable/chunks/D0VgZnk1.js +0 -1
- package/app/_app/immutable/chunks/DD7gpKb2.js +0 -1
- package/app/_app/immutable/chunks/DJtH-lRi.js +0 -3
- package/app/_app/immutable/chunks/DNRgqfTx.js +0 -1
- package/app/_app/immutable/chunks/DVRKjN-E.js +0 -1
- package/app/_app/immutable/chunks/D_J_XtJy.js +0 -846
- package/app/_app/immutable/chunks/Dp9GVO-9.js +0 -1
- package/app/_app/immutable/chunks/DqcD-WtP.js +0 -1
- package/app/_app/immutable/chunks/OJ_lLTHH.js +0 -1
- package/app/_app/immutable/chunks/QukgIHDX.js +0 -1
- package/app/_app/immutable/chunks/WxSPP8QW.js +0 -4
- package/app/_app/immutable/chunks/leQCwW2d.js +0 -1
- package/app/_app/immutable/chunks/p6bgzXiY.js +0 -1
- package/app/_app/immutable/chunks/ufuM4XBq.js +0 -33
- package/app/_app/immutable/entry/app.D5JJain6.js +0 -2
- package/app/_app/immutable/entry/start.CH9DJLgI.js +0 -1
- package/app/_app/immutable/nodes/0.CL1MxOva.js +0 -10
- package/app/_app/immutable/nodes/1.BO731RRg.js +0 -1
- package/app/_app/immutable/nodes/10.1nQxyH9H.js +0 -4
- package/app/_app/immutable/nodes/11.Cw0JnQF3.js +0 -1
- package/app/_app/immutable/nodes/12.BmZyLHbM.js +0 -1
- package/app/_app/immutable/nodes/2.BEw046av.js +0 -17
- package/app/_app/immutable/nodes/3.DvwpTAQA.js +0 -1
- package/app/_app/immutable/nodes/4.qrT4bnmS.js +0 -1
- package/app/_app/immutable/nodes/5.DDLa2uhV.js +0 -1
- package/app/_app/immutable/nodes/6.DN0QTY6z.js +0 -1
- package/app/_app/immutable/nodes/7.C_8N82Wq.js +0 -1
- package/app/_app/immutable/nodes/8.D2Mszsua.js +0 -3
- package/app/_app/immutable/nodes/9.CLYsywul.js +0 -1
- package/app/m/content/Contents/index.html +0 -96
- package/app/m/preferences/UiPreferenceRecord/index.html +0 -96
- package/app/m/users/AccessRequest/index.html +0 -96
- package/app/m/users/ResourceGrant/index.html +0 -96
- package/app/m/users/UsersCliAuthRequest/index.html +0 -96
- package/app/m/users/UsersMagicLinkToken/index.html +0 -96
package/dist/index.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* smrt planner as a package: mount
|
|
2
|
+
* smrt planner as a package: mount `Planner` for the full app shell, or
|
|
3
|
+
* `PlannerControls` inside a host-owned shell,
|
|
3
4
|
* drive it with the typed command set (`./commands` has no UI in it), and read
|
|
4
5
|
* its plan as a compact snapshot.
|
|
5
6
|
*
|
|
@@ -12,5 +13,9 @@ export { parseKitchenConfig, sendToKitchen, } from "./kitchen/client.js";
|
|
|
12
13
|
export { KITCHEN_FRAGMENT_KEY, readKitchenFragment, } from "./kitchen/fragment.js";
|
|
13
14
|
export { createPlannerAssistant, } from "./planner/assistant.js";
|
|
14
15
|
export * from "./planner/commands/index.js";
|
|
16
|
+
export { default as HostPlanner } from './planner/host/HostPlanner.svelte';
|
|
17
|
+
export { createHostSession, } from "./planner/host/session.svelte.js";
|
|
15
18
|
export { plannerController } from "./planner/instance.js";
|
|
16
19
|
export { default as Planner } from './planner/Planner.svelte';
|
|
20
|
+
export { default as PlannerControls } from './planner/PlannerControls.svelte';
|
|
21
|
+
export { PLANNER_SHELL_EDGE_TOGGLES, PLANNER_SHELL_PANEL_DEFAULTS, plannerShellProps, } from "./planner/shell.js";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { ChatModel } from '../assistant/transport.ts';
|
|
2
|
-
import type { ByoPresetDefinition } from './config.ts';
|
|
2
|
+
import type { ByoPresetDefinition, CredentialPersistence } from './config.ts';
|
|
3
3
|
import { type ConnectionResult } from './openai.ts';
|
|
4
4
|
/** Choices (not the key): which endpoint, its address and model, and whether it is in use. */
|
|
5
5
|
export declare const BYO_PREFS_KEY = "smrt-planner:inference:v1";
|
|
@@ -24,6 +24,8 @@ export declare function loadByoKeys(storage: Storage | null): Record<string, Byo
|
|
|
24
24
|
export type ByoTestStatus = 'idle' | 'testing' | 'ok' | 'failed';
|
|
25
25
|
export interface ByoOptions {
|
|
26
26
|
storage: Storage | null;
|
|
27
|
+
/** Credentials default to local storage for compatibility; hosted apps use memory. */
|
|
28
|
+
credentialPersistence?: CredentialPersistence;
|
|
27
29
|
/** The config's `byo.presets`; default all built-ins. */
|
|
28
30
|
presets?: readonly (string | ByoPresetDefinition)[];
|
|
29
31
|
fetch?: typeof fetch;
|
|
@@ -33,8 +35,9 @@ export interface ByoOptions {
|
|
|
33
35
|
/**
|
|
34
36
|
* The visitor's own OpenAI-compatible endpoint: the preset they picked, its
|
|
35
37
|
* address, model and key, a connection test, and whether the assistant uses
|
|
36
|
-
* it. The key lives
|
|
37
|
-
*
|
|
38
|
+
* it. The key lives in the configured credential store (tab memory for hosted
|
|
39
|
+
* policies, localStorage for the compatible standalone default) and is only
|
|
40
|
+
* ever sent as the Authorization header to the chosen address.
|
|
38
41
|
*/
|
|
39
42
|
export declare class ByoModel {
|
|
40
43
|
readonly presets: ByoPresetDefinition[];
|
|
@@ -45,6 +48,7 @@ export declare class ByoModel {
|
|
|
45
48
|
testStatus: ByoTestStatus;
|
|
46
49
|
testMessage: string;
|
|
47
50
|
private readonly options;
|
|
51
|
+
private readonly credentialStorage;
|
|
48
52
|
constructor(options: ByoOptions);
|
|
49
53
|
get preset(): ByoPresetDefinition | undefined;
|
|
50
54
|
get baseUrl(): string;
|
|
@@ -82,5 +86,5 @@ export declare class ByoModel {
|
|
|
82
86
|
* (a mounted `Planner` in byo mode has no AI page of its own). Null when none
|
|
83
87
|
* is connected or what was saved is incomplete.
|
|
84
88
|
*/
|
|
85
|
-
export declare function savedByoChat(storage: Storage | null, presets?: readonly (string | ByoPresetDefinition)[], fetcher?: typeof fetch): ChatModel | null;
|
|
89
|
+
export declare function savedByoChat(storage: Storage | null, presets?: readonly (string | ByoPresetDefinition)[], fetcher?: typeof fetch, credentialPersistence?: CredentialPersistence): ChatModel | null;
|
|
86
90
|
export {};
|
|
@@ -17,15 +17,22 @@ export function loadByoPrefs(storage) {
|
|
|
17
17
|
if (typeof value.preset === 'string')
|
|
18
18
|
prefs.preset = value.preset;
|
|
19
19
|
prefs.active = value.active === true;
|
|
20
|
+
let sanitized = false;
|
|
20
21
|
if (isObject(value.entries)) {
|
|
21
22
|
for (const [id, entry] of Object.entries(value.entries)) {
|
|
22
23
|
if (isObject(entry) &&
|
|
23
24
|
typeof entry.baseUrl === 'string' &&
|
|
24
25
|
typeof entry.model === 'string') {
|
|
25
|
-
|
|
26
|
+
const baseUrl = normalizeBaseUrl(entry.baseUrl) ?? '';
|
|
27
|
+
sanitized ||= baseUrl !== entry.baseUrl;
|
|
28
|
+
prefs.entries[id] = { baseUrl, model: entry.model };
|
|
26
29
|
}
|
|
27
30
|
}
|
|
28
31
|
}
|
|
32
|
+
if (sanitized) {
|
|
33
|
+
prefs.active = false;
|
|
34
|
+
storage?.setItem(BYO_PREFS_KEY, JSON.stringify(prefs));
|
|
35
|
+
}
|
|
29
36
|
}
|
|
30
37
|
catch {
|
|
31
38
|
// Unreadable or unavailable: start empty.
|
|
@@ -59,8 +66,9 @@ export function loadByoKeys(storage) {
|
|
|
59
66
|
/**
|
|
60
67
|
* The visitor's own OpenAI-compatible endpoint: the preset they picked, its
|
|
61
68
|
* address, model and key, a connection test, and whether the assistant uses
|
|
62
|
-
* it. The key lives
|
|
63
|
-
*
|
|
69
|
+
* it. The key lives in the configured credential store (tab memory for hosted
|
|
70
|
+
* policies, localStorage for the compatible standalone default) and is only
|
|
71
|
+
* ever sent as the Authorization header to the chosen address.
|
|
64
72
|
*/
|
|
65
73
|
export class ByoModel {
|
|
66
74
|
presets;
|
|
@@ -71,11 +79,24 @@ export class ByoModel {
|
|
|
71
79
|
testStatus = $state('idle');
|
|
72
80
|
testMessage = $state('');
|
|
73
81
|
options;
|
|
82
|
+
credentialStorage;
|
|
74
83
|
constructor(options) {
|
|
75
84
|
this.options = options;
|
|
85
|
+
this.credentialStorage =
|
|
86
|
+
options.credentialPersistence === 'memory' ? null : options.storage;
|
|
87
|
+
if (options.credentialPersistence === 'memory') {
|
|
88
|
+
// A hosted memory-only policy also removes a key an older local policy
|
|
89
|
+
// may have left on this origin. Endpoint/model preferences stay put.
|
|
90
|
+
try {
|
|
91
|
+
options.storage?.removeItem(BYO_KEYS_KEY);
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
// Storage can be unavailable; memory-only behavior still holds.
|
|
95
|
+
}
|
|
96
|
+
}
|
|
76
97
|
this.presets = resolvePresets(options.presets);
|
|
77
98
|
const prefs = loadByoPrefs(options.storage);
|
|
78
|
-
this.keys = loadByoKeys(
|
|
99
|
+
this.keys = loadByoKeys(this.credentialStorage);
|
|
79
100
|
this.entries = prefs.entries;
|
|
80
101
|
this.presetId = this.presets.some((p) => p.id === prefs.preset)
|
|
81
102
|
? prefs.preset
|
|
@@ -226,13 +247,20 @@ export class ByoModel {
|
|
|
226
247
|
}
|
|
227
248
|
save() {
|
|
228
249
|
try {
|
|
250
|
+
const entries = Object.fromEntries(Object.entries(this.entries).map(([id, entry]) => [
|
|
251
|
+
id,
|
|
252
|
+
{
|
|
253
|
+
baseUrl: normalizeBaseUrl(entry.baseUrl) ?? '',
|
|
254
|
+
model: entry.model,
|
|
255
|
+
},
|
|
256
|
+
]));
|
|
229
257
|
const prefs = {
|
|
230
258
|
preset: this.presetId,
|
|
231
259
|
active: this.active,
|
|
232
|
-
entries
|
|
260
|
+
entries,
|
|
233
261
|
};
|
|
234
262
|
this.options.storage?.setItem(BYO_PREFS_KEY, JSON.stringify(prefs));
|
|
235
|
-
this.
|
|
263
|
+
this.credentialStorage?.setItem(BYO_KEYS_KEY, JSON.stringify(this.keys));
|
|
236
264
|
}
|
|
237
265
|
catch {
|
|
238
266
|
// Not saved; the choice still holds for this visit.
|
|
@@ -244,7 +272,7 @@ export class ByoModel {
|
|
|
244
272
|
* (a mounted `Planner` in byo mode has no AI page of its own). Null when none
|
|
245
273
|
* is connected or what was saved is incomplete.
|
|
246
274
|
*/
|
|
247
|
-
export function savedByoChat(storage, presets, fetcher) {
|
|
275
|
+
export function savedByoChat(storage, presets, fetcher, credentialPersistence = 'local') {
|
|
248
276
|
const prefs = loadByoPrefs(storage);
|
|
249
277
|
if (!prefs.active)
|
|
250
278
|
return null;
|
|
@@ -252,7 +280,7 @@ export function savedByoChat(storage, presets, fetcher) {
|
|
|
252
280
|
const entry = prefs.entries[prefs.preset];
|
|
253
281
|
const baseUrl = normalizeBaseUrl(entry?.baseUrl ?? preset?.baseUrl ?? '');
|
|
254
282
|
const model = (entry?.model ?? preset?.model ?? '').trim();
|
|
255
|
-
const saved = loadByoKeys(storage)[prefs.preset];
|
|
283
|
+
const saved = loadByoKeys(credentialPersistence === 'memory' ? null : storage)[prefs.preset];
|
|
256
284
|
const key = saved && saved.origin === originOf(baseUrl ?? '') ? saved.key : '';
|
|
257
285
|
if (!preset || !baseUrl || !model)
|
|
258
286
|
return null;
|
|
@@ -9,7 +9,9 @@ import { type KitchenEndpoint } from '../kitchen/client.ts';
|
|
|
9
9
|
* - `byo`: the visitor's own OpenAI-compatible endpoint (Ollama, OpenRouter,
|
|
10
10
|
* OpenAI, custom), configured on the AI page.
|
|
11
11
|
*/
|
|
12
|
-
export type InferenceMode = 'browser' | 'host' | 'byo';
|
|
12
|
+
export type InferenceMode = 'manual' | 'browser' | 'host' | 'byo';
|
|
13
|
+
/** Where BYO provider credentials may live. Preferences are always separate. */
|
|
14
|
+
export type CredentialPersistence = 'local' | 'memory';
|
|
13
15
|
export declare const INFERENCE_MODES: readonly InferenceMode[];
|
|
14
16
|
/** A bring-your-own endpoint the AI page offers. */
|
|
15
17
|
export interface ByoPresetDefinition {
|
|
@@ -28,6 +30,10 @@ export interface ByoPresetDefinition {
|
|
|
28
30
|
}
|
|
29
31
|
export interface InferenceConfig {
|
|
30
32
|
mode: InferenceMode;
|
|
33
|
+
/** Other modes the visitor may deliberately select, in display order. */
|
|
34
|
+
alternatives?: InferenceMode[];
|
|
35
|
+
/** Defaults to `local` for compatibility. Hosted apps should use `memory`. */
|
|
36
|
+
credentialPersistence?: CredentialPersistence;
|
|
31
37
|
host?: {
|
|
32
38
|
endpoint: string;
|
|
33
39
|
};
|
|
@@ -41,21 +47,22 @@ export interface InferenceConfig {
|
|
|
41
47
|
};
|
|
42
48
|
}
|
|
43
49
|
export declare const DEFAULT_INFERENCE: InferenceConfig;
|
|
50
|
+
export declare const MANUAL_INFERENCE: InferenceConfig;
|
|
44
51
|
/** The file name, served at `${base}/planner.config.json`. */
|
|
45
52
|
export declare const CONFIG_FILE = "planner.config.json";
|
|
46
53
|
export interface ConfigResult {
|
|
47
54
|
config: InferenceConfig;
|
|
48
55
|
/** The `kitchen` block (`smrt kitchen`), when the file has a usable one. */
|
|
49
56
|
kitchen?: KitchenEndpoint;
|
|
50
|
-
/** Shown
|
|
57
|
+
/** Shown when a present config was unusable and inference was disabled. */
|
|
51
58
|
notice?: string;
|
|
52
59
|
}
|
|
53
60
|
/** http(s) only; a path-only endpoint (`/api/planner/chat`) is the host's own origin. */
|
|
54
61
|
export declare function isUsableEndpoint(value: unknown): value is string;
|
|
55
62
|
/**
|
|
56
|
-
* Validate a parsed config.
|
|
57
|
-
*
|
|
58
|
-
* notice
|
|
63
|
+
* Validate a parsed config. A missing config keeps the standalone browser
|
|
64
|
+
* default. A present but invalid config fails closed to manual planning with a
|
|
65
|
+
* visible notice; it never selects a provider or downloads a model.
|
|
59
66
|
*/
|
|
60
67
|
export declare function validateInferenceConfig(value: unknown): ConfigResult;
|
|
61
68
|
/** Parse the file's text. */
|
package/dist/inference/config.js
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { parseKitchenConfig } from "../kitchen/client.js";
|
|
2
2
|
export const INFERENCE_MODES = [
|
|
3
|
+
'manual',
|
|
3
4
|
'browser',
|
|
4
5
|
'host',
|
|
5
6
|
'byo',
|
|
6
7
|
];
|
|
7
8
|
export const DEFAULT_INFERENCE = { mode: 'browser' };
|
|
9
|
+
export const MANUAL_INFERENCE = { mode: 'manual' };
|
|
8
10
|
/** The file name, served at `${base}/planner.config.json`. */
|
|
9
11
|
export const CONFIG_FILE = 'planner.config.json';
|
|
10
12
|
const isObject = (v) => !!v && typeof v === 'object' && !Array.isArray(v);
|
|
@@ -15,11 +17,22 @@ export function isUsableEndpoint(value) {
|
|
|
15
17
|
const text = value.trim();
|
|
16
18
|
if (!text)
|
|
17
19
|
return false;
|
|
18
|
-
if (text.startsWith('/') && !text.startsWith('//'))
|
|
19
|
-
return true;
|
|
20
20
|
try {
|
|
21
|
-
const
|
|
22
|
-
|
|
21
|
+
const relative = text.startsWith('/') && !text.startsWith('//');
|
|
22
|
+
const url = new URL(text, relative ? 'https://planner.invalid' : undefined);
|
|
23
|
+
if (!relative && url.protocol !== 'http:' && url.protocol !== 'https:') {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
if (url.username || url.password)
|
|
27
|
+
return false;
|
|
28
|
+
if (url.hash)
|
|
29
|
+
return false;
|
|
30
|
+
for (const name of url.searchParams.keys()) {
|
|
31
|
+
if (/^(?:api[-_]?key|key|token|authorization|secret|password)$/i.test(name)) {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return true;
|
|
23
36
|
}
|
|
24
37
|
catch {
|
|
25
38
|
return false;
|
|
@@ -48,13 +61,52 @@ function parsePresetDefinition(value) {
|
|
|
48
61
|
};
|
|
49
62
|
}
|
|
50
63
|
const fallback = (why) => ({
|
|
51
|
-
config:
|
|
52
|
-
notice: `The assistant settings could not be used (${why}), so
|
|
64
|
+
config: MANUAL_INFERENCE,
|
|
65
|
+
notice: `The assistant settings could not be used (${why}), so inference is off. The planner still works manually.`,
|
|
53
66
|
});
|
|
67
|
+
function parseAlternatives(value, initial) {
|
|
68
|
+
if (value === undefined)
|
|
69
|
+
return [];
|
|
70
|
+
if (!Array.isArray(value) || value.length === 0)
|
|
71
|
+
return null;
|
|
72
|
+
const modes = [];
|
|
73
|
+
for (const entry of value) {
|
|
74
|
+
if (typeof entry !== 'string' ||
|
|
75
|
+
!INFERENCE_MODES.includes(entry) ||
|
|
76
|
+
entry === initial ||
|
|
77
|
+
modes.includes(entry)) {
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
modes.push(entry);
|
|
81
|
+
}
|
|
82
|
+
return modes;
|
|
83
|
+
}
|
|
84
|
+
function parseByo(value) {
|
|
85
|
+
if (value === undefined)
|
|
86
|
+
return {};
|
|
87
|
+
if (!isObject(value))
|
|
88
|
+
return null;
|
|
89
|
+
if (value.presets === undefined)
|
|
90
|
+
return {};
|
|
91
|
+
if (!Array.isArray(value.presets) || value.presets.length === 0)
|
|
92
|
+
return null;
|
|
93
|
+
const presets = [];
|
|
94
|
+
for (const entry of value.presets) {
|
|
95
|
+
if (typeof entry === 'string' && entry.trim()) {
|
|
96
|
+
presets.push(entry.trim());
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
const definition = parsePresetDefinition(entry);
|
|
100
|
+
if (!definition)
|
|
101
|
+
return null;
|
|
102
|
+
presets.push(definition);
|
|
103
|
+
}
|
|
104
|
+
return { presets };
|
|
105
|
+
}
|
|
54
106
|
/**
|
|
55
|
-
* Validate a parsed config.
|
|
56
|
-
*
|
|
57
|
-
* notice
|
|
107
|
+
* Validate a parsed config. A missing config keeps the standalone browser
|
|
108
|
+
* default. A present but invalid config fails closed to manual planning with a
|
|
109
|
+
* visible notice; it never selects a provider or downloads a model.
|
|
58
110
|
*/
|
|
59
111
|
export function validateInferenceConfig(value) {
|
|
60
112
|
if (!isObject(value))
|
|
@@ -65,43 +117,47 @@ export function validateInferenceConfig(value) {
|
|
|
65
117
|
if (!isObject(inference))
|
|
66
118
|
return fallback('"inference" is not an object');
|
|
67
119
|
const mode = inference.mode;
|
|
68
|
-
if (mode === undefined
|
|
120
|
+
if (mode === undefined)
|
|
69
121
|
return { config: DEFAULT_INFERENCE };
|
|
122
|
+
if (!INFERENCE_MODES.includes(mode)) {
|
|
123
|
+
return fallback(`unknown mode "${String(mode)}"`);
|
|
124
|
+
}
|
|
125
|
+
const selected = mode;
|
|
126
|
+
const alternatives = parseAlternatives(inference.alternatives, selected);
|
|
127
|
+
if (!alternatives) {
|
|
128
|
+
return fallback('alternatives must be unique supported modes other than mode');
|
|
129
|
+
}
|
|
130
|
+
const credentialPersistence = inference.credentialPersistence;
|
|
131
|
+
if (credentialPersistence !== undefined &&
|
|
132
|
+
credentialPersistence !== 'local' &&
|
|
133
|
+
credentialPersistence !== 'memory') {
|
|
134
|
+
return fallback('credentialPersistence must be "local" or "memory"');
|
|
70
135
|
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
136
|
+
const modes = [selected, ...alternatives];
|
|
137
|
+
let host;
|
|
138
|
+
if (modes.includes('host')) {
|
|
139
|
+
const configuredHost = inference.host;
|
|
140
|
+
if (!isObject(configuredHost) ||
|
|
141
|
+
!isUsableEndpoint(configuredHost.endpoint)) {
|
|
74
142
|
return fallback('host mode needs host.endpoint, an http(s) URL or path');
|
|
75
143
|
}
|
|
76
|
-
|
|
77
|
-
config: { mode: 'host', host: { endpoint: host.endpoint.trim() } },
|
|
78
|
-
};
|
|
144
|
+
host = { endpoint: configuredHost.endpoint.trim() };
|
|
79
145
|
}
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
return fallback('"byo" is not an object');
|
|
86
|
-
if (byo.presets === undefined)
|
|
87
|
-
return { config: { mode: 'byo', byo: {} } };
|
|
88
|
-
if (!Array.isArray(byo.presets) || byo.presets.length === 0) {
|
|
89
|
-
return fallback('byo.presets must be a non-empty list');
|
|
90
|
-
}
|
|
91
|
-
const presets = [];
|
|
92
|
-
for (const entry of byo.presets) {
|
|
93
|
-
if (typeof entry === 'string' && entry.trim()) {
|
|
94
|
-
presets.push(entry.trim());
|
|
95
|
-
continue;
|
|
96
|
-
}
|
|
97
|
-
const definition = parsePresetDefinition(entry);
|
|
98
|
-
if (!definition)
|
|
99
|
-
return fallback('a byo preset is malformed');
|
|
100
|
-
presets.push(definition);
|
|
101
|
-
}
|
|
102
|
-
return { config: { mode: 'byo', byo: { presets } } };
|
|
146
|
+
let byo;
|
|
147
|
+
if (modes.includes('byo')) {
|
|
148
|
+
byo = parseByo(inference.byo) ?? undefined;
|
|
149
|
+
if (!byo)
|
|
150
|
+
return fallback('byo.presets must be a non-empty valid list');
|
|
103
151
|
}
|
|
104
|
-
return
|
|
152
|
+
return {
|
|
153
|
+
config: {
|
|
154
|
+
mode: selected,
|
|
155
|
+
...(alternatives.length ? { alternatives } : {}),
|
|
156
|
+
...(credentialPersistence ? { credentialPersistence } : {}),
|
|
157
|
+
...(host ? { host } : {}),
|
|
158
|
+
...(byo ? { byo } : {}),
|
|
159
|
+
},
|
|
160
|
+
};
|
|
105
161
|
}
|
|
106
162
|
/** Parse the file's text. */
|
|
107
163
|
export function parseInferenceConfig(text) {
|
package/dist/inference/openai.js
CHANGED
|
@@ -9,6 +9,11 @@ export function normalizeBaseUrl(value) {
|
|
|
9
9
|
// Credentials in a URL would travel in the clear as part of it.
|
|
10
10
|
if (url.username || url.password)
|
|
11
11
|
return null;
|
|
12
|
+
for (const name of url.searchParams.keys()) {
|
|
13
|
+
if (/^(?:api[-_]?key|key|token|authorization|secret|password)$/i.test(name)) {
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
12
17
|
return `${url.origin}${url.pathname.replace(/\/+$/, '')}`;
|
|
13
18
|
}
|
|
14
19
|
catch {
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { onMount } from 'svelte';
|
|
3
|
+
import { createHostSession } from '../planner/host/session.svelte.js';
|
|
4
|
+
import { callLiveKitchen, type LiveKitchenBinding } from './live.js';
|
|
5
|
+
|
|
6
|
+
let {
|
|
7
|
+
binding,
|
|
8
|
+
onlock,
|
|
9
|
+
}: { binding: LiveKitchenBinding; onlock?: (locked: boolean) => void } =
|
|
10
|
+
$props();
|
|
11
|
+
const session = createHostSession((name, args) =>
|
|
12
|
+
callLiveKitchen(binding, name, args),
|
|
13
|
+
);
|
|
14
|
+
|
|
15
|
+
$effect(() => {
|
|
16
|
+
onlock?.(session.locked);
|
|
17
|
+
return () => onlock?.(false);
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
onMount(() => {
|
|
21
|
+
const stop = session.mount();
|
|
22
|
+
void session.connect(binding.planId);
|
|
23
|
+
const timer = setInterval(() => {
|
|
24
|
+
if (
|
|
25
|
+
!session.busy &&
|
|
26
|
+
!session.retryable &&
|
|
27
|
+
document.visibilityState === 'visible'
|
|
28
|
+
) {
|
|
29
|
+
void session.connect(binding.planId);
|
|
30
|
+
}
|
|
31
|
+
}, 1500);
|
|
32
|
+
return () => {
|
|
33
|
+
clearInterval(timer);
|
|
34
|
+
stop();
|
|
35
|
+
};
|
|
36
|
+
});
|
|
37
|
+
</script>
|
|
38
|
+
|
|
39
|
+
{#if session.error}
|
|
40
|
+
<p role="alert" class="bridge-error">Kitchen live preview: {session.error}</p>
|
|
41
|
+
{/if}
|
|
42
|
+
{#if session.preservedDraft && !session.retryable}
|
|
43
|
+
<details class="bridge-preserved">
|
|
44
|
+
<summary>Preserved edit</summary>
|
|
45
|
+
<textarea readonly aria-label="Preserved cookbook edit" value={JSON.stringify(session.preservedDraft, null, 2)}></textarea>
|
|
46
|
+
<button type="button" onclick={() => session.dismissPreservedDraft()}>Dismiss preserved edit</button>
|
|
47
|
+
</details>
|
|
48
|
+
{/if}
|
|
49
|
+
{#if session.retryable}
|
|
50
|
+
<div class="bridge-backdrop" aria-hidden="true"></div>
|
|
51
|
+
<div class="bridge-recovery" role="dialog" aria-modal="true" aria-labelledby="bridge-recovery-title">
|
|
52
|
+
<h2 id="bridge-recovery-title">Kitchen edit needs attention</h2>
|
|
53
|
+
<p>The app is paused until this edit is retried. The same command will be sent so Kitchen can safely recognize a previous success.</p>
|
|
54
|
+
{#if session.draft}
|
|
55
|
+
<label for="bridge-draft">Preserved cookbook edit</label>
|
|
56
|
+
<textarea id="bridge-draft" readonly value={JSON.stringify(session.draft, null, 2)}></textarea>
|
|
57
|
+
{/if}
|
|
58
|
+
<button type="button" disabled={session.busy} onclick={() => session.retry()}>Retry same edit</button>
|
|
59
|
+
</div>
|
|
60
|
+
{/if}
|
|
61
|
+
|
|
62
|
+
<style>
|
|
63
|
+
@layer smrt.reset, smrt.structure, smrt.theme;
|
|
64
|
+
@layer smrt.theme {
|
|
65
|
+
.bridge-error { margin: 0; padding: var(--smrt-spacing-2, .5rem) var(--smrt-spacing-4, 1rem); color: var(--smrt-color-on-error-container, #b91c1c); background: var(--smrt-color-error-container, #fef2f2); }
|
|
66
|
+
.bridge-backdrop { position: fixed; inset: 0; z-index: 9998; background: rgb(0 0 0 / .45); }
|
|
67
|
+
.bridge-recovery { position: fixed; z-index: 9999; inset-inline: max(1rem, calc((100vw - 32rem) / 2)); top: 15vh; display: grid; gap: .75rem; padding: 1.5rem; border-radius: var(--smrt-radius-large, .75rem); background: var(--smrt-surface-raised, white); color: var(--smrt-color-on-surface, black); box-shadow: var(--smrt-elevation-4); }
|
|
68
|
+
.bridge-recovery h2, .bridge-recovery p { margin: 0; }
|
|
69
|
+
.bridge-preserved { padding: var(--smrt-spacing-2, .5rem) var(--smrt-spacing-4, 1rem); color: var(--smrt-color-on-error-container, #b91c1c); background: var(--smrt-color-error-container, #fef2f2); }
|
|
70
|
+
.bridge-preserved textarea { width: 100%; min-height: 8rem; }
|
|
71
|
+
.bridge-recovery textarea { min-height: 10rem; max-height: 35vh; width: 100%; }
|
|
72
|
+
}
|
|
73
|
+
</style>
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type LiveKitchenBinding } from './live.ts';
|
|
2
|
+
type $$ComponentProps = {
|
|
3
|
+
binding: LiveKitchenBinding;
|
|
4
|
+
onlock?: (locked: boolean) => void;
|
|
5
|
+
};
|
|
6
|
+
declare const LiveKitchenBridge: import("svelte").Component<$$ComponentProps, {}, "">;
|
|
7
|
+
type LiveKitchenBridge = ReturnType<typeof LiveKitchenBridge>;
|
|
8
|
+
export default LiveKitchenBridge;
|
package/dist/kitchen/client.js
CHANGED
|
@@ -27,11 +27,17 @@ function usableEndpoint(value) {
|
|
|
27
27
|
if (typeof value !== 'string')
|
|
28
28
|
return false;
|
|
29
29
|
const text = value.trim();
|
|
30
|
-
if (text.startsWith('/') && !text.startsWith('//'))
|
|
31
|
-
return true;
|
|
32
30
|
try {
|
|
33
|
-
const
|
|
34
|
-
|
|
31
|
+
const relative = text.startsWith('/') && !text.startsWith('//');
|
|
32
|
+
const url = new URL(text, relative ? 'https://planner.invalid' : undefined);
|
|
33
|
+
if (!relative && url.protocol !== 'http:' && url.protocol !== 'https:') {
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
if (url.username || url.password)
|
|
37
|
+
return false;
|
|
38
|
+
if (url.hash)
|
|
39
|
+
return false;
|
|
40
|
+
return ![...url.searchParams.keys()].some((name) => /^(?:api[-_]?key|key|token|authorization|secret|password)$/i.test(name));
|
|
35
41
|
}
|
|
36
42
|
catch {
|
|
37
43
|
return false;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** Development preview binding: a single Kitchen plan and loopback bridge. */
|
|
2
|
+
export interface LiveKitchenBinding {
|
|
3
|
+
planId: string;
|
|
4
|
+
port: number;
|
|
5
|
+
}
|
|
6
|
+
export declare function liveKitchenBinding(search: string): LiveKitchenBinding | null;
|
|
7
|
+
export declare function callLiveKitchen(binding: LiveKitchenBinding, name: string, args: Record<string, unknown>): Promise<unknown>;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
const KEY = 'smrt-planner:live-kitchen:v1';
|
|
2
|
+
const PLAN_ID = /^plan-[a-f0-9-]{8,36}$/;
|
|
3
|
+
function valid(value) {
|
|
4
|
+
const binding = value;
|
|
5
|
+
return (!!binding &&
|
|
6
|
+
PLAN_ID.test(binding.planId) &&
|
|
7
|
+
Number.isInteger(binding.port) &&
|
|
8
|
+
binding.port > 0 &&
|
|
9
|
+
binding.port <= 65535);
|
|
10
|
+
}
|
|
11
|
+
export function liveKitchenBinding(search) {
|
|
12
|
+
const params = new URLSearchParams(search);
|
|
13
|
+
const planId = params.get('kitchenPlan');
|
|
14
|
+
const port = Number(params.get('kitchenPort'));
|
|
15
|
+
const fromUrl = { planId, port };
|
|
16
|
+
if (valid(fromUrl)) {
|
|
17
|
+
try {
|
|
18
|
+
sessionStorage.setItem(KEY, JSON.stringify(fromUrl));
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
/* URL still binds this tab. */
|
|
22
|
+
}
|
|
23
|
+
return fromUrl;
|
|
24
|
+
}
|
|
25
|
+
try {
|
|
26
|
+
const saved = JSON.parse(sessionStorage.getItem(KEY) ?? 'null');
|
|
27
|
+
return valid(saved) ? saved : null;
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
export async function callLiveKitchen(binding, name, args) {
|
|
34
|
+
if (args.planId !== binding.planId)
|
|
35
|
+
throw new Error('Preview plan id changed.');
|
|
36
|
+
const root = `http://127.0.0.1:${binding.port}/plans/${binding.planId}`;
|
|
37
|
+
const response = name === 'get_plan'
|
|
38
|
+
? await fetch(root, { cache: 'no-store' })
|
|
39
|
+
: name === 'run_commands'
|
|
40
|
+
? await fetch(`${root}/commands`, {
|
|
41
|
+
method: 'POST',
|
|
42
|
+
headers: { 'Content-Type': 'application/json' },
|
|
43
|
+
body: JSON.stringify(args),
|
|
44
|
+
})
|
|
45
|
+
: null;
|
|
46
|
+
if (!response)
|
|
47
|
+
throw new Error(`Preview tool ${name} is unavailable.`);
|
|
48
|
+
if (!response.ok)
|
|
49
|
+
throw new Error(`Kitchen preview answered ${response.status}.`);
|
|
50
|
+
return response.json();
|
|
51
|
+
}
|
package/dist/library/icons.js
CHANGED
|
@@ -23,4 +23,38 @@ export const COOKBOOK_ICONS = {
|
|
|
23
23
|
'M17 20l-1-5h-5l1-7',
|
|
24
24
|
'M4 10l4-1l4-1l4 1.5l4 1.5',
|
|
25
25
|
],
|
|
26
|
+
leaf: [
|
|
27
|
+
'M5 21c.5-4.5 2.5-8 7-10',
|
|
28
|
+
'M9 18c6.218 0 10.5-3.288 11-12v-2h-4.014c-9 0-11.986 4-12 9c0 1 0 3 2 5h3z',
|
|
29
|
+
],
|
|
30
|
+
scissors: [
|
|
31
|
+
'M6 7m-3 0a3 3 0 1 0 6 0a3 3 0 1 0-6 0',
|
|
32
|
+
'M6 17m-3 0a3 3 0 1 0 6 0a3 3 0 1 0-6 0',
|
|
33
|
+
'M8.6 8.6l10.4 10.4',
|
|
34
|
+
'M8.6 15.4l10.4-10.4',
|
|
35
|
+
],
|
|
36
|
+
coffee: [
|
|
37
|
+
'M3 14c.83.642 2.077 1.017 3.5 1c1.423.017 2.67-.358 3.5-1c.83-.642 2.077-1.017 3.5-1c1.423-.017 2.67.358 3.5 1',
|
|
38
|
+
'M8 3a2.4 2.4 0 0 0-1 2a2.4 2.4 0 0 0 1 2',
|
|
39
|
+
'M12 3a2.4 2.4 0 0 0-1 2a2.4 2.4 0 0 0 1 2',
|
|
40
|
+
'M3 10h14v5a6 6 0 0 1-6 6h-2a6 6 0 0 1-6-6v-5z',
|
|
41
|
+
'M16.746 16.726a3 3 0 1 0 .252-5.555',
|
|
42
|
+
],
|
|
43
|
+
forklift: [
|
|
44
|
+
'M5 17m-2 0a2 2 0 1 0 4 0a2 2 0 1 0-4 0',
|
|
45
|
+
'M13 17m-2 0a2 2 0 1 0 4 0a2 2 0 1 0-4 0',
|
|
46
|
+
'M7 17h4',
|
|
47
|
+
'M3 17v-6h13v6',
|
|
48
|
+
'M5 11v-4h4',
|
|
49
|
+
'M9 11v-6h4l3 6',
|
|
50
|
+
'M22 15h-3v-10',
|
|
51
|
+
'M16 13h3',
|
|
52
|
+
],
|
|
53
|
+
heart: [
|
|
54
|
+
'M19.5 12.572l-7.5 7.428l-7.5-7.428a5 5 0 1 1 7.5-6.566a5 5 0 1 1 7.5 6.572',
|
|
55
|
+
],
|
|
56
|
+
pencil: [
|
|
57
|
+
'M4 20h4l10.5-10.5a2.828 2.828 0 1 0-4-4l-10.5 10.5v4',
|
|
58
|
+
'M13.5 6.5l4 4',
|
|
59
|
+
],
|
|
26
60
|
};
|