@happyvertical/smrt-planner 0.0.0-stage → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (815) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +170 -2
  3. package/app/404.html +80 -0
  4. package/app/_app/immutable/assets/0.B5zXkXe_.css +1 -0
  5. package/app/_app/immutable/assets/10.hpcnxvK1.css +1 -0
  6. package/app/_app/immutable/assets/11.D7zoXfVV.css +1 -0
  7. package/app/_app/immutable/assets/12.CPobm1ED.css +1 -0
  8. package/app/_app/immutable/assets/2.CyaWdRdI.css +1 -0
  9. package/app/_app/immutable/assets/3.BlPQOes8.css +1 -0
  10. package/app/_app/immutable/assets/8.2gQeKBp_.css +1 -0
  11. package/app/_app/immutable/assets/9.HOPT4xtg.css +1 -0
  12. package/app/_app/immutable/assets/AiSetup.Cb22AigN.css +1 -0
  13. package/app/_app/immutable/assets/Button.DkP0qkG9.css +1 -0
  14. package/app/_app/immutable/assets/ConnectTools.BgIJOOGW.css +1 -0
  15. package/app/_app/immutable/assets/FieldMapForm.BCU-4pO4.css +1 -0
  16. package/app/_app/immutable/assets/ModelPage.Dd3LcMta.css +1 -0
  17. package/app/_app/immutable/assets/SectionActions.CTkVuNMF.css +1 -0
  18. package/app/_app/immutable/assets/SectionIcons.5Udq9vN-.css +1 -0
  19. package/app/_app/immutable/assets/SegmentedControl.B8SrQacd.css +1 -0
  20. package/app/_app/immutable/assets/dist.C5nHBk_O.css +1 -0
  21. package/app/_app/immutable/assets/feedback.BVKAwFck.css +1 -0
  22. package/app/_app/immutable/assets/forms.BChZ2RWM.css +1 -0
  23. package/app/_app/immutable/assets/inter-latin-ext.B_-bZUTo.woff2 +0 -0
  24. package/app/_app/immutable/assets/inter-latin.8kRkwJBP.woff2 +0 -0
  25. package/app/_app/immutable/assets/jetbrains-mono-latin-ext.Bnd2h4Br.woff2 +0 -0
  26. package/app/_app/immutable/assets/jetbrains-mono-latin.Db4Uuiha.woff2 +0 -0
  27. package/app/_app/immutable/assets/ort-wasm-simd-threaded.asyncify.CxOG5pUO.wasm +0 -0
  28. package/app/_app/immutable/assets/percent.LH0z-ozZ.css +1 -0
  29. package/app/_app/immutable/assets/space-grotesk-latin-ext.wJGaI8U0.woff2 +0 -0
  30. package/app/_app/immutable/assets/space-grotesk-latin.DPT1xrvW.woff2 +0 -0
  31. package/app/_app/immutable/assets/store.CGDwHkkF.css +1 -0
  32. package/app/_app/immutable/assets/ui.B1A1Zl2p.css +1 -0
  33. package/app/_app/immutable/assets/workspace.BIMkuZDb.css +1 -0
  34. package/app/_app/immutable/chunks/1okeBSoq.js +1 -0
  35. package/app/_app/immutable/chunks/2jFBkS1C.js +1 -0
  36. package/app/_app/immutable/chunks/6P9zxrzU.js +1 -0
  37. package/app/_app/immutable/chunks/B32EWqI8.js +9 -0
  38. package/app/_app/immutable/chunks/B4Kevpe0.js +1 -0
  39. package/app/_app/immutable/chunks/BJfAXhak.js +3 -0
  40. package/app/_app/immutable/chunks/BKwRT_1p.js +1 -0
  41. package/app/_app/immutable/chunks/BQxY8kkL.js +1 -0
  42. package/app/_app/immutable/chunks/BS4h9ES-.js +1 -0
  43. package/app/_app/immutable/chunks/BWPhGFHl.js +1 -0
  44. package/app/_app/immutable/chunks/BYcBM-fh.js +1 -0
  45. package/app/_app/immutable/chunks/BegKiy2G.js +1 -0
  46. package/app/_app/immutable/chunks/Bjy-W4x2.js +81 -0
  47. package/app/_app/immutable/chunks/BnRri03M.js +1 -0
  48. package/app/_app/immutable/chunks/C7zBd-pD.js +1 -0
  49. package/app/_app/immutable/chunks/CA-A9Ngs.js +1 -0
  50. package/app/_app/immutable/chunks/CMhpRMKg.js +1 -0
  51. package/app/_app/immutable/chunks/CPRHZZeW.js +1 -0
  52. package/app/_app/immutable/chunks/CRQ1Pmzr.js +1 -0
  53. package/app/_app/immutable/chunks/CWtfVMDz.js +1 -0
  54. package/app/_app/immutable/chunks/CgAkqYsL.js +1 -0
  55. package/app/_app/immutable/chunks/Chyo8rdT.js +3 -0
  56. package/app/_app/immutable/chunks/Ci0DUht6.js +34 -0
  57. package/app/_app/immutable/chunks/CmmuWmp6.js +2 -0
  58. package/app/_app/immutable/chunks/CrFNLK0f.js +1 -0
  59. package/app/_app/immutable/chunks/CrO3W89x.js +1 -0
  60. package/app/_app/immutable/chunks/CsprTb3f.js +2 -0
  61. package/app/_app/immutable/chunks/CyUMm_Wp.js +1 -0
  62. package/app/_app/immutable/chunks/CygC84VT.js +2 -0
  63. package/app/_app/immutable/chunks/D0VgZnk1.js +1 -0
  64. package/app/_app/immutable/chunks/D71UrO5c.js +1 -0
  65. package/app/_app/immutable/chunks/D7hhQvDO.js +1 -0
  66. package/app/_app/immutable/chunks/DD7gpKb2.js +1 -0
  67. package/app/_app/immutable/chunks/DNRgqfTx.js +1 -0
  68. package/app/_app/immutable/chunks/DRByVC-c.js +1 -0
  69. package/app/_app/immutable/chunks/DVRKjN-E.js +1 -0
  70. package/app/_app/immutable/chunks/D_J_XtJy.js +846 -0
  71. package/app/_app/immutable/chunks/Dbjm4OuC.js +1 -0
  72. package/app/_app/immutable/chunks/Dc4q22LH.js +42 -0
  73. package/app/_app/immutable/chunks/Dd_uD5pT.js +1 -0
  74. package/app/_app/immutable/chunks/DkR8_Ws6.js +2 -0
  75. package/app/_app/immutable/chunks/Dp9GVO-9.js +1 -0
  76. package/app/_app/immutable/chunks/DqcD-WtP.js +1 -0
  77. package/app/_app/immutable/chunks/Dt-HX3Vu.js +1 -0
  78. package/app/_app/immutable/chunks/FbOxj-PF.js +69 -0
  79. package/app/_app/immutable/chunks/QukgIHDX.js +1 -0
  80. package/app/_app/immutable/chunks/WxSPP8QW.js +4 -0
  81. package/app/_app/immutable/chunks/Xp1g1t4n.js +3 -0
  82. package/app/_app/immutable/chunks/iET62IRm.js +2 -0
  83. package/app/_app/immutable/chunks/leQCwW2d.js +1 -0
  84. package/app/_app/immutable/chunks/p6bgzXiY.js +1 -0
  85. package/app/_app/immutable/chunks/uBIymjUX.js +1 -0
  86. package/app/_app/immutable/chunks/xihTtKlq.js +1 -0
  87. package/app/_app/immutable/entry/app.IZIJXhgq.js +2 -0
  88. package/app/_app/immutable/entry/start.BuaYHD1N.js +1 -0
  89. package/app/_app/immutable/nodes/0.m_U8WC7E.js +10 -0
  90. package/app/_app/immutable/nodes/1.Crw8ULhB.js +1 -0
  91. package/app/_app/immutable/nodes/10.1nQxyH9H.js +4 -0
  92. package/app/_app/immutable/nodes/11.Cw0JnQF3.js +1 -0
  93. package/app/_app/immutable/nodes/12.BIocA1aI.js +1 -0
  94. package/app/_app/immutable/nodes/2.CR5BwGnt.js +17 -0
  95. package/app/_app/immutable/nodes/3.1B56hgAG.js +1 -0
  96. package/app/_app/immutable/nodes/4.SSIC7sUh.js +1 -0
  97. package/app/_app/immutable/nodes/5.DgdwleDQ.js +1 -0
  98. package/app/_app/immutable/nodes/6.DmD9rqLU.js +1 -0
  99. package/app/_app/immutable/nodes/7.DdngsBmo.js +1 -0
  100. package/app/_app/immutable/nodes/8.D2Mszsua.js +3 -0
  101. package/app/_app/immutable/nodes/9.CLYsywul.js +1 -0
  102. package/app/_app/immutable/workers/assets/ort-wasm-simd-threaded.asyncify-CxOG5pUO.wasm +0 -0
  103. package/app/_app/immutable/workers/llm.worker-wfCOG_uk.js +69 -0
  104. package/app/_app/immutable/workers/local-speech.worker-DWbfmFUk.js +51 -0
  105. package/app/_app/version.json +1 -0
  106. package/app/ai/index.html +89 -0
  107. package/app/blueprint/index.html +87 -0
  108. package/app/cookbook/index.html +87 -0
  109. package/app/index.html +103 -0
  110. package/app/m/ads/AdDeliveryTier/index.html +96 -0
  111. package/app/m/ads/AdEvent/index.html +96 -0
  112. package/app/m/ads/AdFormat/index.html +96 -0
  113. package/app/m/ads/AdGroup/index.html +96 -0
  114. package/app/m/ads/AdVariation/index.html +96 -0
  115. package/app/m/analytics/AnalyticsDataStream/index.html +96 -0
  116. package/app/m/analytics/AnalyticsEvent/index.html +96 -0
  117. package/app/m/analytics/AnalyticsProperty/index.html +96 -0
  118. package/app/m/analytics/AnalyticsReport/index.html +96 -0
  119. package/app/m/approvals/ApprovalEvent/index.html +96 -0
  120. package/app/m/approvals/ApprovalPolicy/index.html +96 -0
  121. package/app/m/approvals/ApprovalRequest/index.html +96 -0
  122. package/app/m/assets/Asset/index.html +96 -0
  123. package/app/m/assets/AssetAssociation/index.html +97 -0
  124. package/app/m/assets/AssetMetafield/index.html +96 -0
  125. package/app/m/assets/AssetStatus/index.html +96 -0
  126. package/app/m/assets/AssetType/index.html +96 -0
  127. package/app/m/assets/Folder/index.html +96 -0
  128. package/app/m/chat/AgentSession/index.html +96 -0
  129. package/app/m/chat/ChatMessage/index.html +97 -0
  130. package/app/m/chat/ChatParticipant/index.html +97 -0
  131. package/app/m/chat/ChatReaction/index.html +96 -0
  132. package/app/m/chat/ChatRoom/index.html +96 -0
  133. package/app/m/chat/ChatThread/index.html +97 -0
  134. package/app/m/chat/VoiceGatewayTurn/index.html +96 -0
  135. package/app/m/chat/VoiceSession/index.html +96 -0
  136. package/app/m/commerce/Agreement/index.html +96 -0
  137. package/app/m/commerce/Cart/index.html +96 -0
  138. package/app/m/commerce/Contract/index.html +96 -0
  139. package/app/m/commerce/ContractLineItem/index.html +97 -0
  140. package/app/m/commerce/Customer/index.html +96 -0
  141. package/app/m/commerce/Estimate/index.html +96 -0
  142. package/app/m/commerce/Fulfillment/index.html +96 -0
  143. package/app/m/commerce/FulfillmentLineItem/index.html +97 -0
  144. package/app/m/commerce/Invoice/index.html +96 -0
  145. package/app/m/commerce/InvoiceLineItem/index.html +97 -0
  146. package/app/m/commerce/Lease/index.html +96 -0
  147. package/app/m/commerce/LicenseSale/index.html +96 -0
  148. package/app/m/commerce/Order/index.html +96 -0
  149. package/app/m/commerce/Payment/index.html +96 -0
  150. package/app/m/commerce/PaymentAllocation/index.html +97 -0
  151. package/app/m/commerce/PaymentInstrument/index.html +96 -0
  152. package/app/m/commerce/PaymentIntent/index.html +96 -0
  153. package/app/m/commerce/Payout/index.html +96 -0
  154. package/app/m/commerce/ProductionOrder/index.html +96 -0
  155. package/app/m/commerce/PurchaseOrder/index.html +96 -0
  156. package/app/m/commerce/Vendor/index.html +96 -0
  157. package/app/m/commerce/WholesaleOrder/index.html +96 -0
  158. package/app/m/content/Content/index.html +96 -0
  159. package/app/m/content/ContentContribution/index.html +96 -0
  160. package/app/m/content/ContentContributionAttachment/index.html +96 -0
  161. package/app/m/content/ContentContributionRevision/index.html +96 -0
  162. package/app/m/content/ContentContributionType/index.html +96 -0
  163. package/app/m/content/ContentContributor/index.html +96 -0
  164. package/app/m/content/ContentCorrection/index.html +96 -0
  165. package/app/m/content/ContentFeedSource/index.html +96 -0
  166. package/app/m/content/ContentGovernanceAssignment/index.html +96 -0
  167. package/app/m/content/ContentGovernancePolicy/index.html +96 -0
  168. package/app/m/content/ContentGovernanceProfile/index.html +96 -0
  169. package/app/m/content/ContentReference/index.html +96 -0
  170. package/app/m/content/ContentReview/index.html +96 -0
  171. package/app/m/content/ContentVersion/index.html +96 -0
  172. package/app/m/content/Contents/index.html +96 -0
  173. package/app/m/events/Event/index.html +96 -0
  174. package/app/m/events/EventParticipant/index.html +97 -0
  175. package/app/m/events/EventSeries/index.html +96 -0
  176. package/app/m/events/EventType/index.html +96 -0
  177. package/app/m/facts/Fact/index.html +96 -0
  178. package/app/m/facts/FactContent/index.html +96 -0
  179. package/app/m/facts/FactEvidence/index.html +96 -0
  180. package/app/m/facts/FactSource/index.html +96 -0
  181. package/app/m/facts/FactSubject/index.html +96 -0
  182. package/app/m/facts/FactTag/index.html +96 -0
  183. package/app/m/fields/FieldPolicy/index.html +96 -0
  184. package/app/m/fields/FieldPolicySuggestion/index.html +96 -0
  185. package/app/m/fields/FieldUsageCounter/index.html +96 -0
  186. package/app/m/images/Image/index.html +96 -0
  187. package/app/m/inventory/InventoryLocation/index.html +96 -0
  188. package/app/m/inventory/StockLevel/index.html +96 -0
  189. package/app/m/inventory/StockMovement/index.html +96 -0
  190. package/app/m/ledgers/Account/index.html +96 -0
  191. package/app/m/ledgers/Journal/index.html +96 -0
  192. package/app/m/ledgers/JournalEntry/index.html +97 -0
  193. package/app/m/manufacturing/Assembly/index.html +96 -0
  194. package/app/m/manufacturing/BillOfMaterials/index.html +96 -0
  195. package/app/m/manufacturing/BomLine/index.html +96 -0
  196. package/app/m/manufacturing/Operation/index.html +96 -0
  197. package/app/m/manufacturing/ProductionRun/index.html +96 -0
  198. package/app/m/manufacturing/ProductionRunCompletion/index.html +96 -0
  199. package/app/m/manufacturing/RoutingStep/index.html +96 -0
  200. package/app/m/marketing/Campaign/index.html +96 -0
  201. package/app/m/marketing/CampaignChannel/index.html +96 -0
  202. package/app/m/marketing/CampaignMetricSnapshot/index.html +96 -0
  203. package/app/m/messages/Account/index.html +96 -0
  204. package/app/m/messages/Attachment/index.html +96 -0
  205. package/app/m/messages/Blacklist/index.html +96 -0
  206. package/app/m/messages/Email/failed-sends/index.html +96 -0
  207. package/app/m/messages/Email/index.html +96 -0
  208. package/app/m/messages/Email/mailbox/index.html +96 -0
  209. package/app/m/messages/EmailAccount/index.html +96 -0
  210. package/app/m/messages/EmailFolder/index.html +96 -0
  211. package/app/m/messages/Message/index.html +96 -0
  212. package/app/m/messages/MessagingEndpoint/index.html +96 -0
  213. package/app/m/messages/PersonaMessageRoute/index.html +96 -0
  214. package/app/m/messages/SlackAccount/index.html +96 -0
  215. package/app/m/messages/SlackMessage/index.html +96 -0
  216. package/app/m/messages/TelegramAccount/index.html +96 -0
  217. package/app/m/messages/Tweet/index.html +96 -0
  218. package/app/m/messages/TwitterAccount/index.html +96 -0
  219. package/app/m/messages/Whitelist/index.html +96 -0
  220. package/app/m/messages/ZulipAccount/index.html +96 -0
  221. package/app/m/places/Place/index.html +96 -0
  222. package/app/m/places/PlaceType/index.html +96 -0
  223. package/app/m/preferences/UiPreferenceRecord/index.html +96 -0
  224. package/app/m/products/Category/index.html +96 -0
  225. package/app/m/products/Material/index.html +96 -0
  226. package/app/m/products/Product/index.html +96 -0
  227. package/app/m/products/Product/ingredients/index.html +96 -0
  228. package/app/m/products/ProductVariant/index.html +97 -0
  229. package/app/m/products/Sku/index.html +97 -0
  230. package/app/m/profiles/ApiKey/index.html +96 -0
  231. package/app/m/profiles/Bot/index.html +96 -0
  232. package/app/m/profiles/MagicLinkToken/index.html +96 -0
  233. package/app/m/profiles/NostrIdentity/index.html +96 -0
  234. package/app/m/profiles/OidcIdentity/index.html +96 -0
  235. package/app/m/profiles/Organization/index.html +96 -0
  236. package/app/m/profiles/Person/index.html +96 -0
  237. package/app/m/profiles/Profile/index.html +96 -0
  238. package/app/m/profiles/ProfileMetadata/index.html +96 -0
  239. package/app/m/profiles/ProfileMetafield/index.html +96 -0
  240. package/app/m/profiles/ProfileRelationship/index.html +96 -0
  241. package/app/m/profiles/ProfileRelationshipTerm/index.html +96 -0
  242. package/app/m/profiles/ProfileRelationshipType/index.html +96 -0
  243. package/app/m/profiles/ProfileType/index.html +96 -0
  244. package/app/m/projects/Comment/index.html +97 -0
  245. package/app/m/projects/Issue/index.html +96 -0
  246. package/app/m/projects/Label/index.html +96 -0
  247. package/app/m/projects/Project/index.html +96 -0
  248. package/app/m/projects/ProjectIntegration/index.html +96 -0
  249. package/app/m/projects/PullRequest/index.html +96 -0
  250. package/app/m/projects/Repository/index.html +96 -0
  251. package/app/m/properties/Property/index.html +96 -0
  252. package/app/m/properties/Zone/index.html +96 -0
  253. package/app/m/reports/RuntimeReport/index.html +96 -0
  254. package/app/m/reports/SmrtPrincipalReportRefreshTask/index.html +96 -0
  255. package/app/m/reports/SmrtReportLock/index.html +96 -0
  256. package/app/m/reports/SmrtReportRefreshTask/index.html +96 -0
  257. package/app/m/reports/SmrtReportRun/index.html +96 -0
  258. package/app/m/reports/SmrtReportSchedule/index.html +96 -0
  259. package/app/m/reports/SmrtReportWatermark/index.html +96 -0
  260. package/app/m/sales/AttributionException/index.html +96 -0
  261. package/app/m/sales/AttributionPolicy/index.html +96 -0
  262. package/app/m/sales/Commission/index.html +96 -0
  263. package/app/m/sales/CommissionAdjustment/index.html +96 -0
  264. package/app/m/sales/CommissionPayout/index.html +96 -0
  265. package/app/m/sales/CommissionPlan/index.html +96 -0
  266. package/app/m/sales/Earner/index.html +96 -0
  267. package/app/m/sales/EarnerSourceAttribution/index.html +96 -0
  268. package/app/m/sales/EarningEvent/index.html +96 -0
  269. package/app/m/sales/ExecutedAgreement/index.html +96 -0
  270. package/app/m/sales/Lead/index.html +96 -0
  271. package/app/m/sales/Opportunity/index.html +96 -0
  272. package/app/m/sales/OpportunityConversion/index.html +96 -0
  273. package/app/m/sales/PipelineDefinition/index.html +96 -0
  274. package/app/m/sales/PipelineStage/index.html +97 -0
  275. package/app/m/sales/Referral/index.html +96 -0
  276. package/app/m/sales/ReferralAgreement/index.html +96 -0
  277. package/app/m/sales/ReferralLink/index.html +96 -0
  278. package/app/m/sales/ReferralProgram/index.html +96 -0
  279. package/app/m/sales/ReferralTermSnapshot/index.html +96 -0
  280. package/app/m/sales/ReferralTouch/index.html +96 -0
  281. package/app/m/sales/Referrer/index.html +96 -0
  282. package/app/m/sales/SalesActivity/index.html +96 -0
  283. package/app/m/sales/SalesRepresentative/index.html +96 -0
  284. package/app/m/sites/Site/index.html +96 -0
  285. package/app/m/sites/SiteAgentBinding/index.html +96 -0
  286. package/app/m/social/OAuthState/index.html +96 -0
  287. package/app/m/social/SocialAccount/index.html +96 -0
  288. package/app/m/social/SocialPost/index.html +96 -0
  289. package/app/m/social/SocialPostAnalyticsSnapshot/index.html +96 -0
  290. package/app/m/subscriptions/BillingAdjustment/index.html +96 -0
  291. package/app/m/subscriptions/ClientCharge/index.html +96 -0
  292. package/app/m/subscriptions/CreditGrant/index.html +96 -0
  293. package/app/m/subscriptions/PricingRule/index.html +96 -0
  294. package/app/m/subscriptions/RetailCharge/index.html +96 -0
  295. package/app/m/subscriptions/SpendingPolicy/index.html +96 -0
  296. package/app/m/subscriptions/SubscriptionPlan/index.html +96 -0
  297. package/app/m/subscriptions/TenantSubscription/index.html +96 -0
  298. package/app/m/subscriptions/TenantUsageMetric/index.html +96 -0
  299. package/app/m/support/ServiceTimeEntry/index.html +96 -0
  300. package/app/m/support/SupportAiRun/index.html +96 -0
  301. package/app/m/support/SupportAvailability/index.html +96 -0
  302. package/app/m/support/SupportCase/index.html +96 -0
  303. package/app/m/support/SupportCaseEvent/index.html +96 -0
  304. package/app/m/support/SupportChannelBinding/index.html +96 -0
  305. package/app/m/support/SupportCharge/index.html +96 -0
  306. package/app/m/support/SupportCompensation/index.html +96 -0
  307. package/app/m/support/SupportCompensationPlan/index.html +96 -0
  308. package/app/m/support/SupportEscalation/index.html +96 -0
  309. package/app/m/support/SupportInteraction/index.html +96 -0
  310. package/app/m/support/SupportPlan/index.html +96 -0
  311. package/app/m/support/SupportPolicy/index.html +96 -0
  312. package/app/m/support/SupportQualification/index.html +96 -0
  313. package/app/m/support/SupportServiceTarget/index.html +96 -0
  314. package/app/m/support/SupportSpecialist/index.html +96 -0
  315. package/app/m/support/SupportWorkLink/index.html +96 -0
  316. package/app/m/tags/Tag/index.html +96 -0
  317. package/app/m/tags/TagAlias/index.html +96 -0
  318. package/app/m/timesheets/AttendanceBreak/index.html +96 -0
  319. package/app/m/timesheets/AttendancePunch/index.html +96 -0
  320. package/app/m/timesheets/ServiceChargeSnapshot/index.html +96 -0
  321. package/app/m/timesheets/ServiceCompensationSnapshot/index.html +96 -0
  322. package/app/m/timesheets/ServiceTimeEntry/index.html +96 -0
  323. package/app/m/users/AccessRequest/index.html +96 -0
  324. package/app/m/users/Group/index.html +96 -0
  325. package/app/m/users/GroupMember/index.html +96 -0
  326. package/app/m/users/GroupRole/index.html +96 -0
  327. package/app/m/users/Membership/index.html +97 -0
  328. package/app/m/users/MembershipOverride/index.html +96 -0
  329. package/app/m/users/Permission/index.html +96 -0
  330. package/app/m/users/ResourceGrant/index.html +96 -0
  331. package/app/m/users/Role/index.html +96 -0
  332. package/app/m/users/RolePermission/index.html +96 -0
  333. package/app/m/users/Session/index.html +96 -0
  334. package/app/m/users/Tenant/index.html +96 -0
  335. package/app/m/users/TenantIntegration/index.html +96 -0
  336. package/app/m/users/TenantPermissionOverride/index.html +96 -0
  337. package/app/m/users/User/index.html +96 -0
  338. package/app/m/users/UsersCliAuthRequest/index.html +96 -0
  339. package/app/m/users/UsersMagicLinkToken/index.html +96 -0
  340. package/app/m/video/Character/index.html +96 -0
  341. package/app/m/video/CharacterAsset/index.html +96 -0
  342. package/app/m/video/CompositeJob/index.html +96 -0
  343. package/app/m/video/Performer/index.html +96 -0
  344. package/app/m/video/PerformerAsset/index.html +96 -0
  345. package/app/m/video/Scene/index.html +96 -0
  346. package/app/m/video/SceneAsset/index.html +96 -0
  347. package/app/m/video/VideoComposition/index.html +96 -0
  348. package/app/m/video/VideoCompositionAsset/index.html +96 -0
  349. package/app/m/video/VideoSequence/index.html +96 -0
  350. package/app/m/video/VideoSequenceAsset/index.html +96 -0
  351. package/app/m/video/VideoShot/index.html +96 -0
  352. package/app/m/video/VideoShotAsset/index.html +96 -0
  353. package/app/m/video/VideoShotCharacter/index.html +96 -0
  354. package/app/m/video/VideoWorkflow/index.html +96 -0
  355. package/app/m/voice/VoiceOutput/index.html +96 -0
  356. package/app/m/voice/VoiceProfile/index.html +96 -0
  357. package/app/m/voice/VoiceSample/index.html +96 -0
  358. package/app/packages/ads/index.html +92 -0
  359. package/app/packages/analytics/index.html +92 -0
  360. package/app/packages/approvals/index.html +92 -0
  361. package/app/packages/assets/index.html +92 -0
  362. package/app/packages/chat/index.html +92 -0
  363. package/app/packages/comments/index.html +92 -0
  364. package/app/packages/commerce/index.html +92 -0
  365. package/app/packages/content/index.html +92 -0
  366. package/app/packages/events/index.html +92 -0
  367. package/app/packages/expenses/index.html +92 -0
  368. package/app/packages/facts/index.html +92 -0
  369. package/app/packages/fields/index.html +92 -0
  370. package/app/packages/human-resources/index.html +92 -0
  371. package/app/packages/images/index.html +92 -0
  372. package/app/packages/index.html +90 -0
  373. package/app/packages/inventory/index.html +92 -0
  374. package/app/packages/ledgers/index.html +92 -0
  375. package/app/packages/manufacturing/index.html +92 -0
  376. package/app/packages/marketing/index.html +92 -0
  377. package/app/packages/messages/index.html +92 -0
  378. package/app/packages/places/index.html +92 -0
  379. package/app/packages/preferences/index.html +92 -0
  380. package/app/packages/products/index.html +92 -0
  381. package/app/packages/profiles/index.html +92 -0
  382. package/app/packages/projects/index.html +92 -0
  383. package/app/packages/properties/index.html +92 -0
  384. package/app/packages/reports/index.html +92 -0
  385. package/app/packages/sales/index.html +92 -0
  386. package/app/packages/sites/index.html +92 -0
  387. package/app/packages/social/index.html +92 -0
  388. package/app/packages/subscriptions/index.html +92 -0
  389. package/app/packages/support/index.html +92 -0
  390. package/app/packages/tags/index.html +92 -0
  391. package/app/packages/timesheets/index.html +92 -0
  392. package/app/packages/users/index.html +92 -0
  393. package/app/packages/video/index.html +92 -0
  394. package/app/packages/voice/index.html +92 -0
  395. package/app/recipes/account-access/help/index.html +93 -0
  396. package/app/recipes/account-access/index.html +95 -0
  397. package/app/recipes/activity/help/index.html +93 -0
  398. package/app/recipes/activity/index.html +94 -0
  399. package/app/recipes/agreements/help/index.html +93 -0
  400. package/app/recipes/agreements/index.html +96 -0
  401. package/app/recipes/analytics.reports/help/index.html +93 -0
  402. package/app/recipes/analytics.reports/index.html +94 -0
  403. package/app/recipes/assets/help/index.html +93 -0
  404. package/app/recipes/assets/index.html +95 -0
  405. package/app/recipes/billing/help/index.html +93 -0
  406. package/app/recipes/billing/index.html +95 -0
  407. package/app/recipes/chat.assistant/help/index.html +93 -0
  408. package/app/recipes/chat.assistant/index.html +94 -0
  409. package/app/recipes/comments/help/index.html +93 -0
  410. package/app/recipes/comments/index.html +94 -0
  411. package/app/recipes/commerce.customers/help/index.html +93 -0
  412. package/app/recipes/commerce.customers/index.html +94 -0
  413. package/app/recipes/commerce.estimates/help/index.html +93 -0
  414. package/app/recipes/commerce.estimates/index.html +94 -0
  415. package/app/recipes/commerce.purchases/help/index.html +93 -0
  416. package/app/recipes/commerce.purchases/index.html +94 -0
  417. package/app/recipes/commerce.sales/help/index.html +93 -0
  418. package/app/recipes/commerce.sales/index.html +94 -0
  419. package/app/recipes/commerce.vendors/help/index.html +93 -0
  420. package/app/recipes/commerce.vendors/index.html +94 -0
  421. package/app/recipes/commerce.wholesale/help/index.html +93 -0
  422. package/app/recipes/commerce.wholesale/index.html +94 -0
  423. package/app/recipes/events.calendar/help/index.html +93 -0
  424. package/app/recipes/events.calendar/index.html +94 -0
  425. package/app/recipes/fields.form-customization/help/index.html +93 -0
  426. package/app/recipes/fields.form-customization/index.html +94 -0
  427. package/app/recipes/inventory.stock/help/index.html +93 -0
  428. package/app/recipes/inventory.stock/index.html +94 -0
  429. package/app/recipes/ledgers.bookkeeping/help/index.html +93 -0
  430. package/app/recipes/ledgers.bookkeeping/index.html +94 -0
  431. package/app/recipes/messages/help/index.html +93 -0
  432. package/app/recipes/messages/index.html +95 -0
  433. package/app/recipes/products/help/index.html +93 -0
  434. package/app/recipes/products/index.html +96 -0
  435. package/app/recipes/projects.tracker/help/index.html +93 -0
  436. package/app/recipes/projects.tracker/index.html +94 -0
  437. package/app/recipes/reports.materialized/help/index.html +93 -0
  438. package/app/recipes/reports.materialized/index.html +94 -0
  439. package/app/recipes/sales.pipeline/help/index.html +93 -0
  440. package/app/recipes/sales.pipeline/index.html +94 -0
  441. package/app/recipes/tags.taxonomy/help/index.html +93 -0
  442. package/app/recipes/tags.taxonomy/index.html +94 -0
  443. package/app/recipes/team-collaboration/help/index.html +93 -0
  444. package/app/recipes/team-collaboration/index.html +94 -0
  445. package/app/s/custom-billing/index.html +89 -0
  446. package/app/s/custom-buying/index.html +89 -0
  447. package/app/s/custom-classes/index.html +89 -0
  448. package/app/s/custom-jobs/index.html +89 -0
  449. package/app/s/custom-kitchen/index.html +89 -0
  450. package/app/s/custom-material/index.html +89 -0
  451. package/app/s/custom-members/index.html +89 -0
  452. package/app/s/custom-parts/index.html +89 -0
  453. package/app/s/custom-schedule/index.html +89 -0
  454. package/app/s/custom-shop/index.html +89 -0
  455. package/app/s/custom-wholesale/index.html +89 -0
  456. package/app/s/section-access-control/index.html +89 -0
  457. package/app/s/section-account-security/index.html +89 -0
  458. package/app/s/section-accounting/index.html +89 -0
  459. package/app/s/section-activity/index.html +89 -0
  460. package/app/s/section-agreements/index.html +89 -0
  461. package/app/s/section-analytics/index.html +89 -0
  462. package/app/s/section-assets/index.html +89 -0
  463. package/app/s/section-billing/index.html +89 -0
  464. package/app/s/section-calendar/index.html +89 -0
  465. package/app/s/section-catalog/index.html +89 -0
  466. package/app/s/section-chat.assistant/index.html +89 -0
  467. package/app/s/section-comments/index.html +89 -0
  468. package/app/s/section-fields.form-customization/index.html +89 -0
  469. package/app/s/section-messages/index.html +89 -0
  470. package/app/s/section-more/index.html +89 -0
  471. package/app/s/section-operations/index.html +89 -0
  472. package/app/s/section-projects/index.html +89 -0
  473. package/app/s/section-purchasing/index.html +89 -0
  474. package/app/s/section-reports.materialized/index.html +89 -0
  475. package/app/s/section-sales/index.html +89 -0
  476. package/app/s/section-taxonomy/index.html +89 -0
  477. package/app/s/section-team/index.html +89 -0
  478. package/dist/ai/echo-gate.d.ts +13 -0
  479. package/dist/ai/echo-gate.js +21 -0
  480. package/dist/ai/icons.d.ts +9 -0
  481. package/dist/ai/icons.js +9 -0
  482. package/dist/ai/instance.d.ts +3 -0
  483. package/dist/ai/instance.js +25 -0
  484. package/dist/ai/state.svelte.d.ts +130 -0
  485. package/dist/ai/state.svelte.js +316 -0
  486. package/dist/ai/status.d.ts +67 -0
  487. package/dist/ai/status.js +125 -0
  488. package/dist/assets/smrt-mark.svg +38 -0
  489. package/dist/assistant/change.d.ts +101 -0
  490. package/dist/assistant/change.js +209 -0
  491. package/dist/assistant/engine.d.ts +20 -0
  492. package/dist/assistant/engine.js +43 -0
  493. package/dist/assistant/llm.worker.d.ts +1 -0
  494. package/dist/assistant/llm.worker.js +7 -0
  495. package/dist/assistant/match.d.ts +59 -0
  496. package/dist/assistant/match.js +271 -0
  497. package/dist/assistant/models.d.ts +38 -0
  498. package/dist/assistant/models.js +57 -0
  499. package/dist/assistant/offers.svelte.d.ts +36 -0
  500. package/dist/assistant/offers.svelte.js +59 -0
  501. package/dist/assistant/prefs.d.ts +14 -0
  502. package/dist/assistant/prefs.js +32 -0
  503. package/dist/assistant/prompt.d.ts +23 -0
  504. package/dist/assistant/prompt.js +163 -0
  505. package/dist/assistant/session.svelte.d.ts +74 -0
  506. package/dist/assistant/session.svelte.js +181 -0
  507. package/dist/assistant/theme-undo.svelte.d.ts +38 -0
  508. package/dist/assistant/theme-undo.svelte.js +50 -0
  509. package/dist/assistant/transport.d.ts +73 -0
  510. package/dist/assistant/transport.js +231 -0
  511. package/dist/assistant/voice-host.d.ts +10 -0
  512. package/dist/assistant/voice-host.js +17 -0
  513. package/dist/assistant/voice.svelte.d.ts +107 -0
  514. package/dist/assistant/voice.svelte.js +261 -0
  515. package/dist/catalog/catalog.json +89663 -0
  516. package/dist/catalog/generate/build.d.ts +33 -0
  517. package/dist/catalog/generate/build.js +131 -0
  518. package/dist/catalog/generate/exclusions.d.ts +18 -0
  519. package/dist/catalog/generate/exclusions.js +33 -0
  520. package/dist/catalog/generate/extract.d.ts +90 -0
  521. package/dist/catalog/generate/extract.js +326 -0
  522. package/dist/catalog/generate/local.d.ts +8 -0
  523. package/dist/catalog/generate/local.js +45 -0
  524. package/dist/catalog/generate/recipe-demo.d.ts +11 -0
  525. package/dist/catalog/generate/recipe-demo.js +29 -0
  526. package/dist/catalog/generate/recipe-metadata.d.ts +12 -0
  527. package/dist/catalog/generate/recipe-metadata.js +138 -0
  528. package/dist/catalog/generate/registry.d.ts +14 -0
  529. package/dist/catalog/generate/registry.js +83 -0
  530. package/dist/catalog/index.d.ts +21 -0
  531. package/dist/catalog/index.js +53 -0
  532. package/dist/catalog/types.d.ts +141 -0
  533. package/dist/catalog/types.js +8 -0
  534. package/dist/components/AiSetup.svelte +528 -0
  535. package/dist/components/AiSetup.svelte.d.ts +8 -0
  536. package/dist/components/AiStatusIcons.svelte +86 -0
  537. package/dist/components/AiStatusIcons.svelte.d.ts +18 -0
  538. package/dist/components/AppSettings.svelte +100 -0
  539. package/dist/components/AppSettings.svelte.d.ts +10 -0
  540. package/dist/components/BrowserAssistant.svelte +318 -0
  541. package/dist/components/BrowserAssistant.svelte.d.ts +8 -0
  542. package/dist/components/ChildRecords.svelte +331 -0
  543. package/dist/components/ChildRecords.svelte.d.ts +15 -0
  544. package/dist/components/ConnectTools.svelte +145 -0
  545. package/dist/components/ConnectTools.svelte.d.ts +8 -0
  546. package/dist/components/CookbooksPanel.svelte +308 -0
  547. package/dist/components/CookbooksPanel.svelte.d.ts +3 -0
  548. package/dist/components/ExportPanel.svelte +217 -0
  549. package/dist/components/ExportPanel.svelte.d.ts +3 -0
  550. package/dist/components/FeatureCard.svelte +197 -0
  551. package/dist/components/FeatureCard.svelte.d.ts +13 -0
  552. package/dist/components/FeaturesPanel.svelte +155 -0
  553. package/dist/components/FeaturesPanel.svelte.d.ts +3 -0
  554. package/dist/components/FieldInput.svelte +307 -0
  555. package/dist/components/FieldInput.svelte.d.ts +24 -0
  556. package/dist/components/FieldMapForm.svelte +173 -0
  557. package/dist/components/FieldMapForm.svelte.d.ts +18 -0
  558. package/dist/components/FormWorkspace.svelte +274 -0
  559. package/dist/components/FormWorkspace.svelte.d.ts +19 -0
  560. package/dist/components/HelpView.svelte +129 -0
  561. package/dist/components/HelpView.svelte.d.ts +12 -0
  562. package/dist/components/ModelOptions.svelte +239 -0
  563. package/dist/components/ModelOptions.svelte.d.ts +12 -0
  564. package/dist/components/ModelPage.svelte +295 -0
  565. package/dist/components/ModelPage.svelte.d.ts +9 -0
  566. package/dist/components/ModelWorkspace.svelte +488 -0
  567. package/dist/components/ModelWorkspace.svelte.d.ts +32 -0
  568. package/dist/components/PlannerEditBridge.svelte +36 -0
  569. package/dist/components/PlannerEditBridge.svelte.d.ts +3 -0
  570. package/dist/components/PlannerPalette.svelte +38 -0
  571. package/dist/components/PlannerPalette.svelte.d.ts +18 -0
  572. package/dist/components/RecipeCards.svelte +145 -0
  573. package/dist/components/RecipeCards.svelte.d.ts +3 -0
  574. package/dist/components/RecipeHelp.svelte +54 -0
  575. package/dist/components/RecipeHelp.svelte.d.ts +9 -0
  576. package/dist/components/RecipeOptions.svelte +160 -0
  577. package/dist/components/RecipeOptions.svelte.d.ts +9 -0
  578. package/dist/components/RecordFeatures.svelte +240 -0
  579. package/dist/components/RecordFeatures.svelte.d.ts +3 -0
  580. package/dist/components/RelationField.svelte +175 -0
  581. package/dist/components/RelationField.svelte.d.ts +16 -0
  582. package/dist/components/SectionActions.svelte +91 -0
  583. package/dist/components/SectionActions.svelte.d.ts +12 -0
  584. package/dist/components/SectionIcons.svelte +98 -0
  585. package/dist/components/SectionIcons.svelte.d.ts +15 -0
  586. package/dist/components/SectionOverview.svelte +65 -0
  587. package/dist/components/SectionOverview.svelte.d.ts +14 -0
  588. package/dist/components/SectionPage.svelte +230 -0
  589. package/dist/components/SectionPage.svelte.d.ts +7 -0
  590. package/dist/components/SettingsPanel.svelte +60 -0
  591. package/dist/components/SettingsPanel.svelte.d.ts +7 -0
  592. package/dist/components/ThemeBridge.svelte +56 -0
  593. package/dist/components/ThemeBridge.svelte.d.ts +3 -0
  594. package/dist/components/ThemeSection.svelte +167 -0
  595. package/dist/components/ThemeSection.svelte.d.ts +11 -0
  596. package/dist/components/VariantGridForm.svelte +309 -0
  597. package/dist/components/VariantGridForm.svelte.d.ts +12 -0
  598. package/dist/components/VoiceTyping.svelte +108 -0
  599. package/dist/components/VoiceTyping.svelte.d.ts +7 -0
  600. package/dist/cookbook/assemble.d.ts +16 -0
  601. package/dist/cookbook/assemble.js +29 -0
  602. package/dist/cookbook/file.d.ts +7 -0
  603. package/dist/cookbook/file.js +25 -0
  604. package/dist/cookbook/legacy.d.ts +9 -0
  605. package/dist/cookbook/legacy.js +87 -0
  606. package/dist/cookbook/migrate.d.ts +22 -0
  607. package/dist/cookbook/migrate.js +106 -0
  608. package/dist/cookbook/parse.d.ts +16 -0
  609. package/dist/cookbook/parse.js +246 -0
  610. package/dist/cookbook/storage.d.ts +45 -0
  611. package/dist/cookbook/storage.js +98 -0
  612. package/dist/cookbook/store.svelte.d.ts +94 -0
  613. package/dist/cookbook/store.svelte.js +231 -0
  614. package/dist/cookbook/types.d.ts +76 -0
  615. package/dist/cookbook/types.js +11 -0
  616. package/dist/cookbook/validate.d.ts +14 -0
  617. package/dist/cookbook/validate.js +29 -0
  618. package/dist/core/app.d.ts +37 -0
  619. package/dist/core/app.js +119 -0
  620. package/dist/core/catalog.d.ts +19 -0
  621. package/dist/core/catalog.js +9 -0
  622. package/dist/core/headless.d.ts +52 -0
  623. package/dist/core/headless.js +39 -0
  624. package/dist/core/index.d.ts +28 -0
  625. package/dist/core/index.js +28 -0
  626. package/dist/core/prompt.d.ts +38 -0
  627. package/dist/core/prompt.js +95 -0
  628. package/dist/core/reply.d.ts +60 -0
  629. package/dist/core/reply.js +89 -0
  630. package/dist/core/request.d.ts +15 -0
  631. package/dist/core/request.js +55 -0
  632. package/dist/data/children.d.ts +20 -0
  633. package/dist/data/children.js +80 -0
  634. package/dist/data/columns.d.ts +56 -0
  635. package/dist/data/columns.js +150 -0
  636. package/dist/data/context.d.ts +8 -0
  637. package/dist/data/context.js +19 -0
  638. package/dist/data/derived.d.ts +79 -0
  639. package/dist/data/derived.js +139 -0
  640. package/dist/data/display.d.ts +23 -0
  641. package/dist/data/display.js +84 -0
  642. package/dist/data/fakes.d.ts +52 -0
  643. package/dist/data/fakes.js +443 -0
  644. package/dist/data/format.d.ts +48 -0
  645. package/dist/data/format.js +121 -0
  646. package/dist/data/labels.d.ts +45 -0
  647. package/dist/data/labels.js +179 -0
  648. package/dist/data/packs.d.ts +95 -0
  649. package/dist/data/packs.js +830 -0
  650. package/dist/data/payments.d.ts +17 -0
  651. package/dist/data/payments.js +60 -0
  652. package/dist/data/planner-source.d.ts +7 -0
  653. package/dist/data/planner-source.js +32 -0
  654. package/dist/data/source.d.ts +119 -0
  655. package/dist/data/source.js +432 -0
  656. package/dist/features/catalogue.d.ts +96 -0
  657. package/dist/features/catalogue.js +225 -0
  658. package/dist/features/demo.d.ts +36 -0
  659. package/dist/features/demo.js +66 -0
  660. package/dist/features/palette.d.ts +39 -0
  661. package/dist/features/palette.js +53 -0
  662. package/dist/fields/address.d.ts +23 -0
  663. package/dist/fields/address.js +39 -0
  664. package/dist/fields/invalid.d.ts +2 -0
  665. package/dist/fields/invalid.js +8 -0
  666. package/dist/fields/modal.d.ts +7 -0
  667. package/dist/fields/modal.js +14 -0
  668. package/dist/fields/percent.d.ts +8 -0
  669. package/dist/fields/percent.js +16 -0
  670. package/dist/fields/renderer.d.ts +17 -0
  671. package/dist/fields/renderer.js +43 -0
  672. package/dist/forms/active.d.ts +16 -0
  673. package/dist/forms/active.js +24 -0
  674. package/dist/forms/fieldMap.d.ts +44 -0
  675. package/dist/forms/fieldMap.js +134 -0
  676. package/dist/forms/shared.d.ts +41 -0
  677. package/dist/forms/shared.js +138 -0
  678. package/dist/forms/stock.d.ts +28 -0
  679. package/dist/forms/stock.js +104 -0
  680. package/dist/forms/variantGrid.d.ts +83 -0
  681. package/dist/forms/variantGrid.js +283 -0
  682. package/dist/index.d.ts +17 -0
  683. package/dist/index.js +16 -0
  684. package/dist/inference/byo.svelte.d.ts +90 -0
  685. package/dist/inference/byo.svelte.js +295 -0
  686. package/dist/inference/config.d.ts +77 -0
  687. package/dist/inference/config.js +205 -0
  688. package/dist/inference/host.d.ts +40 -0
  689. package/dist/inference/host.js +57 -0
  690. package/dist/inference/openai.d.ts +59 -0
  691. package/dist/inference/openai.js +207 -0
  692. package/dist/inference/presets.d.ts +5 -0
  693. package/dist/inference/presets.js +46 -0
  694. package/dist/kitchen/client.d.ts +39 -0
  695. package/dist/kitchen/client.js +115 -0
  696. package/dist/kitchen/fragment.d.ts +30 -0
  697. package/dist/kitchen/fragment.js +49 -0
  698. package/dist/kitchen/state.svelte.d.ts +26 -0
  699. package/dist/kitchen/state.svelte.js +45 -0
  700. package/dist/library/apply.d.ts +17 -0
  701. package/dist/library/apply.js +32 -0
  702. package/dist/library/document.d.ts +12 -0
  703. package/dist/library/document.js +27 -0
  704. package/dist/library/icons.d.ts +6 -0
  705. package/dist/library/icons.js +26 -0
  706. package/dist/library/index.d.ts +8 -0
  707. package/dist/library/index.js +12 -0
  708. package/dist/library/library.json +788 -0
  709. package/dist/library/menu.d.ts +18 -0
  710. package/dist/library/menu.js +72 -0
  711. package/dist/library/state.svelte.d.ts +10 -0
  712. package/dist/library/state.svelte.js +28 -0
  713. package/dist/library/types.d.ts +57 -0
  714. package/dist/library/types.js +1 -0
  715. package/dist/overviews/definitions.d.ts +24 -0
  716. package/dist/overviews/definitions.js +97 -0
  717. package/dist/overviews/page.d.ts +21 -0
  718. package/dist/overviews/page.js +36 -0
  719. package/dist/overviews/registry.d.ts +44 -0
  720. package/dist/overviews/registry.js +191 -0
  721. package/dist/overviews/validate.d.ts +32 -0
  722. package/dist/overviews/validate.js +91 -0
  723. package/dist/planner/Planner.svelte +204 -0
  724. package/dist/planner/Planner.svelte.d.ts +4 -0
  725. package/dist/planner/app.svelte.d.ts +6 -0
  726. package/dist/planner/app.svelte.js +23 -0
  727. package/dist/planner/assistant.d.ts +46 -0
  728. package/dist/planner/assistant.js +122 -0
  729. package/dist/planner/commands/adapter.d.ts +121 -0
  730. package/dist/planner/commands/adapter.js +597 -0
  731. package/dist/planner/commands/catalog.d.ts +19 -0
  732. package/dist/planner/commands/catalog.js +54 -0
  733. package/dist/planner/commands/controller.svelte.d.ts +13 -0
  734. package/dist/planner/commands/controller.svelte.js +77 -0
  735. package/dist/planner/commands/index.d.ts +15 -0
  736. package/dist/planner/commands/index.js +15 -0
  737. package/dist/planner/commands/schemas.d.ts +25 -0
  738. package/dist/planner/commands/schemas.js +67 -0
  739. package/dist/planner/commands/slices.d.ts +18 -0
  740. package/dist/planner/commands/slices.js +49 -0
  741. package/dist/planner/commands/types.d.ts +80 -0
  742. package/dist/planner/commands/types.js +18 -0
  743. package/dist/planner/create.d.ts +4 -0
  744. package/dist/planner/create.js +22 -0
  745. package/dist/planner/instance.d.ts +15 -0
  746. package/dist/planner/instance.js +22 -0
  747. package/dist/planner/query.d.ts +16 -0
  748. package/dist/planner/query.js +28 -0
  749. package/dist/planner/selection.d.ts +15 -0
  750. package/dist/planner/selection.js +38 -0
  751. package/dist/planner/selection.svelte.d.ts +29 -0
  752. package/dist/planner/selection.svelte.js +54 -0
  753. package/dist/planner/tab.svelte.d.ts +11 -0
  754. package/dist/planner/tab.svelte.js +22 -0
  755. package/dist/planner/types.d.ts +41 -0
  756. package/dist/planner/types.js +1 -0
  757. package/dist/recipes/cards.d.ts +55 -0
  758. package/dist/recipes/cards.js +80 -0
  759. package/dist/recipes/features.d.ts +53 -0
  760. package/dist/recipes/features.js +97 -0
  761. package/dist/recipes/help/descriptions.json +373 -0
  762. package/dist/recipes/help.d.ts +121 -0
  763. package/dist/recipes/help.js +262 -0
  764. package/dist/recipes/index.d.ts +65 -0
  765. package/dist/recipes/index.js +95 -0
  766. package/dist/recipes/merge.d.ts +26 -0
  767. package/dist/recipes/merge.js +21 -0
  768. package/dist/recipes/overlay.json +409 -0
  769. package/dist/recipes/plan-data.d.ts +41 -0
  770. package/dist/recipes/plan-data.js +97 -0
  771. package/dist/recipes/plumbing.d.ts +70 -0
  772. package/dist/recipes/plumbing.js +185 -0
  773. package/dist/recipes/policy.d.ts +118 -0
  774. package/dist/recipes/policy.js +268 -0
  775. package/dist/recipes/resolve.d.ts +19 -0
  776. package/dist/recipes/resolve.js +65 -0
  777. package/dist/recipes/scope.d.ts +25 -0
  778. package/dist/recipes/scope.js +31 -0
  779. package/dist/recipes/sections.d.ts +49 -0
  780. package/dist/recipes/sections.js +84 -0
  781. package/dist/recipes/state.svelte.d.ts +67 -0
  782. package/dist/recipes/state.svelte.js +112 -0
  783. package/dist/recipes/types.d.ts +322 -0
  784. package/dist/recipes/types.js +8 -0
  785. package/dist/sections/entries.d.ts +30 -0
  786. package/dist/sections/entries.js +57 -0
  787. package/dist/sections/info.d.ts +16 -0
  788. package/dist/sections/info.js +39 -0
  789. package/dist/sections/path.d.ts +12 -0
  790. package/dist/sections/path.js +18 -0
  791. package/dist/settings/app-settings.d.ts +44 -0
  792. package/dist/settings/app-settings.js +138 -0
  793. package/dist/settings/currencies.d.ts +2 -0
  794. package/dist/settings/currencies.js +8 -0
  795. package/dist/theme/runtime.d.ts +14 -0
  796. package/dist/theme/runtime.js +27 -0
  797. package/dist/theme/theme.d.ts +47 -0
  798. package/dist/theme/theme.js +122 -0
  799. package/dist/upstream/CustomerSelect.svelte +60 -0
  800. package/dist/upstream/CustomerSelect.svelte.d.ts +17 -0
  801. package/dist/upstream/VendorSelect.svelte +60 -0
  802. package/dist/upstream/VendorSelect.svelte.d.ts +17 -0
  803. package/dist/upstream/overlay.d.ts +10 -0
  804. package/dist/upstream/overlay.js +49 -0
  805. package/dist/upstream/partySelect.d.ts +8 -0
  806. package/dist/upstream/partySelect.js +21 -0
  807. package/dist/upstream/partyTypes.d.ts +64 -0
  808. package/dist/upstream/partyTypes.js +8 -0
  809. package/dist/upstream/relations.d.ts +2 -0
  810. package/dist/upstream/relations.js +24 -0
  811. package/dist/upstream/selects.d.ts +26 -0
  812. package/dist/upstream/selects.js +20 -0
  813. package/dist/upstream/widgets.d.ts +20 -0
  814. package/dist/upstream/widgets.js +30 -0
  815. package/package.json +81 -3
@@ -0,0 +1,106 @@
1
+ import { legacyNavSectionKeys, navItemId, navSectionOf, recipeNav, recipes, } from "../recipes/index.js";
2
+ const PREFIX = 'section:';
3
+ /**
4
+ * Nav sections used to be one per group/recipe (`section:commerce.customers`,
5
+ * `section:products`); recipes now suggest shared ones (`section:sales`).
6
+ * Rewrites a saved layout's ids from the old keys to the new, once, in the
7
+ * loader. Idempotent: new ids are not old keys. Section-level hides of a
8
+ * renamed section are dropped (the merged section may hold other recipes'
9
+ * items, so one old hide must not hide them); everything else is mapped and
10
+ * de-duplicated, and ids nothing refers to any more are harmless to the shell.
11
+ */
12
+ export function migrateLegacySections(layout, keys = legacyNavSectionKeys(recipes)) {
13
+ const olds = Object.keys(keys).sort((a, b) => b.length - a.length);
14
+ if (!olds.length)
15
+ return layout;
16
+ /** `section:<old>` -> `section:<new>`; `section:<old>:rest` likewise. */
17
+ const mapId = (id) => {
18
+ if (!id.startsWith(PREFIX))
19
+ return id;
20
+ const rest = id.slice(PREFIX.length);
21
+ for (const old of olds) {
22
+ if (rest === old)
23
+ return `${PREFIX}${keys[old]}`;
24
+ if (rest.startsWith(`${old}:`)) {
25
+ return `${PREFIX}${keys[old]}${rest.slice(old.length)}`;
26
+ }
27
+ }
28
+ return id;
29
+ };
30
+ const isRenamedSection = (id) => id.startsWith(PREFIX) && olds.includes(id.slice(PREFIX.length));
31
+ const unique = (ids) => [...new Set(ids)];
32
+ const next = { ...layout };
33
+ if (layout.sectionOrder)
34
+ next.sectionOrder = unique(layout.sectionOrder.map(mapId));
35
+ if (layout.hidden) {
36
+ next.hidden = unique(layout.hidden.filter((id) => !isRenamedSection(id)).map(mapId));
37
+ }
38
+ if (layout.itemOrder) {
39
+ const merged = {};
40
+ for (const [section, ids] of Object.entries(layout.itemOrder)) {
41
+ const key = mapId(section);
42
+ merged[key] = unique([...(merged[key] ?? []), ...ids.map(mapId)]);
43
+ }
44
+ next.itemOrder = merged;
45
+ }
46
+ if (layout.moved) {
47
+ next.moved = Object.fromEntries(Object.entries(layout.moved).map(([item, to]) => [
48
+ mapId(item),
49
+ mapId(to),
50
+ ]));
51
+ }
52
+ return next;
53
+ }
54
+ /**
55
+ * Old item ids were `section:<nav>:<pkg>:<Model>:<label>` (features
56
+ * `section:more:<pkg>:<Model>`); they are now `item:<pkg>:<Model>[:<key>]`
57
+ * (`navItemId`). Section ids (`section:<id>`, no further parts) are unchanged.
58
+ * Rewrites every id the layout holds (itemOrder, hidden, moved, items), keys
59
+ * and values alike. An entry declaring a `key` is matched exactly through the
60
+ * recipes; any other old id maps by its package and model. Idempotent (`item:`
61
+ * ids are left alone) and unknown ids stay as they are.
62
+ */
63
+ export function migrateNavItemIds(layout, source = recipes) {
64
+ const keyed = new Map();
65
+ for (const recipe of source) {
66
+ const section = navSectionOf(recipe).id;
67
+ for (const entry of recipeNav(recipe)) {
68
+ if (!entry.key)
69
+ continue;
70
+ keyed.set(`${PREFIX}${section}:${entry.packageId}:${entry.model.name}:${entry.label}`, navItemId(entry.packageId, entry.model.name, entry.key));
71
+ }
72
+ }
73
+ const mapId = (id) => {
74
+ const exact = keyed.get(id);
75
+ if (exact)
76
+ return exact;
77
+ if (!id.startsWith(PREFIX))
78
+ return id;
79
+ // section : pkg : Model [: label]; a section id has no further parts.
80
+ const parts = id.slice(PREFIX.length).split(':');
81
+ if (parts.length < 3 || !parts[1] || !parts[2])
82
+ return id;
83
+ return navItemId(parts[1], parts[2]);
84
+ };
85
+ const unique = (ids) => [...new Set(ids)];
86
+ const remap = (record, value) => {
87
+ const out = {};
88
+ for (const [key, v] of Object.entries(record)) {
89
+ const next = mapId(key);
90
+ if (!(next in out))
91
+ out[next] = value(v);
92
+ }
93
+ return out;
94
+ };
95
+ const next = { ...layout };
96
+ if (layout.hidden)
97
+ next.hidden = unique(layout.hidden.map(mapId));
98
+ if (layout.itemOrder) {
99
+ next.itemOrder = remap(layout.itemOrder, (ids) => unique(ids.map(mapId)));
100
+ }
101
+ if (layout.moved)
102
+ next.moved = remap(layout.moved, mapId);
103
+ if (layout.items)
104
+ next.items = remap(layout.items, (item) => item);
105
+ return next;
106
+ }
@@ -0,0 +1,16 @@
1
+ import type { ShellLayout } from '@happyvertical/smrt-svelte/workspace/layout';
2
+ import type { ParsedOverviews } from '../overviews/validate.ts';
3
+ import { type CookbookResult } from './types.ts';
4
+ /** Check a cookbook's `overviews` value; null when it is not an object. */
5
+ export type OverviewParser = (input: unknown, layout: ShellLayout | undefined) => ParsedOverviews | null;
6
+ export interface ParseCookbookOptions {
7
+ dropUnknownRecipes?: boolean;
8
+ /** The page-customisation check; absent: `overviews` are dropped and reported. */
9
+ overviews?: OverviewParser;
10
+ }
11
+ /**
12
+ * Check an unknown value (a parsed file or stored JSON) and return a
13
+ * normalised cookbook, or one clear sentence saying why not. Strict on
14
+ * purpose: nothing is silently dropped, so a bad file never half-applies.
15
+ */
16
+ export declare function parseCookbookWith(input: unknown, options?: ParseCookbookOptions): CookbookResult;
@@ -0,0 +1,246 @@
1
+ import { recipesById } from "../recipes/index.js";
2
+ import { withRequirements } from "../recipes/resolve.js";
3
+ import { isSettingRow } from "../settings/app-settings.js";
4
+ import { parseTheme } from "../theme/theme.js";
5
+ import { migrateLegacySections, migrateNavItemIds } from "./migrate.js";
6
+ import { COOKBOOK_SCHEMA, COOKBOOK_VERSION, PREVIOUS_SCHEMA, } from "./types.js";
7
+ const VISIBILITIES = new Set(['basic', 'advanced', 'hidden']);
8
+ const SURFACES = new Set(['api', 'mcp', 'cli']);
9
+ const fail = (error) => ({ ok: false, error });
10
+ const isObject = (value) => typeof value === 'object' && value !== null && !Array.isArray(value);
11
+ const isStrings = (value) => Array.isArray(value) && value.every((v) => typeof v === 'string');
12
+ /** One policy row, or the reason it is not one. */
13
+ function parseRow(value, at) {
14
+ if (!isObject(value))
15
+ return `${at} is not an object`;
16
+ const { objectRef, fieldName } = value;
17
+ if (typeof objectRef !== 'string' || !objectRef) {
18
+ return `${at} has no objectRef`;
19
+ }
20
+ if (typeof fieldName !== 'string' || !fieldName) {
21
+ return `${at} has no fieldName`;
22
+ }
23
+ if (value.scopeType !== 'app')
24
+ return `${at} must have scopeType "app"`;
25
+ const row = { objectRef, fieldName, scopeType: 'app' };
26
+ for (const key of ['defaultValue', 'help', 'label']) {
27
+ const v = value[key];
28
+ if (v === undefined)
29
+ continue;
30
+ if (typeof v !== 'string' && v !== null)
31
+ return `${at}.${key} is invalid`;
32
+ row[key] = v;
33
+ }
34
+ if (value.visibility !== undefined) {
35
+ const v = value.visibility;
36
+ if (v !== null && !(typeof v === 'string' && VISIBILITIES.has(v))) {
37
+ return `${at}.visibility is invalid`;
38
+ }
39
+ row.visibility = v;
40
+ }
41
+ if (value.displayOrder !== undefined) {
42
+ const v = value.displayOrder;
43
+ if (v !== null && !(typeof v === 'number' && Number.isFinite(v))) {
44
+ return `${at}.displayOrder is invalid`;
45
+ }
46
+ row.displayOrder = v;
47
+ }
48
+ if (value.locked !== undefined) {
49
+ if (value.locked !== null && typeof value.locked !== 'boolean') {
50
+ return `${at}.locked is invalid`;
51
+ }
52
+ row.locked = value.locked;
53
+ }
54
+ return row;
55
+ }
56
+ /** Strictly checked here; the shell's `normalizeShellLayout` is lenient. */
57
+ function parseLayout(value) {
58
+ if (!isObject(value) || value.version !== 1) {
59
+ return 'layout must be an object with version 1';
60
+ }
61
+ for (const key of ['sectionOrder', 'hidden']) {
62
+ if (value[key] !== undefined && !isStrings(value[key])) {
63
+ return `layout.${key} must be a list of strings`;
64
+ }
65
+ }
66
+ for (const key of ['itemOrder', 'moved', 'panels']) {
67
+ if (value[key] !== undefined && !isObject(value[key])) {
68
+ return `layout.${key} must be an object`;
69
+ }
70
+ }
71
+ const itemOrder = value.itemOrder;
72
+ if (isObject(itemOrder)) {
73
+ for (const [key, ids] of Object.entries(itemOrder)) {
74
+ if (key === '__proto__' || !isStrings(ids))
75
+ return `layout.itemOrder.${key} must be a list of strings`;
76
+ }
77
+ }
78
+ const moved = value.moved;
79
+ if (isObject(moved)) {
80
+ for (const [key, to] of Object.entries(moved)) {
81
+ if (key === '__proto__' || typeof to !== 'string')
82
+ return `layout.moved.${key} must be a string`;
83
+ }
84
+ }
85
+ return value;
86
+ }
87
+ /**
88
+ * Check an unknown value (a parsed file or stored JSON) and return a
89
+ * normalised cookbook, or one clear sentence saying why not. Strict on
90
+ * purpose: nothing is silently dropped, so a bad file never half-applies.
91
+ */
92
+ export function parseCookbookWith(input, options = {}) {
93
+ if (!isObject(input))
94
+ return fail('This is not a cookbook: expected a JSON object.');
95
+ if (input.$schema !== undefined &&
96
+ input.$schema !== COOKBOOK_SCHEMA &&
97
+ input.$schema !== PREVIOUS_SCHEMA) {
98
+ return fail('This is not a cookbook: its "$schema" is not a cookbook schema this planner knows.');
99
+ }
100
+ const { version } = input;
101
+ if (version === undefined) {
102
+ return fail('This is not a cookbook: it has no "version".');
103
+ }
104
+ if (typeof version !== 'number' || !Number.isInteger(version)) {
105
+ return fail('The cookbook "version" must be a whole number.');
106
+ }
107
+ if (version > COOKBOOK_VERSION) {
108
+ return fail(`This cookbook is version ${version}, newer than this planner understands (${COOKBOOK_VERSION}). Update the planner or re-export it.`);
109
+ }
110
+ if (version !== COOKBOOK_VERSION) {
111
+ return fail(`Cookbook version ${version} is not supported (this planner reads version ${COOKBOOK_VERSION}).`);
112
+ }
113
+ if (!isStrings(input.recipes)) {
114
+ return fail('The cookbook "recipes" must be a list of recipe ids.');
115
+ }
116
+ // Ids this version does not know (renamed, removed, or from a newer
117
+ // catalog) are kept in the document, not applied: dropping them here would
118
+ // make the loss permanent on the next save. The store surfaces them.
119
+ const unknown = input.recipes.filter((id) => !recipesById.has(id));
120
+ const recipes = [
121
+ ...new Set([
122
+ ...withRequirements(input.recipes.filter((id) => recipesById.has(id)), recipesById),
123
+ ...unknown,
124
+ ]),
125
+ ].sort();
126
+ // Absent in files from before features: read as none.
127
+ let features = [];
128
+ if (input.features !== undefined) {
129
+ if (!isStrings(input.features)) {
130
+ return fail('The cookbook "features" must be a list of model names.');
131
+ }
132
+ const seen = new Set();
133
+ for (const name of input.features) {
134
+ if (seen.has(name)) {
135
+ return fail(`The cookbook lists the feature ${name} more than once.`);
136
+ }
137
+ seen.add(name);
138
+ }
139
+ // Features this catalog lacks are kept like unknown recipes.
140
+ features = [...input.features].sort();
141
+ }
142
+ // Options only mean something for models an added recipe or feature covers, as in the
143
+ // app itself; dropping the rest keeps export then import an exact round trip.
144
+ const covered = new Set([
145
+ ...recipes.flatMap((id) => recipesById.get(id)?.models ?? []),
146
+ ...features,
147
+ ]);
148
+ if (!Array.isArray(input.policies)) {
149
+ return fail('The cookbook "policies" must be a list.');
150
+ }
151
+ const policies = [];
152
+ for (const [index, value] of input.policies.entries()) {
153
+ const row = parseRow(value, `policies[${index}]`);
154
+ if (typeof row === 'string')
155
+ return fail(`Invalid cookbook: ${row}.`);
156
+ if (covered.has(row.objectRef) || isSettingRow(row))
157
+ policies.push(row);
158
+ }
159
+ let exposure;
160
+ if (input.exposure !== undefined) {
161
+ if (!isObject(input.exposure)) {
162
+ return fail('The cookbook "exposure" must be an object.');
163
+ }
164
+ const entries = [];
165
+ for (const [ref, surfaces] of Object.entries(input.exposure)) {
166
+ if (!isStrings(surfaces) || !surfaces.every((s) => SURFACES.has(s))) {
167
+ return fail(`Invalid cookbook: exposure for ${ref} must list api, mcp or cli.`);
168
+ }
169
+ if (surfaces.length && covered.has(ref)) {
170
+ entries.push([ref, [...surfaces]]);
171
+ }
172
+ }
173
+ // fromEntries defines own keys, so a "__proto__" ref cannot rewrite the prototype.
174
+ exposure = Object.fromEntries(entries);
175
+ }
176
+ let layout;
177
+ if (input.layout !== undefined) {
178
+ const parsed = parseLayout(input.layout);
179
+ if (typeof parsed === 'string')
180
+ return fail(`Invalid cookbook: ${parsed}.`);
181
+ layout = migrateNavItemIds(migrateLegacySections(parsed));
182
+ }
183
+ let theme;
184
+ if (input.theme !== undefined) {
185
+ const parsed = parseTheme(input.theme);
186
+ if (parsed.ok)
187
+ theme = parsed.theme;
188
+ // A saved value from an older build may name a preset this one lacks:
189
+ // keep the rest rather than discarding the visitor's work.
190
+ else if (!options.dropUnknownRecipes)
191
+ return fail(parsed.error);
192
+ }
193
+ // Untrusted: every override is checked against its page's definition; bad
194
+ // widgets and unknown pages are dropped and reported, never rendered.
195
+ let overviews;
196
+ let dropped = [];
197
+ if (input.overviews !== undefined) {
198
+ if (!options.overviews) {
199
+ if (!isObject(input.overviews)) {
200
+ return fail('The cookbook "overviews" must be an object.');
201
+ }
202
+ if (Object.keys(input.overviews).length) {
203
+ dropped = [
204
+ 'Page customisations (overviews) are not kept by this host and were dropped.',
205
+ ];
206
+ }
207
+ }
208
+ else {
209
+ const parsed = options.overviews(input.overviews, layout);
210
+ if (!parsed) {
211
+ return fail('The cookbook "overviews" must be an object.');
212
+ }
213
+ overviews = parsed.overviews;
214
+ dropped = parsed.dropped;
215
+ }
216
+ }
217
+ const cookbook = {
218
+ $schema: COOKBOOK_SCHEMA,
219
+ version: COOKBOOK_VERSION,
220
+ recipes,
221
+ features,
222
+ policies,
223
+ };
224
+ for (const key of ['name', 'description']) {
225
+ const value = input[key];
226
+ if (value === undefined)
227
+ continue;
228
+ if (typeof value !== 'string') {
229
+ return fail(`The cookbook "${key}" must be a string.`);
230
+ }
231
+ if (value.trim())
232
+ cookbook[key] = value.trim();
233
+ }
234
+ if (exposure && Object.keys(exposure).length)
235
+ cookbook.exposure = exposure;
236
+ if (layout)
237
+ cookbook.layout = layout;
238
+ if (theme)
239
+ cookbook.theme = theme;
240
+ if (overviews && Object.keys(overviews).length) {
241
+ cookbook.overviews = overviews;
242
+ }
243
+ return dropped.length
244
+ ? { ok: true, cookbook, dropped }
245
+ : { ok: true, cookbook };
246
+ }
@@ -0,0 +1,45 @@
1
+ import type { Cookbook } from './types.ts';
2
+ /**
3
+ * The cookbook's localStorage key. The version is in the key so a future
4
+ * format reads the old key and migrates it; an unknown version is never
5
+ * guessed at. (`smrt-planner:cookbook` alone is the library selection.)
6
+ */
7
+ export declare const STORAGE_KEY = "smrt-planner:cookbook-doc:v1";
8
+ /**
9
+ * Where the document lived while it was called a blueprint. It is read once
10
+ * when the new key is empty and kept as the backup until the next save.
11
+ */
12
+ export declare const PREVIOUS_STORAGE_KEY = "smrt-planner:blueprint:v1";
13
+ /** A value that could not be read is kept here, never silently overwritten. */
14
+ export declare const UNREADABLE_KEY = "smrt-planner:cookbook-doc:unreadable";
15
+ /** The cookbook a legacy link replaced, so opening a link loses nothing. */
16
+ export declare const BACKUP_KEY = "smrt-planner:cookbook-doc:backup";
17
+ export type LoadOutcome = {
18
+ status: 'unavailable';
19
+ } | {
20
+ status: 'empty';
21
+ } | {
22
+ status: 'loaded';
23
+ cookbook: Cookbook;
24
+ /**
25
+ * The previous (blueprint) key still holds a value. It is kept as a
26
+ * backup and removed by the first successful save of the new key.
27
+ */
28
+ previousKept: boolean;
29
+ /** Overview customisations dropped as invalid, one sentence each. */
30
+ dropped?: string[];
31
+ } | {
32
+ status: 'unreadable';
33
+ reason: string;
34
+ /** Whether the raw value was copied to UNREADABLE_KEY. */
35
+ keptAside: boolean;
36
+ };
37
+ /** The browser's localStorage, or null when reaching for it throws. */
38
+ export declare function browserStorage(): Storage | null;
39
+ /** Read the saved cookbook. Never throws. */
40
+ export declare function loadCookbook(storage: Storage | null): LoadOutcome;
41
+ /** Write a value under a key; false when storage refused. Never throws. */
42
+ export declare function writeKey(storage: Storage | null, key: string, value: string): boolean;
43
+ /** Remove a key; false when storage refused. Never throws. */
44
+ export declare function removeKey(storage: Storage | null, key: string): boolean;
45
+ export declare function saveCookbook(storage: Storage | null, cookbook: Cookbook): boolean;
@@ -0,0 +1,98 @@
1
+ import { parseCookbookText } from "./validate.js";
2
+ /**
3
+ * The cookbook's localStorage key. The version is in the key so a future
4
+ * format reads the old key and migrates it; an unknown version is never
5
+ * guessed at. (`smrt-planner:cookbook` alone is the library selection.)
6
+ */
7
+ export const STORAGE_KEY = 'smrt-planner:cookbook-doc:v1';
8
+ /**
9
+ * Where the document lived while it was called a blueprint. It is read once
10
+ * when the new key is empty and kept as the backup until the next save.
11
+ */
12
+ export const PREVIOUS_STORAGE_KEY = 'smrt-planner:blueprint:v1';
13
+ /** A value that could not be read is kept here, never silently overwritten. */
14
+ export const UNREADABLE_KEY = 'smrt-planner:cookbook-doc:unreadable';
15
+ /** The cookbook a legacy link replaced, so opening a link loses nothing. */
16
+ export const BACKUP_KEY = 'smrt-planner:cookbook-doc:backup';
17
+ /** The browser's localStorage, or null when reaching for it throws. */
18
+ export function browserStorage() {
19
+ try {
20
+ return globalThis.localStorage ?? null;
21
+ }
22
+ catch {
23
+ return null;
24
+ }
25
+ }
26
+ /** Read the saved cookbook. Never throws. */
27
+ export function loadCookbook(storage) {
28
+ if (!storage)
29
+ return { status: 'unavailable' };
30
+ let raw;
31
+ try {
32
+ raw = storage.getItem(STORAGE_KEY);
33
+ }
34
+ catch {
35
+ return { status: 'unavailable' };
36
+ }
37
+ let previous = null;
38
+ try {
39
+ previous = storage.getItem(PREVIOUS_STORAGE_KEY);
40
+ }
41
+ catch {
42
+ // Treated as absent.
43
+ }
44
+ // Nothing under the new key: migrate the value saved while it was a blueprint.
45
+ const fromPrevious = raw === null && previous !== null;
46
+ const source = fromPrevious ? previous : raw;
47
+ if (source === null)
48
+ return { status: 'empty' };
49
+ // A saved cookbook from an older build may name recipes this one no longer
50
+ // has: they are kept in the document (and noticed by the store), and a
51
+ // theme preset this build lacks is dropped rather than discarding the rest.
52
+ const parsed = parseCookbookText(source, { dropUnknownRecipes: true });
53
+ if (parsed.ok) {
54
+ // Write the migrated document under the new key now; the old key stays as
55
+ // a backup until the next successful save. If this write fails the old
56
+ // key simply remains the only copy.
57
+ if (fromPrevious) {
58
+ writeKey(storage, STORAGE_KEY, JSON.stringify(parsed.cookbook));
59
+ }
60
+ return {
61
+ status: 'loaded',
62
+ cookbook: parsed.cookbook,
63
+ previousKept: previous !== null,
64
+ ...(parsed.dropped ? { dropped: parsed.dropped } : {}),
65
+ };
66
+ }
67
+ raw = source;
68
+ // Keep what we could not read; the next save would otherwise destroy it.
69
+ const keptAside = writeKey(storage, UNREADABLE_KEY, raw);
70
+ return { status: 'unreadable', reason: parsed.error, keptAside };
71
+ }
72
+ /** Write a value under a key; false when storage refused. Never throws. */
73
+ export function writeKey(storage, key, value) {
74
+ if (!storage)
75
+ return false;
76
+ try {
77
+ storage.setItem(key, value);
78
+ return true;
79
+ }
80
+ catch {
81
+ return false;
82
+ }
83
+ }
84
+ /** Remove a key; false when storage refused. Never throws. */
85
+ export function removeKey(storage, key) {
86
+ if (!storage)
87
+ return false;
88
+ try {
89
+ storage.removeItem(key);
90
+ return true;
91
+ }
92
+ catch {
93
+ return false;
94
+ }
95
+ }
96
+ export function saveCookbook(storage, cookbook) {
97
+ return writeKey(storage, STORAGE_KEY, JSON.stringify(cookbook));
98
+ }
@@ -0,0 +1,94 @@
1
+ import type { OverviewOverride } from '@happyvertical/smrt-svelte/overview/server';
2
+ import { type ShellLayout } from '@happyvertical/smrt-svelte/workspace/layout';
3
+ import { type AppSettings } from '../settings/app-settings.ts';
4
+ import { type ThemeSetting } from '../theme/theme.ts';
5
+ import type { Cookbook, CookbookResult } from './types.ts';
6
+ /** Where the planner's AppShell keeps its own settings (panel states, sizes). */
7
+ export declare const SHELL_STORAGE_KEY = "smrt-planner:shell";
8
+ export declare const SAVE_DELAY_MS = 300;
9
+ /** `ok`: saved. `memory`: storage unavailable or refusing, working in memory. */
10
+ export type PersistState = 'unknown' | 'ok' | 'memory';
11
+ /**
12
+ * The single source of truth for what a visitor has built. Recipes and
13
+ * options stay in `recipeState` (the one store views read); this adds the
14
+ * `layout` field and the persistence around both. `snapshot()` is the
15
+ * Cookbook, whether it is saved, exported or compared.
16
+ */
17
+ export declare class CookbookStore {
18
+ /** The shell layout, owned here and passed to `AppShell`. */
19
+ layout: ShellLayout | undefined;
20
+ /** The app's name and description (`set_name`); not shown in the UI yet. */
21
+ name: string | undefined;
22
+ description: string | undefined;
23
+ /** The app's theme; undefined is the default. The shell applies it live. */
24
+ theme: ThemeSetting | undefined;
25
+ /**
26
+ * Customised overview pages by overview id, canonical overrides only. Each
27
+ * page's `createOverview` reads its entry and writes edits back here.
28
+ */
29
+ overviews: Record<string, OverviewOverride>;
30
+ persist: PersistState;
31
+ /** False until the saved cookbook has been read; nothing saves before. */
32
+ loaded: boolean;
33
+ /** Why the saved cookbook was not used, if it was not. */
34
+ loadNotice: string;
35
+ /**
36
+ * True when saving would destroy the only copy of something (an unreadable
37
+ * value that could not be kept aside, or a saved cookbook a legacy link
38
+ * replaced without a backup). Nothing is written until the visitor imports
39
+ * or resets.
40
+ */
41
+ private saveBlocked;
42
+ /** A migrated legacy link whose data is not safely stored: keep the URL. */
43
+ keepLegacyUrl: boolean;
44
+ /** A cookbook was chosen (cookbook, import) before the saved one was read. */
45
+ private replacedBeforeLoad;
46
+ /** The pre-rename key still holds a backup; the next good save removes it. */
47
+ private previousKept;
48
+ private storage;
49
+ private timer;
50
+ snapshot(): Cookbook;
51
+ /** A page's stored override, or `null` when it is on its defaults. */
52
+ overview(id: string): OverviewOverride | null;
53
+ /**
54
+ * An edit from an overview page: the controller's canonical override, or
55
+ * `null` (back to the defaults), which removes the page's key.
56
+ */
57
+ setOverview(id: string, override: OverviewOverride | null): void;
58
+ /** An edit from the shell or its layout editor; an empty one clears it. */
59
+ setLayout(next: ShellLayout): void;
60
+ /** Replace everything from a validated cookbook. */
61
+ apply(cookbook: Cookbook): void;
62
+ /**
63
+ * A sentence naming recipes and features the loaded cookbook has that this
64
+ * version does not know (they are kept, not applied), or ''.
65
+ */
66
+ get unavailableNotice(): string;
67
+ /** Remove the unavailable ids from the cookbook, on the visitor's say. */
68
+ removeUnavailable(): void;
69
+ /** Change the theme; the default (or an empty one) clears it. */
70
+ setTheme(next: ThemeSetting | undefined): void;
71
+ /** The app settings (currency, tax rate, payment terms), read from the policy rows. */
72
+ settings(): AppSettings;
73
+ /** Write the settings as policy rows. Existing records are untouched. */
74
+ setSettings(settings: AppSettings): void;
75
+ /** Replace on the visitor's say-so (an import): saving is allowed again. */
76
+ replace(cookbook: Cookbook): void;
77
+ /** Back to an empty cookbook, and the shell's own settings to defaults. */
78
+ reset(): void;
79
+ /** Validate and apply JSON text, e.g. a chosen file. Applies nothing on failure. */
80
+ importText(text: string): CookbookResult;
81
+ /**
82
+ * Read the saved cookbook, then migrate a legacy `?r=` / `?o=` link into it.
83
+ * Call once in the browser, before `loaded` lets saving start. Returns true
84
+ * when a legacy link was imported, so the caller can clean the URL.
85
+ */
86
+ hydrate(search: string, storage?: Storage | null): boolean;
87
+ /** Save now. Falls back to memory-only (and says so) if storage refuses. */
88
+ save(): boolean;
89
+ /** Save soon; many quick edits make one write. */
90
+ scheduleSave(): void;
91
+ /** Save any pending change now (page hide). */
92
+ flush(): void;
93
+ }
94
+ export declare const cookbookStore: CookbookStore;