@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,295 @@
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
+ let sanitized = false;
21
+ if (isObject(value.entries)) {
22
+ for (const [id, entry] of Object.entries(value.entries)) {
23
+ if (isObject(entry) &&
24
+ typeof entry.baseUrl === 'string' &&
25
+ typeof entry.model === 'string') {
26
+ const baseUrl = normalizeBaseUrl(entry.baseUrl) ?? '';
27
+ sanitized ||= baseUrl !== entry.baseUrl;
28
+ prefs.entries[id] = { baseUrl, model: entry.model };
29
+ }
30
+ }
31
+ }
32
+ if (sanitized) {
33
+ prefs.active = false;
34
+ storage?.setItem(BYO_PREFS_KEY, JSON.stringify(prefs));
35
+ }
36
+ }
37
+ catch {
38
+ // Unreadable or unavailable: start empty.
39
+ }
40
+ return prefs;
41
+ }
42
+ export function loadByoKeys(storage) {
43
+ const keys = {};
44
+ try {
45
+ const raw = storage?.getItem(BYO_KEYS_KEY);
46
+ const value = raw ? JSON.parse(raw) : null;
47
+ if (isObject(value)) {
48
+ for (const [id, entry] of Object.entries(value)) {
49
+ // A key with no origin (the format before keys were bound to one) is
50
+ // not trusted with any address: it is dropped.
51
+ if (isObject(entry) &&
52
+ typeof entry.key === 'string' &&
53
+ entry.key &&
54
+ typeof entry.origin === 'string' &&
55
+ entry.origin) {
56
+ keys[id] = { origin: entry.origin, key: entry.key };
57
+ }
58
+ }
59
+ }
60
+ }
61
+ catch {
62
+ // Unreadable or unavailable: no keys.
63
+ }
64
+ return keys;
65
+ }
66
+ /**
67
+ * The visitor's own OpenAI-compatible endpoint: the preset they picked, its
68
+ * address, model and key, a connection test, and whether the assistant uses
69
+ * it. The key lives in the configured credential store (tab memory for hosted
70
+ * policies, localStorage for the compatible standalone default) and is only
71
+ * ever sent as the Authorization header to the chosen address.
72
+ */
73
+ export class ByoModel {
74
+ presets;
75
+ presetId = $state('');
76
+ entries = $state({});
77
+ keys = $state({});
78
+ active = $state(false);
79
+ testStatus = $state('idle');
80
+ testMessage = $state('');
81
+ options;
82
+ credentialStorage;
83
+ constructor(options) {
84
+ this.options = options;
85
+ this.credentialStorage =
86
+ options.credentialPersistence === 'memory' ? null : options.storage;
87
+ if (options.credentialPersistence === 'memory') {
88
+ // A hosted memory-only policy also removes a key an older local policy
89
+ // may have left on this origin. Endpoint/model preferences stay put.
90
+ try {
91
+ options.storage?.removeItem(BYO_KEYS_KEY);
92
+ }
93
+ catch {
94
+ // Storage can be unavailable; memory-only behavior still holds.
95
+ }
96
+ }
97
+ this.presets = resolvePresets(options.presets);
98
+ const prefs = loadByoPrefs(options.storage);
99
+ this.keys = loadByoKeys(this.credentialStorage);
100
+ this.entries = prefs.entries;
101
+ this.presetId = this.presets.some((p) => p.id === prefs.preset)
102
+ ? prefs.preset
103
+ : (this.presets[0]?.id ?? '');
104
+ this.active = prefs.active && this.complete;
105
+ }
106
+ get preset() {
107
+ return this.presets.find((p) => p.id === this.presetId);
108
+ }
109
+ get baseUrl() {
110
+ return this.entries[this.presetId]?.baseUrl ?? this.preset?.baseUrl ?? '';
111
+ }
112
+ get model() {
113
+ return this.entries[this.presetId]?.model ?? this.preset?.model ?? '';
114
+ }
115
+ /**
116
+ * The saved key, only while the address is the origin it was entered for:
117
+ * changing the address (or a config that reuses a preset id for another
118
+ * address) never sends the key somewhere new.
119
+ */
120
+ get key() {
121
+ const saved = this.keys[this.presetId];
122
+ return saved && saved.origin === originOf(this.baseUrl) ? saved.key : '';
123
+ }
124
+ /** A key is saved for this preset, but for another address. */
125
+ get keyForOtherAddress() {
126
+ const saved = this.keys[this.presetId];
127
+ return !!saved && saved.origin !== originOf(this.baseUrl);
128
+ }
129
+ /** Address valid, model named, and a key where the preset needs one (sendable there). */
130
+ get complete() {
131
+ const base = normalizeBaseUrl(this.baseUrl);
132
+ return (!!base &&
133
+ !!this.model.trim() &&
134
+ (!!this.preset?.keyless || (!!this.key.trim() && keyMaySendTo(base))));
135
+ }
136
+ select(id) {
137
+ if (!this.presets.some((p) => p.id === id))
138
+ return;
139
+ this.presetId = id;
140
+ this.resetTest();
141
+ this.save();
142
+ }
143
+ setBaseUrl(baseUrl) {
144
+ this.entries = {
145
+ ...this.entries,
146
+ [this.presetId]: { baseUrl, model: this.model },
147
+ };
148
+ this.edited();
149
+ }
150
+ setModel(model) {
151
+ this.entries = {
152
+ ...this.entries,
153
+ [this.presetId]: { baseUrl: this.baseUrl, model },
154
+ };
155
+ this.edited();
156
+ }
157
+ setKey(key) {
158
+ const origin = originOf(this.baseUrl);
159
+ const clean = key.trim();
160
+ if (!clean || !origin) {
161
+ this.forgetKey();
162
+ return;
163
+ }
164
+ this.keys = { ...this.keys, [this.presetId]: { origin, key: clean } };
165
+ this.edited();
166
+ }
167
+ /** Remove the saved key for the selected preset. */
168
+ forgetKey() {
169
+ const { [this.presetId]: _gone, ...rest } = this.keys;
170
+ this.keys = rest;
171
+ this.edited();
172
+ }
173
+ /** The chat model for what is entered, or null while it is incomplete. */
174
+ chat() {
175
+ if (!this.complete)
176
+ return null;
177
+ const baseUrl = normalizeBaseUrl(this.baseUrl);
178
+ if (!baseUrl)
179
+ return null;
180
+ return createOpenAIChat({
181
+ baseUrl,
182
+ model: this.model.trim(),
183
+ apiKey: this.preset?.keyless ? undefined : this.key,
184
+ fetch: this.options.fetch,
185
+ });
186
+ }
187
+ async test() {
188
+ const baseUrl = normalizeBaseUrl(this.baseUrl);
189
+ if (!baseUrl || !this.model.trim()) {
190
+ this.testStatus = 'failed';
191
+ this.testMessage = 'Enter an http(s) address and a model first.';
192
+ return { ok: false, message: this.testMessage };
193
+ }
194
+ if (!this.preset?.keyless && !this.key.trim()) {
195
+ this.testStatus = 'failed';
196
+ this.testMessage = this.keyForOtherAddress
197
+ ? 'The saved key was entered for another address. Enter it again for this one.'
198
+ : 'Enter a key first.';
199
+ return { ok: false, message: this.testMessage };
200
+ }
201
+ if (!this.preset?.keyless && !keyMaySendTo(baseUrl)) {
202
+ this.testStatus = 'failed';
203
+ this.testMessage =
204
+ 'A key is only sent over https, or to this computer. Use an https address.';
205
+ return { ok: false, message: this.testMessage };
206
+ }
207
+ this.testStatus = 'testing';
208
+ this.testMessage = '';
209
+ const result = await testConnection({
210
+ baseUrl,
211
+ model: this.model.trim(),
212
+ apiKey: this.preset?.keyless ? undefined : this.key,
213
+ fetch: this.options.fetch,
214
+ });
215
+ this.testStatus = result.ok ? 'ok' : 'failed';
216
+ this.testMessage = result.message;
217
+ return result;
218
+ }
219
+ /** Make the assistant use this endpoint. */
220
+ use() {
221
+ if (!this.complete)
222
+ return false;
223
+ this.active = true;
224
+ this.save();
225
+ this.options.onChange?.();
226
+ return true;
227
+ }
228
+ /** Stop using it; the entered values stay. */
229
+ stop() {
230
+ this.active = false;
231
+ this.save();
232
+ this.options.onChange?.();
233
+ }
234
+ resetTest() {
235
+ this.testStatus = 'idle';
236
+ this.testMessage = '';
237
+ }
238
+ /** An edit invalidates the last test and, if in use, what is in use. */
239
+ edited() {
240
+ this.resetTest();
241
+ const wasActive = this.active;
242
+ if (wasActive && !this.complete)
243
+ this.active = false;
244
+ this.save();
245
+ if (wasActive)
246
+ this.options.onChange?.();
247
+ }
248
+ save() {
249
+ try {
250
+ const entries = Object.fromEntries(Object.entries(this.entries).map(([id, entry]) => [
251
+ id,
252
+ {
253
+ baseUrl: normalizeBaseUrl(entry.baseUrl) ?? '',
254
+ model: entry.model,
255
+ },
256
+ ]));
257
+ const prefs = {
258
+ preset: this.presetId,
259
+ active: this.active,
260
+ entries,
261
+ };
262
+ this.options.storage?.setItem(BYO_PREFS_KEY, JSON.stringify(prefs));
263
+ this.credentialStorage?.setItem(BYO_KEYS_KEY, JSON.stringify(this.keys));
264
+ }
265
+ catch {
266
+ // Not saved; the choice still holds for this visit.
267
+ }
268
+ }
269
+ }
270
+ /**
271
+ * The chat model for the endpoint a visitor already connected in this browser
272
+ * (a mounted `Planner` in byo mode has no AI page of its own). Null when none
273
+ * is connected or what was saved is incomplete.
274
+ */
275
+ export function savedByoChat(storage, presets, fetcher, credentialPersistence = 'local') {
276
+ const prefs = loadByoPrefs(storage);
277
+ if (!prefs.active)
278
+ return null;
279
+ const preset = resolvePresets(presets).find((p) => p.id === prefs.preset);
280
+ const entry = prefs.entries[prefs.preset];
281
+ const baseUrl = normalizeBaseUrl(entry?.baseUrl ?? preset?.baseUrl ?? '');
282
+ const model = (entry?.model ?? preset?.model ?? '').trim();
283
+ const saved = loadByoKeys(credentialPersistence === 'memory' ? null : storage)[prefs.preset];
284
+ const key = saved && saved.origin === originOf(baseUrl ?? '') ? saved.key : '';
285
+ if (!preset || !baseUrl || !model)
286
+ return null;
287
+ if (!preset.keyless && (!key || !keyMaySendTo(baseUrl)))
288
+ return null;
289
+ return createOpenAIChat({
290
+ baseUrl,
291
+ model,
292
+ apiKey: preset.keyless ? undefined : key,
293
+ fetch: fetcher,
294
+ });
295
+ }
@@ -0,0 +1,77 @@
1
+ import { type KitchenEndpoint } from '../kitchen/client.ts';
2
+ /**
3
+ * Where the assistant's language model runs, chosen at runtime by
4
+ * `planner.config.json` (served next to the app, like a host page's own
5
+ * config file) or by a mounted `Planner`'s `inference` prop, which wins.
6
+ *
7
+ * - `browser`: a small model on this device (WebLLM). The default.
8
+ * - `host`: the host page's server endpoint; the server owns the prompt.
9
+ * - `byo`: the visitor's own OpenAI-compatible endpoint (Ollama, OpenRouter,
10
+ * OpenAI, custom), configured on the AI page.
11
+ */
12
+ export type InferenceMode = 'manual' | 'browser' | 'host' | 'byo';
13
+ /** Where BYO provider credentials may live. Preferences are always separate. */
14
+ export type CredentialPersistence = 'local' | 'memory';
15
+ export declare const INFERENCE_MODES: readonly InferenceMode[];
16
+ /** A bring-your-own endpoint the AI page offers. */
17
+ export interface ByoPresetDefinition {
18
+ id: string;
19
+ label: string;
20
+ /** OpenAI-compatible base, e.g. `http://localhost:11434/v1`; `/chat/completions` is appended. */
21
+ baseUrl: string;
22
+ /** A model to suggest. */
23
+ model?: string;
24
+ /** The visitor types the base URL themselves. */
25
+ customUrl?: boolean;
26
+ /** No key is needed (a local server). */
27
+ keyless?: boolean;
28
+ /** Browser-access note shown with the preset. */
29
+ cors?: string;
30
+ }
31
+ export interface InferenceConfig {
32
+ mode: InferenceMode;
33
+ /** Other modes the visitor may deliberately select, in display order. */
34
+ alternatives?: InferenceMode[];
35
+ /** Defaults to `local` for compatibility. Hosted apps should use `memory`. */
36
+ credentialPersistence?: CredentialPersistence;
37
+ host?: {
38
+ endpoint: string;
39
+ };
40
+ byo?: {
41
+ /**
42
+ * Which presets to offer: ids of the built-in ones (`ollama`,
43
+ * `openrouter`, `openai`, `custom`) or full definitions. Default: all
44
+ * built-in presets.
45
+ */
46
+ presets?: (string | ByoPresetDefinition)[];
47
+ };
48
+ }
49
+ export declare const DEFAULT_INFERENCE: InferenceConfig;
50
+ export declare const MANUAL_INFERENCE: InferenceConfig;
51
+ /** The file name, served at `${base}/planner.config.json`. */
52
+ export declare const CONFIG_FILE = "planner.config.json";
53
+ export interface ConfigResult {
54
+ config: InferenceConfig;
55
+ /** The `kitchen` block (`smrt kitchen`), when the file has a usable one. */
56
+ kitchen?: KitchenEndpoint;
57
+ /** Shown when a present config was unusable and inference was disabled. */
58
+ notice?: string;
59
+ }
60
+ /** http(s) only; a path-only endpoint (`/api/planner/chat`) is the host's own origin. */
61
+ export declare function isUsableEndpoint(value: unknown): value is string;
62
+ /**
63
+ * Validate a parsed config. A missing config keeps the standalone browser
64
+ * default. A present but invalid config fails closed to manual planning with a
65
+ * visible notice; it never selects a provider or downloads a model.
66
+ */
67
+ export declare function validateInferenceConfig(value: unknown): ConfigResult;
68
+ /** Parse the file's text. */
69
+ export declare function parseInferenceConfig(text: string): ConfigResult;
70
+ /** The mounted component's prop, validated like the file. Invalid: browser plus a notice. */
71
+ export declare function configFromProp(prop: unknown): ConfigResult;
72
+ /**
73
+ * Fetch `${base}/planner.config.json`. A missing file (404, network error)
74
+ * means the defaults and no notice; a file that is there but unusable means
75
+ * `browser` and a notice.
76
+ */
77
+ export declare function loadInferenceConfig(base?: string, fetcher?: typeof fetch): Promise<ConfigResult>;
@@ -0,0 +1,205 @@
1
+ import { parseKitchenConfig } from "../kitchen/client.js";
2
+ export const INFERENCE_MODES = [
3
+ 'manual',
4
+ 'browser',
5
+ 'host',
6
+ 'byo',
7
+ ];
8
+ export const DEFAULT_INFERENCE = { mode: 'browser' };
9
+ export const MANUAL_INFERENCE = { mode: 'manual' };
10
+ /** The file name, served at `${base}/planner.config.json`. */
11
+ export const CONFIG_FILE = 'planner.config.json';
12
+ const isObject = (v) => !!v && typeof v === 'object' && !Array.isArray(v);
13
+ /** http(s) only; a path-only endpoint (`/api/planner/chat`) is the host's own origin. */
14
+ export function isUsableEndpoint(value) {
15
+ if (typeof value !== 'string')
16
+ return false;
17
+ const text = value.trim();
18
+ if (!text)
19
+ return false;
20
+ try {
21
+ const relative = text.startsWith('/') && !text.startsWith('//');
22
+ const url = new URL(text, relative ? 'https://planner.invalid' : undefined);
23
+ if (!relative && url.protocol !== 'http:' && url.protocol !== 'https:') {
24
+ return false;
25
+ }
26
+ if (url.username || url.password)
27
+ return false;
28
+ if (url.hash)
29
+ return false;
30
+ for (const name of url.searchParams.keys()) {
31
+ if (/^(?:api[-_]?key|key|token|authorization|secret|password)$/i.test(name)) {
32
+ return false;
33
+ }
34
+ }
35
+ return true;
36
+ }
37
+ catch {
38
+ return false;
39
+ }
40
+ }
41
+ function parsePresetDefinition(value) {
42
+ if (!isObject(value))
43
+ return null;
44
+ const { id, label, baseUrl, model, keyless, cors } = value;
45
+ if (typeof id !== 'string' || !/^[a-z0-9][a-z0-9-]{0,31}$/.test(id)) {
46
+ return null;
47
+ }
48
+ if (typeof label !== 'string' || !label.trim())
49
+ return null;
50
+ if (!isUsableEndpoint(baseUrl) || baseUrl.startsWith('/'))
51
+ return null;
52
+ return {
53
+ id,
54
+ label: label.trim(),
55
+ baseUrl: baseUrl.trim(),
56
+ ...(typeof model === 'string' && model.trim()
57
+ ? { model: model.trim() }
58
+ : {}),
59
+ ...(keyless === true ? { keyless: true } : {}),
60
+ ...(typeof cors === 'string' && cors.trim() ? { cors: cors.trim() } : {}),
61
+ };
62
+ }
63
+ const fallback = (why) => ({
64
+ config: MANUAL_INFERENCE,
65
+ notice: `The assistant settings could not be used (${why}), so inference is off. The planner still works manually.`,
66
+ });
67
+ function parseAlternatives(value, initial) {
68
+ if (value === undefined)
69
+ return [];
70
+ if (!Array.isArray(value) || value.length === 0)
71
+ return null;
72
+ const modes = [];
73
+ for (const entry of value) {
74
+ if (typeof entry !== 'string' ||
75
+ !INFERENCE_MODES.includes(entry) ||
76
+ entry === initial ||
77
+ modes.includes(entry)) {
78
+ return null;
79
+ }
80
+ modes.push(entry);
81
+ }
82
+ return modes;
83
+ }
84
+ function parseByo(value) {
85
+ if (value === undefined)
86
+ return {};
87
+ if (!isObject(value))
88
+ return null;
89
+ if (value.presets === undefined)
90
+ return {};
91
+ if (!Array.isArray(value.presets) || value.presets.length === 0)
92
+ return null;
93
+ const presets = [];
94
+ for (const entry of value.presets) {
95
+ if (typeof entry === 'string' && entry.trim()) {
96
+ presets.push(entry.trim());
97
+ continue;
98
+ }
99
+ const definition = parsePresetDefinition(entry);
100
+ if (!definition)
101
+ return null;
102
+ presets.push(definition);
103
+ }
104
+ return { presets };
105
+ }
106
+ /**
107
+ * Validate a parsed config. A missing config keeps the standalone browser
108
+ * default. A present but invalid config fails closed to manual planning with a
109
+ * visible notice; it never selects a provider or downloads a model.
110
+ */
111
+ export function validateInferenceConfig(value) {
112
+ if (!isObject(value))
113
+ return fallback('not an object');
114
+ const inference = value.inference;
115
+ if (inference === undefined)
116
+ return { config: DEFAULT_INFERENCE };
117
+ if (!isObject(inference))
118
+ return fallback('"inference" is not an object');
119
+ const mode = inference.mode;
120
+ if (mode === undefined)
121
+ return { config: DEFAULT_INFERENCE };
122
+ if (!INFERENCE_MODES.includes(mode)) {
123
+ return fallback(`unknown mode "${String(mode)}"`);
124
+ }
125
+ const selected = mode;
126
+ const alternatives = parseAlternatives(inference.alternatives, selected);
127
+ if (!alternatives) {
128
+ return fallback('alternatives must be unique supported modes other than mode');
129
+ }
130
+ const credentialPersistence = inference.credentialPersistence;
131
+ if (credentialPersistence !== undefined &&
132
+ credentialPersistence !== 'local' &&
133
+ credentialPersistence !== 'memory') {
134
+ return fallback('credentialPersistence must be "local" or "memory"');
135
+ }
136
+ const modes = [selected, ...alternatives];
137
+ let host;
138
+ if (modes.includes('host')) {
139
+ const configuredHost = inference.host;
140
+ if (!isObject(configuredHost) ||
141
+ !isUsableEndpoint(configuredHost.endpoint)) {
142
+ return fallback('host mode needs host.endpoint, an http(s) URL or path');
143
+ }
144
+ host = { endpoint: configuredHost.endpoint.trim() };
145
+ }
146
+ let byo;
147
+ if (modes.includes('byo')) {
148
+ byo = parseByo(inference.byo) ?? undefined;
149
+ if (!byo)
150
+ return fallback('byo.presets must be a non-empty valid list');
151
+ }
152
+ return {
153
+ config: {
154
+ mode: selected,
155
+ ...(alternatives.length ? { alternatives } : {}),
156
+ ...(credentialPersistence ? { credentialPersistence } : {}),
157
+ ...(host ? { host } : {}),
158
+ ...(byo ? { byo } : {}),
159
+ },
160
+ };
161
+ }
162
+ /** Parse the file's text. */
163
+ export function parseInferenceConfig(text) {
164
+ try {
165
+ const value = JSON.parse(text);
166
+ const result = validateInferenceConfig(value);
167
+ const kitchen = isObject(value)
168
+ ? parseKitchenConfig(value.kitchen)
169
+ : undefined;
170
+ return kitchen ? { ...result, kitchen } : result;
171
+ }
172
+ catch {
173
+ return fallback('it is not valid JSON');
174
+ }
175
+ }
176
+ /** The mounted component's prop, validated like the file. Invalid: browser plus a notice. */
177
+ export function configFromProp(prop) {
178
+ return validateInferenceConfig({ inference: prop });
179
+ }
180
+ /**
181
+ * Fetch `${base}/planner.config.json`. A missing file (404, network error)
182
+ * means the defaults and no notice; a file that is there but unusable means
183
+ * `browser` and a notice.
184
+ */
185
+ export async function loadInferenceConfig(base = '', fetcher = fetch) {
186
+ let response;
187
+ try {
188
+ response = await fetcher(`${base.replace(/\/$/, '')}/${CONFIG_FILE}`, {
189
+ headers: { accept: 'application/json' },
190
+ cache: 'no-cache',
191
+ });
192
+ }
193
+ catch {
194
+ return { config: DEFAULT_INFERENCE };
195
+ }
196
+ if (response.status === 404)
197
+ return { config: DEFAULT_INFERENCE };
198
+ if (!response.ok)
199
+ return fallback(`the file answered ${response.status}`);
200
+ const text = await response.text();
201
+ // A static host with a SPA fallback answers a missing file with HTML.
202
+ if (/^\s*</.test(text))
203
+ return { config: DEFAULT_INFERENCE };
204
+ return parseInferenceConfig(text);
205
+ }
@@ -0,0 +1,40 @@
1
+ import type { ChatModel } from '../assistant/transport.ts';
2
+ import type { PlanSnapshot } from '../planner/commands/types.ts';
3
+ /** Wire contract version; see `docs/inference-host.md`. */
4
+ export declare const HOST_WIRE_VERSION = 1;
5
+ /** Recent turns sent along (the transport already keeps six). */
6
+ export declare const HOST_HISTORY_TURNS = 6;
7
+ /** Longest history entry sent; the rest is cut. */
8
+ export declare const HOST_HISTORY_CHARS = 1000;
9
+ /** Longest message sent. */
10
+ export declare const HOST_MESSAGE_CHARS = 2000;
11
+ /** What the planner POSTs to the host endpoint. */
12
+ export interface HostRequest {
13
+ version: typeof HOST_WIRE_VERSION;
14
+ /** The visitor's text, and nothing else of the prompt. */
15
+ message: string;
16
+ /** The compact plan snapshot from the controller. */
17
+ snapshot: PlanSnapshot;
18
+ /** Bounded recent turns, oldest first. Never a system message. */
19
+ history?: {
20
+ role: 'user' | 'assistant';
21
+ content: string;
22
+ }[];
23
+ }
24
+ export interface HostChatOptions {
25
+ /** `http(s)://…` or a path on the page's own origin. */
26
+ endpoint: string;
27
+ /** The plan as it is now, read per turn. */
28
+ snapshot: () => PlanSnapshot;
29
+ fetch?: typeof fetch;
30
+ /** Extra request headers a host wants (a CSRF token, say). */
31
+ headers?: () => Record<string, string>;
32
+ }
33
+ /**
34
+ * A `ChatModel` that asks the host's server. The server owns the prompt: only
35
+ * the visitor's text, the compact snapshot and bounded recent turns leave the
36
+ * page. The system prompt the transport builds for local models is dropped,
37
+ * as is the response schema; the server answers with the same action JSON
38
+ * the assistant reads from a model (see `docs/inference-host.md`).
39
+ */
40
+ export declare function createHostChat(options: HostChatOptions): ChatModel;
@@ -0,0 +1,57 @@
1
+ /** Wire contract version; see `docs/inference-host.md`. */
2
+ export const HOST_WIRE_VERSION = 1;
3
+ /** Recent turns sent along (the transport already keeps six). */
4
+ export const HOST_HISTORY_TURNS = 6;
5
+ /** Longest history entry sent; the rest is cut. */
6
+ export const HOST_HISTORY_CHARS = 1000;
7
+ /** Longest message sent. */
8
+ export const HOST_MESSAGE_CHARS = 2000;
9
+ const REQUEST_TIMEOUT_MS = 60_000;
10
+ const clip = (text, max) => text.length > max ? text.slice(0, max) : text;
11
+ /**
12
+ * A `ChatModel` that asks the host's server. The server owns the prompt: only
13
+ * the visitor's text, the compact snapshot and bounded recent turns leave the
14
+ * page. The system prompt the transport builds for local models is dropped,
15
+ * as is the response schema; the server answers with the same action JSON
16
+ * the assistant reads from a model (see `docs/inference-host.md`).
17
+ */
18
+ export function createHostChat(options) {
19
+ const doFetch = options.fetch ?? fetch;
20
+ return {
21
+ async message(text, callOptions) {
22
+ const history = (callOptions?.history ?? [])
23
+ .filter((turn) => turn.role === 'user' || turn.role === 'assistant')
24
+ .slice(-HOST_HISTORY_TURNS)
25
+ .map((turn) => ({
26
+ role: turn.role,
27
+ content: clip(turn.content, HOST_HISTORY_CHARS),
28
+ }));
29
+ const body = {
30
+ version: HOST_WIRE_VERSION,
31
+ message: clip(text, HOST_MESSAGE_CHARS),
32
+ snapshot: options.snapshot(),
33
+ ...(history.length ? { history } : {}),
34
+ };
35
+ const timeout = AbortSignal.timeout(REQUEST_TIMEOUT_MS);
36
+ const signal = callOptions?.signal
37
+ ? AbortSignal.any([callOptions.signal, timeout])
38
+ : timeout;
39
+ const response = await doFetch(options.endpoint, {
40
+ method: 'POST',
41
+ headers: {
42
+ 'content-type': 'application/json',
43
+ accept: 'application/json',
44
+ ...options.headers?.(),
45
+ },
46
+ body: JSON.stringify(body),
47
+ signal,
48
+ });
49
+ if (!response.ok) {
50
+ throw new Error(`the server answered ${response.status}`);
51
+ }
52
+ const reply = await response.text();
53
+ // The body is the action object. Plain text is read as the reply itself.
54
+ return reply;
55
+ },
56
+ };
57
+ }