@happyvertical/smrt-planner 0.0.2 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (752) hide show
  1. package/README.md +81 -8
  2. package/app/404.html +42 -49
  3. package/app/_app/immutable/assets/0.DUow1OzM.css +1 -0
  4. package/app/_app/immutable/assets/10.CdYxvH4G.css +1 -0
  5. package/app/_app/immutable/assets/11.nOT5Z4Fv.css +1 -0
  6. package/app/_app/immutable/assets/12.F7A7zP4J.css +1 -0
  7. package/app/_app/immutable/assets/13.JoySu8W5.css +1 -0
  8. package/app/_app/immutable/assets/14.nsp62-4b.css +1 -0
  9. package/app/_app/immutable/assets/2.CbPiqdz5.css +1 -0
  10. package/app/_app/immutable/assets/3.D518dbB5.css +1 -0
  11. package/app/_app/immutable/assets/4.B3vt1gMJ.css +1 -0
  12. package/app/_app/immutable/assets/AiSetup.4fXjMpTZ.css +1 -0
  13. package/app/_app/immutable/assets/AppShell.DOvXbUZo.css +1 -0
  14. package/app/_app/immutable/assets/ConnectTools.DTleL8YA.css +1 -0
  15. package/app/_app/immutable/assets/FieldMapForm.C8SZ3t4N.css +1 -0
  16. package/app/_app/immutable/assets/ModelPage.DbXvPbHE.css +1 -0
  17. package/app/_app/immutable/assets/SectionActions.BE1CPmxk.css +1 -0
  18. package/app/_app/immutable/assets/SectionIcons.BGFcFuOf.css +1 -0
  19. package/app/_app/immutable/assets/SegmentedControl.BkyuoCEJ.css +1 -0
  20. package/app/_app/immutable/assets/app.eM0k786r.css +1 -0
  21. package/app/_app/immutable/assets/currency-metadata.DDyu8_ub.css +1 -0
  22. package/app/_app/immutable/assets/data.bGq43K60.css +1 -0
  23. package/app/_app/immutable/assets/feedback.xBpOq9ef.css +1 -0
  24. package/app/_app/immutable/assets/forms.B3_bbIMe.css +1 -0
  25. package/app/_app/immutable/assets/labels.BiuUjqHs.css +1 -0
  26. package/app/_app/immutable/assets/percent.DbwvwMhf.css +1 -0
  27. package/app/_app/immutable/assets/state.CJipYvSU.css +1 -0
  28. package/app/_app/immutable/assets/webmcp-ui-context.BnR-DUfO.css +1 -0
  29. package/app/_app/immutable/assets/workspace.B5Xq-5pJ.css +1 -0
  30. package/app/_app/immutable/chunks/1ElZWh_R.js +10 -0
  31. package/app/_app/immutable/chunks/B-CpwO-j.js +1 -0
  32. package/app/_app/immutable/chunks/{BnRri03M.js → B7KB-rhH.js} +1 -1
  33. package/app/_app/immutable/chunks/BUhghcIm.js +1 -0
  34. package/app/_app/immutable/chunks/BV3NwM01.js +1 -0
  35. package/app/_app/immutable/chunks/BZVZZ6VY.js +1 -0
  36. package/app/_app/immutable/chunks/Ba1g71Sq.js +1 -0
  37. package/app/_app/immutable/chunks/BeJD7_hy.js +1 -0
  38. package/app/_app/immutable/chunks/BiO_bqNH.js +2 -0
  39. package/app/_app/immutable/chunks/{DkR8_Ws6.js → BqBuCJB_.js} +2 -2
  40. package/app/_app/immutable/chunks/BsJoBmTA.js +1 -0
  41. package/app/_app/immutable/chunks/Bxbz6_Mb.js +1 -0
  42. package/app/_app/immutable/chunks/Bz5uCkjV.js +2 -0
  43. package/app/_app/immutable/chunks/BzMfoxBk.js +1 -0
  44. package/app/_app/immutable/chunks/CF6zSg_o.js +2 -0
  45. package/app/_app/immutable/chunks/CFL0B6dk.js +1 -0
  46. package/app/_app/immutable/chunks/CRu55ZTy.js +4 -0
  47. package/app/_app/immutable/chunks/{CyUMm_Wp.js → Cv2EcCr0.js} +1 -1
  48. package/app/_app/immutable/chunks/D-3Ri0zJ.js +1 -0
  49. package/app/_app/immutable/chunks/{BWPhGFHl.js → D0FW0z6R.js} +1 -1
  50. package/app/_app/immutable/chunks/D7d5GssF.js +1 -0
  51. package/app/_app/immutable/chunks/DCsSRJsN.js +1 -0
  52. package/app/_app/immutable/chunks/DGqV6_5v.js +1 -0
  53. package/app/_app/immutable/chunks/DNSRTkf6.js +11 -0
  54. package/app/_app/immutable/chunks/DQNX_XPY.js +1 -0
  55. package/app/_app/immutable/chunks/DSyIMN4M.js +1 -0
  56. package/app/_app/immutable/chunks/DUTtmM1Y.js +1 -0
  57. package/app/_app/immutable/chunks/DYuawOB3.js +980 -0
  58. package/app/_app/immutable/chunks/DfCLzLZc.js +1 -0
  59. package/app/_app/immutable/chunks/Dh5fne6n.js +1 -0
  60. package/app/_app/immutable/chunks/LruoUXGC.js +1 -0
  61. package/app/_app/immutable/chunks/ZLqixH7j.js +9 -0
  62. package/app/_app/immutable/chunks/_pYwB_Eb.js +4 -0
  63. package/app/_app/immutable/chunks/aoU3lIZI.js +1 -0
  64. package/app/_app/immutable/chunks/c57ZlocB.js +24 -0
  65. package/app/_app/immutable/chunks/h8ppmjOm.js +1 -0
  66. package/app/_app/immutable/chunks/jhcy_jeO.js +1 -0
  67. package/app/_app/immutable/chunks/vNEnXNLV.js +3 -0
  68. package/app/_app/immutable/chunks/vwntRvfV.js +1 -0
  69. package/app/_app/immutable/entry/app.D5LoTsNA.js +2 -0
  70. package/app/_app/immutable/entry/start.Sb_s0NGC.js +1 -0
  71. package/app/_app/immutable/nodes/0.Cuo9-RQc.js +9 -0
  72. package/app/_app/immutable/nodes/1.BW8Ar5T3.js +1 -0
  73. package/app/_app/immutable/nodes/10.CpLYjN7r.js +3 -0
  74. package/app/_app/immutable/nodes/11.BMPKD4M3.js +1 -0
  75. package/app/_app/immutable/nodes/12.WYpy0AHE.js +4 -0
  76. package/app/_app/immutable/nodes/13.BYo05X9B.js +1 -0
  77. package/app/_app/immutable/nodes/14.DN0MT3KB.js +1 -0
  78. package/app/_app/immutable/nodes/2.DM6k_pqu.js +24 -0
  79. package/app/_app/immutable/nodes/3.YgEwJ-vF.js +1 -0
  80. package/app/_app/immutable/nodes/4.A3Y6Lax0.js +1 -0
  81. package/app/_app/immutable/nodes/5.D9Vd85hG.js +1 -0
  82. package/app/_app/immutable/nodes/6.C5c56bSW.js +1 -0
  83. package/app/_app/immutable/nodes/7.CDBMbYlD.js +1 -0
  84. package/app/_app/immutable/nodes/8.8olDkDou.js +1 -0
  85. package/app/_app/immutable/nodes/9.CWgx__8Z.js +1 -0
  86. package/app/_app/version.json +1 -1
  87. package/app/advanced-styles/index.html +84 -0
  88. package/app/ai/index.html +60 -52
  89. package/app/blueprint/index.html +46 -53
  90. package/app/cookbook/index.html +46 -53
  91. package/app/index.html +92 -64
  92. package/app/m/ads/AdDeliveryTier/index.html +52 -59
  93. package/app/m/ads/AdEvent/index.html +52 -59
  94. package/app/m/ads/AdFormat/index.html +52 -59
  95. package/app/m/ads/AdGroup/index.html +52 -59
  96. package/app/m/ads/AdVariation/index.html +52 -59
  97. package/app/m/analytics/AnalyticsDataStream/index.html +52 -59
  98. package/app/m/analytics/AnalyticsEvent/index.html +52 -59
  99. package/app/m/analytics/AnalyticsProperty/index.html +52 -59
  100. package/app/m/analytics/AnalyticsReport/index.html +52 -59
  101. package/app/m/approvals/ApprovalEvent/index.html +52 -59
  102. package/app/m/approvals/ApprovalPolicy/index.html +52 -59
  103. package/app/m/approvals/ApprovalRequest/index.html +52 -59
  104. package/app/m/assets/Asset/attachments/index.html +91 -0
  105. package/app/m/assets/Asset/index.html +52 -59
  106. package/app/m/assets/AssetAssociation/index.html +53 -60
  107. package/app/m/assets/AssetMetafield/index.html +52 -59
  108. package/app/m/assets/AssetStatus/index.html +52 -59
  109. package/app/m/assets/AssetType/index.html +52 -59
  110. package/app/m/assets/Folder/index.html +52 -59
  111. package/app/m/chat/AgentSession/index.html +52 -59
  112. package/app/m/chat/ChatMessage/index.html +53 -60
  113. package/app/m/chat/ChatParticipant/index.html +53 -60
  114. package/app/m/chat/ChatReaction/index.html +52 -59
  115. package/app/m/chat/ChatRoom/index.html +52 -59
  116. package/app/m/chat/ChatThread/index.html +53 -60
  117. package/app/m/chat/VoiceGatewayTurn/index.html +52 -59
  118. package/app/m/chat/VoiceSession/index.html +52 -59
  119. package/app/m/commerce/Agreement/index.html +52 -59
  120. package/app/m/commerce/Cart/index.html +52 -59
  121. package/app/m/commerce/Contract/index.html +52 -59
  122. package/app/m/commerce/ContractLineItem/index.html +53 -60
  123. package/app/m/commerce/Customer/index.html +52 -59
  124. package/app/m/commerce/DocumentTax/index.html +89 -0
  125. package/app/m/commerce/Estimate/index.html +52 -59
  126. package/app/m/commerce/Fulfillment/index.html +52 -59
  127. package/app/m/commerce/FulfillmentLineItem/index.html +53 -60
  128. package/app/m/commerce/Invoice/index.html +52 -59
  129. package/app/m/commerce/InvoiceLineItem/index.html +53 -60
  130. package/app/m/commerce/Lease/index.html +52 -59
  131. package/app/m/commerce/LicenseSale/index.html +52 -59
  132. package/app/m/commerce/Order/index.html +52 -59
  133. package/app/m/commerce/Payment/index.html +52 -59
  134. package/app/m/commerce/PaymentAllocation/index.html +53 -60
  135. package/app/m/commerce/PaymentInstrument/index.html +52 -59
  136. package/app/m/commerce/PaymentIntent/index.html +52 -59
  137. package/app/m/commerce/Payout/index.html +52 -59
  138. package/app/m/commerce/ProductionOrder/index.html +52 -59
  139. package/app/m/commerce/PurchaseContract/index.html +89 -0
  140. package/app/m/commerce/PurchaseOrder/index.html +52 -59
  141. package/app/m/commerce/SalesContract/index.html +89 -0
  142. package/app/m/commerce/SupplierQuote/index.html +89 -0
  143. package/app/m/commerce/TaxCode/index.html +89 -0
  144. package/app/m/commerce/TaxComponent/index.html +89 -0
  145. package/app/m/commerce/TaxSettings/index.html +89 -0
  146. package/app/m/commerce/TaxSummaryReport/index.html +89 -0
  147. package/app/m/commerce/Vendor/index.html +52 -59
  148. package/app/m/commerce/WholesaleOrder/index.html +52 -59
  149. package/app/m/content/Content/index.html +52 -59
  150. package/app/m/content/ContentContribution/index.html +52 -59
  151. package/app/m/content/ContentContributionAttachment/index.html +52 -59
  152. package/app/m/content/ContentContributionRevision/index.html +52 -59
  153. package/app/m/content/ContentContributionType/index.html +52 -59
  154. package/app/m/content/ContentContributor/index.html +52 -59
  155. package/app/m/content/ContentCorrection/index.html +52 -59
  156. package/app/m/content/ContentFeedSource/index.html +52 -59
  157. package/app/m/content/ContentGovernanceAssignment/index.html +52 -59
  158. package/app/m/content/ContentGovernancePolicy/index.html +52 -59
  159. package/app/m/content/ContentGovernanceProfile/index.html +52 -59
  160. package/app/m/content/ContentReference/index.html +52 -59
  161. package/app/m/content/ContentReview/index.html +52 -59
  162. package/app/m/content/ContentVersion/index.html +52 -59
  163. package/app/m/events/Event/index.html +52 -59
  164. package/app/m/events/EventParticipant/index.html +53 -60
  165. package/app/m/events/EventSeries/index.html +52 -59
  166. package/app/m/events/EventType/index.html +52 -59
  167. package/app/m/expenses/Expense/index.html +89 -0
  168. package/app/m/facts/Fact/index.html +52 -59
  169. package/app/m/facts/FactContent/index.html +52 -59
  170. package/app/m/facts/FactEvidence/index.html +52 -59
  171. package/app/m/facts/FactSource/index.html +52 -59
  172. package/app/m/facts/FactSubject/index.html +52 -59
  173. package/app/m/facts/FactTag/index.html +52 -59
  174. package/app/m/fields/FieldPolicy/index.html +52 -59
  175. package/app/m/fields/FieldPolicySuggestion/index.html +52 -59
  176. package/app/m/fields/FieldUsageCounter/index.html +52 -59
  177. package/app/m/images/Image/index.html +52 -59
  178. package/app/m/inventory/InventoryLocation/index.html +52 -59
  179. package/app/m/inventory/StockLevel/index.html +52 -59
  180. package/app/m/inventory/StockMovement/index.html +52 -59
  181. package/app/m/ledgers/Account/index.html +52 -59
  182. package/app/m/ledgers/Journal/index.html +52 -59
  183. package/app/m/ledgers/JournalEntry/index.html +53 -60
  184. package/app/m/manufacturing/Assembly/index.html +52 -59
  185. package/app/m/manufacturing/BillOfMaterials/index.html +52 -59
  186. package/app/m/manufacturing/BomLine/index.html +52 -59
  187. package/app/m/manufacturing/Operation/index.html +52 -59
  188. package/app/m/manufacturing/ProductionRun/index.html +52 -59
  189. package/app/m/manufacturing/ProductionRunCompletion/index.html +52 -59
  190. package/app/m/manufacturing/RoutingStep/index.html +52 -59
  191. package/app/m/marketing/Campaign/index.html +52 -59
  192. package/app/m/marketing/CampaignChannel/index.html +52 -59
  193. package/app/m/marketing/CampaignMetricSnapshot/index.html +52 -59
  194. package/app/m/messages/Account/index.html +52 -59
  195. package/app/m/messages/Attachment/index.html +52 -59
  196. package/app/m/messages/Blacklist/index.html +52 -59
  197. package/app/m/messages/Email/failed-sends/index.html +54 -59
  198. package/app/m/messages/Email/index.html +52 -59
  199. package/app/m/messages/Email/mailbox/index.html +54 -59
  200. package/app/m/messages/EmailAccount/index.html +52 -59
  201. package/app/m/messages/EmailAttachment/index.html +89 -0
  202. package/app/m/messages/EmailFolder/index.html +52 -59
  203. package/app/m/messages/Message/index.html +52 -59
  204. package/app/m/messages/MessagingEndpoint/index.html +52 -59
  205. package/app/m/messages/PersonaMessageRoute/index.html +52 -59
  206. package/app/m/messages/SlackAccount/index.html +52 -59
  207. package/app/m/messages/SlackMessage/index.html +52 -59
  208. package/app/m/messages/TelegramAccount/index.html +52 -59
  209. package/app/m/messages/Tweet/index.html +52 -59
  210. package/app/m/messages/TwitterAccount/index.html +52 -59
  211. package/app/m/messages/Whitelist/index.html +52 -59
  212. package/app/m/messages/ZulipAccount/index.html +52 -59
  213. package/app/m/places/Place/index.html +52 -59
  214. package/app/m/places/PlaceType/index.html +52 -59
  215. package/app/m/products/Category/index.html +52 -59
  216. package/app/m/products/Material/index.html +52 -59
  217. package/app/m/products/Product/index.html +52 -59
  218. package/app/m/products/Product/ingredients/index.html +54 -59
  219. package/app/m/products/ProductVariant/index.html +53 -60
  220. package/app/m/products/Sku/index.html +53 -60
  221. package/app/m/profiles/ApiKey/index.html +52 -59
  222. package/app/m/profiles/Bot/index.html +52 -59
  223. package/app/m/profiles/MagicLinkToken/index.html +52 -59
  224. package/app/m/profiles/NostrIdentity/index.html +52 -59
  225. package/app/m/profiles/OidcIdentity/index.html +52 -59
  226. package/app/m/profiles/Organization/index.html +52 -59
  227. package/app/m/profiles/Person/index.html +52 -59
  228. package/app/m/profiles/Profile/index.html +52 -59
  229. package/app/m/profiles/ProfileMetadata/index.html +52 -59
  230. package/app/m/profiles/ProfileMetafield/index.html +52 -59
  231. package/app/m/profiles/ProfileRelationship/index.html +52 -59
  232. package/app/m/profiles/ProfileRelationshipTerm/index.html +52 -59
  233. package/app/m/profiles/ProfileRelationshipType/index.html +52 -59
  234. package/app/m/profiles/ProfileType/index.html +52 -59
  235. package/app/m/projects/Comment/index.html +53 -60
  236. package/app/m/projects/Issue/index.html +52 -59
  237. package/app/m/projects/Label/index.html +52 -59
  238. package/app/m/projects/Project/index.html +52 -59
  239. package/app/m/projects/ProjectIntegration/index.html +52 -59
  240. package/app/m/projects/PullRequest/index.html +52 -59
  241. package/app/m/projects/Repository/index.html +52 -59
  242. package/app/m/properties/Property/index.html +52 -59
  243. package/app/m/properties/Zone/index.html +52 -59
  244. package/app/m/reports/RuntimeReport/index.html +52 -59
  245. package/app/m/reports/SmrtPrincipalReportRefreshTask/index.html +52 -59
  246. package/app/m/reports/SmrtReportLock/index.html +52 -59
  247. package/app/m/reports/SmrtReportRefreshTask/index.html +52 -59
  248. package/app/m/reports/SmrtReportRun/index.html +52 -59
  249. package/app/m/reports/SmrtReportSchedule/index.html +52 -59
  250. package/app/m/reports/SmrtReportWatermark/index.html +52 -59
  251. package/app/m/sales/AttributionException/index.html +52 -59
  252. package/app/m/sales/AttributionPolicy/index.html +52 -59
  253. package/app/m/sales/Commission/index.html +52 -59
  254. package/app/m/sales/CommissionAdjustment/index.html +52 -59
  255. package/app/m/sales/CommissionPayout/index.html +52 -59
  256. package/app/m/sales/CommissionPlan/index.html +52 -59
  257. package/app/m/sales/Earner/index.html +52 -59
  258. package/app/m/sales/EarnerSourceAttribution/index.html +52 -59
  259. package/app/m/sales/EarningEvent/index.html +52 -59
  260. package/app/m/sales/ExecutedAgreement/index.html +52 -59
  261. package/app/m/sales/Lead/index.html +52 -59
  262. package/app/m/sales/Opportunity/index.html +52 -59
  263. package/app/m/sales/OpportunityConversion/index.html +52 -59
  264. package/app/m/sales/PipelineDefinition/index.html +52 -59
  265. package/app/m/sales/PipelineStage/index.html +53 -60
  266. package/app/m/sales/Referral/index.html +52 -59
  267. package/app/m/sales/ReferralAgreement/index.html +52 -59
  268. package/app/m/sales/ReferralLink/index.html +52 -59
  269. package/app/m/sales/ReferralProgram/index.html +52 -59
  270. package/app/m/sales/ReferralTermSnapshot/index.html +52 -59
  271. package/app/m/sales/ReferralTouch/index.html +52 -59
  272. package/app/m/sales/Referrer/index.html +52 -59
  273. package/app/m/sales/SalesActivity/index.html +52 -59
  274. package/app/m/sales/SalesRepresentative/index.html +52 -59
  275. package/app/m/sites/Site/index.html +52 -59
  276. package/app/m/sites/SiteAgentBinding/index.html +52 -59
  277. package/app/m/social/OAuthState/index.html +52 -59
  278. package/app/m/social/SocialAccount/index.html +52 -59
  279. package/app/m/social/SocialPost/index.html +52 -59
  280. package/app/m/social/SocialPostAnalyticsSnapshot/index.html +52 -59
  281. package/app/m/subscriptions/BillingAdjustment/index.html +52 -59
  282. package/app/m/subscriptions/ClientCharge/index.html +52 -59
  283. package/app/m/subscriptions/CreditGrant/index.html +52 -59
  284. package/app/m/subscriptions/PricingRule/index.html +52 -59
  285. package/app/m/subscriptions/RetailCharge/index.html +52 -59
  286. package/app/m/subscriptions/SpendingPolicy/index.html +52 -59
  287. package/app/m/subscriptions/SubscriptionPlan/index.html +52 -59
  288. package/app/m/subscriptions/TenantSubscription/index.html +52 -59
  289. package/app/m/subscriptions/TenantUsageMetric/index.html +52 -59
  290. package/app/m/support/ServiceTimeEntry/index.html +52 -59
  291. package/app/m/support/SupportAiRun/index.html +52 -59
  292. package/app/m/support/SupportAvailability/index.html +52 -59
  293. package/app/m/support/SupportCase/index.html +52 -59
  294. package/app/m/support/SupportCaseEvent/index.html +52 -59
  295. package/app/m/support/SupportChannelBinding/index.html +52 -59
  296. package/app/m/support/SupportCharge/index.html +52 -59
  297. package/app/m/support/SupportCompensation/index.html +52 -59
  298. package/app/m/support/SupportCompensationPlan/index.html +52 -59
  299. package/app/m/support/SupportEscalation/index.html +52 -59
  300. package/app/m/support/SupportInteraction/index.html +52 -59
  301. package/app/m/support/SupportPlan/index.html +52 -59
  302. package/app/m/support/SupportPolicy/index.html +52 -59
  303. package/app/m/support/SupportQualification/index.html +52 -59
  304. package/app/m/support/SupportServiceTarget/index.html +52 -59
  305. package/app/m/support/SupportSpecialist/index.html +52 -59
  306. package/app/m/support/SupportWorkLink/index.html +52 -59
  307. package/app/m/tags/Tag/index.html +52 -59
  308. package/app/m/tags/TagAlias/index.html +52 -59
  309. package/app/m/timesheets/AttendanceBreak/index.html +52 -59
  310. package/app/m/timesheets/AttendancePunch/index.html +52 -59
  311. package/app/m/timesheets/AttendanceSegment/index.html +89 -0
  312. package/app/m/timesheets/ServiceChargeSnapshot/index.html +52 -59
  313. package/app/m/timesheets/ServiceCompensationSnapshot/index.html +52 -59
  314. package/app/m/timesheets/ServiceTimeEntry/index.html +52 -59
  315. package/app/m/users/Group/index.html +52 -59
  316. package/app/m/users/GroupMember/index.html +52 -59
  317. package/app/m/users/GroupRole/index.html +52 -59
  318. package/app/m/users/Membership/index.html +53 -60
  319. package/app/m/users/MembershipOverride/index.html +52 -59
  320. package/app/m/users/Permission/index.html +52 -59
  321. package/app/m/users/Role/index.html +52 -59
  322. package/app/m/users/RolePermission/index.html +52 -59
  323. package/app/m/users/Session/index.html +52 -59
  324. package/app/m/users/Tenant/index.html +52 -59
  325. package/app/m/users/TenantIntegration/index.html +52 -59
  326. package/app/m/users/TenantPermissionOverride/index.html +52 -59
  327. package/app/m/users/User/index.html +52 -59
  328. package/app/m/video/Character/index.html +52 -59
  329. package/app/m/video/CharacterAsset/index.html +52 -59
  330. package/app/m/video/CompositeJob/index.html +52 -59
  331. package/app/m/video/Performer/index.html +52 -59
  332. package/app/m/video/PerformerAsset/index.html +52 -59
  333. package/app/m/video/Scene/index.html +52 -59
  334. package/app/m/video/SceneAsset/index.html +52 -59
  335. package/app/m/video/VideoComposition/index.html +52 -59
  336. package/app/m/video/VideoCompositionAsset/index.html +52 -59
  337. package/app/m/video/VideoSequence/index.html +52 -59
  338. package/app/m/video/VideoSequenceAsset/index.html +52 -59
  339. package/app/m/video/VideoShot/index.html +52 -59
  340. package/app/m/video/VideoShotAsset/index.html +52 -59
  341. package/app/m/video/VideoShotCharacter/index.html +52 -59
  342. package/app/m/video/VideoWorkflow/index.html +52 -59
  343. package/app/m/voice/VoiceOutput/index.html +52 -59
  344. package/app/m/voice/VoiceProfile/index.html +52 -59
  345. package/app/m/voice/VoiceSample/index.html +52 -59
  346. package/app/packages/ads/index.html +50 -57
  347. package/app/packages/analytics/index.html +50 -57
  348. package/app/packages/approvals/index.html +50 -57
  349. package/app/packages/assets/index.html +50 -57
  350. package/app/packages/chat/index.html +50 -57
  351. package/app/packages/comments/index.html +50 -57
  352. package/app/packages/commerce/index.html +50 -57
  353. package/app/packages/content/index.html +50 -57
  354. package/app/packages/events/index.html +50 -57
  355. package/app/packages/expenses/index.html +50 -57
  356. package/app/packages/facts/index.html +50 -57
  357. package/app/packages/fields/index.html +50 -57
  358. package/app/packages/human-resources/index.html +50 -57
  359. package/app/packages/images/index.html +50 -57
  360. package/app/packages/index.html +49 -55
  361. package/app/packages/ingestion/index.html +85 -0
  362. package/app/packages/inventory/index.html +50 -57
  363. package/app/packages/ledgers/index.html +50 -57
  364. package/app/packages/manufacturing/index.html +50 -57
  365. package/app/packages/marketing/index.html +50 -57
  366. package/app/packages/messages/index.html +50 -57
  367. package/app/packages/places/index.html +50 -57
  368. package/app/packages/preferences/index.html +50 -57
  369. package/app/packages/products/index.html +50 -57
  370. package/app/packages/profiles/index.html +50 -57
  371. package/app/packages/projects/index.html +50 -57
  372. package/app/packages/properties/index.html +50 -57
  373. package/app/packages/reports/index.html +50 -57
  374. package/app/packages/sales/index.html +50 -57
  375. package/app/packages/sites/index.html +50 -57
  376. package/app/packages/social/index.html +50 -57
  377. package/app/packages/subscriptions/index.html +50 -57
  378. package/app/packages/support/index.html +50 -57
  379. package/app/packages/tags/index.html +50 -57
  380. package/app/packages/timesheets/index.html +50 -57
  381. package/app/packages/users/index.html +50 -57
  382. package/app/packages/video/index.html +50 -57
  383. package/app/packages/voice/index.html +50 -57
  384. package/app/packages/webhooks/index.html +85 -0
  385. package/app/recipes/account-access/help/index.html +52 -57
  386. package/app/recipes/account-access/index.html +57 -59
  387. package/app/recipes/activity/help/index.html +52 -57
  388. package/app/recipes/activity/index.html +57 -59
  389. package/app/recipes/agreements/help/index.html +52 -57
  390. package/app/recipes/agreements/index.html +57 -59
  391. package/app/recipes/analytics.reports/help/index.html +52 -57
  392. package/app/recipes/analytics.reports/index.html +57 -59
  393. package/app/recipes/assets/help/index.html +52 -57
  394. package/app/recipes/assets/index.html +57 -59
  395. package/app/recipes/billing/help/index.html +52 -57
  396. package/app/recipes/billing/index.html +57 -59
  397. package/app/recipes/chat.assistant/help/index.html +52 -57
  398. package/app/recipes/chat.assistant/index.html +57 -59
  399. package/app/recipes/comments/help/index.html +52 -57
  400. package/app/recipes/comments/index.html +57 -59
  401. package/app/recipes/commerce.customers/help/index.html +52 -57
  402. package/app/recipes/commerce.customers/index.html +57 -59
  403. package/app/recipes/commerce.estimates/help/index.html +52 -57
  404. package/app/recipes/commerce.estimates/index.html +57 -59
  405. package/app/recipes/commerce.purchases/help/index.html +52 -57
  406. package/app/recipes/commerce.purchases/index.html +57 -59
  407. package/app/recipes/commerce.sales/help/index.html +52 -57
  408. package/app/recipes/commerce.sales/index.html +57 -59
  409. package/app/recipes/commerce.vendors/help/index.html +52 -57
  410. package/app/recipes/commerce.vendors/index.html +57 -59
  411. package/app/recipes/commerce.wholesale/help/index.html +52 -57
  412. package/app/recipes/commerce.wholesale/index.html +57 -59
  413. package/app/recipes/events.calendar/help/index.html +52 -57
  414. package/app/recipes/events.calendar/index.html +57 -59
  415. package/app/recipes/expenses.tracking/help/index.html +88 -0
  416. package/app/recipes/expenses.tracking/index.html +92 -0
  417. package/app/recipes/fields.form-customization/help/index.html +52 -57
  418. package/app/recipes/fields.form-customization/index.html +57 -59
  419. package/app/recipes/ingestion/help/index.html +88 -0
  420. package/app/recipes/ingestion/index.html +93 -0
  421. package/app/recipes/integrations/help/index.html +88 -0
  422. package/app/recipes/integrations/index.html +92 -0
  423. package/app/recipes/inventory.stock/help/index.html +52 -57
  424. package/app/recipes/inventory.stock/index.html +57 -59
  425. package/app/recipes/ledgers.bookkeeping/help/index.html +52 -57
  426. package/app/recipes/ledgers.bookkeeping/index.html +57 -59
  427. package/app/recipes/messages/help/index.html +52 -57
  428. package/app/recipes/messages/index.html +57 -59
  429. package/app/recipes/products/help/index.html +52 -57
  430. package/app/recipes/products/index.html +57 -59
  431. package/app/recipes/projects.tracker/help/index.html +52 -57
  432. package/app/recipes/projects.tracker/index.html +57 -59
  433. package/app/recipes/reports.materialized/help/index.html +52 -57
  434. package/app/recipes/reports.materialized/index.html +57 -59
  435. package/app/recipes/reports.runtime/help/index.html +88 -0
  436. package/app/recipes/reports.runtime/index.html +92 -0
  437. package/app/recipes/sales.pipeline/help/index.html +52 -57
  438. package/app/recipes/sales.pipeline/index.html +57 -59
  439. package/app/recipes/tags.taxonomy/help/index.html +52 -57
  440. package/app/recipes/tags.taxonomy/index.html +57 -59
  441. package/app/recipes/team-collaboration/help/index.html +52 -57
  442. package/app/recipes/team-collaboration/index.html +57 -59
  443. package/app/recipes/timesheets.time-entries/help/index.html +88 -0
  444. package/app/recipes/timesheets.time-entries/index.html +92 -0
  445. package/app/s/custom-accounts/index.html +82 -0
  446. package/app/s/custom-appointments/index.html +82 -0
  447. package/app/s/custom-billing/index.html +47 -54
  448. package/app/s/custom-buying/index.html +47 -54
  449. package/app/s/custom-checkout/index.html +82 -0
  450. package/app/s/custom-classes/index.html +47 -54
  451. package/app/s/custom-clients/index.html +82 -0
  452. package/app/s/custom-events/index.html +82 -0
  453. package/app/s/custom-fleet/index.html +82 -0
  454. package/app/s/custom-giving/index.html +82 -0
  455. package/app/s/custom-jobs/index.html +47 -54
  456. package/app/s/custom-kitchen/index.html +47 -54
  457. package/app/s/custom-material/index.html +47 -54
  458. package/app/s/custom-meetings/index.html +82 -0
  459. package/app/s/custom-members/index.html +47 -54
  460. package/app/s/custom-parts/index.html +47 -54
  461. package/app/s/custom-rentals/index.html +82 -0
  462. package/app/s/custom-roastery/index.html +82 -0
  463. package/app/s/custom-schedule/index.html +47 -54
  464. package/app/s/custom-shelf/index.html +82 -0
  465. package/app/s/custom-shop/index.html +47 -54
  466. package/app/s/custom-wholesale/index.html +47 -54
  467. package/app/s/custom-work/index.html +82 -0
  468. package/app/s/custom-yard/index.html +82 -0
  469. package/app/s/section-access-control/index.html +47 -54
  470. package/app/s/section-account-security/index.html +47 -54
  471. package/app/s/section-accounting/index.html +47 -54
  472. package/app/s/section-activity/index.html +47 -54
  473. package/app/s/section-agreements/index.html +47 -54
  474. package/app/s/section-analytics/index.html +47 -54
  475. package/app/s/section-assets/index.html +47 -54
  476. package/app/s/section-billing/index.html +47 -54
  477. package/app/s/section-calendar/index.html +47 -54
  478. package/app/s/section-catalog/index.html +47 -54
  479. package/app/s/section-chat.assistant/index.html +47 -54
  480. package/app/s/section-comments/index.html +47 -54
  481. package/app/s/section-fields.form-customization/index.html +47 -54
  482. package/app/s/section-ingestion/index.html +82 -0
  483. package/app/s/section-integrations/index.html +82 -0
  484. package/app/s/section-messages/index.html +47 -54
  485. package/app/s/section-more/index.html +47 -54
  486. package/app/s/section-operations/index.html +47 -54
  487. package/app/s/section-projects/index.html +47 -54
  488. package/app/s/section-purchasing/index.html +47 -54
  489. package/app/s/section-reports.materialized/index.html +47 -54
  490. package/app/s/section-reports.runtime/index.html +82 -0
  491. package/app/s/section-sales/index.html +47 -54
  492. package/app/s/section-taxonomy/index.html +47 -54
  493. package/app/s/section-team/index.html +47 -54
  494. package/app/s/section-work/index.html +82 -0
  495. package/dist/ai/state.svelte.d.ts +13 -0
  496. package/dist/ai/state.svelte.js +33 -0
  497. package/dist/assistant/change.d.ts +14 -3
  498. package/dist/assistant/change.js +26 -3
  499. package/dist/assistant/engine.js +5 -1
  500. package/dist/assistant/prompt.js +7 -3
  501. package/dist/catalog/catalog.json +11263 -14455
  502. package/dist/catalog/generate/exclusions.d.ts +2 -0
  503. package/dist/catalog/generate/exclusions.js +14 -0
  504. package/dist/catalog/generate/extract.js +28 -7
  505. package/dist/catalog/types.d.ts +7 -0
  506. package/dist/components/AdvancedStyles.svelte +138 -0
  507. package/dist/components/AdvancedStyles.svelte.d.ts +6 -0
  508. package/dist/components/AiModelsPage.svelte +40 -0
  509. package/dist/components/AiModelsPage.svelte.d.ts +7 -0
  510. package/dist/components/AiSetup.svelte +9 -6
  511. package/dist/components/AiStatusIcons.svelte +8 -5
  512. package/dist/components/AppSettings.svelte +105 -1
  513. package/dist/components/BrowserAssistant.svelte +16 -17
  514. package/dist/components/BrowserAssistant.svelte.d.ts +2 -0
  515. package/dist/components/ChildRecords.svelte +61 -14
  516. package/dist/components/ChildRecords.svelte.d.ts +1 -0
  517. package/dist/components/ConnectTools.svelte +5 -2
  518. package/dist/components/CookbooksPanel.svelte +56 -33
  519. package/dist/components/CopyButton.svelte +65 -0
  520. package/dist/components/CopyButton.svelte.d.ts +24 -0
  521. package/dist/components/ExportPanel.svelte +292 -57
  522. package/dist/components/ExportPanel.svelte.d.ts +10 -1
  523. package/dist/components/FeatureCard.svelte +21 -10
  524. package/dist/components/FeaturesPanel.svelte +4 -1
  525. package/dist/components/FieldInput.svelte +6 -3
  526. package/dist/components/FieldMapForm.svelte +6 -10
  527. package/dist/components/FieldMapForm.svelte.d.ts +1 -0
  528. package/dist/components/FormWorkspace.svelte +80 -9
  529. package/dist/components/FormWorkspace.svelte.d.ts +1 -0
  530. package/dist/components/HeaderIconLink.svelte +86 -0
  531. package/dist/components/HeaderIconLink.svelte.d.ts +14 -0
  532. package/dist/components/HelpView.svelte +3 -0
  533. package/dist/components/ModelOptions.svelte +13 -2
  534. package/dist/components/ModelPage.svelte +33 -5
  535. package/dist/components/ModelPage.svelte.d.ts +4 -0
  536. package/dist/components/ModelWorkspace.svelte +148 -50
  537. package/dist/components/ModelWorkspace.svelte.d.ts +4 -0
  538. package/dist/components/PackagePage.svelte +96 -0
  539. package/dist/components/PackagePage.svelte.d.ts +9 -0
  540. package/dist/components/ProductMedia.svelte +95 -0
  541. package/dist/components/ProductMedia.svelte.d.ts +10 -0
  542. package/dist/components/RecipeCards.svelte +13 -1
  543. package/dist/components/RecipeHelp.svelte +3 -0
  544. package/dist/components/RecipeOptions.svelte +13 -1
  545. package/dist/components/RecordFeatures.svelte +22 -8
  546. package/dist/components/RecordView.svelte +354 -0
  547. package/dist/components/RecordView.svelte.d.ts +14 -0
  548. package/dist/components/RelationField.svelte +5 -2
  549. package/dist/components/SectionActions.svelte +8 -5
  550. package/dist/components/SectionHeading.svelte +63 -0
  551. package/dist/components/SectionHeading.svelte.d.ts +11 -0
  552. package/dist/components/SectionIcons.svelte +15 -3
  553. package/dist/components/SectionOverview.svelte +33 -3
  554. package/dist/components/SectionOverview.svelte.d.ts +4 -0
  555. package/dist/components/SectionPage.svelte +25 -165
  556. package/dist/components/SectionView.svelte +172 -0
  557. package/dist/components/SectionView.svelte.d.ts +18 -0
  558. package/dist/components/SettingsPanel.svelte +3 -9
  559. package/dist/components/SettingsPanel.svelte.d.ts +1 -5
  560. package/dist/components/ThemeBridge.svelte +80 -4
  561. package/dist/components/ThemeBridge.svelte.d.ts +5 -1
  562. package/dist/components/ThemeSection.svelte +208 -117
  563. package/dist/components/ThemeSection.svelte.d.ts +3 -7
  564. package/dist/components/VariantGridForm.svelte +9 -13
  565. package/dist/components/VariantGridForm.svelte.d.ts +1 -0
  566. package/dist/components/VoiceTyping.svelte +3 -0
  567. package/dist/cookbook/describe.d.ts +29 -0
  568. package/dist/cookbook/describe.js +164 -0
  569. package/dist/cookbook/file.d.ts +6 -0
  570. package/dist/cookbook/file.js +18 -4
  571. package/dist/cookbook/prompt.d.ts +49 -0
  572. package/dist/cookbook/prompt.js +96 -0
  573. package/dist/cookbook/store.svelte.d.ts +13 -0
  574. package/dist/cookbook/store.svelte.js +36 -8
  575. package/dist/core/prompt.js +10 -1
  576. package/dist/core/reply.d.ts +6 -1
  577. package/dist/data/children.d.ts +50 -6
  578. package/dist/data/children.js +146 -16
  579. package/dist/data/derived.d.ts +37 -29
  580. package/dist/data/derived.js +49 -30
  581. package/dist/data/display.d.ts +21 -8
  582. package/dist/data/display.js +74 -11
  583. package/dist/data/fakes.d.ts +48 -9
  584. package/dist/data/fakes.js +146 -22
  585. package/dist/data/labels.d.ts +7 -2
  586. package/dist/data/labels.js +12 -2
  587. package/dist/data/list-sort.d.ts +8 -0
  588. package/dist/data/list-sort.js +45 -0
  589. package/dist/data/money.d.ts +225 -0
  590. package/dist/data/money.js +411 -0
  591. package/dist/data/packs.d.ts +13 -0
  592. package/dist/data/packs.js +1224 -0
  593. package/dist/data/planner-source.js +120 -3
  594. package/dist/data/source.d.ts +13 -2
  595. package/dist/data/source.js +274 -40
  596. package/dist/features/palette.d.ts +2 -0
  597. package/dist/features/palette.js +1 -1
  598. package/dist/forms/stock.d.ts +1 -1
  599. package/dist/forms/stock.js +3 -1
  600. package/dist/index.d.ts +7 -2
  601. package/dist/index.js +6 -1
  602. package/dist/kitchen/LiveKitchenBridge.svelte +73 -0
  603. package/dist/kitchen/LiveKitchenBridge.svelte.d.ts +8 -0
  604. package/dist/kitchen/live.d.ts +7 -0
  605. package/dist/kitchen/live.js +51 -0
  606. package/dist/library/icons.js +34 -0
  607. package/dist/library/library.json +1546 -15
  608. package/dist/library/pending.json +5 -0
  609. package/dist/library/types.d.ts +4 -0
  610. package/dist/motion/tokens.d.ts +6 -0
  611. package/dist/motion/tokens.js +32 -0
  612. package/dist/motion/view-transition.d.ts +13 -0
  613. package/dist/motion/view-transition.js +17 -0
  614. package/dist/overviews/definitions.d.ts +41 -2
  615. package/dist/overviews/definitions.js +111 -4
  616. package/dist/overviews/models.d.ts +10 -0
  617. package/dist/overviews/models.js +19 -0
  618. package/dist/overviews/registry.d.ts +92 -5
  619. package/dist/overviews/registry.js +468 -58
  620. package/dist/overviews/validate.js +2 -2
  621. package/dist/planner/Planner.svelte +374 -166
  622. package/dist/planner/PlannerControls.svelte +255 -0
  623. package/dist/planner/PlannerControls.svelte.d.ts +17 -0
  624. package/dist/planner/PlannerLifecycle.svelte +73 -0
  625. package/dist/planner/PlannerLifecycle.svelte.d.ts +9 -0
  626. package/dist/planner/app.svelte.d.ts +12 -2
  627. package/dist/planner/app.svelte.js +13 -3
  628. package/dist/planner/assistant.js +20 -2
  629. package/dist/planner/commands/adapter.js +9 -2
  630. package/dist/planner/commands/types.d.ts +1 -1
  631. package/dist/planner/commands/types.js +1 -0
  632. package/dist/planner/header-icons.d.ts +12 -0
  633. package/dist/planner/header-icons.js +12 -0
  634. package/dist/planner/host/HostPlanner.svelte +70 -0
  635. package/dist/planner/host/HostPlanner.svelte.d.ts +17 -0
  636. package/dist/planner/host/session.svelte.d.ts +28 -0
  637. package/dist/planner/host/session.svelte.js +186 -0
  638. package/dist/planner/routes.d.ts +49 -0
  639. package/dist/planner/routes.js +64 -0
  640. package/dist/planner/shell.d.ts +40 -0
  641. package/dist/planner/shell.js +56 -0
  642. package/dist/planner/tab.svelte.d.ts +6 -3
  643. package/dist/planner/tab.svelte.js +11 -4
  644. package/dist/planner/title.d.ts +15 -0
  645. package/dist/planner/title.js +21 -0
  646. package/dist/planner/title.svelte.d.ts +6 -0
  647. package/dist/planner/title.svelte.js +11 -0
  648. package/dist/planner/types.d.ts +39 -7
  649. package/dist/products/media.d.ts +20 -0
  650. package/dist/products/media.js +65 -0
  651. package/dist/recipes/help/descriptions.json +1 -3
  652. package/dist/recipes/index.d.ts +2 -0
  653. package/dist/recipes/index.js +6 -0
  654. package/dist/recipes/plumbing.d.ts +35 -1
  655. package/dist/recipes/plumbing.js +74 -0
  656. package/dist/screens/definition.d.ts +35 -0
  657. package/dist/screens/definition.js +132 -0
  658. package/dist/screens/relations.d.ts +17 -0
  659. package/dist/screens/relations.js +98 -0
  660. package/dist/screens/totals.d.ts +37 -0
  661. package/dist/screens/totals.js +65 -0
  662. package/dist/sections/info.d.ts +1 -1
  663. package/dist/sections/info.js +2 -2
  664. package/dist/settings/app-settings.d.ts +17 -1
  665. package/dist/settings/app-settings.js +40 -3
  666. package/dist/smrt-version.d.ts +2 -0
  667. package/dist/smrt-version.js +4 -0
  668. package/dist/styles/planner-forms.css +53 -0
  669. package/dist/styles/planner-lists.css +43 -0
  670. package/dist/theme/css-highlight.d.ts +6 -0
  671. package/dist/theme/css-highlight.js +34 -0
  672. package/dist/theme/custom-css.svelte.d.ts +34 -0
  673. package/dist/theme/custom-css.svelte.js +246 -0
  674. package/dist/theme/runtime.js +25 -5
  675. package/dist/theme/theme.d.ts +26 -3
  676. package/dist/theme/theme.js +70 -2
  677. package/dist/upstream/overlay.d.ts +14 -5
  678. package/dist/upstream/overlay.js +20 -2
  679. package/package.json +12 -6
  680. package/app/_app/immutable/assets/0.B5zXkXe_.css +0 -1
  681. package/app/_app/immutable/assets/10.hpcnxvK1.css +0 -1
  682. package/app/_app/immutable/assets/11.D7zoXfVV.css +0 -1
  683. package/app/_app/immutable/assets/12.CPobm1ED.css +0 -1
  684. package/app/_app/immutable/assets/2.CyaWdRdI.css +0 -1
  685. package/app/_app/immutable/assets/3.BlPQOes8.css +0 -1
  686. package/app/_app/immutable/assets/8.2gQeKBp_.css +0 -1
  687. package/app/_app/immutable/assets/9.HOPT4xtg.css +0 -1
  688. package/app/_app/immutable/assets/AiSetup.Cb22AigN.css +0 -1
  689. package/app/_app/immutable/assets/Button.DkP0qkG9.css +0 -1
  690. package/app/_app/immutable/assets/ConnectTools.BgIJOOGW.css +0 -1
  691. package/app/_app/immutable/assets/FieldMapForm.BCU-4pO4.css +0 -1
  692. package/app/_app/immutable/assets/ModelPage.Dd3LcMta.css +0 -1
  693. package/app/_app/immutable/assets/SectionActions.CTkVuNMF.css +0 -1
  694. package/app/_app/immutable/assets/SectionIcons.5Udq9vN-.css +0 -1
  695. package/app/_app/immutable/assets/SegmentedControl.B8SrQacd.css +0 -1
  696. package/app/_app/immutable/assets/dist.C5nHBk_O.css +0 -1
  697. package/app/_app/immutable/assets/feedback.BVKAwFck.css +0 -1
  698. package/app/_app/immutable/assets/forms.BChZ2RWM.css +0 -1
  699. package/app/_app/immutable/assets/percent.LH0z-ozZ.css +0 -1
  700. package/app/_app/immutable/assets/store.CGDwHkkF.css +0 -1
  701. package/app/_app/immutable/assets/ui.B1A1Zl2p.css +0 -1
  702. package/app/_app/immutable/assets/workspace.BIMkuZDb.css +0 -1
  703. package/app/_app/immutable/chunks/1okeBSoq.js +0 -1
  704. package/app/_app/immutable/chunks/2jFBkS1C.js +0 -1
  705. package/app/_app/immutable/chunks/6P9zxrzU.js +0 -1
  706. package/app/_app/immutable/chunks/B32EWqI8.js +0 -9
  707. package/app/_app/immutable/chunks/B4Kevpe0.js +0 -1
  708. package/app/_app/immutable/chunks/BKwRT_1p.js +0 -1
  709. package/app/_app/immutable/chunks/BS4h9ES-.js +0 -1
  710. package/app/_app/immutable/chunks/CMhpRMKg.js +0 -1
  711. package/app/_app/immutable/chunks/CPRHZZeW.js +0 -1
  712. package/app/_app/immutable/chunks/CRQ1Pmzr.js +0 -1
  713. package/app/_app/immutable/chunks/CWtfVMDz.js +0 -1
  714. package/app/_app/immutable/chunks/Chyo8rdT.js +0 -3
  715. package/app/_app/immutable/chunks/Ci0DUht6.js +0 -34
  716. package/app/_app/immutable/chunks/CmmuWmp6.js +0 -2
  717. package/app/_app/immutable/chunks/CrFNLK0f.js +0 -1
  718. package/app/_app/immutable/chunks/CsprTb3f.js +0 -2
  719. package/app/_app/immutable/chunks/CygC84VT.js +0 -2
  720. package/app/_app/immutable/chunks/D0VgZnk1.js +0 -1
  721. package/app/_app/immutable/chunks/DD7gpKb2.js +0 -1
  722. package/app/_app/immutable/chunks/DNRgqfTx.js +0 -1
  723. package/app/_app/immutable/chunks/DVRKjN-E.js +0 -1
  724. package/app/_app/immutable/chunks/D_J_XtJy.js +0 -846
  725. package/app/_app/immutable/chunks/Dp9GVO-9.js +0 -1
  726. package/app/_app/immutable/chunks/DqcD-WtP.js +0 -1
  727. package/app/_app/immutable/chunks/QukgIHDX.js +0 -1
  728. package/app/_app/immutable/chunks/WxSPP8QW.js +0 -4
  729. package/app/_app/immutable/chunks/Xp1g1t4n.js +0 -3
  730. package/app/_app/immutable/chunks/leQCwW2d.js +0 -1
  731. package/app/_app/immutable/chunks/p6bgzXiY.js +0 -1
  732. package/app/_app/immutable/entry/app.IZIJXhgq.js +0 -2
  733. package/app/_app/immutable/entry/start.BuaYHD1N.js +0 -1
  734. package/app/_app/immutable/nodes/0.m_U8WC7E.js +0 -10
  735. package/app/_app/immutable/nodes/1.Crw8ULhB.js +0 -1
  736. package/app/_app/immutable/nodes/10.1nQxyH9H.js +0 -4
  737. package/app/_app/immutable/nodes/11.Cw0JnQF3.js +0 -1
  738. package/app/_app/immutable/nodes/12.BIocA1aI.js +0 -1
  739. package/app/_app/immutable/nodes/2.CR5BwGnt.js +0 -17
  740. package/app/_app/immutable/nodes/3.1B56hgAG.js +0 -1
  741. package/app/_app/immutable/nodes/4.SSIC7sUh.js +0 -1
  742. package/app/_app/immutable/nodes/5.DgdwleDQ.js +0 -1
  743. package/app/_app/immutable/nodes/6.DmD9rqLU.js +0 -1
  744. package/app/_app/immutable/nodes/7.DdngsBmo.js +0 -1
  745. package/app/_app/immutable/nodes/8.D2Mszsua.js +0 -3
  746. package/app/_app/immutable/nodes/9.CLYsywul.js +0 -1
  747. package/app/m/content/Contents/index.html +0 -96
  748. package/app/m/preferences/UiPreferenceRecord/index.html +0 -96
  749. package/app/m/users/AccessRequest/index.html +0 -96
  750. package/app/m/users/ResourceGrant/index.html +0 -96
  751. package/app/m/users/UsersCliAuthRequest/index.html +0 -96
  752. package/app/m/users/UsersMagicLinkToken/index.html +0 -96
@@ -0,0 +1,186 @@
1
+ import { untrack } from 'svelte';
2
+ import { cookbookStore } from "../../cookbook/store.svelte.js";
3
+ import { parseCookbook } from "../../cookbook/validate.js";
4
+ let mounted = false;
5
+ /** One authoritative Kitchen plan projected into the stores the existing panels read. */
6
+ export function createHostSession(callTool) {
7
+ let current = $state.raw(null);
8
+ let busy = $state(false);
9
+ let error = $state('');
10
+ let pendingPlanId = $state(null);
11
+ let draft = $state.raw(null);
12
+ let preservedDraft = $state.raw(null);
13
+ let pending = $state.raw(null);
14
+ let baseline = '';
15
+ let disposed = false;
16
+ const copy = (value) => JSON.parse(JSON.stringify(value));
17
+ function refresh(value) {
18
+ if (disposed)
19
+ return;
20
+ const payload = value;
21
+ const next = payload?.state
22
+ ? { planId: payload.planId, ...payload.state }
23
+ : value;
24
+ if (!next ||
25
+ typeof next.planId !== 'string' ||
26
+ !Number.isInteger(next.snapshot?.revision))
27
+ throw new Error('Kitchen did not return a plan snapshot.');
28
+ if (current && next.planId !== current.planId)
29
+ throw new Error('Kitchen returned a different plan.');
30
+ const parsed = parseCookbook(next.cookbook);
31
+ if (!parsed.ok)
32
+ throw new Error(parsed.error);
33
+ if (current && next.snapshot.revision < current.snapshot.revision)
34
+ return;
35
+ if (current && next.snapshot.revision === current.snapshot.revision)
36
+ return;
37
+ if (current && JSON.stringify(cookbookStore.snapshot()) !== baseline) {
38
+ preservedDraft ??= copy(cookbookStore.snapshot());
39
+ error =
40
+ 'Kitchen updated the plan while you were editing. Your draft is preserved; dismiss it to keep editing.';
41
+ }
42
+ current = { ...next, cookbook: copy(parsed.cookbook) };
43
+ pendingPlanId = null;
44
+ cookbookStore.apply(current.cookbook);
45
+ cookbookStore.loaded = true;
46
+ baseline = JSON.stringify(cookbookStore.snapshot());
47
+ }
48
+ async function invoke() {
49
+ if (!pending || busy || disposed)
50
+ return;
51
+ busy = true;
52
+ error = '';
53
+ const submitted = draft;
54
+ try {
55
+ const result = (await callTool('run_commands', pending));
56
+ if (disposed)
57
+ return;
58
+ if (result?.state || (result?.snapshot && result?.cookbook))
59
+ refresh(result);
60
+ if (!result?.ok) {
61
+ pending = null;
62
+ preservedDraft ??= submitted ? copy(submitted) : null;
63
+ throw new Error(result?.error?.message ??
64
+ 'Kitchen rejected this edit. Your draft is preserved below; dismiss it to keep editing.');
65
+ }
66
+ pending = null;
67
+ if (draft === submitted)
68
+ draft = null;
69
+ }
70
+ catch (cause) {
71
+ if (!disposed) {
72
+ if (!pending)
73
+ preservedDraft ??= submitted ? copy(submitted) : null;
74
+ error = cause instanceof Error ? cause.message : String(cause);
75
+ }
76
+ }
77
+ finally {
78
+ busy = false;
79
+ }
80
+ }
81
+ return {
82
+ get current() {
83
+ return current;
84
+ },
85
+ get busy() {
86
+ return busy;
87
+ },
88
+ get error() {
89
+ return error;
90
+ },
91
+ get pendingPlanId() {
92
+ return pendingPlanId;
93
+ },
94
+ get draft() {
95
+ return draft;
96
+ },
97
+ get preservedDraft() {
98
+ return preservedDraft;
99
+ },
100
+ dismissPreservedDraft() {
101
+ preservedDraft = null;
102
+ if (!pending)
103
+ error = '';
104
+ },
105
+ get retryable() {
106
+ return pending !== null;
107
+ },
108
+ /** Edits wait while a request is unresolved or a preserved draft is unacknowledged. */
109
+ get locked() {
110
+ return busy || pending !== null || preservedDraft !== null;
111
+ },
112
+ refresh,
113
+ reportError(cause) {
114
+ error = cause instanceof Error ? cause.message : String(cause);
115
+ },
116
+ receive(value) {
117
+ if (disposed)
118
+ return;
119
+ const id = value?.planId;
120
+ if (!current && typeof id === 'string')
121
+ pendingPlanId = id;
122
+ try {
123
+ refresh(value);
124
+ if (!pending && !draft)
125
+ error = '';
126
+ }
127
+ catch (cause) {
128
+ error = cause instanceof Error ? cause.message : String(cause);
129
+ }
130
+ },
131
+ async connect(planId) {
132
+ try {
133
+ const result = await callTool('get_plan', { planId });
134
+ if (disposed)
135
+ return;
136
+ refresh(result);
137
+ if (!pending && !draft)
138
+ error = '';
139
+ }
140
+ catch (cause) {
141
+ if (!disposed)
142
+ error = String(cause);
143
+ }
144
+ },
145
+ retry: invoke,
146
+ mount() {
147
+ if (mounted)
148
+ throw new Error('Only one host-backed Planner may be mounted in this document.');
149
+ mounted = true;
150
+ const stop = $effect.root(() => {
151
+ $effect(() => {
152
+ const value = JSON.stringify(cookbookStore.snapshot());
153
+ untrack(() => {
154
+ if (!current || value === baseline || disposed)
155
+ return;
156
+ draft = JSON.parse(value);
157
+ cookbookStore.apply(current.cookbook);
158
+ baseline = JSON.stringify(cookbookStore.snapshot());
159
+ if (busy || pending) {
160
+ error =
161
+ 'An edit is already pending. Your additional draft is preserved.';
162
+ return;
163
+ }
164
+ pending = {
165
+ planId: current.planId,
166
+ id: crypto.randomUUID(),
167
+ expectedRevision: current.snapshot.revision,
168
+ commands: [
169
+ {
170
+ name: 'import_cookbook',
171
+ input: { document: draft, replace: true },
172
+ },
173
+ ],
174
+ };
175
+ void invoke();
176
+ });
177
+ });
178
+ });
179
+ return () => {
180
+ disposed = true;
181
+ stop();
182
+ mounted = false;
183
+ };
184
+ },
185
+ };
186
+ }
@@ -0,0 +1,49 @@
1
+ /**
2
+ * The model pages' paths and how a route under `/m/` reads. One place for the
3
+ * static app (`src/routes/m/`), the mounted `Planner`'s hash router and every
4
+ * link to a record, so they agree:
5
+ *
6
+ * - `/m/<pkg>/<Model>/` the list; `?<fk>=<id>` narrows it to the rows whose
7
+ * reference field `<fk>` points at the record `<id>` ("View all" on a
8
+ * record's related panel).
9
+ * - `/m/<pkg>/<Model>/<key>/` a keyed nav entry (a model shown twice in the
10
+ * menu); the key is known from the recipes.
11
+ * - `/m/<pkg>/<Model>/<id>/` a record's view page, `/<id>/edit/` its edit
12
+ * page. A segment that is not a known key is a record id.
13
+ */
14
+ import type { CatalogModel } from '../catalog/types.ts';
15
+ import type { RowScope } from '../recipes/scope.ts';
16
+ export type RecordMode = 'view' | 'edit';
17
+ export interface ModelRoute {
18
+ packageId: string;
19
+ modelName: string;
20
+ /** The nav entry key, for a keyed entry page. */
21
+ view?: string;
22
+ /** The record the page shows, with how. */
23
+ recordId?: string;
24
+ mode?: RecordMode;
25
+ }
26
+ export declare function modelPath(packageId: string, modelName: string): string;
27
+ export declare function recordPath(packageId: string, modelName: string, id: string, mode?: RecordMode): string;
28
+ /** The list narrowed to the rows whose `field` points at the record `id`. */
29
+ export declare function filteredListPath(packageId: string, modelName: string, field: string, id: string): string;
30
+ /**
31
+ * Read the segments after `m/` (`['commerce', 'Order', <id>, 'edit']`).
32
+ * `isViewKey` says whether a third segment is a keyed nav entry of the model;
33
+ * otherwise it is a record id. `undefined` for a shape that is not a model
34
+ * page (`m/commerce/Order/x/y/` and the like).
35
+ */
36
+ export declare function parseModelRoute(parts: readonly string[], isViewKey: (packageId: string, modelName: string, key: string) => boolean): ModelRoute | undefined;
37
+ /** A fragment route (`/m/commerce/Order/?customerId=x`) split into path and query. */
38
+ export declare function splitRoute(route: string): {
39
+ path: string;
40
+ search: string;
41
+ };
42
+ /**
43
+ * The `?<fk>=<id>` filter of a list page, when the query names a reference
44
+ * field of the model with a non-empty value. Any other parameter (the package
45
+ * selection, the Planner tab) is not a filter.
46
+ */
47
+ export declare function recordFilter(search: string, model: Pick<CatalogModel, 'fields'>): RowScope | undefined;
48
+ /** The `?<fk>=<id>` pair as a query fragment to keep in a list page's URL. */
49
+ export declare function recordFilterQuery(scope: RowScope | undefined): string;
@@ -0,0 +1,64 @@
1
+ const REF_TYPES = new Set(['foreignKey', 'crossPackageRef']);
2
+ export function modelPath(packageId, modelName) {
3
+ return `/m/${packageId}/${modelName}/`;
4
+ }
5
+ export function recordPath(packageId, modelName, id, mode = 'view') {
6
+ const base = `${modelPath(packageId, modelName)}${encodeURIComponent(id)}/`;
7
+ return mode === 'edit' ? `${base}edit/` : base;
8
+ }
9
+ /** The list narrowed to the rows whose `field` points at the record `id`. */
10
+ export function filteredListPath(packageId, modelName, field, id) {
11
+ return `${modelPath(packageId, modelName)}?${encodeURIComponent(field)}=${encodeURIComponent(id)}`;
12
+ }
13
+ /**
14
+ * Read the segments after `m/` (`['commerce', 'Order', <id>, 'edit']`).
15
+ * `isViewKey` says whether a third segment is a keyed nav entry of the model;
16
+ * otherwise it is a record id. `undefined` for a shape that is not a model
17
+ * page (`m/commerce/Order/x/y/` and the like).
18
+ */
19
+ export function parseModelRoute(parts, isViewKey) {
20
+ const [packageId, modelName, third, fourth, ...rest] = parts;
21
+ if (!packageId || !modelName || rest.length)
22
+ return undefined;
23
+ if (third === undefined)
24
+ return { packageId, modelName };
25
+ if (fourth === undefined) {
26
+ if (isViewKey(packageId, modelName, third)) {
27
+ return { packageId, modelName, view: third };
28
+ }
29
+ return { packageId, modelName, recordId: third, mode: 'view' };
30
+ }
31
+ if (fourth !== 'edit' || isViewKey(packageId, modelName, third)) {
32
+ return undefined;
33
+ }
34
+ return { packageId, modelName, recordId: third, mode: 'edit' };
35
+ }
36
+ /** A fragment route (`/m/commerce/Order/?customerId=x`) split into path and query. */
37
+ export function splitRoute(route) {
38
+ const at = route.indexOf('?');
39
+ return at < 0
40
+ ? { path: route, search: '' }
41
+ : { path: route.slice(0, at), search: route.slice(at) };
42
+ }
43
+ /**
44
+ * The `?<fk>=<id>` filter of a list page, when the query names a reference
45
+ * field of the model with a non-empty value. Any other parameter (the package
46
+ * selection, the Planner tab) is not a filter.
47
+ */
48
+ export function recordFilter(search, model) {
49
+ const params = new URLSearchParams(search);
50
+ for (const field of model.fields) {
51
+ if (!REF_TYPES.has(field.type))
52
+ continue;
53
+ const value = params.get(field.name);
54
+ if (value)
55
+ return { field: field.name, equals: value };
56
+ }
57
+ return undefined;
58
+ }
59
+ /** The `?<fk>=<id>` pair as a query fragment to keep in a list page's URL. */
60
+ export function recordFilterQuery(scope) {
61
+ return scope?.equals !== undefined
62
+ ? `${encodeURIComponent(scope.field)}=${encodeURIComponent(scope.equals)}`
63
+ : '';
64
+ }
@@ -0,0 +1,40 @@
1
+ import type { AppShell, DockToggle } from '@happyvertical/smrt-svelte/app';
2
+ import type { PanelEdge, ShellPanelDefaults } from '@happyvertical/smrt-svelte/workspace';
3
+ import type { ComponentProps } from 'svelte';
4
+ /**
5
+ * The Planner starts with its navigation open so footer controls stay in the
6
+ * left sidebar. Hosts embedding Planner can use the same shell defaults.
7
+ */
8
+ export declare const PLANNER_SHELL_EDGE_TOGGLES: Partial<Record<PanelEdge, boolean>>;
9
+ /** Panel defaults shared by Planner's static shell and embedding hosts. */
10
+ export declare const PLANNER_SHELL_PANEL_DEFAULTS: ShellPanelDefaults;
11
+ /**
12
+ * The shell's assistant control: the built-in `dock:assistant` item (a
13
+ * chat-bubble `header.end` button, the dock tab on phones) toggling the
14
+ * `assistant` `ShellDockTool`. Until the assistant can answer (`ready`, from
15
+ * `aiState.assistantReady`) the shell renders it as a link to `href`, the AI
16
+ * setup page, instead of opening an empty dock.
17
+ */
18
+ export declare function plannerAssistantToggle(href: string, ready: boolean): DockToggle;
19
+ type ShellUser = NonNullable<ComponentProps<typeof AppShell>['user']>;
20
+ /**
21
+ * The visitor, as the shell's account item (`item:account`: full identity in
22
+ * the expanded sidebar footer, the compact avatar in the collapsed rail and on
23
+ * phones). A static demo has no sign-in, so this stands in for one.
24
+ */
25
+ export declare const PLANNER_SHELL_USER: ShellUser;
26
+ /** Props for an AppShell that hosts Planner. */
27
+ export declare function plannerShellProps(): {
28
+ edgeToggles: Partial<Record<PanelEdge, boolean>>;
29
+ config: Partial<Record<PanelEdge, false | Partial<import("@happyvertical/smrt-svelte/workspace").ShellPanelConfig>>>;
30
+ hotkeys: boolean;
31
+ user: {
32
+ readonly id: string | null | undefined;
33
+ readonly email?: string | null;
34
+ readonly name?: string | null;
35
+ readonly avatarUrl?: string | null;
36
+ };
37
+ phoneTabBar: boolean;
38
+ phoneDock: "sheet";
39
+ };
40
+ export {};
@@ -0,0 +1,56 @@
1
+ /**
2
+ * The Planner starts with its navigation open so footer controls stay in the
3
+ * left sidebar. Hosts embedding Planner can use the same shell defaults.
4
+ */
5
+ export const PLANNER_SHELL_EDGE_TOGGLES = {
6
+ left: true,
7
+ };
8
+ /** Panel defaults shared by Planner's static shell and embedding hosts. */
9
+ export const PLANNER_SHELL_PANEL_DEFAULTS = {
10
+ left: { initial: 'expanded' },
11
+ right: { initial: 'collapsed', rail: false, presentation: 'overlay' },
12
+ bottom: { initial: 'hidden' },
13
+ };
14
+ /**
15
+ * The shell's assistant control: the built-in `dock:assistant` item (a
16
+ * chat-bubble `header.end` button, the dock tab on phones) toggling the
17
+ * `assistant` `ShellDockTool`. Until the assistant can answer (`ready`, from
18
+ * `aiState.assistantReady`) the shell renders it as a link to `href`, the AI
19
+ * setup page, instead of opening an empty dock.
20
+ */
21
+ export function plannerAssistantToggle(href, ready) {
22
+ return {
23
+ tool: 'assistant',
24
+ label: 'Assistant',
25
+ labelNotReady: 'Set up the assistant',
26
+ href,
27
+ ready,
28
+ };
29
+ }
30
+ /**
31
+ * The visitor, as the shell's account item (`item:account`: full identity in
32
+ * the expanded sidebar footer, the compact avatar in the collapsed rail and on
33
+ * phones). A static demo has no sign-in, so this stands in for one.
34
+ */
35
+ export const PLANNER_SHELL_USER = {
36
+ id: 'visitor',
37
+ slug: null,
38
+ created_at: null,
39
+ updated_at: null,
40
+ profileId: 'visitor',
41
+ email: '',
42
+ status: 'active',
43
+ lastLoginAt: null,
44
+ name: 'You',
45
+ };
46
+ /** Props for an AppShell that hosts Planner. */
47
+ export function plannerShellProps() {
48
+ return {
49
+ edgeToggles: PLANNER_SHELL_EDGE_TOGGLES,
50
+ config: PLANNER_SHELL_PANEL_DEFAULTS,
51
+ hotkeys: false,
52
+ user: PLANNER_SHELL_USER,
53
+ phoneTabBar: true,
54
+ phoneDock: 'sheet',
55
+ };
56
+ }
@@ -1,11 +1,14 @@
1
- export declare const PLANNER_TABS: readonly ["cookbooks", "recipes", "features", "layout", "settings", "export"];
1
+ export declare const PLANNER_TABS: readonly ["cookbooks", "recipes", "features", "layout", "theme", "settings", "export"];
2
2
  export type PlannerTab = (typeof PLANNER_TABS)[number];
3
- /** `fallback` (Recipes) unless the query names another known tab. */
3
+ /** `fallback` (Cookbooks) unless the query names another known tab. */
4
4
  export declare function parseTab(search: string, fallback?: PlannerTab): PlannerTab;
5
5
  /** The Planner page's active tab; the address bar mirrors it (`?tab=`). */
6
6
  declare class PlannerTabState {
7
- active: "export" | "settings" | "features" | "recipes" | "layout" | "cookbooks";
7
+ active: "export" | "settings" | "features" | "recipes" | "theme" | "layout" | "cookbooks";
8
8
  fromSearch(search: string, fallback?: PlannerTab): void;
9
+ /** The chef's hat from Export: `#/configure/` names no tab, so leave Export
10
+ * for the default rather than stay on it; any other tab is kept. */
11
+ leaveExport(fallback?: PlannerTab): void;
9
12
  }
10
13
  export declare const plannerTab: PlannerTabState;
11
14
  export {};
@@ -4,19 +4,26 @@ export const PLANNER_TABS = [
4
4
  'recipes',
5
5
  'features',
6
6
  'layout',
7
+ 'theme',
7
8
  'settings',
8
9
  'export',
9
10
  ];
10
- /** `fallback` (Recipes) unless the query names another known tab. */
11
- export function parseTab(search, fallback = 'recipes') {
11
+ /** `fallback` (Cookbooks) unless the query names another known tab. */
12
+ export function parseTab(search, fallback = 'cookbooks') {
12
13
  const value = new URLSearchParams(search).get(TAB_PARAM);
13
14
  return PLANNER_TABS.find((tab) => tab === value) ?? fallback;
14
15
  }
15
16
  /** The Planner page's active tab; the address bar mirrors it (`?tab=`). */
16
17
  class PlannerTabState {
17
- active = $state('recipes');
18
- fromSearch(search, fallback = 'recipes') {
18
+ active = $state('cookbooks');
19
+ fromSearch(search, fallback = 'cookbooks') {
19
20
  this.active = parseTab(search, fallback);
20
21
  }
22
+ /** The chef's hat from Export: `#/configure/` names no tab, so leave Export
23
+ * for the default rather than stay on it; any other tab is kept. */
24
+ leaveExport(fallback = 'cookbooks') {
25
+ if (this.active === 'export')
26
+ this.active = fallback;
27
+ }
21
28
  }
22
29
  export const plannerTab = new PlannerTabState();
@@ -0,0 +1,15 @@
1
+ import type { Cookbook } from '../cookbook/types.ts';
2
+ import type { LibraryCookbook } from '../library/types.ts';
3
+ /** The shell's brand label when nothing names the app. */
4
+ export declare const DEFAULT_PLANNER_TITLE = "Planner";
5
+ /** What the title derivation reads of the cookbook document. */
6
+ export type TitledCookbook = Pick<Cookbook, 'name' | 'recipes' | 'features'>;
7
+ /**
8
+ * The app's title, for the shell brand and the page `<title>`: an explicit
9
+ * app name (`set_name`, carried in the cookbook document) wins; else the
10
+ * library cookbook the visitor applied and still holds (its friendly `name`,
11
+ * never its id); else `fallback` (a host's `defaultTitle`, "Planner" by default). A reset, a replacing import or removing the
12
+ * cookbook's recipes drops the library name the same way the Cookbooks tab
13
+ * stops marking it "in use".
14
+ */
15
+ export declare function plannerTitle(cookbook: TitledCookbook, applied: string | null | undefined, library?: readonly LibraryCookbook[], fallback?: string): string;
@@ -0,0 +1,21 @@
1
+ import { holdsCookbook } from "../library/apply.js";
2
+ import { libraryCookbooks } from "../library/index.js";
3
+ /** The shell's brand label when nothing names the app. */
4
+ export const DEFAULT_PLANNER_TITLE = 'Planner';
5
+ /**
6
+ * The app's title, for the shell brand and the page `<title>`: an explicit
7
+ * app name (`set_name`, carried in the cookbook document) wins; else the
8
+ * library cookbook the visitor applied and still holds (its friendly `name`,
9
+ * never its id); else `fallback` (a host's `defaultTitle`, "Planner" by default). A reset, a replacing import or removing the
10
+ * cookbook's recipes drops the library name the same way the Cookbooks tab
11
+ * stops marking it "in use".
12
+ */
13
+ export function plannerTitle(cookbook, applied, library = libraryCookbooks, fallback = DEFAULT_PLANNER_TITLE) {
14
+ const name = cookbook.name?.trim();
15
+ if (name)
16
+ return name;
17
+ const entry = applied ? library.find((c) => c.id === applied) : undefined;
18
+ if (entry && holdsCookbook(entry, cookbook))
19
+ return entry.name;
20
+ return fallback;
21
+ }
@@ -0,0 +1,6 @@
1
+ /**
2
+ * The live app title over the module stores. Call it inside a `$derived` so
3
+ * a cookbook applied, imported, named or reset re-reads it. `fallback` is the
4
+ * title when no cookbook name or library cookbook applies.
5
+ */
6
+ export declare function currentPlannerTitle(fallback?: string): string;
@@ -0,0 +1,11 @@
1
+ import { cookbookStore } from "../cookbook/store.svelte.js";
2
+ import { libraryState } from "../library/state.svelte.js";
3
+ import { plannerTitle } from "./title.js";
4
+ /**
5
+ * The live app title over the module stores. Call it inside a `$derived` so
6
+ * a cookbook applied, imported, named or reset re-reads it. `fallback` is the
7
+ * title when no cookbook name or library cookbook applies.
8
+ */
9
+ export function currentPlannerTitle(fallback) {
10
+ return plannerTitle(cookbookStore.snapshot(), libraryState.active, undefined, fallback);
11
+ }
@@ -6,7 +6,7 @@ export interface PlannerHandle {
6
6
  /** Present when `inference` was given: a chat transport driven by the controller. */
7
7
  assistant?: PlannerAssistant;
8
8
  }
9
- /** The `Planner` component's props. */
9
+ /** Shared props for the complete Planner and the separately mounted controls. */
10
10
  export interface PlannerProps {
11
11
  /**
12
12
  * The commands to drive the planner with and the snapshot to read. Defaults
@@ -15,16 +15,23 @@ export interface PlannerProps {
15
15
  */
16
16
  controller?: PlannerController;
17
17
  /**
18
- * Where the planner's own pages are served from (`''`, `'/planner'`). Only
19
- * links to planner pages use it; the component needs no router of its own.
18
+ * Where the customization controls' own pages are served from (`''`,
19
+ * `'/planner'`). The complete Planner uses fragment paths for its app
20
+ * sections and model pages, so it needs no host router.
20
21
  */
21
22
  basePath?: string;
22
- /** A model for the planner's assistant; see `createPlannerAssistant`. */
23
+ /**
24
+ * A model for the planner's assistant; see `createPlannerAssistant`. The
25
+ * complete `Planner` then shows the assistant icon at the end of its
26
+ * header: it opens the chat dock once a model is ready and the AI models
27
+ * page (`#/ai/`, where a visitor downloads a model or connects their own
28
+ * endpoint) before. Without it the planner has no assistant.
29
+ */
23
30
  inference?: PlannerInference;
24
31
  /**
25
- * `'own'` (the default) edits the menu layout on a headless controller built
26
- * from the cookbook. `'shell'` edits the nearest smrt-svelte `AppShell`'s, as
27
- * the static app does (it also holds panel and slot placements).
32
+ * `PlannerControls` uses `'own'` by default, editing the menu layout on a
33
+ * headless controller. `'shell'` edits the nearest smrt-svelte `AppShell`.
34
+ * The complete `Planner` always uses its own shell for these controls.
28
35
  */
29
36
  layout?: 'own' | 'shell';
30
37
  /**
@@ -35,7 +42,32 @@ export interface PlannerProps {
35
42
  persistence?: 'self' | 'host';
36
43
  /** Show the theme preset and light/dark controls (they need a theme provider). */
37
44
  themeControls?: boolean;
45
+ /** Link to the host's Advanced Styles page, when mounting controls alone. */
46
+ advancedStylesHref?: string;
47
+ /**
48
+ * The shell title shown when no cookbook name and no applied library
49
+ * cookbook names the app (the brand label, and the fallback for a section
50
+ * page without a heading). A host that calls the planner something else
51
+ * passes it here. Defaults to `'Planner'`. The complete `Planner` only.
52
+ */
53
+ defaultTitle?: string;
38
54
  /** Tabs to show, in order; defaults to all. */
39
55
  tabs?: readonly PlannerTabId[];
56
+ /**
57
+ * A host's way back, rendered at the start of the planner's header beside
58
+ * the brand (`{ href: '/', label: 'Back to documentation' }`). Off by
59
+ * default. The complete `Planner` only.
60
+ */
61
+ backLink?: PlannerBackLink;
62
+ /**
63
+ * Called once the planner is mounted, with its controller and (when
64
+ * `inference` was given) the assistant transport, for a host that drives
65
+ * the plan itself.
66
+ */
40
67
  onready?: (handle: PlannerHandle) => void;
41
68
  }
69
+ /** A link out of the planner, shown in its header. */
70
+ export interface PlannerBackLink {
71
+ href: string;
72
+ label: string;
73
+ }
@@ -0,0 +1,20 @@
1
+ import type { ModelRecord, RecordWrite } from '../data/source.ts';
2
+ /** Canonical records used to attach an image to a product. */
3
+ export declare const ASSET = "@happyvertical/smrt-assets:Asset";
4
+ export declare const PRODUCT_ASSET = "@happyvertical/smrt-products:ProductAsset";
5
+ /** The smrt-assets recipe whose library view is the product gallery. */
6
+ export declare const GALLERY_RECIPE = "assets.library";
7
+ export interface ProductImage {
8
+ id: string;
9
+ name: string;
10
+ sourceUri: string;
11
+ mimeType: string;
12
+ description: string;
13
+ sortOrder: number;
14
+ }
15
+ /** Image rows associated with one product, in the order the product declares. */
16
+ export declare function productImages(productId: string, assets: readonly ModelRecord[], associations: readonly ModelRecord[]): ProductImage[];
17
+ /** A single atomic browser-local image selection, stored in canonical records. */
18
+ export declare function planProductImageSave(productId: string, file: Pick<File, 'name' | 'type'>, sourceUri: string, sortOrder: number): RecordWrite[];
19
+ /** Removing a product removes its browser-demo associations and image rows too. */
20
+ export declare function planProductImageDelete(productId: string, associations: readonly ModelRecord[]): RecordWrite[];
@@ -0,0 +1,65 @@
1
+ import { catalogModels } from "../forms/shared.js";
2
+ /** Canonical records used to attach an image to a product. */
3
+ export const ASSET = '@happyvertical/smrt-assets:Asset';
4
+ export const PRODUCT_ASSET = '@happyvertical/smrt-products:ProductAsset';
5
+ /** The smrt-assets recipe whose library view is the product gallery. */
6
+ export const GALLERY_RECIPE = 'assets.library';
7
+ /** Image rows associated with one product, in the order the product declares. */
8
+ export function productImages(productId, assets, associations) {
9
+ const byId = new Map(assets.map((asset) => [asset.id, asset]));
10
+ return associations
11
+ .filter((link) => link.productId === productId)
12
+ .flatMap((link) => {
13
+ const asset = byId.get(String(link.assetId));
14
+ const sourceUri = asset?.sourceUri;
15
+ if (!asset || typeof sourceUri !== 'string')
16
+ return [];
17
+ return [
18
+ {
19
+ id: asset.id,
20
+ name: String(asset.name ?? 'Product image'),
21
+ sourceUri,
22
+ mimeType: String(asset.mimeType ?? 'image/*'),
23
+ description: String(asset.description ?? ''),
24
+ sortOrder: Number(link.sortOrder ?? 0),
25
+ },
26
+ ];
27
+ })
28
+ .sort((a, b) => a.sortOrder - b.sortOrder || a.name.localeCompare(b.name));
29
+ }
30
+ /** A single atomic browser-local image selection, stored in canonical records. */
31
+ export function planProductImageSave(productId, file, sourceUri, sortOrder) {
32
+ return [
33
+ {
34
+ op: 'save',
35
+ as: 'asset',
36
+ model: catalogModels(ASSET),
37
+ values: {
38
+ name: file.name || 'Product image',
39
+ sourceUri,
40
+ mimeType: file.type || 'image/*',
41
+ description: `Image selected for this product in the browser demo.`,
42
+ sourceType: 'browser-demo',
43
+ },
44
+ },
45
+ {
46
+ op: 'save',
47
+ model: catalogModels(PRODUCT_ASSET),
48
+ values: {
49
+ productId,
50
+ assetId: { ref: 'asset' },
51
+ relationship: 'gallery',
52
+ sortOrder,
53
+ },
54
+ },
55
+ ];
56
+ }
57
+ /** Removing a product removes its browser-demo associations and image rows too. */
58
+ export function planProductImageDelete(productId, associations) {
59
+ return associations
60
+ .filter((link) => link.productId === productId)
61
+ .flatMap((link) => [
62
+ { op: 'delete', model: catalogModels(PRODUCT_ASSET), id: link.id },
63
+ { op: 'delete', model: catalogModels(ASSET), id: String(link.assetId) },
64
+ ]);
65
+ }