@happyvertical/smrt-planner 0.0.0-stage → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (815) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +170 -2
  3. package/app/404.html +80 -0
  4. package/app/_app/immutable/assets/0.B5zXkXe_.css +1 -0
  5. package/app/_app/immutable/assets/10.hpcnxvK1.css +1 -0
  6. package/app/_app/immutable/assets/11.D7zoXfVV.css +1 -0
  7. package/app/_app/immutable/assets/12.CPobm1ED.css +1 -0
  8. package/app/_app/immutable/assets/2.CyaWdRdI.css +1 -0
  9. package/app/_app/immutable/assets/3.BlPQOes8.css +1 -0
  10. package/app/_app/immutable/assets/8.2gQeKBp_.css +1 -0
  11. package/app/_app/immutable/assets/9.HOPT4xtg.css +1 -0
  12. package/app/_app/immutable/assets/AiSetup.Cb22AigN.css +1 -0
  13. package/app/_app/immutable/assets/Button.DkP0qkG9.css +1 -0
  14. package/app/_app/immutable/assets/ConnectTools.BgIJOOGW.css +1 -0
  15. package/app/_app/immutable/assets/FieldMapForm.BCU-4pO4.css +1 -0
  16. package/app/_app/immutable/assets/ModelPage.Dd3LcMta.css +1 -0
  17. package/app/_app/immutable/assets/SectionActions.CTkVuNMF.css +1 -0
  18. package/app/_app/immutable/assets/SectionIcons.5Udq9vN-.css +1 -0
  19. package/app/_app/immutable/assets/SegmentedControl.B8SrQacd.css +1 -0
  20. package/app/_app/immutable/assets/dist.C5nHBk_O.css +1 -0
  21. package/app/_app/immutable/assets/feedback.BVKAwFck.css +1 -0
  22. package/app/_app/immutable/assets/forms.BChZ2RWM.css +1 -0
  23. package/app/_app/immutable/assets/inter-latin-ext.B_-bZUTo.woff2 +0 -0
  24. package/app/_app/immutable/assets/inter-latin.8kRkwJBP.woff2 +0 -0
  25. package/app/_app/immutable/assets/jetbrains-mono-latin-ext.Bnd2h4Br.woff2 +0 -0
  26. package/app/_app/immutable/assets/jetbrains-mono-latin.Db4Uuiha.woff2 +0 -0
  27. package/app/_app/immutable/assets/ort-wasm-simd-threaded.asyncify.CxOG5pUO.wasm +0 -0
  28. package/app/_app/immutable/assets/percent.LH0z-ozZ.css +1 -0
  29. package/app/_app/immutable/assets/space-grotesk-latin-ext.wJGaI8U0.woff2 +0 -0
  30. package/app/_app/immutable/assets/space-grotesk-latin.DPT1xrvW.woff2 +0 -0
  31. package/app/_app/immutable/assets/store.CGDwHkkF.css +1 -0
  32. package/app/_app/immutable/assets/ui.B1A1Zl2p.css +1 -0
  33. package/app/_app/immutable/assets/workspace.BIMkuZDb.css +1 -0
  34. package/app/_app/immutable/chunks/1okeBSoq.js +1 -0
  35. package/app/_app/immutable/chunks/2jFBkS1C.js +1 -0
  36. package/app/_app/immutable/chunks/6P9zxrzU.js +1 -0
  37. package/app/_app/immutable/chunks/B32EWqI8.js +9 -0
  38. package/app/_app/immutable/chunks/B4Kevpe0.js +1 -0
  39. package/app/_app/immutable/chunks/BJfAXhak.js +3 -0
  40. package/app/_app/immutable/chunks/BKwRT_1p.js +1 -0
  41. package/app/_app/immutable/chunks/BQxY8kkL.js +1 -0
  42. package/app/_app/immutable/chunks/BS4h9ES-.js +1 -0
  43. package/app/_app/immutable/chunks/BWPhGFHl.js +1 -0
  44. package/app/_app/immutable/chunks/BYcBM-fh.js +1 -0
  45. package/app/_app/immutable/chunks/BegKiy2G.js +1 -0
  46. package/app/_app/immutable/chunks/Bjy-W4x2.js +81 -0
  47. package/app/_app/immutable/chunks/BnRri03M.js +1 -0
  48. package/app/_app/immutable/chunks/C7zBd-pD.js +1 -0
  49. package/app/_app/immutable/chunks/CA-A9Ngs.js +1 -0
  50. package/app/_app/immutable/chunks/CMhpRMKg.js +1 -0
  51. package/app/_app/immutable/chunks/CPRHZZeW.js +1 -0
  52. package/app/_app/immutable/chunks/CRQ1Pmzr.js +1 -0
  53. package/app/_app/immutable/chunks/CWtfVMDz.js +1 -0
  54. package/app/_app/immutable/chunks/CgAkqYsL.js +1 -0
  55. package/app/_app/immutable/chunks/Chyo8rdT.js +3 -0
  56. package/app/_app/immutable/chunks/Ci0DUht6.js +34 -0
  57. package/app/_app/immutable/chunks/CmmuWmp6.js +2 -0
  58. package/app/_app/immutable/chunks/CrFNLK0f.js +1 -0
  59. package/app/_app/immutable/chunks/CrO3W89x.js +1 -0
  60. package/app/_app/immutable/chunks/CsprTb3f.js +2 -0
  61. package/app/_app/immutable/chunks/CyUMm_Wp.js +1 -0
  62. package/app/_app/immutable/chunks/CygC84VT.js +2 -0
  63. package/app/_app/immutable/chunks/D0VgZnk1.js +1 -0
  64. package/app/_app/immutable/chunks/D71UrO5c.js +1 -0
  65. package/app/_app/immutable/chunks/D7hhQvDO.js +1 -0
  66. package/app/_app/immutable/chunks/DD7gpKb2.js +1 -0
  67. package/app/_app/immutable/chunks/DNRgqfTx.js +1 -0
  68. package/app/_app/immutable/chunks/DRByVC-c.js +1 -0
  69. package/app/_app/immutable/chunks/DVRKjN-E.js +1 -0
  70. package/app/_app/immutable/chunks/D_J_XtJy.js +846 -0
  71. package/app/_app/immutable/chunks/Dbjm4OuC.js +1 -0
  72. package/app/_app/immutable/chunks/Dc4q22LH.js +42 -0
  73. package/app/_app/immutable/chunks/Dd_uD5pT.js +1 -0
  74. package/app/_app/immutable/chunks/DkR8_Ws6.js +2 -0
  75. package/app/_app/immutable/chunks/Dp9GVO-9.js +1 -0
  76. package/app/_app/immutable/chunks/DqcD-WtP.js +1 -0
  77. package/app/_app/immutable/chunks/Dt-HX3Vu.js +1 -0
  78. package/app/_app/immutable/chunks/FbOxj-PF.js +69 -0
  79. package/app/_app/immutable/chunks/QukgIHDX.js +1 -0
  80. package/app/_app/immutable/chunks/WxSPP8QW.js +4 -0
  81. package/app/_app/immutable/chunks/Xp1g1t4n.js +3 -0
  82. package/app/_app/immutable/chunks/iET62IRm.js +2 -0
  83. package/app/_app/immutable/chunks/leQCwW2d.js +1 -0
  84. package/app/_app/immutable/chunks/p6bgzXiY.js +1 -0
  85. package/app/_app/immutable/chunks/uBIymjUX.js +1 -0
  86. package/app/_app/immutable/chunks/xihTtKlq.js +1 -0
  87. package/app/_app/immutable/entry/app.IZIJXhgq.js +2 -0
  88. package/app/_app/immutable/entry/start.BuaYHD1N.js +1 -0
  89. package/app/_app/immutable/nodes/0.m_U8WC7E.js +10 -0
  90. package/app/_app/immutable/nodes/1.Crw8ULhB.js +1 -0
  91. package/app/_app/immutable/nodes/10.1nQxyH9H.js +4 -0
  92. package/app/_app/immutable/nodes/11.Cw0JnQF3.js +1 -0
  93. package/app/_app/immutable/nodes/12.BIocA1aI.js +1 -0
  94. package/app/_app/immutable/nodes/2.CR5BwGnt.js +17 -0
  95. package/app/_app/immutable/nodes/3.1B56hgAG.js +1 -0
  96. package/app/_app/immutable/nodes/4.SSIC7sUh.js +1 -0
  97. package/app/_app/immutable/nodes/5.DgdwleDQ.js +1 -0
  98. package/app/_app/immutable/nodes/6.DmD9rqLU.js +1 -0
  99. package/app/_app/immutable/nodes/7.DdngsBmo.js +1 -0
  100. package/app/_app/immutable/nodes/8.D2Mszsua.js +3 -0
  101. package/app/_app/immutable/nodes/9.CLYsywul.js +1 -0
  102. package/app/_app/immutable/workers/assets/ort-wasm-simd-threaded.asyncify-CxOG5pUO.wasm +0 -0
  103. package/app/_app/immutable/workers/llm.worker-wfCOG_uk.js +69 -0
  104. package/app/_app/immutable/workers/local-speech.worker-DWbfmFUk.js +51 -0
  105. package/app/_app/version.json +1 -0
  106. package/app/ai/index.html +89 -0
  107. package/app/blueprint/index.html +87 -0
  108. package/app/cookbook/index.html +87 -0
  109. package/app/index.html +103 -0
  110. package/app/m/ads/AdDeliveryTier/index.html +96 -0
  111. package/app/m/ads/AdEvent/index.html +96 -0
  112. package/app/m/ads/AdFormat/index.html +96 -0
  113. package/app/m/ads/AdGroup/index.html +96 -0
  114. package/app/m/ads/AdVariation/index.html +96 -0
  115. package/app/m/analytics/AnalyticsDataStream/index.html +96 -0
  116. package/app/m/analytics/AnalyticsEvent/index.html +96 -0
  117. package/app/m/analytics/AnalyticsProperty/index.html +96 -0
  118. package/app/m/analytics/AnalyticsReport/index.html +96 -0
  119. package/app/m/approvals/ApprovalEvent/index.html +96 -0
  120. package/app/m/approvals/ApprovalPolicy/index.html +96 -0
  121. package/app/m/approvals/ApprovalRequest/index.html +96 -0
  122. package/app/m/assets/Asset/index.html +96 -0
  123. package/app/m/assets/AssetAssociation/index.html +97 -0
  124. package/app/m/assets/AssetMetafield/index.html +96 -0
  125. package/app/m/assets/AssetStatus/index.html +96 -0
  126. package/app/m/assets/AssetType/index.html +96 -0
  127. package/app/m/assets/Folder/index.html +96 -0
  128. package/app/m/chat/AgentSession/index.html +96 -0
  129. package/app/m/chat/ChatMessage/index.html +97 -0
  130. package/app/m/chat/ChatParticipant/index.html +97 -0
  131. package/app/m/chat/ChatReaction/index.html +96 -0
  132. package/app/m/chat/ChatRoom/index.html +96 -0
  133. package/app/m/chat/ChatThread/index.html +97 -0
  134. package/app/m/chat/VoiceGatewayTurn/index.html +96 -0
  135. package/app/m/chat/VoiceSession/index.html +96 -0
  136. package/app/m/commerce/Agreement/index.html +96 -0
  137. package/app/m/commerce/Cart/index.html +96 -0
  138. package/app/m/commerce/Contract/index.html +96 -0
  139. package/app/m/commerce/ContractLineItem/index.html +97 -0
  140. package/app/m/commerce/Customer/index.html +96 -0
  141. package/app/m/commerce/Estimate/index.html +96 -0
  142. package/app/m/commerce/Fulfillment/index.html +96 -0
  143. package/app/m/commerce/FulfillmentLineItem/index.html +97 -0
  144. package/app/m/commerce/Invoice/index.html +96 -0
  145. package/app/m/commerce/InvoiceLineItem/index.html +97 -0
  146. package/app/m/commerce/Lease/index.html +96 -0
  147. package/app/m/commerce/LicenseSale/index.html +96 -0
  148. package/app/m/commerce/Order/index.html +96 -0
  149. package/app/m/commerce/Payment/index.html +96 -0
  150. package/app/m/commerce/PaymentAllocation/index.html +97 -0
  151. package/app/m/commerce/PaymentInstrument/index.html +96 -0
  152. package/app/m/commerce/PaymentIntent/index.html +96 -0
  153. package/app/m/commerce/Payout/index.html +96 -0
  154. package/app/m/commerce/ProductionOrder/index.html +96 -0
  155. package/app/m/commerce/PurchaseOrder/index.html +96 -0
  156. package/app/m/commerce/Vendor/index.html +96 -0
  157. package/app/m/commerce/WholesaleOrder/index.html +96 -0
  158. package/app/m/content/Content/index.html +96 -0
  159. package/app/m/content/ContentContribution/index.html +96 -0
  160. package/app/m/content/ContentContributionAttachment/index.html +96 -0
  161. package/app/m/content/ContentContributionRevision/index.html +96 -0
  162. package/app/m/content/ContentContributionType/index.html +96 -0
  163. package/app/m/content/ContentContributor/index.html +96 -0
  164. package/app/m/content/ContentCorrection/index.html +96 -0
  165. package/app/m/content/ContentFeedSource/index.html +96 -0
  166. package/app/m/content/ContentGovernanceAssignment/index.html +96 -0
  167. package/app/m/content/ContentGovernancePolicy/index.html +96 -0
  168. package/app/m/content/ContentGovernanceProfile/index.html +96 -0
  169. package/app/m/content/ContentReference/index.html +96 -0
  170. package/app/m/content/ContentReview/index.html +96 -0
  171. package/app/m/content/ContentVersion/index.html +96 -0
  172. package/app/m/content/Contents/index.html +96 -0
  173. package/app/m/events/Event/index.html +96 -0
  174. package/app/m/events/EventParticipant/index.html +97 -0
  175. package/app/m/events/EventSeries/index.html +96 -0
  176. package/app/m/events/EventType/index.html +96 -0
  177. package/app/m/facts/Fact/index.html +96 -0
  178. package/app/m/facts/FactContent/index.html +96 -0
  179. package/app/m/facts/FactEvidence/index.html +96 -0
  180. package/app/m/facts/FactSource/index.html +96 -0
  181. package/app/m/facts/FactSubject/index.html +96 -0
  182. package/app/m/facts/FactTag/index.html +96 -0
  183. package/app/m/fields/FieldPolicy/index.html +96 -0
  184. package/app/m/fields/FieldPolicySuggestion/index.html +96 -0
  185. package/app/m/fields/FieldUsageCounter/index.html +96 -0
  186. package/app/m/images/Image/index.html +96 -0
  187. package/app/m/inventory/InventoryLocation/index.html +96 -0
  188. package/app/m/inventory/StockLevel/index.html +96 -0
  189. package/app/m/inventory/StockMovement/index.html +96 -0
  190. package/app/m/ledgers/Account/index.html +96 -0
  191. package/app/m/ledgers/Journal/index.html +96 -0
  192. package/app/m/ledgers/JournalEntry/index.html +97 -0
  193. package/app/m/manufacturing/Assembly/index.html +96 -0
  194. package/app/m/manufacturing/BillOfMaterials/index.html +96 -0
  195. package/app/m/manufacturing/BomLine/index.html +96 -0
  196. package/app/m/manufacturing/Operation/index.html +96 -0
  197. package/app/m/manufacturing/ProductionRun/index.html +96 -0
  198. package/app/m/manufacturing/ProductionRunCompletion/index.html +96 -0
  199. package/app/m/manufacturing/RoutingStep/index.html +96 -0
  200. package/app/m/marketing/Campaign/index.html +96 -0
  201. package/app/m/marketing/CampaignChannel/index.html +96 -0
  202. package/app/m/marketing/CampaignMetricSnapshot/index.html +96 -0
  203. package/app/m/messages/Account/index.html +96 -0
  204. package/app/m/messages/Attachment/index.html +96 -0
  205. package/app/m/messages/Blacklist/index.html +96 -0
  206. package/app/m/messages/Email/failed-sends/index.html +96 -0
  207. package/app/m/messages/Email/index.html +96 -0
  208. package/app/m/messages/Email/mailbox/index.html +96 -0
  209. package/app/m/messages/EmailAccount/index.html +96 -0
  210. package/app/m/messages/EmailFolder/index.html +96 -0
  211. package/app/m/messages/Message/index.html +96 -0
  212. package/app/m/messages/MessagingEndpoint/index.html +96 -0
  213. package/app/m/messages/PersonaMessageRoute/index.html +96 -0
  214. package/app/m/messages/SlackAccount/index.html +96 -0
  215. package/app/m/messages/SlackMessage/index.html +96 -0
  216. package/app/m/messages/TelegramAccount/index.html +96 -0
  217. package/app/m/messages/Tweet/index.html +96 -0
  218. package/app/m/messages/TwitterAccount/index.html +96 -0
  219. package/app/m/messages/Whitelist/index.html +96 -0
  220. package/app/m/messages/ZulipAccount/index.html +96 -0
  221. package/app/m/places/Place/index.html +96 -0
  222. package/app/m/places/PlaceType/index.html +96 -0
  223. package/app/m/preferences/UiPreferenceRecord/index.html +96 -0
  224. package/app/m/products/Category/index.html +96 -0
  225. package/app/m/products/Material/index.html +96 -0
  226. package/app/m/products/Product/index.html +96 -0
  227. package/app/m/products/Product/ingredients/index.html +96 -0
  228. package/app/m/products/ProductVariant/index.html +97 -0
  229. package/app/m/products/Sku/index.html +97 -0
  230. package/app/m/profiles/ApiKey/index.html +96 -0
  231. package/app/m/profiles/Bot/index.html +96 -0
  232. package/app/m/profiles/MagicLinkToken/index.html +96 -0
  233. package/app/m/profiles/NostrIdentity/index.html +96 -0
  234. package/app/m/profiles/OidcIdentity/index.html +96 -0
  235. package/app/m/profiles/Organization/index.html +96 -0
  236. package/app/m/profiles/Person/index.html +96 -0
  237. package/app/m/profiles/Profile/index.html +96 -0
  238. package/app/m/profiles/ProfileMetadata/index.html +96 -0
  239. package/app/m/profiles/ProfileMetafield/index.html +96 -0
  240. package/app/m/profiles/ProfileRelationship/index.html +96 -0
  241. package/app/m/profiles/ProfileRelationshipTerm/index.html +96 -0
  242. package/app/m/profiles/ProfileRelationshipType/index.html +96 -0
  243. package/app/m/profiles/ProfileType/index.html +96 -0
  244. package/app/m/projects/Comment/index.html +97 -0
  245. package/app/m/projects/Issue/index.html +96 -0
  246. package/app/m/projects/Label/index.html +96 -0
  247. package/app/m/projects/Project/index.html +96 -0
  248. package/app/m/projects/ProjectIntegration/index.html +96 -0
  249. package/app/m/projects/PullRequest/index.html +96 -0
  250. package/app/m/projects/Repository/index.html +96 -0
  251. package/app/m/properties/Property/index.html +96 -0
  252. package/app/m/properties/Zone/index.html +96 -0
  253. package/app/m/reports/RuntimeReport/index.html +96 -0
  254. package/app/m/reports/SmrtPrincipalReportRefreshTask/index.html +96 -0
  255. package/app/m/reports/SmrtReportLock/index.html +96 -0
  256. package/app/m/reports/SmrtReportRefreshTask/index.html +96 -0
  257. package/app/m/reports/SmrtReportRun/index.html +96 -0
  258. package/app/m/reports/SmrtReportSchedule/index.html +96 -0
  259. package/app/m/reports/SmrtReportWatermark/index.html +96 -0
  260. package/app/m/sales/AttributionException/index.html +96 -0
  261. package/app/m/sales/AttributionPolicy/index.html +96 -0
  262. package/app/m/sales/Commission/index.html +96 -0
  263. package/app/m/sales/CommissionAdjustment/index.html +96 -0
  264. package/app/m/sales/CommissionPayout/index.html +96 -0
  265. package/app/m/sales/CommissionPlan/index.html +96 -0
  266. package/app/m/sales/Earner/index.html +96 -0
  267. package/app/m/sales/EarnerSourceAttribution/index.html +96 -0
  268. package/app/m/sales/EarningEvent/index.html +96 -0
  269. package/app/m/sales/ExecutedAgreement/index.html +96 -0
  270. package/app/m/sales/Lead/index.html +96 -0
  271. package/app/m/sales/Opportunity/index.html +96 -0
  272. package/app/m/sales/OpportunityConversion/index.html +96 -0
  273. package/app/m/sales/PipelineDefinition/index.html +96 -0
  274. package/app/m/sales/PipelineStage/index.html +97 -0
  275. package/app/m/sales/Referral/index.html +96 -0
  276. package/app/m/sales/ReferralAgreement/index.html +96 -0
  277. package/app/m/sales/ReferralLink/index.html +96 -0
  278. package/app/m/sales/ReferralProgram/index.html +96 -0
  279. package/app/m/sales/ReferralTermSnapshot/index.html +96 -0
  280. package/app/m/sales/ReferralTouch/index.html +96 -0
  281. package/app/m/sales/Referrer/index.html +96 -0
  282. package/app/m/sales/SalesActivity/index.html +96 -0
  283. package/app/m/sales/SalesRepresentative/index.html +96 -0
  284. package/app/m/sites/Site/index.html +96 -0
  285. package/app/m/sites/SiteAgentBinding/index.html +96 -0
  286. package/app/m/social/OAuthState/index.html +96 -0
  287. package/app/m/social/SocialAccount/index.html +96 -0
  288. package/app/m/social/SocialPost/index.html +96 -0
  289. package/app/m/social/SocialPostAnalyticsSnapshot/index.html +96 -0
  290. package/app/m/subscriptions/BillingAdjustment/index.html +96 -0
  291. package/app/m/subscriptions/ClientCharge/index.html +96 -0
  292. package/app/m/subscriptions/CreditGrant/index.html +96 -0
  293. package/app/m/subscriptions/PricingRule/index.html +96 -0
  294. package/app/m/subscriptions/RetailCharge/index.html +96 -0
  295. package/app/m/subscriptions/SpendingPolicy/index.html +96 -0
  296. package/app/m/subscriptions/SubscriptionPlan/index.html +96 -0
  297. package/app/m/subscriptions/TenantSubscription/index.html +96 -0
  298. package/app/m/subscriptions/TenantUsageMetric/index.html +96 -0
  299. package/app/m/support/ServiceTimeEntry/index.html +96 -0
  300. package/app/m/support/SupportAiRun/index.html +96 -0
  301. package/app/m/support/SupportAvailability/index.html +96 -0
  302. package/app/m/support/SupportCase/index.html +96 -0
  303. package/app/m/support/SupportCaseEvent/index.html +96 -0
  304. package/app/m/support/SupportChannelBinding/index.html +96 -0
  305. package/app/m/support/SupportCharge/index.html +96 -0
  306. package/app/m/support/SupportCompensation/index.html +96 -0
  307. package/app/m/support/SupportCompensationPlan/index.html +96 -0
  308. package/app/m/support/SupportEscalation/index.html +96 -0
  309. package/app/m/support/SupportInteraction/index.html +96 -0
  310. package/app/m/support/SupportPlan/index.html +96 -0
  311. package/app/m/support/SupportPolicy/index.html +96 -0
  312. package/app/m/support/SupportQualification/index.html +96 -0
  313. package/app/m/support/SupportServiceTarget/index.html +96 -0
  314. package/app/m/support/SupportSpecialist/index.html +96 -0
  315. package/app/m/support/SupportWorkLink/index.html +96 -0
  316. package/app/m/tags/Tag/index.html +96 -0
  317. package/app/m/tags/TagAlias/index.html +96 -0
  318. package/app/m/timesheets/AttendanceBreak/index.html +96 -0
  319. package/app/m/timesheets/AttendancePunch/index.html +96 -0
  320. package/app/m/timesheets/ServiceChargeSnapshot/index.html +96 -0
  321. package/app/m/timesheets/ServiceCompensationSnapshot/index.html +96 -0
  322. package/app/m/timesheets/ServiceTimeEntry/index.html +96 -0
  323. package/app/m/users/AccessRequest/index.html +96 -0
  324. package/app/m/users/Group/index.html +96 -0
  325. package/app/m/users/GroupMember/index.html +96 -0
  326. package/app/m/users/GroupRole/index.html +96 -0
  327. package/app/m/users/Membership/index.html +97 -0
  328. package/app/m/users/MembershipOverride/index.html +96 -0
  329. package/app/m/users/Permission/index.html +96 -0
  330. package/app/m/users/ResourceGrant/index.html +96 -0
  331. package/app/m/users/Role/index.html +96 -0
  332. package/app/m/users/RolePermission/index.html +96 -0
  333. package/app/m/users/Session/index.html +96 -0
  334. package/app/m/users/Tenant/index.html +96 -0
  335. package/app/m/users/TenantIntegration/index.html +96 -0
  336. package/app/m/users/TenantPermissionOverride/index.html +96 -0
  337. package/app/m/users/User/index.html +96 -0
  338. package/app/m/users/UsersCliAuthRequest/index.html +96 -0
  339. package/app/m/users/UsersMagicLinkToken/index.html +96 -0
  340. package/app/m/video/Character/index.html +96 -0
  341. package/app/m/video/CharacterAsset/index.html +96 -0
  342. package/app/m/video/CompositeJob/index.html +96 -0
  343. package/app/m/video/Performer/index.html +96 -0
  344. package/app/m/video/PerformerAsset/index.html +96 -0
  345. package/app/m/video/Scene/index.html +96 -0
  346. package/app/m/video/SceneAsset/index.html +96 -0
  347. package/app/m/video/VideoComposition/index.html +96 -0
  348. package/app/m/video/VideoCompositionAsset/index.html +96 -0
  349. package/app/m/video/VideoSequence/index.html +96 -0
  350. package/app/m/video/VideoSequenceAsset/index.html +96 -0
  351. package/app/m/video/VideoShot/index.html +96 -0
  352. package/app/m/video/VideoShotAsset/index.html +96 -0
  353. package/app/m/video/VideoShotCharacter/index.html +96 -0
  354. package/app/m/video/VideoWorkflow/index.html +96 -0
  355. package/app/m/voice/VoiceOutput/index.html +96 -0
  356. package/app/m/voice/VoiceProfile/index.html +96 -0
  357. package/app/m/voice/VoiceSample/index.html +96 -0
  358. package/app/packages/ads/index.html +92 -0
  359. package/app/packages/analytics/index.html +92 -0
  360. package/app/packages/approvals/index.html +92 -0
  361. package/app/packages/assets/index.html +92 -0
  362. package/app/packages/chat/index.html +92 -0
  363. package/app/packages/comments/index.html +92 -0
  364. package/app/packages/commerce/index.html +92 -0
  365. package/app/packages/content/index.html +92 -0
  366. package/app/packages/events/index.html +92 -0
  367. package/app/packages/expenses/index.html +92 -0
  368. package/app/packages/facts/index.html +92 -0
  369. package/app/packages/fields/index.html +92 -0
  370. package/app/packages/human-resources/index.html +92 -0
  371. package/app/packages/images/index.html +92 -0
  372. package/app/packages/index.html +90 -0
  373. package/app/packages/inventory/index.html +92 -0
  374. package/app/packages/ledgers/index.html +92 -0
  375. package/app/packages/manufacturing/index.html +92 -0
  376. package/app/packages/marketing/index.html +92 -0
  377. package/app/packages/messages/index.html +92 -0
  378. package/app/packages/places/index.html +92 -0
  379. package/app/packages/preferences/index.html +92 -0
  380. package/app/packages/products/index.html +92 -0
  381. package/app/packages/profiles/index.html +92 -0
  382. package/app/packages/projects/index.html +92 -0
  383. package/app/packages/properties/index.html +92 -0
  384. package/app/packages/reports/index.html +92 -0
  385. package/app/packages/sales/index.html +92 -0
  386. package/app/packages/sites/index.html +92 -0
  387. package/app/packages/social/index.html +92 -0
  388. package/app/packages/subscriptions/index.html +92 -0
  389. package/app/packages/support/index.html +92 -0
  390. package/app/packages/tags/index.html +92 -0
  391. package/app/packages/timesheets/index.html +92 -0
  392. package/app/packages/users/index.html +92 -0
  393. package/app/packages/video/index.html +92 -0
  394. package/app/packages/voice/index.html +92 -0
  395. package/app/recipes/account-access/help/index.html +93 -0
  396. package/app/recipes/account-access/index.html +95 -0
  397. package/app/recipes/activity/help/index.html +93 -0
  398. package/app/recipes/activity/index.html +94 -0
  399. package/app/recipes/agreements/help/index.html +93 -0
  400. package/app/recipes/agreements/index.html +96 -0
  401. package/app/recipes/analytics.reports/help/index.html +93 -0
  402. package/app/recipes/analytics.reports/index.html +94 -0
  403. package/app/recipes/assets/help/index.html +93 -0
  404. package/app/recipes/assets/index.html +95 -0
  405. package/app/recipes/billing/help/index.html +93 -0
  406. package/app/recipes/billing/index.html +95 -0
  407. package/app/recipes/chat.assistant/help/index.html +93 -0
  408. package/app/recipes/chat.assistant/index.html +94 -0
  409. package/app/recipes/comments/help/index.html +93 -0
  410. package/app/recipes/comments/index.html +94 -0
  411. package/app/recipes/commerce.customers/help/index.html +93 -0
  412. package/app/recipes/commerce.customers/index.html +94 -0
  413. package/app/recipes/commerce.estimates/help/index.html +93 -0
  414. package/app/recipes/commerce.estimates/index.html +94 -0
  415. package/app/recipes/commerce.purchases/help/index.html +93 -0
  416. package/app/recipes/commerce.purchases/index.html +94 -0
  417. package/app/recipes/commerce.sales/help/index.html +93 -0
  418. package/app/recipes/commerce.sales/index.html +94 -0
  419. package/app/recipes/commerce.vendors/help/index.html +93 -0
  420. package/app/recipes/commerce.vendors/index.html +94 -0
  421. package/app/recipes/commerce.wholesale/help/index.html +93 -0
  422. package/app/recipes/commerce.wholesale/index.html +94 -0
  423. package/app/recipes/events.calendar/help/index.html +93 -0
  424. package/app/recipes/events.calendar/index.html +94 -0
  425. package/app/recipes/fields.form-customization/help/index.html +93 -0
  426. package/app/recipes/fields.form-customization/index.html +94 -0
  427. package/app/recipes/inventory.stock/help/index.html +93 -0
  428. package/app/recipes/inventory.stock/index.html +94 -0
  429. package/app/recipes/ledgers.bookkeeping/help/index.html +93 -0
  430. package/app/recipes/ledgers.bookkeeping/index.html +94 -0
  431. package/app/recipes/messages/help/index.html +93 -0
  432. package/app/recipes/messages/index.html +95 -0
  433. package/app/recipes/products/help/index.html +93 -0
  434. package/app/recipes/products/index.html +96 -0
  435. package/app/recipes/projects.tracker/help/index.html +93 -0
  436. package/app/recipes/projects.tracker/index.html +94 -0
  437. package/app/recipes/reports.materialized/help/index.html +93 -0
  438. package/app/recipes/reports.materialized/index.html +94 -0
  439. package/app/recipes/sales.pipeline/help/index.html +93 -0
  440. package/app/recipes/sales.pipeline/index.html +94 -0
  441. package/app/recipes/tags.taxonomy/help/index.html +93 -0
  442. package/app/recipes/tags.taxonomy/index.html +94 -0
  443. package/app/recipes/team-collaboration/help/index.html +93 -0
  444. package/app/recipes/team-collaboration/index.html +94 -0
  445. package/app/s/custom-billing/index.html +89 -0
  446. package/app/s/custom-buying/index.html +89 -0
  447. package/app/s/custom-classes/index.html +89 -0
  448. package/app/s/custom-jobs/index.html +89 -0
  449. package/app/s/custom-kitchen/index.html +89 -0
  450. package/app/s/custom-material/index.html +89 -0
  451. package/app/s/custom-members/index.html +89 -0
  452. package/app/s/custom-parts/index.html +89 -0
  453. package/app/s/custom-schedule/index.html +89 -0
  454. package/app/s/custom-shop/index.html +89 -0
  455. package/app/s/custom-wholesale/index.html +89 -0
  456. package/app/s/section-access-control/index.html +89 -0
  457. package/app/s/section-account-security/index.html +89 -0
  458. package/app/s/section-accounting/index.html +89 -0
  459. package/app/s/section-activity/index.html +89 -0
  460. package/app/s/section-agreements/index.html +89 -0
  461. package/app/s/section-analytics/index.html +89 -0
  462. package/app/s/section-assets/index.html +89 -0
  463. package/app/s/section-billing/index.html +89 -0
  464. package/app/s/section-calendar/index.html +89 -0
  465. package/app/s/section-catalog/index.html +89 -0
  466. package/app/s/section-chat.assistant/index.html +89 -0
  467. package/app/s/section-comments/index.html +89 -0
  468. package/app/s/section-fields.form-customization/index.html +89 -0
  469. package/app/s/section-messages/index.html +89 -0
  470. package/app/s/section-more/index.html +89 -0
  471. package/app/s/section-operations/index.html +89 -0
  472. package/app/s/section-projects/index.html +89 -0
  473. package/app/s/section-purchasing/index.html +89 -0
  474. package/app/s/section-reports.materialized/index.html +89 -0
  475. package/app/s/section-sales/index.html +89 -0
  476. package/app/s/section-taxonomy/index.html +89 -0
  477. package/app/s/section-team/index.html +89 -0
  478. package/dist/ai/echo-gate.d.ts +13 -0
  479. package/dist/ai/echo-gate.js +21 -0
  480. package/dist/ai/icons.d.ts +9 -0
  481. package/dist/ai/icons.js +9 -0
  482. package/dist/ai/instance.d.ts +3 -0
  483. package/dist/ai/instance.js +25 -0
  484. package/dist/ai/state.svelte.d.ts +130 -0
  485. package/dist/ai/state.svelte.js +316 -0
  486. package/dist/ai/status.d.ts +67 -0
  487. package/dist/ai/status.js +125 -0
  488. package/dist/assets/smrt-mark.svg +38 -0
  489. package/dist/assistant/change.d.ts +101 -0
  490. package/dist/assistant/change.js +209 -0
  491. package/dist/assistant/engine.d.ts +20 -0
  492. package/dist/assistant/engine.js +43 -0
  493. package/dist/assistant/llm.worker.d.ts +1 -0
  494. package/dist/assistant/llm.worker.js +7 -0
  495. package/dist/assistant/match.d.ts +59 -0
  496. package/dist/assistant/match.js +271 -0
  497. package/dist/assistant/models.d.ts +38 -0
  498. package/dist/assistant/models.js +57 -0
  499. package/dist/assistant/offers.svelte.d.ts +36 -0
  500. package/dist/assistant/offers.svelte.js +59 -0
  501. package/dist/assistant/prefs.d.ts +14 -0
  502. package/dist/assistant/prefs.js +32 -0
  503. package/dist/assistant/prompt.d.ts +23 -0
  504. package/dist/assistant/prompt.js +163 -0
  505. package/dist/assistant/session.svelte.d.ts +74 -0
  506. package/dist/assistant/session.svelte.js +181 -0
  507. package/dist/assistant/theme-undo.svelte.d.ts +38 -0
  508. package/dist/assistant/theme-undo.svelte.js +50 -0
  509. package/dist/assistant/transport.d.ts +73 -0
  510. package/dist/assistant/transport.js +231 -0
  511. package/dist/assistant/voice-host.d.ts +10 -0
  512. package/dist/assistant/voice-host.js +17 -0
  513. package/dist/assistant/voice.svelte.d.ts +107 -0
  514. package/dist/assistant/voice.svelte.js +261 -0
  515. package/dist/catalog/catalog.json +89663 -0
  516. package/dist/catalog/generate/build.d.ts +33 -0
  517. package/dist/catalog/generate/build.js +131 -0
  518. package/dist/catalog/generate/exclusions.d.ts +18 -0
  519. package/dist/catalog/generate/exclusions.js +33 -0
  520. package/dist/catalog/generate/extract.d.ts +90 -0
  521. package/dist/catalog/generate/extract.js +326 -0
  522. package/dist/catalog/generate/local.d.ts +8 -0
  523. package/dist/catalog/generate/local.js +45 -0
  524. package/dist/catalog/generate/recipe-demo.d.ts +11 -0
  525. package/dist/catalog/generate/recipe-demo.js +29 -0
  526. package/dist/catalog/generate/recipe-metadata.d.ts +12 -0
  527. package/dist/catalog/generate/recipe-metadata.js +138 -0
  528. package/dist/catalog/generate/registry.d.ts +14 -0
  529. package/dist/catalog/generate/registry.js +83 -0
  530. package/dist/catalog/index.d.ts +21 -0
  531. package/dist/catalog/index.js +53 -0
  532. package/dist/catalog/types.d.ts +141 -0
  533. package/dist/catalog/types.js +8 -0
  534. package/dist/components/AiSetup.svelte +528 -0
  535. package/dist/components/AiSetup.svelte.d.ts +8 -0
  536. package/dist/components/AiStatusIcons.svelte +86 -0
  537. package/dist/components/AiStatusIcons.svelte.d.ts +18 -0
  538. package/dist/components/AppSettings.svelte +100 -0
  539. package/dist/components/AppSettings.svelte.d.ts +10 -0
  540. package/dist/components/BrowserAssistant.svelte +318 -0
  541. package/dist/components/BrowserAssistant.svelte.d.ts +8 -0
  542. package/dist/components/ChildRecords.svelte +331 -0
  543. package/dist/components/ChildRecords.svelte.d.ts +15 -0
  544. package/dist/components/ConnectTools.svelte +145 -0
  545. package/dist/components/ConnectTools.svelte.d.ts +8 -0
  546. package/dist/components/CookbooksPanel.svelte +308 -0
  547. package/dist/components/CookbooksPanel.svelte.d.ts +3 -0
  548. package/dist/components/ExportPanel.svelte +217 -0
  549. package/dist/components/ExportPanel.svelte.d.ts +3 -0
  550. package/dist/components/FeatureCard.svelte +197 -0
  551. package/dist/components/FeatureCard.svelte.d.ts +13 -0
  552. package/dist/components/FeaturesPanel.svelte +155 -0
  553. package/dist/components/FeaturesPanel.svelte.d.ts +3 -0
  554. package/dist/components/FieldInput.svelte +307 -0
  555. package/dist/components/FieldInput.svelte.d.ts +24 -0
  556. package/dist/components/FieldMapForm.svelte +173 -0
  557. package/dist/components/FieldMapForm.svelte.d.ts +18 -0
  558. package/dist/components/FormWorkspace.svelte +274 -0
  559. package/dist/components/FormWorkspace.svelte.d.ts +19 -0
  560. package/dist/components/HelpView.svelte +129 -0
  561. package/dist/components/HelpView.svelte.d.ts +12 -0
  562. package/dist/components/ModelOptions.svelte +239 -0
  563. package/dist/components/ModelOptions.svelte.d.ts +12 -0
  564. package/dist/components/ModelPage.svelte +295 -0
  565. package/dist/components/ModelPage.svelte.d.ts +9 -0
  566. package/dist/components/ModelWorkspace.svelte +488 -0
  567. package/dist/components/ModelWorkspace.svelte.d.ts +32 -0
  568. package/dist/components/PlannerEditBridge.svelte +36 -0
  569. package/dist/components/PlannerEditBridge.svelte.d.ts +3 -0
  570. package/dist/components/PlannerPalette.svelte +38 -0
  571. package/dist/components/PlannerPalette.svelte.d.ts +18 -0
  572. package/dist/components/RecipeCards.svelte +145 -0
  573. package/dist/components/RecipeCards.svelte.d.ts +3 -0
  574. package/dist/components/RecipeHelp.svelte +54 -0
  575. package/dist/components/RecipeHelp.svelte.d.ts +9 -0
  576. package/dist/components/RecipeOptions.svelte +160 -0
  577. package/dist/components/RecipeOptions.svelte.d.ts +9 -0
  578. package/dist/components/RecordFeatures.svelte +240 -0
  579. package/dist/components/RecordFeatures.svelte.d.ts +3 -0
  580. package/dist/components/RelationField.svelte +175 -0
  581. package/dist/components/RelationField.svelte.d.ts +16 -0
  582. package/dist/components/SectionActions.svelte +91 -0
  583. package/dist/components/SectionActions.svelte.d.ts +12 -0
  584. package/dist/components/SectionIcons.svelte +98 -0
  585. package/dist/components/SectionIcons.svelte.d.ts +15 -0
  586. package/dist/components/SectionOverview.svelte +65 -0
  587. package/dist/components/SectionOverview.svelte.d.ts +14 -0
  588. package/dist/components/SectionPage.svelte +230 -0
  589. package/dist/components/SectionPage.svelte.d.ts +7 -0
  590. package/dist/components/SettingsPanel.svelte +60 -0
  591. package/dist/components/SettingsPanel.svelte.d.ts +7 -0
  592. package/dist/components/ThemeBridge.svelte +56 -0
  593. package/dist/components/ThemeBridge.svelte.d.ts +3 -0
  594. package/dist/components/ThemeSection.svelte +167 -0
  595. package/dist/components/ThemeSection.svelte.d.ts +11 -0
  596. package/dist/components/VariantGridForm.svelte +309 -0
  597. package/dist/components/VariantGridForm.svelte.d.ts +12 -0
  598. package/dist/components/VoiceTyping.svelte +108 -0
  599. package/dist/components/VoiceTyping.svelte.d.ts +7 -0
  600. package/dist/cookbook/assemble.d.ts +16 -0
  601. package/dist/cookbook/assemble.js +29 -0
  602. package/dist/cookbook/file.d.ts +7 -0
  603. package/dist/cookbook/file.js +25 -0
  604. package/dist/cookbook/legacy.d.ts +9 -0
  605. package/dist/cookbook/legacy.js +87 -0
  606. package/dist/cookbook/migrate.d.ts +22 -0
  607. package/dist/cookbook/migrate.js +106 -0
  608. package/dist/cookbook/parse.d.ts +16 -0
  609. package/dist/cookbook/parse.js +246 -0
  610. package/dist/cookbook/storage.d.ts +45 -0
  611. package/dist/cookbook/storage.js +98 -0
  612. package/dist/cookbook/store.svelte.d.ts +94 -0
  613. package/dist/cookbook/store.svelte.js +231 -0
  614. package/dist/cookbook/types.d.ts +76 -0
  615. package/dist/cookbook/types.js +11 -0
  616. package/dist/cookbook/validate.d.ts +14 -0
  617. package/dist/cookbook/validate.js +29 -0
  618. package/dist/core/app.d.ts +37 -0
  619. package/dist/core/app.js +119 -0
  620. package/dist/core/catalog.d.ts +19 -0
  621. package/dist/core/catalog.js +9 -0
  622. package/dist/core/headless.d.ts +52 -0
  623. package/dist/core/headless.js +39 -0
  624. package/dist/core/index.d.ts +28 -0
  625. package/dist/core/index.js +28 -0
  626. package/dist/core/prompt.d.ts +38 -0
  627. package/dist/core/prompt.js +95 -0
  628. package/dist/core/reply.d.ts +60 -0
  629. package/dist/core/reply.js +89 -0
  630. package/dist/core/request.d.ts +15 -0
  631. package/dist/core/request.js +55 -0
  632. package/dist/data/children.d.ts +20 -0
  633. package/dist/data/children.js +80 -0
  634. package/dist/data/columns.d.ts +56 -0
  635. package/dist/data/columns.js +150 -0
  636. package/dist/data/context.d.ts +8 -0
  637. package/dist/data/context.js +19 -0
  638. package/dist/data/derived.d.ts +79 -0
  639. package/dist/data/derived.js +139 -0
  640. package/dist/data/display.d.ts +23 -0
  641. package/dist/data/display.js +84 -0
  642. package/dist/data/fakes.d.ts +52 -0
  643. package/dist/data/fakes.js +443 -0
  644. package/dist/data/format.d.ts +48 -0
  645. package/dist/data/format.js +121 -0
  646. package/dist/data/labels.d.ts +45 -0
  647. package/dist/data/labels.js +179 -0
  648. package/dist/data/packs.d.ts +95 -0
  649. package/dist/data/packs.js +830 -0
  650. package/dist/data/payments.d.ts +17 -0
  651. package/dist/data/payments.js +60 -0
  652. package/dist/data/planner-source.d.ts +7 -0
  653. package/dist/data/planner-source.js +32 -0
  654. package/dist/data/source.d.ts +119 -0
  655. package/dist/data/source.js +432 -0
  656. package/dist/features/catalogue.d.ts +96 -0
  657. package/dist/features/catalogue.js +225 -0
  658. package/dist/features/demo.d.ts +36 -0
  659. package/dist/features/demo.js +66 -0
  660. package/dist/features/palette.d.ts +39 -0
  661. package/dist/features/palette.js +53 -0
  662. package/dist/fields/address.d.ts +23 -0
  663. package/dist/fields/address.js +39 -0
  664. package/dist/fields/invalid.d.ts +2 -0
  665. package/dist/fields/invalid.js +8 -0
  666. package/dist/fields/modal.d.ts +7 -0
  667. package/dist/fields/modal.js +14 -0
  668. package/dist/fields/percent.d.ts +8 -0
  669. package/dist/fields/percent.js +16 -0
  670. package/dist/fields/renderer.d.ts +17 -0
  671. package/dist/fields/renderer.js +43 -0
  672. package/dist/forms/active.d.ts +16 -0
  673. package/dist/forms/active.js +24 -0
  674. package/dist/forms/fieldMap.d.ts +44 -0
  675. package/dist/forms/fieldMap.js +134 -0
  676. package/dist/forms/shared.d.ts +41 -0
  677. package/dist/forms/shared.js +138 -0
  678. package/dist/forms/stock.d.ts +28 -0
  679. package/dist/forms/stock.js +104 -0
  680. package/dist/forms/variantGrid.d.ts +83 -0
  681. package/dist/forms/variantGrid.js +283 -0
  682. package/dist/index.d.ts +17 -0
  683. package/dist/index.js +16 -0
  684. package/dist/inference/byo.svelte.d.ts +90 -0
  685. package/dist/inference/byo.svelte.js +295 -0
  686. package/dist/inference/config.d.ts +77 -0
  687. package/dist/inference/config.js +205 -0
  688. package/dist/inference/host.d.ts +40 -0
  689. package/dist/inference/host.js +57 -0
  690. package/dist/inference/openai.d.ts +59 -0
  691. package/dist/inference/openai.js +207 -0
  692. package/dist/inference/presets.d.ts +5 -0
  693. package/dist/inference/presets.js +46 -0
  694. package/dist/kitchen/client.d.ts +39 -0
  695. package/dist/kitchen/client.js +115 -0
  696. package/dist/kitchen/fragment.d.ts +30 -0
  697. package/dist/kitchen/fragment.js +49 -0
  698. package/dist/kitchen/state.svelte.d.ts +26 -0
  699. package/dist/kitchen/state.svelte.js +45 -0
  700. package/dist/library/apply.d.ts +17 -0
  701. package/dist/library/apply.js +32 -0
  702. package/dist/library/document.d.ts +12 -0
  703. package/dist/library/document.js +27 -0
  704. package/dist/library/icons.d.ts +6 -0
  705. package/dist/library/icons.js +26 -0
  706. package/dist/library/index.d.ts +8 -0
  707. package/dist/library/index.js +12 -0
  708. package/dist/library/library.json +788 -0
  709. package/dist/library/menu.d.ts +18 -0
  710. package/dist/library/menu.js +72 -0
  711. package/dist/library/state.svelte.d.ts +10 -0
  712. package/dist/library/state.svelte.js +28 -0
  713. package/dist/library/types.d.ts +57 -0
  714. package/dist/library/types.js +1 -0
  715. package/dist/overviews/definitions.d.ts +24 -0
  716. package/dist/overviews/definitions.js +97 -0
  717. package/dist/overviews/page.d.ts +21 -0
  718. package/dist/overviews/page.js +36 -0
  719. package/dist/overviews/registry.d.ts +44 -0
  720. package/dist/overviews/registry.js +191 -0
  721. package/dist/overviews/validate.d.ts +32 -0
  722. package/dist/overviews/validate.js +91 -0
  723. package/dist/planner/Planner.svelte +204 -0
  724. package/dist/planner/Planner.svelte.d.ts +4 -0
  725. package/dist/planner/app.svelte.d.ts +6 -0
  726. package/dist/planner/app.svelte.js +23 -0
  727. package/dist/planner/assistant.d.ts +46 -0
  728. package/dist/planner/assistant.js +122 -0
  729. package/dist/planner/commands/adapter.d.ts +121 -0
  730. package/dist/planner/commands/adapter.js +597 -0
  731. package/dist/planner/commands/catalog.d.ts +19 -0
  732. package/dist/planner/commands/catalog.js +54 -0
  733. package/dist/planner/commands/controller.svelte.d.ts +13 -0
  734. package/dist/planner/commands/controller.svelte.js +77 -0
  735. package/dist/planner/commands/index.d.ts +15 -0
  736. package/dist/planner/commands/index.js +15 -0
  737. package/dist/planner/commands/schemas.d.ts +25 -0
  738. package/dist/planner/commands/schemas.js +67 -0
  739. package/dist/planner/commands/slices.d.ts +18 -0
  740. package/dist/planner/commands/slices.js +49 -0
  741. package/dist/planner/commands/types.d.ts +80 -0
  742. package/dist/planner/commands/types.js +18 -0
  743. package/dist/planner/create.d.ts +4 -0
  744. package/dist/planner/create.js +22 -0
  745. package/dist/planner/instance.d.ts +15 -0
  746. package/dist/planner/instance.js +22 -0
  747. package/dist/planner/query.d.ts +16 -0
  748. package/dist/planner/query.js +28 -0
  749. package/dist/planner/selection.d.ts +15 -0
  750. package/dist/planner/selection.js +38 -0
  751. package/dist/planner/selection.svelte.d.ts +29 -0
  752. package/dist/planner/selection.svelte.js +54 -0
  753. package/dist/planner/tab.svelte.d.ts +11 -0
  754. package/dist/planner/tab.svelte.js +22 -0
  755. package/dist/planner/types.d.ts +41 -0
  756. package/dist/planner/types.js +1 -0
  757. package/dist/recipes/cards.d.ts +55 -0
  758. package/dist/recipes/cards.js +80 -0
  759. package/dist/recipes/features.d.ts +53 -0
  760. package/dist/recipes/features.js +97 -0
  761. package/dist/recipes/help/descriptions.json +373 -0
  762. package/dist/recipes/help.d.ts +121 -0
  763. package/dist/recipes/help.js +262 -0
  764. package/dist/recipes/index.d.ts +65 -0
  765. package/dist/recipes/index.js +95 -0
  766. package/dist/recipes/merge.d.ts +26 -0
  767. package/dist/recipes/merge.js +21 -0
  768. package/dist/recipes/overlay.json +409 -0
  769. package/dist/recipes/plan-data.d.ts +41 -0
  770. package/dist/recipes/plan-data.js +97 -0
  771. package/dist/recipes/plumbing.d.ts +70 -0
  772. package/dist/recipes/plumbing.js +185 -0
  773. package/dist/recipes/policy.d.ts +118 -0
  774. package/dist/recipes/policy.js +268 -0
  775. package/dist/recipes/resolve.d.ts +19 -0
  776. package/dist/recipes/resolve.js +65 -0
  777. package/dist/recipes/scope.d.ts +25 -0
  778. package/dist/recipes/scope.js +31 -0
  779. package/dist/recipes/sections.d.ts +49 -0
  780. package/dist/recipes/sections.js +84 -0
  781. package/dist/recipes/state.svelte.d.ts +67 -0
  782. package/dist/recipes/state.svelte.js +112 -0
  783. package/dist/recipes/types.d.ts +322 -0
  784. package/dist/recipes/types.js +8 -0
  785. package/dist/sections/entries.d.ts +30 -0
  786. package/dist/sections/entries.js +57 -0
  787. package/dist/sections/info.d.ts +16 -0
  788. package/dist/sections/info.js +39 -0
  789. package/dist/sections/path.d.ts +12 -0
  790. package/dist/sections/path.js +18 -0
  791. package/dist/settings/app-settings.d.ts +44 -0
  792. package/dist/settings/app-settings.js +138 -0
  793. package/dist/settings/currencies.d.ts +2 -0
  794. package/dist/settings/currencies.js +8 -0
  795. package/dist/theme/runtime.d.ts +14 -0
  796. package/dist/theme/runtime.js +27 -0
  797. package/dist/theme/theme.d.ts +47 -0
  798. package/dist/theme/theme.js +122 -0
  799. package/dist/upstream/CustomerSelect.svelte +60 -0
  800. package/dist/upstream/CustomerSelect.svelte.d.ts +17 -0
  801. package/dist/upstream/VendorSelect.svelte +60 -0
  802. package/dist/upstream/VendorSelect.svelte.d.ts +17 -0
  803. package/dist/upstream/overlay.d.ts +10 -0
  804. package/dist/upstream/overlay.js +49 -0
  805. package/dist/upstream/partySelect.d.ts +8 -0
  806. package/dist/upstream/partySelect.js +21 -0
  807. package/dist/upstream/partyTypes.d.ts +64 -0
  808. package/dist/upstream/partyTypes.js +8 -0
  809. package/dist/upstream/relations.d.ts +2 -0
  810. package/dist/upstream/relations.js +24 -0
  811. package/dist/upstream/selects.d.ts +26 -0
  812. package/dist/upstream/selects.js +20 -0
  813. package/dist/upstream/widgets.d.ts +20 -0
  814. package/dist/upstream/widgets.js +30 -0
  815. package/package.json +81 -3
@@ -0,0 +1,57 @@
1
+ export const DEFAULT_MODEL_ID = 'Qwen3-1.7B-q4f16_1-MLC';
2
+ /** Small instruction-tuned models; the first is the default. */
3
+ export const ASSISTANT_MODELS = [
4
+ {
5
+ id: DEFAULT_MODEL_ID,
6
+ label: 'Qwen3 1.7B (recommended)',
7
+ downloadMB: 1100,
8
+ vramMB: 2037,
9
+ },
10
+ {
11
+ id: 'Llama-3.2-1B-Instruct-q4f16_1-MLC',
12
+ label: 'Llama 3.2 1B (smallest)',
13
+ downloadMB: 700,
14
+ vramMB: 879,
15
+ },
16
+ {
17
+ id: 'Qwen3-4B-q4f16_1-MLC',
18
+ label: 'Qwen3 4B (smarter, larger)',
19
+ downloadMB: 2300,
20
+ vramMB: 3432,
21
+ },
22
+ ];
23
+ export function getModel(id) {
24
+ return ASSISTANT_MODELS.find((model) => model.id === id);
25
+ }
26
+ /** "about 1.1 GB" / "about 700 MB". */
27
+ export function formatSize(megabytes) {
28
+ return megabytes >= 1000
29
+ ? `about ${(megabytes / 1000).toFixed(1)} GB`
30
+ : `about ${megabytes} MB`;
31
+ }
32
+ /** The label without its advice: "Qwen3 1.7B (recommended)" -> "Qwen3 1.7B". */
33
+ export function shortLabel(model) {
34
+ return model.label.replace(/\s*\(.*\)\s*$/, '');
35
+ }
36
+ /** The model to suggest when the graphics card has room for it. */
37
+ export const ROOMY_MODEL_ID = 'Qwen3-4B-q4f16_1-MLC';
38
+ /**
39
+ * Whether a graphics card whose largest single buffer is `maxBufferBytes` has
40
+ * room for the model (with some headroom). The default stays the default for
41
+ * small cards.
42
+ */
43
+ export function hasRoomFor(model, maxBufferBytes) {
44
+ return maxBufferBytes >= model.vramMB * 1_000_000 * 1.2;
45
+ }
46
+ /** The largest buffer the graphics card allows, or 0 when unknown. */
47
+ export async function graphicsBufferLimit(nav = typeof navigator === 'undefined'
48
+ ? undefined
49
+ : navigator) {
50
+ try {
51
+ const adapter = await nav?.gpu?.requestAdapter();
52
+ return adapter?.limits?.maxBufferSize ?? 0;
53
+ }
54
+ catch {
55
+ return 0;
56
+ }
57
+ }
@@ -0,0 +1,36 @@
1
+ import type { LibraryCookbook } from '../library/types.ts';
2
+ export type OfferStatus = 'pending' | 'applied' | 'declined' | 'replaced' | 'failed';
3
+ export interface Offer {
4
+ id: string;
5
+ cookbookId: string;
6
+ status: OfferStatus;
7
+ error: string;
8
+ }
9
+ /** What a chat message carries (`toolCallData`) to render its offer. */
10
+ export interface OfferRef {
11
+ kind: 'cookbook-offer';
12
+ offerId: string;
13
+ }
14
+ export declare const isOfferRef: (value: unknown) => value is OfferRef;
15
+ /** Applies a cookbook (the Cookbooks tab's path); returns an error or null. */
16
+ export type CookbookApplier = (cookbook: LibraryCookbook) => string | null;
17
+ /**
18
+ * Cookbooks the assistant proposed. Applying one replaces the recipes, menu
19
+ * and sample records, so an offer only ever applies from `accept`, which the
20
+ * person's click calls. A newer offer replaces a pending one (latest wins).
21
+ */
22
+ export declare class CookbookOffers {
23
+ private readonly find;
24
+ offers: Record<string, Offer>;
25
+ /** Set by the component that can reach the data source. */
26
+ applier: CookbookApplier | null;
27
+ private counter;
28
+ constructor(find: (id: string) => LibraryCookbook | undefined);
29
+ pending(): Offer | undefined;
30
+ /** Whether a cookbook is already applied or waiting for the person's click. */
31
+ engaged(): boolean;
32
+ /** Propose a cookbook. Returns null when the same one is already pending. */
33
+ offer(cookbookId: string): OfferRef | null;
34
+ accept(offerId: string): void;
35
+ decline(offerId: string): void;
36
+ }
@@ -0,0 +1,59 @@
1
+ export const isOfferRef = (value) => !!value &&
2
+ typeof value === 'object' &&
3
+ value.kind === 'cookbook-offer' &&
4
+ typeof value.offerId === 'string';
5
+ /**
6
+ * Cookbooks the assistant proposed. Applying one replaces the recipes, menu
7
+ * and sample records, so an offer only ever applies from `accept`, which the
8
+ * person's click calls. A newer offer replaces a pending one (latest wins).
9
+ */
10
+ export class CookbookOffers {
11
+ find;
12
+ offers = $state({});
13
+ /** Set by the component that can reach the data source. */
14
+ applier = null;
15
+ counter = 0;
16
+ constructor(find) {
17
+ this.find = find;
18
+ }
19
+ pending() {
20
+ return Object.values(this.offers).find((o) => o.status === 'pending');
21
+ }
22
+ /** Whether a cookbook is already applied or waiting for the person's click. */
23
+ engaged() {
24
+ return Object.values(this.offers).some((o) => o.status === 'pending' || o.status === 'applied');
25
+ }
26
+ /** Propose a cookbook. Returns null when the same one is already pending. */
27
+ offer(cookbookId) {
28
+ const open = this.pending();
29
+ if (open?.cookbookId === cookbookId)
30
+ return null;
31
+ if (open)
32
+ open.status = 'replaced';
33
+ const id = `offer-${++this.counter}`;
34
+ this.offers[id] = { id, cookbookId, status: 'pending', error: '' };
35
+ return { kind: 'cookbook-offer', offerId: id };
36
+ }
37
+ accept(offerId) {
38
+ const offer = this.offers[offerId];
39
+ if (offer?.status !== 'pending')
40
+ return;
41
+ const cookbook = this.find(offer.cookbookId);
42
+ const error = !cookbook
43
+ ? 'Unknown cookbook.'
44
+ : !this.applier
45
+ ? 'Not ready yet.'
46
+ : this.applier(cookbook);
47
+ if (error || !cookbook) {
48
+ offer.status = 'failed';
49
+ offer.error = error ?? 'Could not set it up.';
50
+ return;
51
+ }
52
+ offer.status = 'applied';
53
+ }
54
+ decline(offerId) {
55
+ const offer = this.offers[offerId];
56
+ if (offer?.status === 'pending')
57
+ offer.status = 'declined';
58
+ }
59
+ }
@@ -0,0 +1,14 @@
1
+ /**
2
+ * A UI preference, not part of the cookbook: which model to use and which the
3
+ * visitor has agreed to download. Kept in localStorage; every access is
4
+ * guarded because it can throw or be empty (private windows, blocked storage).
5
+ */
6
+ export interface AssistantPrefs {
7
+ modelId: string;
8
+ /** Models whose download the visitor has accepted. */
9
+ consented: string[];
10
+ }
11
+ export declare const PREFS_KEY = "smrt-planner:assistant:v1";
12
+ export declare function defaultPrefs(): AssistantPrefs;
13
+ export declare function loadPrefs(storage: Storage | null): AssistantPrefs;
14
+ export declare function savePrefs(storage: Storage | null, prefs: AssistantPrefs): void;
@@ -0,0 +1,32 @@
1
+ import { DEFAULT_MODEL_ID, getModel } from "./models.js";
2
+ export const PREFS_KEY = 'smrt-planner:assistant:v1';
3
+ export function defaultPrefs() {
4
+ return { modelId: DEFAULT_MODEL_ID, consented: [] };
5
+ }
6
+ export function loadPrefs(storage) {
7
+ const prefs = defaultPrefs();
8
+ try {
9
+ const raw = storage?.getItem(PREFS_KEY);
10
+ if (!raw)
11
+ return prefs;
12
+ const value = JSON.parse(raw);
13
+ if (typeof value.modelId === 'string' && getModel(value.modelId)) {
14
+ prefs.modelId = value.modelId;
15
+ }
16
+ if (Array.isArray(value.consented)) {
17
+ prefs.consented = value.consented.filter((id) => typeof id === 'string' && !!getModel(id));
18
+ }
19
+ }
20
+ catch {
21
+ // Unreadable or unavailable: start from the defaults.
22
+ }
23
+ return prefs;
24
+ }
25
+ export function savePrefs(storage, prefs) {
26
+ try {
27
+ storage?.setItem(PREFS_KEY, JSON.stringify(prefs));
28
+ }
29
+ catch {
30
+ // Not saved; the choice still holds for this visit.
31
+ }
32
+ }
@@ -0,0 +1,23 @@
1
+ import type { LibraryCookbook } from '../library/types.ts';
2
+ import type { Recipe } from '../recipes/types.ts';
3
+ import type { AppSettings } from '../settings/app-settings.ts';
4
+ import { type ThemeSetting } from '../theme/theme.ts';
5
+ import type { Match } from './match.ts';
6
+ /** The slice of a cookbook the model needs to pick one. */
7
+ export type CookbookBrief = Pick<LibraryCookbook, 'id' | 'name' | 'summary'> & Partial<Pick<LibraryCookbook, 'keywords'>>;
8
+ /** Tax is shown as a percent, the unit the person says it in. */
9
+ export declare function formatTaxPercent(fraction: number): string;
10
+ /**
11
+ * The system prompt: what the assistant is, how little to say, the recipes it
12
+ * may use, the cookbooks it may offer, the current settings and which recipes
13
+ * are on now. Short on purpose, for a 1-2B model.
14
+ *
15
+ * With `matches` (keyword matches for the person's message, possibly none) the
16
+ * prompt is focused: full lines (id, label, summary, synonyms) only for the
17
+ * matched and currently-on recipes and cookbooks, a compact list of the rest,
18
+ * and a hint line naming what looks relevant. Without it every item gets a
19
+ * full line. The response schema lists every id either way.
20
+ */
21
+ export declare function buildSystemPrompt(recipes: readonly Recipe[], current: readonly string[], cookbooks?: readonly CookbookBrief[], settings?: AppSettings, matches?: readonly Match[], themeInfo?: {
22
+ current: ThemeSetting | undefined;
23
+ }): string;
@@ -0,0 +1,163 @@
1
+ import { describeTheme } from "../theme/theme.js";
2
+ /** Most matched items given full lines; the rest stay in the compact list. */
3
+ const MAX_FOCUSED_RECIPES = 5;
4
+ const MAX_FOCUSED_COOKBOOKS = 2;
5
+ const EXAMPLES = [
6
+ {
7
+ says: 'I run a bakery',
8
+ cookbook: 'bakery',
9
+ answer: {
10
+ reply: 'The Bakery cookbook covers that.',
11
+ add: [],
12
+ remove: [],
13
+ cookbook: 'bakery',
14
+ },
15
+ },
16
+ {
17
+ says: 'I need to send invoices',
18
+ recipes: ['commerce.invoicing'],
19
+ answer: {
20
+ reply: 'Added invoicing for billing customers.',
21
+ add: ['commerce.invoicing'],
22
+ remove: [],
23
+ },
24
+ },
25
+ {
26
+ says: "we don't need the pipeline",
27
+ recipes: ['sales.pipeline'],
28
+ answer: {
29
+ reply: 'Removed leads and pipeline.',
30
+ add: [],
31
+ remove: ['sales.pipeline'],
32
+ },
33
+ },
34
+ {
35
+ says: "we're in Canada, 13% tax",
36
+ settings: true,
37
+ answer: {
38
+ reply: 'Set to Canadian dollars and 13% tax.',
39
+ add: [],
40
+ remove: [],
41
+ settings: { currency: 'CAD', taxRate: 13 },
42
+ },
43
+ },
44
+ {
45
+ says: 'make it warmer',
46
+ theme: true,
47
+ answer: {
48
+ reply: 'Gave it a warm amber brand colour.',
49
+ add: [],
50
+ remove: [],
51
+ theme: { primary: '#d97706' },
52
+ },
53
+ },
54
+ {
55
+ says: 'hello',
56
+ answer: { reply: 'Hi. What kind of business is it?', add: [], remove: [] },
57
+ },
58
+ ];
59
+ function examples(recipeIds, cookbookIds, withSettings, withTheme) {
60
+ return EXAMPLES.filter((e) => (e.recipes ?? []).every((id) => recipeIds.has(id)) &&
61
+ (!e.cookbook || cookbookIds.has(e.cookbook)) &&
62
+ (!e.settings || withSettings) &&
63
+ (!e.theme || withTheme)).map((e) => `"${e.says}" -> ${JSON.stringify(e.answer)}`);
64
+ }
65
+ /** Tax is shown as a percent, the unit the person says it in. */
66
+ export function formatTaxPercent(fraction) {
67
+ return `${Number((fraction * 100).toFixed(4))}%`;
68
+ }
69
+ /**
70
+ * The system prompt: what the assistant is, how little to say, the recipes it
71
+ * may use, the cookbooks it may offer, the current settings and which recipes
72
+ * are on now. Short on purpose, for a 1-2B model.
73
+ *
74
+ * With `matches` (keyword matches for the person's message, possibly none) the
75
+ * prompt is focused: full lines (id, label, summary, synonyms) only for the
76
+ * matched and currently-on recipes and cookbooks, a compact list of the rest,
77
+ * and a hint line naming what looks relevant. Without it every item gets a
78
+ * full line. The response schema lists every id either way.
79
+ */
80
+ export function buildSystemPrompt(recipes, current, cookbooks = [], settings, matches, themeInfo) {
81
+ const focused = matches !== undefined;
82
+ const matchedRecipes = (matches ?? [])
83
+ .filter((m) => m.kind === 'recipe')
84
+ .slice(0, MAX_FOCUSED_RECIPES)
85
+ .map((m) => m.id);
86
+ const matchedCookbooks = (matches ?? [])
87
+ .filter((m) => m.kind === 'cookbook')
88
+ .slice(0, MAX_FOCUSED_COOKBOOKS)
89
+ .map((m) => m.id);
90
+ const fullRecipe = new Set([...matchedRecipes, ...current]);
91
+ const fullCookbook = new Set(matchedCookbooks);
92
+ const recipeLine = (recipe) => {
93
+ const also = recipe.synonyms.length
94
+ ? ` Also called: ${recipe.synonyms.join(', ')}.`
95
+ : '';
96
+ return `- ${recipe.id}: ${recipe.label}. ${recipe.summary}${also}`;
97
+ };
98
+ const out = [
99
+ 'You help assemble a small business app. Reply as JSON.',
100
+ '"reply": answer what they just said in one sentence of 12 words or fewer. No greeting; never repeat a reply.',
101
+ '"add"/"remove": recipe ids, only what they ask to add or drop; else []. Dependencies are automatic.',
102
+ ];
103
+ if (cookbooks.length) {
104
+ out.push('"cookbook": id only if their business clearly fits, else null.');
105
+ }
106
+ if (settings) {
107
+ out.push('"settings": only what they state: currency (ISO), taxRate (percent), paymentTerms; else omit, and do not mention them otherwise.');
108
+ }
109
+ if (themeInfo) {
110
+ out.push('"theme": only if they ask for a look: {"preset": material|glass|studio|smrt|happyvertical} or {"primary": "#rrggbb"}, optional "colorScheme": light|dark; else omit.');
111
+ }
112
+ const shown = examples(new Set(recipes.map((r) => r.id)), new Set(cookbooks.map((c) => c.id)), Boolean(settings), Boolean(themeInfo));
113
+ if (shown.length)
114
+ out.push('', 'Examples:', ...shown);
115
+ const themeHint = !!themeInfo && (matches ?? []).some((m) => m.kind === 'theme');
116
+ if (matchedRecipes.length || matchedCookbooks.length || themeHint) {
117
+ const parts = [];
118
+ if (themeHint)
119
+ parts.push('theming (use "theme")');
120
+ if (matchedCookbooks.length) {
121
+ parts.push(`cookbook ${matchedCookbooks.join(', ')}`);
122
+ }
123
+ if (matchedRecipes.length) {
124
+ parts.push(`recipes ${matchedRecipes.join(', ')}`);
125
+ }
126
+ out.push('', `Looks relevant: ${parts.join('; ')}.`);
127
+ }
128
+ const cookbookLine = (c) => `- ${c.id}: ${c.name}. ${c.summary}`;
129
+ const compact = (items) => items.join(', ');
130
+ const fullRecipes = recipes.filter((r) => !focused || fullRecipe.has(r.id));
131
+ const otherRecipes = focused
132
+ ? recipes.filter((r) => !fullRecipe.has(r.id))
133
+ : [];
134
+ out.push('');
135
+ if (fullRecipes.length)
136
+ out.push('Recipes:', ...fullRecipes.map(recipeLine));
137
+ if (otherRecipes.length) {
138
+ out.push(`Other recipes: ${compact(otherRecipes.map((r) => `${r.id} (${r.label})`))}.`);
139
+ }
140
+ if (cookbooks.length) {
141
+ const fullBooks = cookbooks.filter((c) => !focused || fullCookbook.has(c.id));
142
+ const otherBooks = focused
143
+ ? cookbooks.filter((c) => !fullCookbook.has(c.id))
144
+ : [];
145
+ out.push('');
146
+ if (fullBooks.length)
147
+ out.push('Cookbooks:', ...fullBooks.map(cookbookLine));
148
+ if (otherBooks.length) {
149
+ out.push(`Other cookbooks: ${compact(otherBooks.map((c) => `${c.id} (${c.name})`))}.`);
150
+ }
151
+ }
152
+ out.push('', `Currently on: ${current.length ? current.join(', ') : 'none'}.`);
153
+ if (settings) {
154
+ const terms = settings.paymentTerms
155
+ ? `, terms ${settings.paymentTerms}`
156
+ : '';
157
+ out.push(`Settings: currency ${settings.currency}, tax ${formatTaxPercent(settings.taxRate)}${terms}.`);
158
+ }
159
+ if (themeInfo) {
160
+ out.push(`Theme: ${describeTheme(themeInfo.current)}.`);
161
+ }
162
+ return out.join('\n');
163
+ }
@@ -0,0 +1,74 @@
1
+ import type { InferenceMode } from '../inference/config.ts';
2
+ import type { PlannerController } from '../planner/commands/index.ts';
3
+ import type { Recipe } from '../recipes/types.ts';
4
+ import type { RecipeStore, SettingsStore, ThemeStore } from './change.ts';
5
+ import { type EngineHost, type LoadProgress } from './engine.ts';
6
+ import { CookbookOffers } from './offers.svelte.ts';
7
+ import { type AssistantPrefs } from './prefs.ts';
8
+ import { ThemeUndos } from './theme-undo.svelte.ts';
9
+ import { type BrowserAssistantTransport, type ChatModel } from './transport.ts';
10
+ /**
11
+ * Qwen3 reasons before it answers unless told not to; its `/no_think` switch
12
+ * skips that, which is slow and pointless for a short structured reply. The
13
+ * grammar-constrained JSON already keeps any thinking out of the output.
14
+ */
15
+ export declare function withoutThinking(chat: ChatModel, modelId: string): ChatModel;
16
+ export type SessionStatus = 'unsupported' | 'idle' | 'loading' | 'ready' | 'error';
17
+ export interface SessionOptions {
18
+ store: RecipeStore;
19
+ recipes: readonly Recipe[];
20
+ /** The app settings the assistant may change; omit to leave them out. */
21
+ settings?: SettingsStore;
22
+ /** The app theme the assistant may change (with Undo); omit to leave it out. */
23
+ theme?: ThemeStore;
24
+ /** The controller the assistant's changes go through; made from the slices if omitted. */
25
+ controller?: PlannerController;
26
+ storage: Storage | null;
27
+ /** Defaults to the browser's WebGPU check. */
28
+ webgpu?: () => boolean;
29
+ host?: EngineHost;
30
+ /** Called with each reply the model produced, e.g. to read it aloud. */
31
+ onReply?: (text: string) => void;
32
+ }
33
+ /**
34
+ * The assistant's lifecycle: nothing is downloaded until the visitor accepts
35
+ * the model's size (`start`), loading reports progress and can be cancelled,
36
+ * and `unload` frees the GPU. The transport talks to whatever is loaded.
37
+ */
38
+ export declare class AssistantSession {
39
+ status: SessionStatus;
40
+ prefs: AssistantPrefs;
41
+ progress: LoadProgress;
42
+ error: string;
43
+ /** Where the model runs. `browser` loads WebLLM here; the others are remote. */
44
+ mode: InferenceMode;
45
+ /** Remote modes: what the visitor sees as the model, e.g. `gpt-4o-mini`. */
46
+ remoteLabel: string;
47
+ readonly transport: BrowserAssistantTransport;
48
+ /** Cookbooks the assistant proposed, applied only by the person's click. */
49
+ readonly offers: CookbookOffers;
50
+ /** Theme changes the assistant made, each undoable from the chat. */
51
+ readonly themeUndos: ThemeUndos | null;
52
+ private loaded;
53
+ private chat;
54
+ private abort;
55
+ private loadGeneration;
56
+ private readonly options;
57
+ constructor(options: SessionOptions);
58
+ /**
59
+ * Choose where the model runs. `host` and `byo` need no WebGPU and no
60
+ * download; the chat is set with `useRemote`.
61
+ */
62
+ setMode(mode: InferenceMode): void;
63
+ /** The remote chat model, or null when none is connected (byo, before setup). */
64
+ useRemote(chat: ChatModel | null, label: string): void;
65
+ /** Whether the visitor already accepted the selected model's download. */
66
+ get consented(): boolean;
67
+ select(modelId: string): void;
68
+ /** Load the selected model. The caller has shown its size and got consent. */
69
+ start(): Promise<void>;
70
+ /** Stop a download in progress. */
71
+ cancel(): void;
72
+ /** Free the model, for example to choose another. */
73
+ unload(): void;
74
+ }
@@ -0,0 +1,181 @@
1
+ import { isWebGPUAvailable, WebLLMProvider } from '@happyvertical/ai/local';
2
+ import { getLibraryCookbook, libraryCookbooks } from "../library/index.js";
3
+ import { browserHost, loadModel, } from "./engine.js";
4
+ import { getModel } from "./models.js";
5
+ import { CookbookOffers } from "./offers.svelte.js";
6
+ import { loadPrefs, savePrefs } from "./prefs.js";
7
+ import { ThemeUndos } from "./theme-undo.svelte.js";
8
+ import { createBrowserAssistantTransport, } from "./transport.js";
9
+ /**
10
+ * Qwen3 reasons before it answers unless told not to; its `/no_think` switch
11
+ * skips that, which is slow and pointless for a short structured reply. The
12
+ * grammar-constrained JSON already keeps any thinking out of the output.
13
+ */
14
+ export function withoutThinking(chat, modelId) {
15
+ if (!/^qwen3/i.test(modelId))
16
+ return chat;
17
+ return {
18
+ message: (text, options) => chat.message(`${text} /no_think`, options),
19
+ };
20
+ }
21
+ /**
22
+ * The assistant's lifecycle: nothing is downloaded until the visitor accepts
23
+ * the model's size (`start`), loading reports progress and can be cancelled,
24
+ * and `unload` frees the GPU. The transport talks to whatever is loaded.
25
+ */
26
+ export class AssistantSession {
27
+ status = $state('idle');
28
+ prefs = $state({ modelId: '', consented: [] });
29
+ progress = $state({ progress: 0, text: '' });
30
+ error = $state('');
31
+ /** Where the model runs. `browser` loads WebLLM here; the others are remote. */
32
+ mode = $state('browser');
33
+ /** Remote modes: what the visitor sees as the model, e.g. `gpt-4o-mini`. */
34
+ remoteLabel = $state('');
35
+ transport;
36
+ /** Cookbooks the assistant proposed, applied only by the person's click. */
37
+ offers = new CookbookOffers(getLibraryCookbook);
38
+ /** Theme changes the assistant made, each undoable from the chat. */
39
+ themeUndos;
40
+ loaded = null;
41
+ chat = null;
42
+ abort = null;
43
+ loadGeneration = 0;
44
+ options;
45
+ constructor(options) {
46
+ this.options = options;
47
+ this.prefs = loadPrefs(options.storage);
48
+ this.status = (options.webgpu ?? isWebGPUAvailable)()
49
+ ? 'idle'
50
+ : 'unsupported';
51
+ this.themeUndos = options.theme
52
+ ? new ThemeUndos(options.theme, options.controller)
53
+ : null;
54
+ this.transport = createBrowserAssistantTransport({
55
+ model: () => this.chat,
56
+ store: options.store,
57
+ recipes: options.recipes,
58
+ cookbooks: libraryCookbooks,
59
+ offers: this.offers,
60
+ settings: options.settings,
61
+ theme: options.theme,
62
+ controller: options.controller,
63
+ themeUndos: this.themeUndos ?? undefined,
64
+ acceptCommands: () => this.mode === 'host',
65
+ unavailable: () => this.mode === 'byo'
66
+ ? 'Connect your model on the AI page first, then I can help. The cards on the Planner page work without one.'
67
+ : this.mode === 'host'
68
+ ? 'The assistant is not available right now. The cards on the Planner page work without it.'
69
+ : this.mode === 'manual'
70
+ ? 'Inference is off. The cards on the Planner page work without it.'
71
+ : 'Download a model first, then I can help. The cards on the Planner page work without one.',
72
+ onReply: (text) => options.onReply?.(text),
73
+ });
74
+ }
75
+ /**
76
+ * Choose where the model runs. `host` and `byo` need no WebGPU and no
77
+ * download; the chat is set with `useRemote`.
78
+ */
79
+ setMode(mode) {
80
+ if (mode !== this.mode)
81
+ this.unload();
82
+ this.mode = mode;
83
+ if (mode !== 'browser') {
84
+ this.status = 'idle';
85
+ }
86
+ else if (!(this.options.webgpu ?? isWebGPUAvailable)()) {
87
+ this.status = 'unsupported';
88
+ }
89
+ else {
90
+ this.status = 'idle';
91
+ }
92
+ }
93
+ /** The remote chat model, or null when none is connected (byo, before setup). */
94
+ useRemote(chat, label) {
95
+ if (this.mode === 'browser')
96
+ return;
97
+ this.chat = chat;
98
+ this.remoteLabel = chat ? label : '';
99
+ this.status = chat ? 'ready' : 'idle';
100
+ }
101
+ /** Whether the visitor already accepted the selected model's download. */
102
+ get consented() {
103
+ return this.prefs.consented.includes(this.prefs.modelId);
104
+ }
105
+ select(modelId) {
106
+ if (!getModel(modelId) || this.status === 'loading')
107
+ return;
108
+ this.prefs = { ...this.prefs, modelId };
109
+ savePrefs(this.options.storage, this.prefs);
110
+ }
111
+ /** Load the selected model. The caller has shown its size and got consent. */
112
+ async start() {
113
+ if (this.status === 'loading' || this.status === 'unsupported')
114
+ return;
115
+ const modelId = this.prefs.modelId;
116
+ if (!getModel(modelId))
117
+ return;
118
+ this.status = 'loading';
119
+ this.error = '';
120
+ this.progress = { progress: 0, text: 'Starting' };
121
+ const abort = new AbortController();
122
+ const generation = ++this.loadGeneration;
123
+ this.abort = abort;
124
+ try {
125
+ const loaded = await loadModel(modelId, (report) => {
126
+ this.progress = report;
127
+ }, abort.signal, this.options.host ?? browserHost);
128
+ if (generation !== this.loadGeneration || this.mode !== 'browser') {
129
+ loaded.dispose();
130
+ return;
131
+ }
132
+ this.loaded = loaded;
133
+ // Consent is recorded only once the download completed: a cancelled or
134
+ // failed attempt must show the size and memory warning again.
135
+ this.prefs = {
136
+ ...this.prefs,
137
+ consented: [...new Set([...this.prefs.consented, modelId])],
138
+ };
139
+ savePrefs(this.options.storage, this.prefs);
140
+ this.chat = withoutThinking(new WebLLMProvider({
141
+ type: 'webllm',
142
+ engine: loaded.engine,
143
+ model: modelId,
144
+ }), modelId);
145
+ this.status = 'ready';
146
+ }
147
+ catch (error) {
148
+ if (generation !== this.loadGeneration)
149
+ return;
150
+ if (abort.signal.aborted) {
151
+ this.status = 'idle';
152
+ }
153
+ else {
154
+ this.error = error instanceof Error ? error.message : String(error);
155
+ this.status = 'error';
156
+ }
157
+ }
158
+ finally {
159
+ if (generation === this.loadGeneration)
160
+ this.abort = null;
161
+ }
162
+ }
163
+ /** Stop a download in progress. */
164
+ cancel() {
165
+ this.abort?.abort();
166
+ }
167
+ /** Free the model, for example to choose another. */
168
+ unload() {
169
+ // A load in progress is aborted too, which terminates its worker.
170
+ this.loadGeneration += 1;
171
+ const abort = this.abort;
172
+ this.abort = null;
173
+ abort?.abort();
174
+ this.transport.abort();
175
+ this.loaded?.dispose();
176
+ this.loaded = null;
177
+ this.chat = null;
178
+ if (this.status !== 'unsupported')
179
+ this.status = 'idle';
180
+ }
181
+ }