@happyvertical/smrt-planner 0.57.3 → 0.57.5

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 (537) hide show
  1. package/agents/assistant.md +8 -1
  2. package/agents/cookbook.md +8 -2
  3. package/app/404.html +21 -21
  4. package/app/_app/immutable/assets/2.CdEXvRg0.css +1 -0
  5. package/app/_app/immutable/assets/{feedback.DePeap37.css → feedback.qFktqYFY.css} +1 -1
  6. package/app/_app/immutable/chunks/{DveAWx7t.js → 5ukUzDcw.js} +1 -1
  7. package/app/_app/immutable/chunks/{DR_9YSDq.js → BDbFl7UA.js} +1 -1
  8. package/app/_app/immutable/chunks/{rkUL-DlL.js → BG9Gz_25.js} +25 -25
  9. package/app/_app/immutable/chunks/{BfPYbnRI.js → Bal1oPZu.js} +1 -1
  10. package/app/_app/immutable/chunks/BhU_yBI_.js +1 -0
  11. package/app/_app/immutable/chunks/{CZwkvsZI.js → BiEOJeYb.js} +1 -1
  12. package/app/_app/immutable/chunks/{DsY7g8iJ.js → Bsn3IIve.js} +3 -3
  13. package/app/_app/immutable/chunks/{PJY04JNF.js → BybfWt-B.js} +1 -1
  14. package/app/_app/immutable/chunks/{CF503c7E.js → C1VofLtR.js} +1 -1
  15. package/app/_app/immutable/chunks/{2l76O8yg.js → C3sRGrYK.js} +1 -1
  16. package/app/_app/immutable/chunks/{Bz0ybtg3.js → CTlMHIE6.js} +1 -1
  17. package/app/_app/immutable/chunks/C_3CJO_1.js +1 -0
  18. package/app/_app/immutable/chunks/Cga8zF3r.js +1 -0
  19. package/app/_app/immutable/chunks/Cr4byQts.js +24 -0
  20. package/app/_app/immutable/chunks/{U6_OBRq_.js → CtjBwCj8.js} +1 -1
  21. package/app/_app/immutable/chunks/CyUSxz1P.js +4 -0
  22. package/app/_app/immutable/chunks/{BAeyjCL_.js → DTWraE40.js} +1 -1
  23. package/app/_app/immutable/chunks/{Cfd9dmBM.js → DjJovMrk.js} +1 -1
  24. package/app/_app/immutable/chunks/{BJKoxDbG.js → DuZeZzOA.js} +1 -1
  25. package/app/_app/immutable/chunks/{C-DLpfU4.js → J9kOiFLO.js} +1 -1
  26. package/app/_app/immutable/chunks/NppCG--v.js +1 -0
  27. package/app/_app/immutable/chunks/{EZsakmZX.js → O8DAZ_le.js} +1 -1
  28. package/app/_app/immutable/chunks/{Dq8aYheE.js → YGONf0jr.js} +1 -1
  29. package/app/_app/immutable/chunks/d_dqmeIr.js +1 -0
  30. package/app/_app/immutable/chunks/{Bb0f-PWY.js → gCpxN2IC.js} +1 -1
  31. package/app/_app/immutable/chunks/nphy1MQF.js +1 -0
  32. package/app/_app/immutable/entry/{app.BOdcGXnx.js → app.B4gMiHwR.js} +2 -2
  33. package/app/_app/immutable/entry/start.BXkBl20Z.js +1 -0
  34. package/app/_app/immutable/nodes/0.2MYMg80l.js +9 -0
  35. package/app/_app/immutable/nodes/{1.CULLAAlp.js → 1.DKP901Gn.js} +1 -1
  36. package/app/_app/immutable/nodes/{10.D3aS_KZl.js → 10.DNN0cVai.js} +1 -1
  37. package/app/_app/immutable/nodes/{11.C92xaiTE.js → 11.DgbmegX3.js} +1 -1
  38. package/app/_app/immutable/nodes/{12.D1Lzt56L.js → 12.D5MtnJoE.js} +1 -1
  39. package/app/_app/immutable/nodes/{13.Bx4rov-F.js → 13._rY66Xa_.js} +1 -1
  40. package/app/_app/immutable/nodes/{14.CEBy0En2.js → 14.B6TD25VU.js} +1 -1
  41. package/app/_app/immutable/nodes/2.x9WyxQ1S.js +24 -0
  42. package/app/_app/immutable/nodes/{3.C8f09BsJ.js → 3.V5uGCpGb.js} +1 -1
  43. package/app/_app/immutable/nodes/{4.Z1MwZ_rU.js → 4.CCwzLrgu.js} +1 -1
  44. package/app/_app/immutable/nodes/{5.BnknP-NB.js → 5.CgHzwpns.js} +1 -1
  45. package/app/_app/immutable/nodes/{6.B0InO4bR.js → 6.CvQHLh_u.js} +1 -1
  46. package/app/_app/immutable/nodes/{7.CLnj1BGB.js → 7.7EIrly34.js} +1 -1
  47. package/app/_app/immutable/nodes/{8.BmZYIUmz.js → 8.DyyRBuTw.js} +1 -1
  48. package/app/_app/immutable/nodes/{9.BKWSHjz-.js → 9.DcURs0gN.js} +1 -1
  49. package/app/_app/version.json +1 -1
  50. package/app/advanced-styles/index.html +24 -24
  51. package/app/ai/index.html +28 -33
  52. package/app/blueprint/index.html +22 -22
  53. package/app/cookbook/index.html +22 -22
  54. package/app/index.html +38 -38
  55. package/app/m/ads/AdDeliveryTier/index.html +25 -25
  56. package/app/m/ads/AdEvent/index.html +25 -25
  57. package/app/m/ads/AdFormat/index.html +25 -25
  58. package/app/m/ads/AdGroup/index.html +25 -25
  59. package/app/m/ads/AdVariation/index.html +25 -25
  60. package/app/m/analytics/AnalyticsDataStream/index.html +25 -25
  61. package/app/m/analytics/AnalyticsEvent/index.html +25 -25
  62. package/app/m/analytics/AnalyticsProperty/index.html +25 -25
  63. package/app/m/analytics/AnalyticsReport/index.html +25 -25
  64. package/app/m/approvals/ApprovalEvent/index.html +25 -25
  65. package/app/m/approvals/ApprovalPolicy/index.html +25 -25
  66. package/app/m/approvals/ApprovalRequest/index.html +25 -25
  67. package/app/m/assets/Asset/attachments/index.html +26 -26
  68. package/app/m/assets/Asset/index.html +25 -25
  69. package/app/m/assets/AssetAssociation/index.html +25 -25
  70. package/app/m/assets/AssetMetafield/index.html +25 -25
  71. package/app/m/assets/AssetStatus/index.html +25 -25
  72. package/app/m/assets/AssetType/index.html +25 -25
  73. package/app/m/assets/Folder/index.html +25 -25
  74. package/app/m/chat/AgentSession/index.html +25 -25
  75. package/app/m/chat/ChatMessage/index.html +25 -25
  76. package/app/m/chat/ChatParticipant/index.html +25 -25
  77. package/app/m/chat/ChatReaction/index.html +25 -25
  78. package/app/m/chat/ChatRoom/index.html +25 -25
  79. package/app/m/chat/ChatThread/index.html +25 -25
  80. package/app/m/chat/VoiceGatewayTurn/index.html +25 -25
  81. package/app/m/chat/VoiceSession/index.html +25 -25
  82. package/app/m/commerce/Agreement/index.html +25 -25
  83. package/app/m/commerce/Cart/index.html +25 -25
  84. package/app/m/commerce/Contract/index.html +25 -25
  85. package/app/m/commerce/ContractLineItem/index.html +26 -26
  86. package/app/m/commerce/Customer/index.html +25 -25
  87. package/app/m/commerce/DocumentTax/index.html +25 -25
  88. package/app/m/commerce/Estimate/index.html +25 -25
  89. package/app/m/commerce/Fulfillment/index.html +25 -25
  90. package/app/m/commerce/FulfillmentLineItem/index.html +25 -25
  91. package/app/m/commerce/HistoricalCustomerFunds/index.html +89 -0
  92. package/app/m/commerce/HistoricalCustomerFundsAllocation/index.html +89 -0
  93. package/app/m/commerce/HistoricalSalesLine/index.html +89 -0
  94. package/app/m/commerce/Invoice/index.html +25 -25
  95. package/app/m/commerce/InvoiceLineItem/index.html +25 -25
  96. package/app/m/commerce/Lease/index.html +25 -25
  97. package/app/m/commerce/LicenseSale/index.html +25 -25
  98. package/app/m/commerce/Order/index.html +25 -25
  99. package/app/m/commerce/Payment/index.html +25 -25
  100. package/app/m/commerce/PaymentAllocation/index.html +25 -25
  101. package/app/m/commerce/PaymentInstrument/index.html +25 -25
  102. package/app/m/commerce/PaymentIntent/index.html +25 -25
  103. package/app/m/commerce/Payout/index.html +25 -25
  104. package/app/m/commerce/ProductionOrder/index.html +25 -25
  105. package/app/m/commerce/PurchaseContract/index.html +25 -25
  106. package/app/m/commerce/PurchaseOrder/index.html +25 -25
  107. package/app/m/commerce/SalesContract/index.html +25 -25
  108. package/app/m/commerce/SupplierQuote/index.html +25 -25
  109. package/app/m/commerce/TaxCode/index.html +25 -25
  110. package/app/m/commerce/TaxComponent/index.html +25 -25
  111. package/app/m/commerce/TaxSettings/index.html +25 -25
  112. package/app/m/commerce/TaxSummaryReport/index.html +25 -25
  113. package/app/m/commerce/Vendor/index.html +25 -25
  114. package/app/m/commerce/WholesaleOrder/index.html +25 -25
  115. package/app/m/content/Content/index.html +25 -25
  116. package/app/m/content/ContentContribution/index.html +25 -25
  117. package/app/m/content/ContentContributionAttachment/index.html +25 -25
  118. package/app/m/content/ContentContributionRevision/index.html +25 -25
  119. package/app/m/content/ContentContributionType/index.html +25 -25
  120. package/app/m/content/ContentContributor/index.html +25 -25
  121. package/app/m/content/ContentCorrection/index.html +25 -25
  122. package/app/m/content/ContentFeedSource/index.html +25 -25
  123. package/app/m/content/ContentGovernanceAssignment/index.html +25 -25
  124. package/app/m/content/ContentGovernancePolicy/index.html +25 -25
  125. package/app/m/content/ContentGovernanceProfile/index.html +25 -25
  126. package/app/m/content/ContentReference/index.html +25 -25
  127. package/app/m/content/ContentReview/index.html +25 -25
  128. package/app/m/content/ContentVersion/index.html +25 -25
  129. package/app/m/events/Event/index.html +25 -25
  130. package/app/m/events/EventParticipant/index.html +25 -25
  131. package/app/m/events/EventSeries/index.html +26 -26
  132. package/app/m/events/EventType/index.html +25 -25
  133. package/app/m/expenses/Expense/index.html +25 -25
  134. package/app/m/facts/Fact/index.html +25 -25
  135. package/app/m/facts/FactContent/index.html +25 -25
  136. package/app/m/facts/FactEvidence/index.html +25 -25
  137. package/app/m/facts/FactSource/index.html +25 -25
  138. package/app/m/facts/FactSubject/index.html +25 -25
  139. package/app/m/facts/FactTag/index.html +25 -25
  140. package/app/m/fields/FieldPolicy/index.html +25 -25
  141. package/app/m/fields/FieldPolicySuggestion/index.html +25 -25
  142. package/app/m/fields/FieldUsageCounter/index.html +25 -25
  143. package/app/m/images/Image/index.html +25 -25
  144. package/app/m/inventory/InventoryLocation/index.html +25 -25
  145. package/app/m/inventory/StockLevel/index.html +25 -25
  146. package/app/m/inventory/StockMovement/index.html +25 -25
  147. package/app/m/ledgers/Account/index.html +25 -25
  148. package/app/m/ledgers/Journal/index.html +25 -25
  149. package/app/m/ledgers/JournalEntry/index.html +25 -25
  150. package/app/m/ledgers/Ledger/index.html +25 -25
  151. package/app/m/manufacturing/Assembly/index.html +25 -25
  152. package/app/m/manufacturing/BillOfMaterials/index.html +25 -25
  153. package/app/m/manufacturing/BomLine/index.html +25 -25
  154. package/app/m/manufacturing/Operation/index.html +25 -25
  155. package/app/m/manufacturing/ProductionRun/index.html +25 -25
  156. package/app/m/manufacturing/ProductionRunCompletion/index.html +25 -25
  157. package/app/m/manufacturing/RoutingStep/index.html +25 -25
  158. package/app/m/marketing/Campaign/index.html +25 -25
  159. package/app/m/marketing/CampaignChannel/index.html +25 -25
  160. package/app/m/marketing/CampaignMetricSnapshot/index.html +25 -25
  161. package/app/m/messages/Account/index.html +25 -25
  162. package/app/m/messages/Attachment/index.html +25 -25
  163. package/app/m/messages/Blacklist/index.html +25 -25
  164. package/app/m/messages/Email/failed-sends/index.html +26 -26
  165. package/app/m/messages/Email/index.html +25 -25
  166. package/app/m/messages/Email/mailbox/index.html +26 -26
  167. package/app/m/messages/EmailAccount/index.html +25 -25
  168. package/app/m/messages/EmailAttachment/index.html +25 -25
  169. package/app/m/messages/EmailFolder/index.html +25 -25
  170. package/app/m/messages/Message/index.html +25 -25
  171. package/app/m/messages/MessagingEndpoint/index.html +25 -25
  172. package/app/m/messages/PersonaMessageRoute/index.html +25 -25
  173. package/app/m/messages/SlackAccount/index.html +25 -25
  174. package/app/m/messages/SlackMessage/index.html +25 -25
  175. package/app/m/messages/TelegramAccount/index.html +25 -25
  176. package/app/m/messages/Tweet/index.html +25 -25
  177. package/app/m/messages/TwitterAccount/index.html +25 -25
  178. package/app/m/messages/Whitelist/index.html +25 -25
  179. package/app/m/messages/ZulipAccount/index.html +25 -25
  180. package/app/m/places/Place/index.html +25 -25
  181. package/app/m/places/PlaceType/index.html +25 -25
  182. package/app/m/products/Category/index.html +25 -25
  183. package/app/m/products/Material/index.html +25 -25
  184. package/app/m/products/Product/index.html +25 -25
  185. package/app/m/products/Product/ingredients/index.html +26 -26
  186. package/app/m/products/ProductVariant/index.html +25 -25
  187. package/app/m/products/Sku/index.html +25 -25
  188. package/app/m/profiles/ApiKey/index.html +25 -25
  189. package/app/m/profiles/Bot/index.html +25 -25
  190. package/app/m/profiles/MagicLinkToken/index.html +25 -25
  191. package/app/m/profiles/NostrIdentity/index.html +25 -25
  192. package/app/m/profiles/OidcIdentity/index.html +25 -25
  193. package/app/m/profiles/Organization/index.html +25 -25
  194. package/app/m/profiles/Person/index.html +25 -25
  195. package/app/m/profiles/Profile/index.html +25 -25
  196. package/app/m/profiles/ProfileMetadata/index.html +25 -25
  197. package/app/m/profiles/ProfileMetafield/index.html +25 -25
  198. package/app/m/profiles/ProfileRelationship/index.html +25 -25
  199. package/app/m/profiles/ProfileRelationshipTerm/index.html +25 -25
  200. package/app/m/profiles/ProfileRelationshipType/index.html +25 -25
  201. package/app/m/profiles/ProfileType/index.html +25 -25
  202. package/app/m/projects/Comment/index.html +25 -25
  203. package/app/m/projects/Issue/index.html +25 -25
  204. package/app/m/projects/Label/index.html +25 -25
  205. package/app/m/projects/Project/index.html +25 -25
  206. package/app/m/projects/ProjectIntegration/index.html +25 -25
  207. package/app/m/projects/PullRequest/index.html +25 -25
  208. package/app/m/projects/Repository/index.html +25 -25
  209. package/app/m/properties/Property/index.html +25 -25
  210. package/app/m/properties/Zone/index.html +25 -25
  211. package/app/m/reports/RuntimeReport/index.html +25 -25
  212. package/app/m/reports/SmrtPrincipalReportRefreshTask/index.html +26 -26
  213. package/app/m/reports/SmrtReportLock/index.html +26 -26
  214. package/app/m/reports/SmrtReportRefreshTask/index.html +26 -26
  215. package/app/m/reports/SmrtReportRun/index.html +26 -26
  216. package/app/m/reports/SmrtReportSchedule/index.html +26 -26
  217. package/app/m/reports/SmrtReportWatermark/index.html +26 -26
  218. package/app/m/sales/Agreement/index.html +25 -25
  219. package/app/m/sales/AttributionException/index.html +25 -25
  220. package/app/m/sales/AttributionPolicy/index.html +25 -25
  221. package/app/m/sales/Commission/index.html +25 -25
  222. package/app/m/sales/CommissionAdjustment/index.html +25 -25
  223. package/app/m/sales/CommissionPayout/index.html +25 -25
  224. package/app/m/sales/CommissionPlan/index.html +25 -25
  225. package/app/m/sales/Earner/index.html +25 -25
  226. package/app/m/sales/EarnerSourceAttribution/index.html +25 -25
  227. package/app/m/sales/EarningEvent/index.html +25 -25
  228. package/app/m/sales/ExecutedAgreement/index.html +25 -25
  229. package/app/m/sales/Lead/index.html +25 -25
  230. package/app/m/sales/Opportunity/index.html +25 -25
  231. package/app/m/sales/OpportunityConversion/index.html +25 -25
  232. package/app/m/sales/PipelineDefinition/index.html +25 -25
  233. package/app/m/sales/PipelineStage/index.html +25 -25
  234. package/app/m/sales/Referral/index.html +25 -25
  235. package/app/m/sales/ReferralAgreement/index.html +25 -25
  236. package/app/m/sales/ReferralLink/index.html +25 -25
  237. package/app/m/sales/ReferralProgram/index.html +25 -25
  238. package/app/m/sales/ReferralTermSnapshot/index.html +25 -25
  239. package/app/m/sales/ReferralTouch/index.html +25 -25
  240. package/app/m/sales/Referrer/index.html +25 -25
  241. package/app/m/sales/SalesActivity/index.html +25 -25
  242. package/app/m/sales/SalesRepresentative/index.html +25 -25
  243. package/app/m/sites/Site/index.html +25 -25
  244. package/app/m/sites/SiteAgentBinding/index.html +25 -25
  245. package/app/m/social/OAuthState/index.html +25 -25
  246. package/app/m/social/SocialAccount/index.html +25 -25
  247. package/app/m/social/SocialPost/index.html +25 -25
  248. package/app/m/social/SocialPostAnalyticsSnapshot/index.html +25 -25
  249. package/app/m/subscriptions/BillingAdjustment/index.html +25 -25
  250. package/app/m/subscriptions/ClientCharge/index.html +25 -25
  251. package/app/m/subscriptions/CreditGrant/index.html +25 -25
  252. package/app/m/subscriptions/PricingRule/index.html +25 -25
  253. package/app/m/subscriptions/RetailCharge/index.html +25 -25
  254. package/app/m/subscriptions/SpendingPolicy/index.html +25 -25
  255. package/app/m/subscriptions/SubscriptionPlan/index.html +25 -25
  256. package/app/m/subscriptions/TenantSubscription/index.html +25 -25
  257. package/app/m/subscriptions/TenantUsageMetric/index.html +25 -25
  258. package/app/m/support/ServiceTimeEntry/index.html +25 -25
  259. package/app/m/support/SupportAiRun/index.html +25 -25
  260. package/app/m/support/SupportAvailability/index.html +25 -25
  261. package/app/m/support/SupportCase/index.html +25 -25
  262. package/app/m/support/SupportCaseEvent/index.html +25 -25
  263. package/app/m/support/SupportChannelBinding/index.html +25 -25
  264. package/app/m/support/SupportCharge/index.html +25 -25
  265. package/app/m/support/SupportCompensation/index.html +25 -25
  266. package/app/m/support/SupportCompensationPlan/index.html +25 -25
  267. package/app/m/support/SupportEscalation/index.html +25 -25
  268. package/app/m/support/SupportInteraction/index.html +25 -25
  269. package/app/m/support/SupportPlan/index.html +25 -25
  270. package/app/m/support/SupportPolicy/index.html +25 -25
  271. package/app/m/support/SupportQualification/index.html +25 -25
  272. package/app/m/support/SupportServiceTarget/index.html +25 -25
  273. package/app/m/support/SupportSpecialist/index.html +25 -25
  274. package/app/m/support/SupportWorkLink/index.html +25 -25
  275. package/app/m/tags/Tag/index.html +25 -25
  276. package/app/m/tags/TagAlias/index.html +25 -25
  277. package/app/m/timesheets/AttendanceBreak/index.html +25 -25
  278. package/app/m/timesheets/AttendancePunch/index.html +25 -25
  279. package/app/m/timesheets/AttendanceSegment/index.html +25 -25
  280. package/app/m/timesheets/ServiceChargeSnapshot/index.html +25 -25
  281. package/app/m/timesheets/ServiceCompensationSnapshot/index.html +25 -25
  282. package/app/m/timesheets/ServiceTimeEntry/index.html +25 -25
  283. package/app/m/users/Group/index.html +25 -25
  284. package/app/m/users/GroupMember/index.html +25 -25
  285. package/app/m/users/GroupRole/index.html +25 -25
  286. package/app/m/users/Membership/index.html +25 -25
  287. package/app/m/users/MembershipOverride/index.html +25 -25
  288. package/app/m/users/Permission/index.html +25 -25
  289. package/app/m/users/Role/index.html +25 -25
  290. package/app/m/users/RolePermission/index.html +25 -25
  291. package/app/m/users/Session/index.html +25 -25
  292. package/app/m/users/Tenant/index.html +25 -25
  293. package/app/m/users/TenantIntegration/index.html +25 -25
  294. package/app/m/users/TenantPermissionOverride/index.html +25 -25
  295. package/app/m/users/User/index.html +25 -25
  296. package/app/m/video/Character/index.html +25 -25
  297. package/app/m/video/CharacterAsset/index.html +25 -25
  298. package/app/m/video/CompositeJob/index.html +25 -25
  299. package/app/m/video/Performer/index.html +25 -25
  300. package/app/m/video/PerformerAsset/index.html +25 -25
  301. package/app/m/video/Scene/index.html +25 -25
  302. package/app/m/video/SceneAsset/index.html +25 -25
  303. package/app/m/video/VideoComposition/index.html +25 -25
  304. package/app/m/video/VideoCompositionAsset/index.html +25 -25
  305. package/app/m/video/VideoSequence/index.html +25 -25
  306. package/app/m/video/VideoSequenceAsset/index.html +25 -25
  307. package/app/m/video/VideoShot/index.html +25 -25
  308. package/app/m/video/VideoShotAsset/index.html +25 -25
  309. package/app/m/video/VideoShotCharacter/index.html +25 -25
  310. package/app/m/video/VideoWorkflow/index.html +25 -25
  311. package/app/m/voice/VoiceOutput/index.html +25 -25
  312. package/app/m/voice/VoiceProfile/index.html +25 -25
  313. package/app/m/voice/VoiceSample/index.html +25 -25
  314. package/app/mcp.html +2 -2
  315. package/app/packages/ads/index.html +24 -24
  316. package/app/packages/analytics/index.html +24 -24
  317. package/app/packages/approvals/index.html +24 -24
  318. package/app/packages/assets/index.html +24 -24
  319. package/app/packages/chat/index.html +24 -24
  320. package/app/packages/comments/index.html +24 -24
  321. package/app/packages/commerce/index.html +25 -25
  322. package/app/packages/content/index.html +24 -24
  323. package/app/packages/events/index.html +24 -24
  324. package/app/packages/expenses/index.html +25 -25
  325. package/app/packages/facts/index.html +24 -24
  326. package/app/packages/fields/index.html +24 -24
  327. package/app/packages/human-resources/index.html +24 -24
  328. package/app/packages/images/index.html +24 -24
  329. package/app/packages/index.html +24 -24
  330. package/app/packages/ingestion/index.html +24 -24
  331. package/app/packages/inventory/index.html +24 -24
  332. package/app/packages/ledgers/index.html +24 -24
  333. package/app/packages/manufacturing/index.html +24 -24
  334. package/app/packages/marketing/index.html +24 -24
  335. package/app/packages/messages/index.html +24 -24
  336. package/app/packages/places/index.html +24 -24
  337. package/app/packages/preferences/index.html +24 -24
  338. package/app/packages/products/index.html +24 -24
  339. package/app/packages/profiles/index.html +24 -24
  340. package/app/packages/projects/index.html +24 -24
  341. package/app/packages/properties/index.html +24 -24
  342. package/app/packages/reports/index.html +24 -24
  343. package/app/packages/sales/index.html +24 -24
  344. package/app/packages/sites/index.html +24 -24
  345. package/app/packages/social/index.html +24 -24
  346. package/app/packages/subscriptions/index.html +24 -24
  347. package/app/packages/support/index.html +24 -24
  348. package/app/packages/tags/index.html +24 -24
  349. package/app/packages/timesheets/index.html +24 -24
  350. package/app/packages/users/index.html +24 -24
  351. package/app/packages/video/index.html +24 -24
  352. package/app/packages/voice/index.html +24 -24
  353. package/app/packages/webhooks/index.html +24 -24
  354. package/app/recipes/account-access/help/index.html +24 -24
  355. package/app/recipes/account-access/index.html +26 -26
  356. package/app/recipes/activity/help/index.html +24 -24
  357. package/app/recipes/activity/index.html +26 -26
  358. package/app/recipes/agreements/help/index.html +26 -26
  359. package/app/recipes/agreements/index.html +27 -27
  360. package/app/recipes/analytics.reports/help/index.html +24 -24
  361. package/app/recipes/analytics.reports/index.html +26 -26
  362. package/app/recipes/assets/help/index.html +24 -24
  363. package/app/recipes/assets/index.html +27 -27
  364. package/app/recipes/billing/help/index.html +26 -26
  365. package/app/recipes/billing/index.html +26 -26
  366. package/app/recipes/chat.assistant/help/index.html +24 -24
  367. package/app/recipes/chat.assistant/index.html +26 -26
  368. package/app/recipes/comments/help/index.html +24 -24
  369. package/app/recipes/comments/index.html +26 -26
  370. package/app/recipes/commerce.customers/help/index.html +24 -24
  371. package/app/recipes/commerce.customers/index.html +26 -26
  372. package/app/recipes/commerce.estimates/help/index.html +26 -26
  373. package/app/recipes/commerce.estimates/index.html +26 -26
  374. package/app/recipes/commerce.purchases/help/index.html +26 -26
  375. package/app/recipes/commerce.purchases/index.html +26 -26
  376. package/app/recipes/commerce.sales/help/index.html +26 -26
  377. package/app/recipes/commerce.sales/index.html +26 -26
  378. package/app/recipes/commerce.vendors/help/index.html +24 -24
  379. package/app/recipes/commerce.vendors/index.html +26 -26
  380. package/app/recipes/commerce.wholesale/help/index.html +26 -26
  381. package/app/recipes/commerce.wholesale/index.html +26 -26
  382. package/app/recipes/events.calendar/help/index.html +24 -24
  383. package/app/recipes/events.calendar/index.html +26 -26
  384. package/app/recipes/expenses.tracking/help/index.html +26 -26
  385. package/app/recipes/expenses.tracking/index.html +26 -26
  386. package/app/recipes/fields.form-customization/help/index.html +24 -24
  387. package/app/recipes/fields.form-customization/index.html +26 -26
  388. package/app/recipes/ingestion/help/index.html +24 -24
  389. package/app/recipes/ingestion/index.html +26 -26
  390. package/app/recipes/integrations/help/index.html +24 -24
  391. package/app/recipes/integrations/index.html +26 -26
  392. package/app/recipes/inventory.stock/help/index.html +24 -24
  393. package/app/recipes/inventory.stock/index.html +26 -26
  394. package/app/recipes/ledgers.bookkeeping/help/index.html +24 -24
  395. package/app/recipes/ledgers.bookkeeping/index.html +26 -26
  396. package/app/recipes/messages/help/index.html +24 -24
  397. package/app/recipes/messages/index.html +26 -26
  398. package/app/recipes/products/help/index.html +24 -24
  399. package/app/recipes/products/index.html +26 -26
  400. package/app/recipes/projects.tracker/help/index.html +24 -24
  401. package/app/recipes/projects.tracker/index.html +27 -27
  402. package/app/recipes/reports.materialized/help/index.html +26 -26
  403. package/app/recipes/reports.materialized/index.html +29 -29
  404. package/app/recipes/reports.runtime/help/index.html +24 -24
  405. package/app/recipes/reports.runtime/index.html +27 -27
  406. package/app/recipes/sales.pipeline/help/index.html +24 -24
  407. package/app/recipes/sales.pipeline/index.html +26 -26
  408. package/app/recipes/tags.taxonomy/help/index.html +24 -24
  409. package/app/recipes/tags.taxonomy/index.html +26 -26
  410. package/app/recipes/team-collaboration/help/index.html +24 -24
  411. package/app/recipes/team-collaboration/index.html +26 -26
  412. package/app/recipes/timesheets.time-entries/help/index.html +24 -24
  413. package/app/recipes/timesheets.time-entries/index.html +26 -26
  414. package/app/s/custom-accounts/index.html +22 -22
  415. package/app/s/custom-appointments/index.html +22 -22
  416. package/app/s/custom-billing/index.html +22 -22
  417. package/app/s/custom-buying/index.html +22 -22
  418. package/app/s/custom-checkout/index.html +22 -22
  419. package/app/s/custom-classes/index.html +22 -22
  420. package/app/s/custom-clients/index.html +22 -22
  421. package/app/s/custom-events/index.html +22 -22
  422. package/app/s/custom-fleet/index.html +22 -22
  423. package/app/s/custom-giving/index.html +22 -22
  424. package/app/s/custom-jobs/index.html +22 -22
  425. package/app/s/custom-kitchen/index.html +22 -22
  426. package/app/s/custom-material/index.html +22 -22
  427. package/app/s/custom-meetings/index.html +22 -22
  428. package/app/s/custom-members/index.html +22 -22
  429. package/app/s/custom-paint/index.html +82 -0
  430. package/app/s/custom-parts/index.html +22 -22
  431. package/app/s/custom-rentals/index.html +22 -22
  432. package/app/s/custom-roastery/index.html +22 -22
  433. package/app/s/custom-schedule/index.html +22 -22
  434. package/app/s/custom-shelf/index.html +22 -22
  435. package/app/s/custom-shop/index.html +22 -22
  436. package/app/s/custom-wholesale/index.html +22 -22
  437. package/app/s/custom-work/index.html +22 -22
  438. package/app/s/custom-yard/index.html +22 -22
  439. package/app/s/section-access-control/index.html +22 -22
  440. package/app/s/section-account-security/index.html +22 -22
  441. package/app/s/section-accounting/index.html +22 -22
  442. package/app/s/section-activity/index.html +22 -22
  443. package/app/s/section-agreements/index.html +22 -22
  444. package/app/s/section-analytics/index.html +22 -22
  445. package/app/s/section-assets/index.html +22 -22
  446. package/app/s/section-billing/index.html +22 -22
  447. package/app/s/section-calendar/index.html +22 -22
  448. package/app/s/section-catalog/index.html +22 -22
  449. package/app/s/section-chat.assistant/index.html +22 -22
  450. package/app/s/section-comments/index.html +22 -22
  451. package/app/s/section-fields.form-customization/index.html +22 -22
  452. package/app/s/section-ingestion/index.html +22 -22
  453. package/app/s/section-integrations/index.html +22 -22
  454. package/app/s/section-messages/index.html +22 -22
  455. package/app/s/section-more/index.html +22 -22
  456. package/app/s/section-operations/index.html +22 -22
  457. package/app/s/section-projects/index.html +22 -22
  458. package/app/s/section-purchasing/index.html +22 -22
  459. package/app/s/section-reports.materialized/index.html +22 -22
  460. package/app/s/section-reports.runtime/index.html +22 -22
  461. package/app/s/section-sales/index.html +22 -22
  462. package/app/s/section-taxonomy/index.html +22 -22
  463. package/app/s/section-team/index.html +22 -22
  464. package/app/s/section-work/index.html +22 -22
  465. package/dist/ai/instance.d.ts.map +1 -1
  466. package/dist/ai/instance.js +9 -1
  467. package/dist/assistant/change.d.ts +13 -3
  468. package/dist/assistant/change.d.ts.map +1 -1
  469. package/dist/assistant/change.js +18 -3
  470. package/dist/assistant/prompt.d.ts +6 -1
  471. package/dist/assistant/prompt.d.ts.map +1 -1
  472. package/dist/assistant/prompt.js +13 -1
  473. package/dist/assistant/session.svelte.d.ts +5 -0
  474. package/dist/assistant/session.svelte.d.ts.map +1 -1
  475. package/dist/assistant/session.svelte.js +1 -0
  476. package/dist/assistant/transport.d.ts +24 -1
  477. package/dist/assistant/transport.d.ts.map +1 -1
  478. package/dist/assistant/transport.js +57 -8
  479. package/dist/catalog/catalog.json +1366 -51
  480. package/dist/components/BrowserAssistant.svelte +0 -2
  481. package/dist/components/BrowserAssistant.svelte.d.ts.map +1 -1
  482. package/dist/components/CookbooksPanel.svelte +101 -21
  483. package/dist/components/CookbooksPanel.svelte.d.ts.map +1 -1
  484. package/dist/data/format.d.ts.map +1 -1
  485. package/dist/data/format.js +3 -0
  486. package/dist/data/money.d.ts +1 -1
  487. package/dist/data/money.js +2 -2
  488. package/dist/data/packs.d.ts +0 -1
  489. package/dist/data/packs.d.ts.map +1 -1
  490. package/dist/data/packs.js +835 -1
  491. package/dist/library/apply.d.ts +7 -3
  492. package/dist/library/apply.d.ts.map +1 -1
  493. package/dist/library/apply.js +19 -6
  494. package/dist/library/document.d.ts +9 -0
  495. package/dist/library/document.d.ts.map +1 -1
  496. package/dist/library/document.js +29 -0
  497. package/dist/library/icons.d.ts.map +1 -1
  498. package/dist/library/icons.js +15 -0
  499. package/dist/library/index.d.ts +4 -1
  500. package/dist/library/index.d.ts.map +1 -1
  501. package/dist/library/index.js +9 -2
  502. package/dist/library/library.json +919 -14
  503. package/dist/library/state.svelte.d.ts +5 -1
  504. package/dist/library/state.svelte.d.ts.map +1 -1
  505. package/dist/library/state.svelte.js +12 -1
  506. package/dist/library/view.svelte.d.ts +41 -0
  507. package/dist/library/view.svelte.d.ts.map +1 -0
  508. package/dist/library/view.svelte.js +67 -0
  509. package/dist/planner/Planner.svelte +79 -2
  510. package/dist/planner/Planner.svelte.d.ts.map +1 -1
  511. package/dist/planner/PlannerControls.svelte +21 -2
  512. package/dist/planner/PlannerControls.svelte.d.ts.map +1 -1
  513. package/dist/planner/assistant.d.ts.map +1 -1
  514. package/dist/planner/assistant.js +9 -0
  515. package/dist/planner/commands/adapter.d.ts.map +1 -1
  516. package/dist/planner/commands/adapter.js +10 -3
  517. package/dist/planner/commands/controller.svelte.d.ts.map +1 -1
  518. package/dist/planner/commands/controller.svelte.js +2 -1
  519. package/dist/recipes/scope.d.ts +23 -0
  520. package/dist/recipes/scope.d.ts.map +1 -1
  521. package/dist/recipes/scope.js +20 -0
  522. package/dist/smrt-version.d.ts +1 -1
  523. package/dist/smrt-version.js +1 -1
  524. package/package.json +56 -56
  525. package/app/_app/immutable/assets/2.Djk1H2wk.css +0 -1
  526. package/app/_app/immutable/chunks/BV_A2GBw.js +0 -24
  527. package/app/_app/immutable/chunks/CbCYY1ps.js +0 -1
  528. package/app/_app/immutable/chunks/DD4mX3od.js +0 -1
  529. package/app/_app/immutable/chunks/DgkBKeKW.js +0 -4
  530. package/app/_app/immutable/chunks/DvUWb_GS.js +0 -1
  531. package/app/_app/immutable/chunks/M81UeXT1.js +0 -1
  532. package/app/_app/immutable/chunks/g7M7feZg.js +0 -1
  533. package/app/_app/immutable/chunks/r7IFcw-O.js +0 -1
  534. package/app/_app/immutable/entry/start.BixveMT0.js +0 -1
  535. package/app/_app/immutable/nodes/0._WFh95JB.js +0 -9
  536. package/app/_app/immutable/nodes/2.D3Lg90Nn.js +0 -24
  537. /package/app/_app/immutable/chunks/{DVQPWAnI.js → Bv5jGtB8.js} +0 -0
@@ -1,10 +1,14 @@
1
1
  /** Which cookbook the visitor last applied; a UI note, not part of the cookbook. */
2
2
  export declare const COOKBOOK_KEY = "smrt-planner:cookbook";
3
+ /** The `workFingerprint` of the document the visitor last applied, as applied. */
4
+ export declare const APPLIED_WORK_KEY = "smrt-planner:cookbook-applied";
3
5
  declare class CookbookState {
4
6
  active: string | null;
7
+ /** What applying `active` set up, to tell later edits from none. */
8
+ appliedWork: string | null;
5
9
  /** Read the remembered cookbook (browser only; never throws). */
6
10
  load(storage?: Storage | null): void;
7
- select(id: string, storage?: Storage | null): void;
11
+ select(id: string, work?: string | null, storage?: Storage | null): void;
8
12
  }
9
13
  export declare const libraryState: CookbookState;
10
14
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"state.svelte.d.ts","sourceRoot":"","sources":["../../src/lib/library/state.svelte.ts"],"names":[],"mappings":"AAGA,oFAAoF;AACpF,eAAO,MAAM,YAAY,0BAA0B,CAAC;AAEpD,cAAM,aAAa;IACjB,MAAM,gBAA+B;IAErC,iEAAiE;IACjE,IAAI,CAAC,OAAO,GAAE,OAAO,GAAG,IAAuB,GAAG,IAAI;IAUtD,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,GAAE,OAAO,GAAG,IAAuB,GAAG,IAAI;CAQrE;AAED,eAAO,MAAM,YAAY,eAAsB,CAAC"}
1
+ {"version":3,"file":"state.svelte.d.ts","sourceRoot":"","sources":["../../src/lib/library/state.svelte.ts"],"names":[],"mappings":"AAGA,oFAAoF;AACpF,eAAO,MAAM,YAAY,0BAA0B,CAAC;AACpD,kFAAkF;AAClF,eAAO,MAAM,gBAAgB,kCAAkC,CAAC;AAEhE,cAAM,aAAa;IACjB,MAAM,gBAA+B;IACrC,oEAAoE;IACpE,WAAW,gBAA+B;IAE1C,iEAAiE;IACjE,IAAI,CAAC,OAAO,GAAE,OAAO,GAAG,IAAuB,GAAG,IAAI;IAYtD,MAAM,CACJ,EAAE,EAAE,MAAM,EACV,IAAI,GAAE,MAAM,GAAG,IAAW,EAC1B,OAAO,GAAE,OAAO,GAAG,IAAuB,GACzC,IAAI;CAWR;AAED,eAAO,MAAM,YAAY,eAAsB,CAAC"}
@@ -2,23 +2,34 @@ import { browserStorage } from "../cookbook/storage.js";
2
2
  import { setSamplePack } from "../data/packs.js";
3
3
  /** Which cookbook the visitor last applied; a UI note, not part of the cookbook. */
4
4
  export const COOKBOOK_KEY = 'smrt-planner:cookbook';
5
+ /** The `workFingerprint` of the document the visitor last applied, as applied. */
6
+ export const APPLIED_WORK_KEY = 'smrt-planner:cookbook-applied';
5
7
  class CookbookState {
6
8
  active = $state(null);
9
+ /** What applying `active` set up, to tell later edits from none. */
10
+ appliedWork = $state(null);
7
11
  /** Read the remembered cookbook (browser only; never throws). */
8
12
  load(storage = browserStorage()) {
9
13
  try {
10
14
  this.active = storage?.getItem(COOKBOOK_KEY) ?? null;
15
+ this.appliedWork = storage?.getItem(APPLIED_WORK_KEY) ?? null;
11
16
  }
12
17
  catch {
13
18
  this.active = null;
19
+ this.appliedWork = null;
14
20
  }
15
21
  // The sample data follows the cookbook the visitor last applied.
16
22
  setSamplePack(this.active);
17
23
  }
18
- select(id, storage = browserStorage()) {
24
+ select(id, work = null, storage = browserStorage()) {
19
25
  this.active = id;
26
+ this.appliedWork = work;
20
27
  try {
21
28
  storage?.setItem(COOKBOOK_KEY, id);
29
+ if (work === null)
30
+ storage?.removeItem(APPLIED_WORK_KEY);
31
+ else
32
+ storage?.setItem(APPLIED_WORK_KEY, work);
22
33
  }
23
34
  catch {
24
35
  // Remembered in memory only.
@@ -0,0 +1,41 @@
1
+ /** The query parameter naming the open cookbook: `?tab=cookbooks&cookbook=mechanic`. */
2
+ export declare const COOKBOOK_PARAM = "cookbook";
3
+ /**
4
+ * How a host keeps the open cookbook in its address, so browser Back returns
5
+ * to the grid and a link opens the detail. The static app pushes a shallow
6
+ * history entry (`?cookbook=`); the mounted Planner a fragment route
7
+ * (`#/configure/cookbooks/<id>/`). Each one ends by calling `cookbookView.set`.
8
+ */
9
+ export interface CookbookNavigator {
10
+ open(id: string): void;
11
+ close(): void;
12
+ }
13
+ /**
14
+ * The Cookbooks tab's view: the grid, or one cookbook's detail in its place.
15
+ * A UI note like the active tab, never part of the cookbook document.
16
+ */
17
+ declare class CookbookView {
18
+ /** The cookbook whose detail is shown; null shows the grid. */
19
+ open: string | null;
20
+ /** The card the visitor opened, to take focus back to on the way out. */
21
+ returnTo: string | null;
22
+ /** Set by a host that keeps the open cookbook in its address. */
23
+ navigator: CookbookNavigator | null;
24
+ /** Open a cookbook's detail in place of the grid. */
25
+ show(id: string): void;
26
+ /** Back to the grid. */
27
+ back(): void;
28
+ /**
29
+ * Swap the view. A view transition crossfades the grid and the detail (the
30
+ * shell's helper: none under reduced motion, an instant swap). `transition:
31
+ * false` for a host whose own router already runs one, and for a page load.
32
+ */
33
+ set(id: string | null, transition?: boolean): Promise<void>;
34
+ }
35
+ export declare const cookbookView: CookbookView;
36
+ /** The cookbook a query string opens (`?cookbook=`), when it is one of `ids`. */
37
+ export declare function cookbookFromSearch(search: string, ids: readonly string[]): string | null;
38
+ /** Set or drop `?cookbook=` in a query string, keeping every other parameter. */
39
+ export declare function withCookbook(query: string, id: string | null): string;
40
+ export {};
41
+ //# sourceMappingURL=view.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"view.svelte.d.ts","sourceRoot":"","sources":["../../src/lib/library/view.svelte.ts"],"names":[],"mappings":"AAGA,wFAAwF;AACxF,eAAO,MAAM,cAAc,aAAa,CAAC;AAEzC;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,KAAK,IAAI,IAAI,CAAC;CACf;AAED;;;GAGG;AACH,cAAM,YAAY;IAChB,+DAA+D;IAC/D,IAAI,gBAA+B;IACnC,yEAAyE;IACzE,QAAQ,gBAA+B;IACvC,iEAAiE;IACjE,SAAS,EAAE,iBAAiB,GAAG,IAAI,CAAQ;IAE3C,qDAAqD;IACrD,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAMtB,wBAAwB;IACxB,IAAI,IAAI,IAAI;IAOZ;;;;OAIG;IACG,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,EAAE,UAAU,UAAO,GAAG,OAAO,CAAC,IAAI,CAAC;CAW/D;AAED,eAAO,MAAM,YAAY,cAAqB,CAAC;AAE/C,iFAAiF;AACjF,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,SAAS,MAAM,EAAE,GACrB,MAAM,GAAG,IAAI,CAGf;AAED,iFAAiF;AACjF,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAMrE"}
@@ -0,0 +1,67 @@
1
+ import { tick } from 'svelte';
2
+ import { runViewTransition } from "../motion/view-transition.js";
3
+ /** The query parameter naming the open cookbook: `?tab=cookbooks&cookbook=mechanic`. */
4
+ export const COOKBOOK_PARAM = 'cookbook';
5
+ /**
6
+ * The Cookbooks tab's view: the grid, or one cookbook's detail in its place.
7
+ * A UI note like the active tab, never part of the cookbook document.
8
+ */
9
+ class CookbookView {
10
+ /** The cookbook whose detail is shown; null shows the grid. */
11
+ open = $state(null);
12
+ /** The card the visitor opened, to take focus back to on the way out. */
13
+ returnTo = $state(null);
14
+ /** Set by a host that keeps the open cookbook in its address. */
15
+ navigator = null;
16
+ /** Open a cookbook's detail in place of the grid. */
17
+ show(id) {
18
+ this.returnTo = id;
19
+ if (this.navigator)
20
+ this.navigator.open(id);
21
+ else
22
+ void this.set(id);
23
+ }
24
+ /** Back to the grid. */
25
+ back() {
26
+ // A link that opened the detail came from no card: its own card it is.
27
+ if (this.open)
28
+ this.returnTo = this.open;
29
+ if (this.navigator)
30
+ this.navigator.close();
31
+ else
32
+ void this.set(null);
33
+ }
34
+ /**
35
+ * Swap the view. A view transition crossfades the grid and the detail (the
36
+ * shell's helper: none under reduced motion, an instant swap). `transition:
37
+ * false` for a host whose own router already runs one, and for a page load.
38
+ */
39
+ async set(id, transition = true) {
40
+ if (this.open === id)
41
+ return;
42
+ if (!transition) {
43
+ this.open = id;
44
+ return;
45
+ }
46
+ await runViewTransition(async () => {
47
+ this.open = id;
48
+ await tick();
49
+ });
50
+ }
51
+ }
52
+ export const cookbookView = new CookbookView();
53
+ /** The cookbook a query string opens (`?cookbook=`), when it is one of `ids`. */
54
+ export function cookbookFromSearch(search, ids) {
55
+ const id = new URLSearchParams(search).get(COOKBOOK_PARAM);
56
+ return id && ids.includes(id) ? id : null;
57
+ }
58
+ /** Set or drop `?cookbook=` in a query string, keeping every other parameter. */
59
+ export function withCookbook(query, id) {
60
+ const params = new URLSearchParams(query);
61
+ if (id)
62
+ params.set(COOKBOOK_PARAM, id);
63
+ else
64
+ params.delete(COOKBOOK_PARAM);
65
+ const out = params.toString().replace(/%2C/gi, ',');
66
+ return out ? `?${out}` : '';
67
+ }
@@ -25,8 +25,10 @@ import ThemeBridge from '../components/ThemeBridge.svelte';
25
25
  import { cookbookStore, SHELL_STORAGE_KEY } from '../cookbook/store.svelte.js';
26
26
  import type { Cookbook } from '../cookbook/types.js';
27
27
  import { provideDataSource, tryUseDataSource } from '../data/context.js';
28
+ import { humanize, navNoun, pluralize } from '../data/format.js';
28
29
  import { createPlannerDataSource } from '../data/planner-source.js';
29
30
  import { activeForms } from '../forms/active.js';
31
+ import { cookbookView } from '../library/view.svelte.js';
30
32
  import { runViewTransition } from '../motion/view-transition.js';
31
33
  import { plannerLoaders, resolveRecipeExport } from '../overviews/registry.js';
32
34
  import {
@@ -35,7 +37,8 @@ import {
35
37
  recipes,
36
38
  recipesById,
37
39
  } from '../recipes/index.js';
38
- import { pageScope, scopePreset } from '../recipes/scope.js';
40
+ import { menuEntryWords, pageScope, scopePreset } from '../recipes/scope.js';
41
+ import { navItemId } from '../recipes/sections.js';
39
42
  import { recipeState } from '../recipes/state.svelte.js';
40
43
  import { entryIndex } from '../sections/entries.js';
41
44
  import { sectionInfo, sectionTitle } from '../sections/info.js';
@@ -44,6 +47,7 @@ import { DEFAULT_PRESET } from '../theme/theme.js';
44
47
  import { appHref, setBasePath } from './app.svelte.js';
45
48
  import { PLANNER_TAB_IDS } from './commands/index.js';
46
49
  import { CHEF_HAT_ICON, EXPORT_ICON } from './header-icons.js';
50
+ import { plannerRuntime } from './instance.js';
47
51
  import PlannerControls from './PlannerControls.svelte';
48
52
  import PlannerLifecycle from './PlannerLifecycle.svelte';
49
53
  import { parseModelRoute, recordFilter, splitRoute } from './routes.js';
@@ -211,6 +215,34 @@ const scope = $derived.by(() => {
211
215
  );
212
216
  });
213
217
  const preset = $derived(scopePreset(scope));
218
+ // The list's heading and New noun follow its menu entry, as the static app's.
219
+ const entryWords = $derived.by(() => {
220
+ if (!model || !modelRoute) return {};
221
+ return menuEntryWords(
222
+ model,
223
+ navItemId(modelRoute.packageId, modelRoute.modelName, modelRoute.view),
224
+ modelRoute.view,
225
+ recipeState.ids.flatMap((id) => {
226
+ const recipe = recipes.find((r) => r.id === id);
227
+ return recipe ? recipeNav(recipe) : [];
228
+ }),
229
+ cookbookStore.layout,
230
+ humanize,
231
+ );
232
+ });
233
+ // The document title for every route a section page does not title itself
234
+ // (`CookbookSectionPage` sets its own): set as the route changes, so the
235
+ // previous page's title never lingers.
236
+ const pageTitle = $derived.by(() => {
237
+ if (model) return entryWords.label ?? pluralize(humanize(model.name));
238
+ if (packageId) return humanize(packageId);
239
+ if (pathParts[0] === 'advanced-styles') return 'Advanced styles';
240
+ if (pathParts[0] === 'ai') return 'AI models';
241
+ return title;
242
+ });
243
+ const listNoun = $derived(
244
+ entryWords.label ? navNoun(entryWords.label, entryWords.noun) : undefined,
245
+ );
214
246
  // The planner's own pages (`#/configure/`, and any route no page above
215
247
  // claims) show the customization controls; the header marks them current.
216
248
  const configuring = $derived(
@@ -230,6 +262,47 @@ const routeTab = $derived(
230
262
  $effect(() => {
231
263
  if (routeTab) plannerTab.active = routeTab;
232
264
  });
265
+ // `#/configure/cookbooks/<id>/` opens that cookbook's detail on the Cookbooks
266
+ // tab; the hash router's own view transition is the swap, so none here.
267
+ // Opening one pushes the route, so browser Back returns to the grid.
268
+ // Any other configure route (`#/configure/`, where the header's Planner link
269
+ // and an empty app land, or another tab's) is the grid.
270
+ const routeCookbook = $derived(
271
+ pathParts[0] === 'configure'
272
+ ? pathParts[1] === 'cookbooks'
273
+ ? (pathParts[2] ?? null)
274
+ : null
275
+ : undefined,
276
+ );
277
+ $effect(() => {
278
+ if (routeCookbook !== undefined) void cookbookView.set(routeCookbook, false);
279
+ });
280
+ let openedHere = false;
281
+ onMount(() => {
282
+ // The controller's `focus` (the assistant's "take me to it") opens a
283
+ // section through this, as the static layout's does with its router.
284
+ const previousOpen = plannerRuntime.openSection;
285
+ plannerRuntime.openSection = (id) => {
286
+ location.hash = `#${shell.sectionPath(id)}`;
287
+ };
288
+ const previous = cookbookView.navigator;
289
+ cookbookView.navigator = {
290
+ open(id) {
291
+ openedHere = true;
292
+ location.hash = `#/configure/cookbooks/${encodeURIComponent(id)}/`;
293
+ },
294
+ close() {
295
+ if (openedHere) {
296
+ openedHere = false;
297
+ history.back();
298
+ } else location.replace('#/configure/cookbooks/');
299
+ },
300
+ };
301
+ return () => {
302
+ cookbookView.navigator = previous;
303
+ plannerRuntime.openSection = previousOpen;
304
+ };
305
+ });
233
306
  const exporting = $derived(configuring && plannerTab.active === 'export');
234
307
  /** The mount's own way around: a fragment route. */
235
308
  const navigate = (path: string) => {
@@ -335,6 +408,10 @@ const dockToggles = $derived(
335
408
  (`CookbookSectionPage`, drawn `plain` with the planner's heading) to the
336
409
  sample data; `loaders.shortcuts` adds the record counts.
337
410
  -->
411
+ <svelte:head>
412
+ {#if !sectionSlug}<title>{pageTitle}</title>{/if}
413
+ </svelte:head>
414
+
338
415
  <CookbookApp
339
416
  cookbook={cookbook as ComponentProps<typeof CookbookApp>['cookbook']}
340
417
  catalog={shellCatalog}
@@ -385,7 +462,7 @@ const dockToggles = $derived(
385
462
  />
386
463
  {/key}
387
464
  {:else if applied && model}
388
- <ModelWorkspace model={applied.model} fields={applied.fields} {forms} {scope} {preset} href={hashHref} />
465
+ <ModelWorkspace model={applied.model} fields={applied.fields} {forms} {scope} {preset} title={entryWords.heading} noun={listNoun} href={hashHref} />
389
466
  {:else}
390
467
  <PlannerControls {controller} {basePath} {inference} {persistence} {themeControls} {tabs} managedByParent layout="shell" advancedStylesHref="#/advanced-styles/" />
391
468
  {/if}
@@ -1 +1 @@
1
- {"version":3,"file":"Planner.svelte.d.ts","sourceRoot":"","sources":["../../src/lib/planner/Planner.svelte.ts"],"names":[],"mappings":"AAuDA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AA2U/C,QAAA,MAAM,OAAO,kDAAwC,CAAC;AACtD,KAAK,OAAO,GAAG,UAAU,CAAC,OAAO,OAAO,CAAC,CAAC;AAC1C,eAAe,OAAO,CAAC"}
1
+ {"version":3,"file":"Planner.svelte.d.ts","sourceRoot":"","sources":["../../src/lib/planner/Planner.svelte.ts"],"names":[],"mappings":"AA2DA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAwZ/C,QAAA,MAAM,OAAO,kDAAwC,CAAC;AACtD,KAAK,OAAO,GAAG,UAAU,CAAC,OAAO,OAAO,CAAC,CAAC;AAC1C,eAAe,OAAO,CAAC"}
@@ -6,7 +6,7 @@ import {
6
6
  useShellLayout,
7
7
  } from '@happyvertical/smrt-svelte/workspace';
8
8
  import { Tabs } from '@happyvertical/smrt-ui';
9
- import { onMount, untrack } from 'svelte';
9
+ import { onMount, tick, untrack } from 'svelte';
10
10
  import CookbooksPanel from '../components/CookbooksPanel.svelte';
11
11
  import ExportPanel from '../components/ExportPanel.svelte';
12
12
  import FeaturesPanel from '../components/FeaturesPanel.svelte';
@@ -125,6 +125,25 @@ onMount(() => {
125
125
  });
126
126
  return stop;
127
127
  });
128
+ // A tab opened while the page is scrolled down (from the header's links, the
129
+ // palette, a focus command, or a long Recipes list) would show the new panel
130
+ // at the old offset, with the tab strip out of sight. Bring the strip back
131
+ // into view on a change; nothing moves when it is already visible.
132
+ let root = $state<HTMLElement | null>(null);
133
+ let shownTab: string | undefined;
134
+ $effect(() => {
135
+ const tab = active;
136
+ if (shownTab === undefined || shownTab === tab) {
137
+ shownTab = tab;
138
+ return;
139
+ }
140
+ shownTab = tab;
141
+ void tick().then(() => {
142
+ root
143
+ ?.querySelector<HTMLElement>('[role="tablist"]')
144
+ ?.scrollIntoView({ block: 'nearest' });
145
+ });
146
+ });
128
147
  $effect(() => {
129
148
  const tab = plannerTab.active;
130
149
  untrack(() => {
@@ -140,7 +159,7 @@ $effect(() => {
140
159
  {/if}
141
160
 
142
161
  {#snippet view()}
143
- <div class="planner">
162
+ <div class="planner" bind:this={root}>
144
163
  <Tabs tabs={items} {active} onchange={select} aria-label="Planner">
145
164
  {#if reachable.includes('cookbooks')}
146
165
  <div hidden={active !== 'cookbooks'}><CookbooksPanel /></div>
@@ -1 +1 @@
1
- {"version":3,"file":"PlannerControls.svelte.d.ts","sourceRoot":"","sources":["../../src/lib/planner/PlannerControls.svelte.ts"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG/C;;;;GAIG;AACH,UAAU,oBAAqB,SAAQ,YAAY;IACjD;;;;OAIG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAyKD,QAAA,MAAM,eAAe,0DAAwC,CAAC;AAC9D,KAAK,eAAe,GAAG,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC;AAC1D,eAAe,eAAe,CAAC"}
1
+ {"version":3,"file":"PlannerControls.svelte.d.ts","sourceRoot":"","sources":["../../src/lib/planner/PlannerControls.svelte.ts"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG/C;;;;GAIG;AACH,UAAU,oBAAqB,SAAQ,YAAY;IACjD;;;;OAIG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AA4LD,QAAA,MAAM,eAAe,0DAAwC,CAAC;AAC9D,KAAK,eAAe,GAAG,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC;AAC1D,eAAe,eAAe,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"assistant.d.ts","sourceRoot":"","sources":["../../src/lib/planner/assistant.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAC;AAC/D,OAAO,EACL,KAAK,yBAAyB,EAC9B,KAAK,SAAS,EAEf,MAAM,2BAA2B,CAAC;AAGnC,OAAO,EAAkB,KAAK,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAI9E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE7D;;;;;GAKG;AACH,MAAM,WAAW,oBAAoB;IACnC,wEAAwE;IACxE,IAAI,EAAE,SAAS,GAAG,CAAC,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC;IAC3C,qEAAqE;IACrE,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAClC;AAED;;;;;;;;GAQG;AACH,MAAM,MAAM,sBAAsB,GAAG,eAAe,GAAG;IACrD,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,oBAAoB,GAAG,sBAAsB,CAAC;AAE7E,MAAM,WAAW,gBAAgB;IAC/B,qDAAqD;IACrD,SAAS,EAAE,yBAAyB,CAAC;IACrC,4EAA4E;IAC5E,UAAU,EAAE,UAAU,CAAC;IACvB,uBAAuB;IACvB,IAAI,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC;IAC9B,wEAAwE;IACxE,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAyFD;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,iBAAiB,EAC7B,SAAS,EAAE,gBAAgB,GAC1B,gBAAgB,CAgDlB"}
1
+ {"version":3,"file":"assistant.d.ts","sourceRoot":"","sources":["../../src/lib/planner/assistant.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAC;AAC/D,OAAO,EACL,KAAK,yBAAyB,EAC9B,KAAK,SAAS,EAEf,MAAM,2BAA2B,CAAC;AAGnC,OAAO,EAAkB,KAAK,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAI9E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAG7D;;;;;GAKG;AACH,MAAM,WAAW,oBAAoB;IACnC,wEAAwE;IACxE,IAAI,EAAE,SAAS,GAAG,CAAC,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC;IAC3C,qEAAqE;IACrE,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAClC;AAED;;;;;;;;GAQG;AACH,MAAM,MAAM,sBAAsB,GAAG,eAAe,GAAG;IACrD,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,oBAAoB,GAAG,sBAAsB,CAAC;AAE7E,MAAM,WAAW,gBAAgB;IAC/B,qDAAqD;IACrD,SAAS,EAAE,yBAAyB,CAAC;IACrC,4EAA4E;IAC5E,UAAU,EAAE,UAAU,CAAC;IACvB,uBAAuB;IACvB,IAAI,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC;IAC9B,wEAAwE;IACxE,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAyFD;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,iBAAiB,EAC7B,SAAS,EAAE,gBAAgB,GAC1B,gBAAgB,CAyDlB"}
@@ -5,6 +5,7 @@ import { savedByoChat } from "../inference/byo.svelte.js";
5
5
  import { configFromProp } from "../inference/config.js";
6
6
  import { createHostChat } from "../inference/host.js";
7
7
  import { recipes } from "../recipes/index.js";
8
+ import { plannerController, plannerRuntime } from "./instance.js";
8
9
  /** The controller's recipes as the store the assistant reads. Changes are commands. */
9
10
  function recipeStoreOf(controller) {
10
11
  return {
@@ -135,6 +136,14 @@ export function createPlannerAssistant(controller, inference) {
135
136
  themeUndos,
136
137
  controller,
137
138
  onReply: inference.onReply,
139
+ // Navigation goes through the app's own controller only (its `focus`
140
+ // reaches `plannerRuntime.openSection`); a host's controller may not.
141
+ menu: () => controller === plannerController && plannerRuntime.openSection
142
+ ? controller
143
+ .snapshot()
144
+ .sections.filter((section) => !section.hidden)
145
+ .map(({ id, label }) => ({ id, label }))
146
+ : [],
138
147
  });
139
148
  return { transport, themeUndos, mode, ...(notice ? { notice } : {}) };
140
149
  }
@@ -1 +1 @@
1
- {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/lib/planner/commands/adapter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/lib/planner/commands/adapter.ts"],"names":[],"mappings":"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"}
@@ -411,19 +411,26 @@ export function createPlannerAdapter(config) {
411
411
  /**
412
412
  * Applying a library cookbook that sets no theme keeps the person's own look
413
413
  * (as the Cookbooks tab does): the preset, brand colour, colour scheme,
414
- * corner radius, density and contrast (the font is not carried). Returns
415
- * the patch.
414
+ * corner radius, density and contrast (the font is not carried). One that
415
+ * sets a theme without a colour scheme keeps the person's light or dark.
416
+ * Returns the patch.
416
417
  */
417
418
  function themeToKeep(raw) {
418
419
  const input = raw.input;
419
420
  if (raw.name !== 'apply_cookbook' || !isObject(input))
420
421
  return undefined;
421
422
  const book = catalog.cookbooks?.find((c) => c.id === input.id);
422
- if (!book || book.document.theme)
423
+ if (!book)
423
424
  return undefined;
424
425
  const theme = engine.cookbook().theme;
425
426
  if (!theme)
426
427
  return undefined;
428
+ const own = book.document.theme;
429
+ if (own) {
430
+ return own.colorScheme || !theme.colorScheme
431
+ ? undefined
432
+ : { colorScheme: theme.colorScheme };
433
+ }
427
434
  const patch = {};
428
435
  if (theme.preset)
429
436
  patch.preset = theme.preset;
@@ -1 +1 @@
1
- {"version":3,"file":"controller.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/planner/commands/controller.svelte.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,aAAa,EAEnB,MAAM,gCAAgC,CAAC;AAIxC,OAAO,EAGL,KAAK,cAAc,EACnB,KAAK,iBAAiB,EACtB,KAAK,wBAAwB,EAC7B,KAAK,WAAW,EACjB,MAAM,cAAc,CAAC;AAItB,YAAY,EACV,iBAAiB,EACjB,wBAAwB,EACxB,iBAAiB,GAClB,MAAM,cAAc,CAAC;AAatB,qFAAqF;AACrF,wBAAgB,aAAa,CAAC,KAAK,EAAE,aAAa,GAAG,WAAW,CAmB/D;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,GAAE,aAA6B,EACpC,OAAO,GAAE,wBAA6B,GACrC,iBAAiB,GAAG,IAAI,CAAC,cAAc,EAAE,UAAU,GAAG,MAAM,GAAG,OAAO,CAAC,CA4BzE"}
1
+ {"version":3,"file":"controller.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/planner/commands/controller.svelte.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,aAAa,EAEnB,MAAM,gCAAgC,CAAC;AAKxC,OAAO,EAGL,KAAK,cAAc,EACnB,KAAK,iBAAiB,EACtB,KAAK,wBAAwB,EAC7B,KAAK,WAAW,EACjB,MAAM,cAAc,CAAC;AAItB,YAAY,EACV,iBAAiB,EACjB,wBAAwB,EACxB,iBAAiB,GAClB,MAAM,cAAc,CAAC;AAatB,qFAAqF;AACrF,wBAAgB,aAAa,CAAC,KAAK,EAAE,aAAa,GAAG,WAAW,CAmB/D;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,GAAE,aAA6B,EACpC,OAAO,GAAE,wBAA6B,GACrC,iBAAiB,GAAG,IAAI,CAAC,cAAc,EAAE,UAAU,GAAG,MAAM,GAAG,OAAO,CAAC,CA4BzE"}
@@ -2,6 +2,7 @@ import { untrack } from 'svelte';
2
2
  import { cookbookStore, } from "../../cookbook/store.svelte.js";
3
3
  import { parseCookbook } from "../../cookbook/validate.js";
4
4
  import { setSamplePack } from "../../data/packs.js";
5
+ import { workFingerprint } from "../../library/document.js";
5
6
  import { libraryState } from "../../library/state.svelte.js";
6
7
  import { createPlannerAdapter, } from "./adapter.js";
7
8
  import { engineCatalog } from "./catalog.js";
@@ -32,7 +33,7 @@ export function portFromStore(store) {
32
33
  else
33
34
  store.apply(next);
34
35
  if (libraryApplied && applied) {
35
- libraryState.select(applied);
36
+ libraryState.select(applied, workFingerprint(store.snapshot()));
36
37
  setSamplePack(applied);
37
38
  }
38
39
  },
@@ -22,5 +22,28 @@ export declare function pageScope(modelId: string, view: string | undefined, add
22
22
  export declare function inScope(scope: RowScope | undefined, row: Record<string, unknown>): boolean;
23
23
  /** Values a row created from the page carries, so it stays in view. */
24
24
  export declare function scopePreset(scope: RowScope | undefined): Record<string, unknown>;
25
+ /**
26
+ * A model page's menu words: the label its menu entry shows (the layout's
27
+ * rename, a cookbook's or the visitor's, else the added recipe entry's own)
28
+ * and its declared New noun. `heading` is that label unless it only repeats
29
+ * the model's name. The static app reads the rendered menu (`ModelPage`); the
30
+ * mount, outside the shell's context, reads the same sources here.
31
+ */
32
+ export declare function menuEntryWords(model: {
33
+ id: string;
34
+ name: string;
35
+ }, itemId: string, view: string | undefined, added: readonly (Pick<RecipeNavTarget, 'key' | 'label' | 'noun'> & {
36
+ model: {
37
+ id: string;
38
+ };
39
+ })[], layout: {
40
+ items?: Record<string, {
41
+ label?: string;
42
+ } | undefined>;
43
+ } | undefined, humanize: (name: string) => string): {
44
+ label?: string;
45
+ heading?: string;
46
+ noun?: string;
47
+ };
25
48
  export {};
26
49
  //# sourceMappingURL=scope.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"scope.d.ts","sourceRoot":"","sources":["../../src/lib/recipes/scope.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD;;;;GAIG;AACH,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,KAAK,WAAW,GAAG,IAAI,CAAC,eAAe,EAAE,KAAK,GAAG,QAAQ,CAAC,GAAG;IAC3D,KAAK,EAAE;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;CACvB,CAAC;AAEF;;;GAGG;AACH,wBAAgB,SAAS,CACvB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,KAAK,EAAE,SAAS,WAAW,EAAE,GAC5B,QAAQ,GAAG,SAAS,CAatB;AAED,wBAAgB,OAAO,CACrB,KAAK,EAAE,QAAQ,GAAG,SAAS,EAC3B,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC3B,OAAO,CAKT;AAED,uEAAuE;AACvE,wBAAgB,WAAW,CACzB,KAAK,EAAE,QAAQ,GAAG,SAAS,GAC1B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzB"}
1
+ {"version":3,"file":"scope.d.ts","sourceRoot":"","sources":["../../src/lib/recipes/scope.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD;;;;GAIG;AACH,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,KAAK,WAAW,GAAG,IAAI,CAAC,eAAe,EAAE,KAAK,GAAG,QAAQ,CAAC,GAAG;IAC3D,KAAK,EAAE;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;CACvB,CAAC;AAEF;;;GAGG;AACH,wBAAgB,SAAS,CACvB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,KAAK,EAAE,SAAS,WAAW,EAAE,GAC5B,QAAQ,GAAG,SAAS,CAatB;AAED,wBAAgB,OAAO,CACrB,KAAK,EAAE,QAAQ,GAAG,SAAS,EAC3B,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC3B,OAAO,CAKT;AAED,uEAAuE;AACvE,wBAAgB,WAAW,CACzB,KAAK,EAAE,QAAQ,GAAG,SAAS,GAC1B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzB;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EACnC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,KAAK,EAAE,SAAS,CAAC,IAAI,CAAC,eAAe,EAAE,KAAK,GAAG,OAAO,GAAG,MAAM,CAAC,GAAG;IACjE,KAAK,EAAE;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;CACvB,CAAC,EAAE,EACJ,MAAM,EACF;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC,CAAA;CAAE,GAC1D,SAAS,EACb,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GACjC;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAYrD"}
@@ -29,3 +29,23 @@ export function inScope(scope, row) {
29
29
  export function scopePreset(scope) {
30
30
  return scope?.equals !== undefined ? { [scope.field]: scope.equals } : {};
31
31
  }
32
+ /**
33
+ * A model page's menu words: the label its menu entry shows (the layout's
34
+ * rename, a cookbook's or the visitor's, else the added recipe entry's own)
35
+ * and its declared New noun. `heading` is that label unless it only repeats
36
+ * the model's name. The static app reads the rendered menu (`ModelPage`); the
37
+ * mount, outside the shell's context, reads the same sources here.
38
+ */
39
+ export function menuEntryWords(model, itemId, view, added, layout, humanize) {
40
+ const entry = added.find((e) => e.model.id === model.id && e.key === view);
41
+ const label = layout?.items?.[itemId]?.label?.trim() || entry?.label;
42
+ if (!label)
43
+ return {};
44
+ return {
45
+ label,
46
+ heading: label.toLowerCase() === humanize(model.name).toLowerCase()
47
+ ? undefined
48
+ : label,
49
+ ...(entry?.noun ? { noun: entry.noun } : {}),
50
+ };
51
+ }
@@ -1,3 +1,3 @@
1
1
  /** The released smrt line the planner is built against (the `smrt` CLI version its commands name). */
2
- export declare const SMRT_VERSION = "0.57.3";
2
+ export declare const SMRT_VERSION = "0.57.5";
3
3
  //# sourceMappingURL=smrt-version.d.ts.map
@@ -1,4 +1,4 @@
1
1
  // Generated by scripts/write-smrt-version.ts from the installed
2
2
  // @happyvertical/smrt-core; do not edit. `pnpm version:smrt` refreshes it.
3
3
  /** The released smrt line the planner is built against (the `smrt` CLI version its commands name). */
4
- export const SMRT_VERSION = '0.57.3';
4
+ export const SMRT_VERSION = '0.57.5';