@happyvertical/smrt-planner 0.0.0-stage → 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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/B32EWqI8.js +9 -0
  36. package/app/_app/immutable/chunks/B4Kevpe0.js +1 -0
  37. package/app/_app/immutable/chunks/BJfAXhak.js +3 -0
  38. package/app/_app/immutable/chunks/BKwRT_1p.js +1 -0
  39. package/app/_app/immutable/chunks/BQxY8kkL.js +1 -0
  40. package/app/_app/immutable/chunks/BS4h9ES-.js +1 -0
  41. package/app/_app/immutable/chunks/BWPhGFHl.js +1 -0
  42. package/app/_app/immutable/chunks/BYcBM-fh.js +1 -0
  43. package/app/_app/immutable/chunks/BYde9M_U.js +1 -0
  44. package/app/_app/immutable/chunks/BegKiy2G.js +1 -0
  45. package/app/_app/immutable/chunks/Bjy-W4x2.js +81 -0
  46. package/app/_app/immutable/chunks/C7zBd-pD.js +1 -0
  47. package/app/_app/immutable/chunks/CA-A9Ngs.js +1 -0
  48. package/app/_app/immutable/chunks/CMhpRMKg.js +1 -0
  49. package/app/_app/immutable/chunks/CPRHZZeW.js +1 -0
  50. package/app/_app/immutable/chunks/CRQ1Pmzr.js +1 -0
  51. package/app/_app/immutable/chunks/CV-2zt0K.js +2 -0
  52. package/app/_app/immutable/chunks/CWtfVMDz.js +1 -0
  53. package/app/_app/immutable/chunks/CgAkqYsL.js +1 -0
  54. package/app/_app/immutable/chunks/Chyo8rdT.js +3 -0
  55. package/app/_app/immutable/chunks/CmmuWmp6.js +2 -0
  56. package/app/_app/immutable/chunks/CrFNLK0f.js +1 -0
  57. package/app/_app/immutable/chunks/CrO3W89x.js +1 -0
  58. package/app/_app/immutable/chunks/CyUMm_Wp.js +1 -0
  59. package/app/_app/immutable/chunks/CygC84VT.js +2 -0
  60. package/app/_app/immutable/chunks/D0VgZnk1.js +1 -0
  61. package/app/_app/immutable/chunks/D333l2GL.js +2 -0
  62. package/app/_app/immutable/chunks/D71UrO5c.js +1 -0
  63. package/app/_app/immutable/chunks/D7hhQvDO.js +1 -0
  64. package/app/_app/immutable/chunks/DD7gpKb2.js +1 -0
  65. package/app/_app/immutable/chunks/DJtH-lRi.js +3 -0
  66. package/app/_app/immutable/chunks/DNRgqfTx.js +1 -0
  67. package/app/_app/immutable/chunks/DRByVC-c.js +1 -0
  68. package/app/_app/immutable/chunks/DVRKjN-E.js +1 -0
  69. package/app/_app/immutable/chunks/D_J_XtJy.js +846 -0
  70. package/app/_app/immutable/chunks/Dbjm4OuC.js +1 -0
  71. package/app/_app/immutable/chunks/Dc4q22LH.js +42 -0
  72. package/app/_app/immutable/chunks/Dd_uD5pT.js +1 -0
  73. package/app/_app/immutable/chunks/Dp9GVO-9.js +1 -0
  74. package/app/_app/immutable/chunks/DqcD-WtP.js +1 -0
  75. package/app/_app/immutable/chunks/Dt-HX3Vu.js +1 -0
  76. package/app/_app/immutable/chunks/DyGfbRG-.js +1 -0
  77. package/app/_app/immutable/chunks/FbOxj-PF.js +69 -0
  78. package/app/_app/immutable/chunks/OJ_lLTHH.js +1 -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/iET62IRm.js +2 -0
  82. package/app/_app/immutable/chunks/leQCwW2d.js +1 -0
  83. package/app/_app/immutable/chunks/p6bgzXiY.js +1 -0
  84. package/app/_app/immutable/chunks/uBIymjUX.js +1 -0
  85. package/app/_app/immutable/chunks/ufuM4XBq.js +33 -0
  86. package/app/_app/immutable/chunks/xihTtKlq.js +1 -0
  87. package/app/_app/immutable/entry/app.D5JJain6.js +2 -0
  88. package/app/_app/immutable/entry/start.CH9DJLgI.js +1 -0
  89. package/app/_app/immutable/nodes/0.CL1MxOva.js +10 -0
  90. package/app/_app/immutable/nodes/1.BO731RRg.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.BmZyLHbM.js +1 -0
  94. package/app/_app/immutable/nodes/2.BEw046av.js +17 -0
  95. package/app/_app/immutable/nodes/3.DvwpTAQA.js +1 -0
  96. package/app/_app/immutable/nodes/4.qrT4bnmS.js +1 -0
  97. package/app/_app/immutable/nodes/5.DDLa2uhV.js +1 -0
  98. package/app/_app/immutable/nodes/6.DN0QTY6z.js +1 -0
  99. package/app/_app/immutable/nodes/7.C_8N82Wq.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 +125 -0
  485. package/dist/ai/state.svelte.js +286 -0
  486. package/dist/ai/status.d.ts +67 -0
  487. package/dist/ai/status.js +117 -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 +73 -0
  506. package/dist/assistant/session.svelte.js +163 -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 +499 -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 +314 -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 +12 -0
  619. package/dist/core/app.js +15 -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 +86 -0
  685. package/dist/inference/byo.svelte.js +267 -0
  686. package/dist/inference/config.d.ts +70 -0
  687. package/dist/inference/config.js +149 -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 +202 -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 +109 -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 +80 -3
@@ -0,0 +1,283 @@
1
+ import { contextFrom, findRows, mappedValues, parseTarget, slug, startingValue, targetField, toWriteValues, } from "./shared.js";
2
+ const comboKey = (values) => JSON.stringify(values);
3
+ /**
4
+ * Split pasted lists on commas, trim, drop blanks and repeats
5
+ * (case-insensitively), keep the order.
6
+ */
7
+ export function cleanValues(values) {
8
+ const seen = new Set();
9
+ const out = [];
10
+ for (const raw of values.flatMap((value) => value.split(','))) {
11
+ const value = raw.trim();
12
+ const folded = value.toLowerCase();
13
+ if (!value || seen.has(folded))
14
+ continue;
15
+ seen.add(folded);
16
+ out.push(value);
17
+ }
18
+ return out;
19
+ }
20
+ /**
21
+ * Every combination of the axes' values, rows in axis order. An axis with no
22
+ * values is left out, so a product with only sizes still gets a cell per size;
23
+ * no values anywhere means no cells.
24
+ */
25
+ export function combinations(axes) {
26
+ const used = axes
27
+ .map((axis) => ({ name: axis.name, values: cleanValues(axis.values) }))
28
+ .filter((axis) => axis.values.length > 0);
29
+ if (used.length === 0)
30
+ return [];
31
+ let combos = [[]];
32
+ for (const axis of used) {
33
+ combos = combos.flatMap((prefix) => axis.values.map((value) => [...prefix, { name: axis.name, value }]));
34
+ }
35
+ return combos.map((parts) => ({
36
+ key: comboKey(parts.map((p) => p.value)),
37
+ attributes: Object.fromEntries(parts.map((p) => [p.name, p.value])),
38
+ values: parts.map((p) => p.value),
39
+ }));
40
+ }
41
+ /** The grid's combinations for its current state. */
42
+ export function gridCombos(form, state) {
43
+ return combinations(form.axes.map((axis) => ({
44
+ name: axis.name,
45
+ values: state.axes[axis.name] ?? [],
46
+ })));
47
+ }
48
+ /** Product inputs plus the per-cell inputs the extensions add. */
49
+ export function gridParts(active) {
50
+ return {
51
+ productFields: active.form.fields,
52
+ cellFields: active.extensions.flatMap((ext) => ext.fields ?? []),
53
+ cellRecords: active.extensions.flatMap((ext) => ext.records ?? []),
54
+ };
55
+ }
56
+ /** Product inputs with the catalog field they map onto, for rendering. */
57
+ export function gridProductInputs(active, models) {
58
+ return active.form.fields.map((field) => ({
59
+ field,
60
+ catalogField: targetField(field, [active.form.product], models),
61
+ }));
62
+ }
63
+ /** Cell inputs with the catalog field they map onto. */
64
+ export function gridCellInputs(active, models) {
65
+ const { cellFields, cellRecords } = gridParts(active);
66
+ const records = [skuRecord(active.form), ...cellRecords];
67
+ return cellFields.map((field) => ({
68
+ field,
69
+ catalogField: targetField(field, records, models),
70
+ }));
71
+ }
72
+ const skuRecord = (form) => ({
73
+ as: 'sku',
74
+ model: form.skus,
75
+ });
76
+ /** An empty grid: starting values for the product inputs and every axis. */
77
+ export function blankGrid(active, models) {
78
+ return {
79
+ values: Object.fromEntries(gridProductInputs(active, models).map(({ field, catalogField }) => [
80
+ field.id,
81
+ startingValue(field, catalogField),
82
+ ])),
83
+ axes: Object.fromEntries(active.form.axes.map((axis) => [axis.name, [...axis.values]])),
84
+ cells: {},
85
+ };
86
+ }
87
+ /** The starting inputs of one cell. */
88
+ export function blankCell(active, models) {
89
+ return Object.fromEntries(gridCellInputs(active, models).map(({ field, catalogField }) => [
90
+ field.id,
91
+ startingValue(field, catalogField),
92
+ ]));
93
+ }
94
+ /** Parse a JSON-string field (`allowedValues`, `attributes`), leniently. */
95
+ export function parseJson(value) {
96
+ if (typeof value !== 'string')
97
+ return value;
98
+ try {
99
+ return JSON.parse(value);
100
+ }
101
+ catch {
102
+ return undefined;
103
+ }
104
+ }
105
+ function attributesOf(sku) {
106
+ const parsed = parseJson(sku.attributes);
107
+ return parsed && typeof parsed === 'object' && !Array.isArray(parsed)
108
+ ? parsed
109
+ : {};
110
+ }
111
+ function skuKey(form, sku) {
112
+ const attributes = attributesOf(sku);
113
+ const parts = form.axes
114
+ .filter((axis) => axis.name in attributes)
115
+ .map((axis) => String(attributes[axis.name]));
116
+ return parts.length ? comboKey(parts) : undefined;
117
+ }
118
+ /** Load an existing product into a grid: its axes, then a cell per Sku. */
119
+ export async function loadGrid(source, active, models, productId) {
120
+ const { form } = active;
121
+ const product = await source.get(models(form.product.model), productId);
122
+ if (!product)
123
+ return undefined;
124
+ const variants = (await source.list(models(form.variants))).filter((row) => row.productId === productId);
125
+ const skus = (await source.list(models(form.skus))).filter((row) => row.productId === productId);
126
+ const state = blankGrid(active, models);
127
+ for (const input of gridProductInputs(active, models)) {
128
+ const { field } = parseTarget(input.field.to);
129
+ const value = product[field];
130
+ if (value !== undefined)
131
+ state.values[input.field.id] = value;
132
+ }
133
+ for (const axis of form.axes) {
134
+ const row = variants.find((v) => v.axisName === axis.name);
135
+ const stored = parseJson(row?.allowedValues);
136
+ state.axes[axis.name] = row
137
+ ? Array.isArray(stored)
138
+ ? cleanValues(stored.map(String))
139
+ : []
140
+ : [];
141
+ }
142
+ const { cellFields, cellRecords } = gridParts(active);
143
+ const blank = blankCell(active, models);
144
+ for (const sku of skus) {
145
+ const key = skuKey(form, sku);
146
+ if (!key)
147
+ continue;
148
+ const rows = await findRows(source, [skuRecord(form), ...cellRecords], { product, sku }, models);
149
+ state.cells[key] = Object.fromEntries(cellFields.map((field) => {
150
+ const { alias, field: name } = parseTarget(field.to);
151
+ const value = rows[alias]?.[name];
152
+ return [field.id, value === undefined ? blank[field.id] : value];
153
+ }));
154
+ }
155
+ return { state, existing: { productId, variants, skus } };
156
+ }
157
+ /** The Sku code of a new cell: product, then each value, upper-cased. */
158
+ export function skuCode(productName, combo) {
159
+ return [slug(productName) || 'SKU', ...combo.values.map(slug)]
160
+ .filter(Boolean)
161
+ .join('-');
162
+ }
163
+ /**
164
+ * The related writes that save a variant grid: the product, one
165
+ * `ProductVariant` per axis that has values (and a delete for one that no
166
+ * longer does), a `Sku` per combination with its `attributes` pinned (Skus of
167
+ * combinations that went away are deleted with the rows the extensions keep
168
+ * under them), then each extension's rows per cell. Pure; `apply` runs it
169
+ * all or nothing.
170
+ */
171
+ export function planGridSave(active, models, state, existing) {
172
+ const { form } = active;
173
+ const { cellFields, cellRecords } = gridParts(active);
174
+ const writes = [];
175
+ const productContext = contextFrom(form.fields, state.values);
176
+ const productValues = mappedValues(form.fields, form.product.as, state.values);
177
+ writes.push({
178
+ op: 'save',
179
+ as: 'product',
180
+ model: models(form.product.model),
181
+ ...(existing ? { id: existing.productId } : {}),
182
+ onCreate: toWriteValues(form.product.values, productContext),
183
+ values: productValues,
184
+ });
185
+ const variantModel = models(form.variants);
186
+ form.axes.forEach((axis, index) => {
187
+ const values = cleanValues(state.axes[axis.name] ?? []);
188
+ const match = { productId: { ref: 'product' }, axisName: axis.name };
189
+ if (values.length === 0) {
190
+ writes.push({ op: 'delete', model: variantModel, match });
191
+ return;
192
+ }
193
+ writes.push({
194
+ op: 'save',
195
+ model: variantModel,
196
+ match,
197
+ onCreate: { label: axis.label.replace(/s$/i, '') },
198
+ values: { allowedValues: JSON.stringify(values), sortOrder: index },
199
+ });
200
+ });
201
+ const skuModel = models(form.skus);
202
+ const combos = gridCombos(form, state);
203
+ const wanted = new Set(combos.map((c) => c.key));
204
+ const byKey = new Map((existing?.skus ?? []).flatMap((sku) => {
205
+ const key = skuKey(form, sku);
206
+ return key ? [[key, sku]] : [];
207
+ }));
208
+ // Skus whose combination left the grid go, with what hangs off them.
209
+ for (const sku of existing?.skus ?? []) {
210
+ const key = skuKey(form, sku);
211
+ if (key && wanted.has(key))
212
+ continue;
213
+ for (const record of cellRecords) {
214
+ const match = Object.fromEntries(Object.entries(record.match ?? {}).flatMap(([field, value]) => typeof value === 'object' && value?.ref === 'sku'
215
+ ? [[field, sku.id]]
216
+ : []));
217
+ if (Object.keys(match).length) {
218
+ writes.push({ op: 'delete', model: models(record.model), match });
219
+ }
220
+ }
221
+ writes.push({ op: 'delete', model: skuModel, id: sku.id });
222
+ }
223
+ const productName = productContext['product.name'];
224
+ // Codes stay unique in the plan: values that slug alike get a numeric suffix
225
+ // instead of being found-and-merged as one Sku.
226
+ const usedCodes = new Set((existing?.skus ?? [])
227
+ .filter((row) => wanted.has(skuKey(form, row) ?? ''))
228
+ .map((row) => String(row.code ?? '')));
229
+ combos.forEach((combo, i) => {
230
+ const current = byKey.get(combo.key);
231
+ const label = combo.values.join(' / ');
232
+ const name = `${String(productName ?? '').trim() || 'Item'} (${label})`;
233
+ const baseCode = skuCode(productName, combo);
234
+ let code = baseCode;
235
+ for (let n = 2; !current && usedCodes.has(code); n++) {
236
+ code = `${baseCode}-${n}`;
237
+ }
238
+ usedCodes.add(code);
239
+ const skuAlias = `sku#${i}`;
240
+ const values = {
241
+ name,
242
+ attributes: JSON.stringify(combo.attributes),
243
+ };
244
+ writes.push(current
245
+ ? { op: 'save', as: skuAlias, model: skuModel, id: current.id, values }
246
+ : {
247
+ op: 'save',
248
+ as: skuAlias,
249
+ model: skuModel,
250
+ match: { productId: { ref: 'product' }, code },
251
+ onCreate: { active: true },
252
+ values,
253
+ });
254
+ const cell = {
255
+ ...blankCell(active, models),
256
+ ...(state.cells[combo.key] ?? {}),
257
+ };
258
+ const rename = (alias) => alias === 'product'
259
+ ? alias
260
+ : alias === 'sku'
261
+ ? skuAlias
262
+ : `${alias}#${i}`;
263
+ const context = {
264
+ ...productContext,
265
+ 'sku.name': name,
266
+ 'sku.code': current ? String(current.code ?? code) : code,
267
+ };
268
+ for (const record of cellRecords) {
269
+ const mapped = mappedValues(cellFields, record.as, cell);
270
+ writes.push({
271
+ op: 'save',
272
+ as: rename(record.as),
273
+ model: models(record.model),
274
+ ...(record.match
275
+ ? { match: toWriteValues(record.match, context, rename) }
276
+ : {}),
277
+ onCreate: toWriteValues(record.values, context, rename),
278
+ values: mapped,
279
+ });
280
+ }
281
+ });
282
+ return writes;
283
+ }
@@ -0,0 +1,17 @@
1
+ /**
2
+ * smrt planner as a package: mount the `Planner` component in a host layout,
3
+ * drive it with the typed command set (`./commands` has no UI in it), and read
4
+ * its plan as a compact snapshot.
5
+ *
6
+ * @module
7
+ */
8
+ export { type ByoPresetDefinition, type ConfigResult, type InferenceConfig, type InferenceMode, loadInferenceConfig, parseInferenceConfig, } from './inference/config.ts';
9
+ export { createHostChat, type HostChatOptions, type HostRequest, } from './inference/host.ts';
10
+ export { createOpenAIChat, testConnection } from './inference/openai.ts';
11
+ export { type KitchenConfig, type KitchenEndpoint, type KitchenOutcome, type KitchenResult, parseKitchenConfig, sendToKitchen, } from './kitchen/client.ts';
12
+ export { KITCHEN_FRAGMENT_KEY, type KitchenFragment, readKitchenFragment, } from './kitchen/fragment.ts';
13
+ export { createPlannerAssistant, type PlannerAssistant, type PlannerChatInference, type PlannerConfigInference, type PlannerInference, } from './planner/assistant.ts';
14
+ export * from './planner/commands/index.ts';
15
+ export { plannerController } from './planner/instance.ts';
16
+ export { default as Planner } from './planner/Planner.svelte';
17
+ export type { PlannerHandle, PlannerProps } from './planner/types.ts';
package/dist/index.js ADDED
@@ -0,0 +1,16 @@
1
+ /**
2
+ * smrt planner as a package: mount the `Planner` component in a host layout,
3
+ * drive it with the typed command set (`./commands` has no UI in it), and read
4
+ * its plan as a compact snapshot.
5
+ *
6
+ * @module
7
+ */
8
+ export { loadInferenceConfig, parseInferenceConfig, } from "./inference/config.js";
9
+ export { createHostChat, } from "./inference/host.js";
10
+ export { createOpenAIChat, testConnection } from "./inference/openai.js";
11
+ export { parseKitchenConfig, sendToKitchen, } from "./kitchen/client.js";
12
+ export { KITCHEN_FRAGMENT_KEY, readKitchenFragment, } from "./kitchen/fragment.js";
13
+ export { createPlannerAssistant, } from "./planner/assistant.js";
14
+ export * from "./planner/commands/index.js";
15
+ export { plannerController } from "./planner/instance.js";
16
+ export { default as Planner } from './planner/Planner.svelte';
@@ -0,0 +1,86 @@
1
+ import type { ChatModel } from '../assistant/transport.ts';
2
+ import type { ByoPresetDefinition } from './config.ts';
3
+ import { type ConnectionResult } from './openai.ts';
4
+ /** Choices (not the key): which endpoint, its address and model, and whether it is in use. */
5
+ export declare const BYO_PREFS_KEY = "smrt-planner:inference:v1";
6
+ /** The keys, apart from the choices so nothing that copies prefs copies a key. */
7
+ export declare const BYO_KEYS_KEY = "smrt-planner:inference-key:v1";
8
+ export interface ByoEntry {
9
+ baseUrl: string;
10
+ model: string;
11
+ }
12
+ interface ByoPrefs {
13
+ preset: string;
14
+ active: boolean;
15
+ entries: Record<string, ByoEntry>;
16
+ }
17
+ export declare function loadByoPrefs(storage: Storage | null): ByoPrefs;
18
+ /** A saved key and the origin (scheme, host, port) it was entered for. */
19
+ export interface ByoKey {
20
+ origin: string;
21
+ key: string;
22
+ }
23
+ export declare function loadByoKeys(storage: Storage | null): Record<string, ByoKey>;
24
+ export type ByoTestStatus = 'idle' | 'testing' | 'ok' | 'failed';
25
+ export interface ByoOptions {
26
+ storage: Storage | null;
27
+ /** The config's `byo.presets`; default all built-ins. */
28
+ presets?: readonly (string | ByoPresetDefinition)[];
29
+ fetch?: typeof fetch;
30
+ /** Called after "use" or "stop using", so the assistant follows. */
31
+ onChange?: () => void;
32
+ }
33
+ /**
34
+ * The visitor's own OpenAI-compatible endpoint: the preset they picked, its
35
+ * address, model and key, a connection test, and whether the assistant uses
36
+ * it. The key lives only in this browser's localStorage and is only ever sent
37
+ * as the Authorization header to the chosen address.
38
+ */
39
+ export declare class ByoModel {
40
+ readonly presets: ByoPresetDefinition[];
41
+ presetId: string;
42
+ entries: Record<string, ByoEntry>;
43
+ keys: Record<string, ByoKey>;
44
+ active: boolean;
45
+ testStatus: ByoTestStatus;
46
+ testMessage: string;
47
+ private readonly options;
48
+ constructor(options: ByoOptions);
49
+ get preset(): ByoPresetDefinition | undefined;
50
+ get baseUrl(): string;
51
+ get model(): string;
52
+ /**
53
+ * The saved key, only while the address is the origin it was entered for:
54
+ * changing the address (or a config that reuses a preset id for another
55
+ * address) never sends the key somewhere new.
56
+ */
57
+ get key(): string;
58
+ /** A key is saved for this preset, but for another address. */
59
+ get keyForOtherAddress(): boolean;
60
+ /** Address valid, model named, and a key where the preset needs one (sendable there). */
61
+ get complete(): boolean;
62
+ select(id: string): void;
63
+ setBaseUrl(baseUrl: string): void;
64
+ setModel(model: string): void;
65
+ setKey(key: string): void;
66
+ /** Remove the saved key for the selected preset. */
67
+ forgetKey(): void;
68
+ /** The chat model for what is entered, or null while it is incomplete. */
69
+ chat(): ChatModel | null;
70
+ test(): Promise<ConnectionResult>;
71
+ /** Make the assistant use this endpoint. */
72
+ use(): boolean;
73
+ /** Stop using it; the entered values stay. */
74
+ stop(): void;
75
+ private resetTest;
76
+ /** An edit invalidates the last test and, if in use, what is in use. */
77
+ private edited;
78
+ private save;
79
+ }
80
+ /**
81
+ * The chat model for the endpoint a visitor already connected in this browser
82
+ * (a mounted `Planner` in byo mode has no AI page of its own). Null when none
83
+ * is connected or what was saved is incomplete.
84
+ */
85
+ export declare function savedByoChat(storage: Storage | null, presets?: readonly (string | ByoPresetDefinition)[], fetcher?: typeof fetch): ChatModel | null;
86
+ export {};
@@ -0,0 +1,267 @@
1
+ import { createOpenAIChat, keyMaySendTo, normalizeBaseUrl, originOf, testConnection, } from "./openai.js";
2
+ import { resolvePresets } from "./presets.js";
3
+ /** Choices (not the key): which endpoint, its address and model, and whether it is in use. */
4
+ export const BYO_PREFS_KEY = 'smrt-planner:inference:v1';
5
+ /** The keys, apart from the choices so nothing that copies prefs copies a key. */
6
+ export const BYO_KEYS_KEY = 'smrt-planner:inference-key:v1';
7
+ const isObject = (v) => !!v && typeof v === 'object' && !Array.isArray(v);
8
+ export function loadByoPrefs(storage) {
9
+ const prefs = { preset: '', active: false, entries: {} };
10
+ try {
11
+ const raw = storage?.getItem(BYO_PREFS_KEY);
12
+ if (!raw)
13
+ return prefs;
14
+ const value = JSON.parse(raw);
15
+ if (!isObject(value))
16
+ return prefs;
17
+ if (typeof value.preset === 'string')
18
+ prefs.preset = value.preset;
19
+ prefs.active = value.active === true;
20
+ if (isObject(value.entries)) {
21
+ for (const [id, entry] of Object.entries(value.entries)) {
22
+ if (isObject(entry) &&
23
+ typeof entry.baseUrl === 'string' &&
24
+ typeof entry.model === 'string') {
25
+ prefs.entries[id] = { baseUrl: entry.baseUrl, model: entry.model };
26
+ }
27
+ }
28
+ }
29
+ }
30
+ catch {
31
+ // Unreadable or unavailable: start empty.
32
+ }
33
+ return prefs;
34
+ }
35
+ export function loadByoKeys(storage) {
36
+ const keys = {};
37
+ try {
38
+ const raw = storage?.getItem(BYO_KEYS_KEY);
39
+ const value = raw ? JSON.parse(raw) : null;
40
+ if (isObject(value)) {
41
+ for (const [id, entry] of Object.entries(value)) {
42
+ // A key with no origin (the format before keys were bound to one) is
43
+ // not trusted with any address: it is dropped.
44
+ if (isObject(entry) &&
45
+ typeof entry.key === 'string' &&
46
+ entry.key &&
47
+ typeof entry.origin === 'string' &&
48
+ entry.origin) {
49
+ keys[id] = { origin: entry.origin, key: entry.key };
50
+ }
51
+ }
52
+ }
53
+ }
54
+ catch {
55
+ // Unreadable or unavailable: no keys.
56
+ }
57
+ return keys;
58
+ }
59
+ /**
60
+ * The visitor's own OpenAI-compatible endpoint: the preset they picked, its
61
+ * address, model and key, a connection test, and whether the assistant uses
62
+ * it. The key lives only in this browser's localStorage and is only ever sent
63
+ * as the Authorization header to the chosen address.
64
+ */
65
+ export class ByoModel {
66
+ presets;
67
+ presetId = $state('');
68
+ entries = $state({});
69
+ keys = $state({});
70
+ active = $state(false);
71
+ testStatus = $state('idle');
72
+ testMessage = $state('');
73
+ options;
74
+ constructor(options) {
75
+ this.options = options;
76
+ this.presets = resolvePresets(options.presets);
77
+ const prefs = loadByoPrefs(options.storage);
78
+ this.keys = loadByoKeys(options.storage);
79
+ this.entries = prefs.entries;
80
+ this.presetId = this.presets.some((p) => p.id === prefs.preset)
81
+ ? prefs.preset
82
+ : (this.presets[0]?.id ?? '');
83
+ this.active = prefs.active && this.complete;
84
+ }
85
+ get preset() {
86
+ return this.presets.find((p) => p.id === this.presetId);
87
+ }
88
+ get baseUrl() {
89
+ return this.entries[this.presetId]?.baseUrl ?? this.preset?.baseUrl ?? '';
90
+ }
91
+ get model() {
92
+ return this.entries[this.presetId]?.model ?? this.preset?.model ?? '';
93
+ }
94
+ /**
95
+ * The saved key, only while the address is the origin it was entered for:
96
+ * changing the address (or a config that reuses a preset id for another
97
+ * address) never sends the key somewhere new.
98
+ */
99
+ get key() {
100
+ const saved = this.keys[this.presetId];
101
+ return saved && saved.origin === originOf(this.baseUrl) ? saved.key : '';
102
+ }
103
+ /** A key is saved for this preset, but for another address. */
104
+ get keyForOtherAddress() {
105
+ const saved = this.keys[this.presetId];
106
+ return !!saved && saved.origin !== originOf(this.baseUrl);
107
+ }
108
+ /** Address valid, model named, and a key where the preset needs one (sendable there). */
109
+ get complete() {
110
+ const base = normalizeBaseUrl(this.baseUrl);
111
+ return (!!base &&
112
+ !!this.model.trim() &&
113
+ (!!this.preset?.keyless || (!!this.key.trim() && keyMaySendTo(base))));
114
+ }
115
+ select(id) {
116
+ if (!this.presets.some((p) => p.id === id))
117
+ return;
118
+ this.presetId = id;
119
+ this.resetTest();
120
+ this.save();
121
+ }
122
+ setBaseUrl(baseUrl) {
123
+ this.entries = {
124
+ ...this.entries,
125
+ [this.presetId]: { baseUrl, model: this.model },
126
+ };
127
+ this.edited();
128
+ }
129
+ setModel(model) {
130
+ this.entries = {
131
+ ...this.entries,
132
+ [this.presetId]: { baseUrl: this.baseUrl, model },
133
+ };
134
+ this.edited();
135
+ }
136
+ setKey(key) {
137
+ const origin = originOf(this.baseUrl);
138
+ const clean = key.trim();
139
+ if (!clean || !origin) {
140
+ this.forgetKey();
141
+ return;
142
+ }
143
+ this.keys = { ...this.keys, [this.presetId]: { origin, key: clean } };
144
+ this.edited();
145
+ }
146
+ /** Remove the saved key for the selected preset. */
147
+ forgetKey() {
148
+ const { [this.presetId]: _gone, ...rest } = this.keys;
149
+ this.keys = rest;
150
+ this.edited();
151
+ }
152
+ /** The chat model for what is entered, or null while it is incomplete. */
153
+ chat() {
154
+ if (!this.complete)
155
+ return null;
156
+ const baseUrl = normalizeBaseUrl(this.baseUrl);
157
+ if (!baseUrl)
158
+ return null;
159
+ return createOpenAIChat({
160
+ baseUrl,
161
+ model: this.model.trim(),
162
+ apiKey: this.preset?.keyless ? undefined : this.key,
163
+ fetch: this.options.fetch,
164
+ });
165
+ }
166
+ async test() {
167
+ const baseUrl = normalizeBaseUrl(this.baseUrl);
168
+ if (!baseUrl || !this.model.trim()) {
169
+ this.testStatus = 'failed';
170
+ this.testMessage = 'Enter an http(s) address and a model first.';
171
+ return { ok: false, message: this.testMessage };
172
+ }
173
+ if (!this.preset?.keyless && !this.key.trim()) {
174
+ this.testStatus = 'failed';
175
+ this.testMessage = this.keyForOtherAddress
176
+ ? 'The saved key was entered for another address. Enter it again for this one.'
177
+ : 'Enter a key first.';
178
+ return { ok: false, message: this.testMessage };
179
+ }
180
+ if (!this.preset?.keyless && !keyMaySendTo(baseUrl)) {
181
+ this.testStatus = 'failed';
182
+ this.testMessage =
183
+ 'A key is only sent over https, or to this computer. Use an https address.';
184
+ return { ok: false, message: this.testMessage };
185
+ }
186
+ this.testStatus = 'testing';
187
+ this.testMessage = '';
188
+ const result = await testConnection({
189
+ baseUrl,
190
+ model: this.model.trim(),
191
+ apiKey: this.preset?.keyless ? undefined : this.key,
192
+ fetch: this.options.fetch,
193
+ });
194
+ this.testStatus = result.ok ? 'ok' : 'failed';
195
+ this.testMessage = result.message;
196
+ return result;
197
+ }
198
+ /** Make the assistant use this endpoint. */
199
+ use() {
200
+ if (!this.complete)
201
+ return false;
202
+ this.active = true;
203
+ this.save();
204
+ this.options.onChange?.();
205
+ return true;
206
+ }
207
+ /** Stop using it; the entered values stay. */
208
+ stop() {
209
+ this.active = false;
210
+ this.save();
211
+ this.options.onChange?.();
212
+ }
213
+ resetTest() {
214
+ this.testStatus = 'idle';
215
+ this.testMessage = '';
216
+ }
217
+ /** An edit invalidates the last test and, if in use, what is in use. */
218
+ edited() {
219
+ this.resetTest();
220
+ const wasActive = this.active;
221
+ if (wasActive && !this.complete)
222
+ this.active = false;
223
+ this.save();
224
+ if (wasActive)
225
+ this.options.onChange?.();
226
+ }
227
+ save() {
228
+ try {
229
+ const prefs = {
230
+ preset: this.presetId,
231
+ active: this.active,
232
+ entries: { ...this.entries },
233
+ };
234
+ this.options.storage?.setItem(BYO_PREFS_KEY, JSON.stringify(prefs));
235
+ this.options.storage?.setItem(BYO_KEYS_KEY, JSON.stringify(this.keys));
236
+ }
237
+ catch {
238
+ // Not saved; the choice still holds for this visit.
239
+ }
240
+ }
241
+ }
242
+ /**
243
+ * The chat model for the endpoint a visitor already connected in this browser
244
+ * (a mounted `Planner` in byo mode has no AI page of its own). Null when none
245
+ * is connected or what was saved is incomplete.
246
+ */
247
+ export function savedByoChat(storage, presets, fetcher) {
248
+ const prefs = loadByoPrefs(storage);
249
+ if (!prefs.active)
250
+ return null;
251
+ const preset = resolvePresets(presets).find((p) => p.id === prefs.preset);
252
+ const entry = prefs.entries[prefs.preset];
253
+ const baseUrl = normalizeBaseUrl(entry?.baseUrl ?? preset?.baseUrl ?? '');
254
+ const model = (entry?.model ?? preset?.model ?? '').trim();
255
+ const saved = loadByoKeys(storage)[prefs.preset];
256
+ const key = saved && saved.origin === originOf(baseUrl ?? '') ? saved.key : '';
257
+ if (!preset || !baseUrl || !model)
258
+ return null;
259
+ if (!preset.keyless && (!key || !keyMaySendTo(baseUrl)))
260
+ return null;
261
+ return createOpenAIChat({
262
+ baseUrl,
263
+ model,
264
+ apiKey: preset.keyless ? undefined : key,
265
+ fetch: fetcher,
266
+ });
267
+ }