@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,70 @@
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 = 'browser' | 'host' | 'byo';
13
+ export declare const INFERENCE_MODES: readonly InferenceMode[];
14
+ /** A bring-your-own endpoint the AI page offers. */
15
+ export interface ByoPresetDefinition {
16
+ id: string;
17
+ label: string;
18
+ /** OpenAI-compatible base, e.g. `http://localhost:11434/v1`; `/chat/completions` is appended. */
19
+ baseUrl: string;
20
+ /** A model to suggest. */
21
+ model?: string;
22
+ /** The visitor types the base URL themselves. */
23
+ customUrl?: boolean;
24
+ /** No key is needed (a local server). */
25
+ keyless?: boolean;
26
+ /** Browser-access note shown with the preset. */
27
+ cors?: string;
28
+ }
29
+ export interface InferenceConfig {
30
+ mode: InferenceMode;
31
+ host?: {
32
+ endpoint: string;
33
+ };
34
+ byo?: {
35
+ /**
36
+ * Which presets to offer: ids of the built-in ones (`ollama`,
37
+ * `openrouter`, `openai`, `custom`) or full definitions. Default: all
38
+ * built-in presets.
39
+ */
40
+ presets?: (string | ByoPresetDefinition)[];
41
+ };
42
+ }
43
+ export declare const DEFAULT_INFERENCE: InferenceConfig;
44
+ /** The file name, served at `${base}/planner.config.json`. */
45
+ export declare const CONFIG_FILE = "planner.config.json";
46
+ export interface ConfigResult {
47
+ config: InferenceConfig;
48
+ /** The `kitchen` block (`smrt kitchen`), when the file has a usable one. */
49
+ kitchen?: KitchenEndpoint;
50
+ /** Shown to the visitor when the config was unusable and `browser` is used instead. */
51
+ notice?: string;
52
+ }
53
+ /** http(s) only; a path-only endpoint (`/api/planner/chat`) is the host's own origin. */
54
+ export declare function isUsableEndpoint(value: unknown): value is string;
55
+ /**
56
+ * Validate a parsed config. Anything wrong (unknown mode, `host` without a
57
+ * usable endpoint, a malformed preset list) falls back to `browser` with a
58
+ * notice, never to a half-working mode.
59
+ */
60
+ export declare function validateInferenceConfig(value: unknown): ConfigResult;
61
+ /** Parse the file's text. */
62
+ export declare function parseInferenceConfig(text: string): ConfigResult;
63
+ /** The mounted component's prop, validated like the file. Invalid: browser plus a notice. */
64
+ export declare function configFromProp(prop: unknown): ConfigResult;
65
+ /**
66
+ * Fetch `${base}/planner.config.json`. A missing file (404, network error)
67
+ * means the defaults and no notice; a file that is there but unusable means
68
+ * `browser` and a notice.
69
+ */
70
+ export declare function loadInferenceConfig(base?: string, fetcher?: typeof fetch): Promise<ConfigResult>;
@@ -0,0 +1,149 @@
1
+ import { parseKitchenConfig } from "../kitchen/client.js";
2
+ export const INFERENCE_MODES = [
3
+ 'browser',
4
+ 'host',
5
+ 'byo',
6
+ ];
7
+ export const DEFAULT_INFERENCE = { mode: 'browser' };
8
+ /** The file name, served at `${base}/planner.config.json`. */
9
+ export const CONFIG_FILE = 'planner.config.json';
10
+ const isObject = (v) => !!v && typeof v === 'object' && !Array.isArray(v);
11
+ /** http(s) only; a path-only endpoint (`/api/planner/chat`) is the host's own origin. */
12
+ export function isUsableEndpoint(value) {
13
+ if (typeof value !== 'string')
14
+ return false;
15
+ const text = value.trim();
16
+ if (!text)
17
+ return false;
18
+ if (text.startsWith('/') && !text.startsWith('//'))
19
+ return true;
20
+ try {
21
+ const url = new URL(text);
22
+ return url.protocol === 'http:' || url.protocol === 'https:';
23
+ }
24
+ catch {
25
+ return false;
26
+ }
27
+ }
28
+ function parsePresetDefinition(value) {
29
+ if (!isObject(value))
30
+ return null;
31
+ const { id, label, baseUrl, model, keyless, cors } = value;
32
+ if (typeof id !== 'string' || !/^[a-z0-9][a-z0-9-]{0,31}$/.test(id)) {
33
+ return null;
34
+ }
35
+ if (typeof label !== 'string' || !label.trim())
36
+ return null;
37
+ if (!isUsableEndpoint(baseUrl) || baseUrl.startsWith('/'))
38
+ return null;
39
+ return {
40
+ id,
41
+ label: label.trim(),
42
+ baseUrl: baseUrl.trim(),
43
+ ...(typeof model === 'string' && model.trim()
44
+ ? { model: model.trim() }
45
+ : {}),
46
+ ...(keyless === true ? { keyless: true } : {}),
47
+ ...(typeof cors === 'string' && cors.trim() ? { cors: cors.trim() } : {}),
48
+ };
49
+ }
50
+ const fallback = (why) => ({
51
+ config: DEFAULT_INFERENCE,
52
+ notice: `The assistant settings could not be used (${why}), so it runs in your browser instead.`,
53
+ });
54
+ /**
55
+ * Validate a parsed config. Anything wrong (unknown mode, `host` without a
56
+ * usable endpoint, a malformed preset list) falls back to `browser` with a
57
+ * notice, never to a half-working mode.
58
+ */
59
+ export function validateInferenceConfig(value) {
60
+ if (!isObject(value))
61
+ return fallback('not an object');
62
+ const inference = value.inference;
63
+ if (inference === undefined)
64
+ return { config: DEFAULT_INFERENCE };
65
+ if (!isObject(inference))
66
+ return fallback('"inference" is not an object');
67
+ const mode = inference.mode;
68
+ if (mode === undefined || mode === 'browser') {
69
+ return { config: DEFAULT_INFERENCE };
70
+ }
71
+ if (mode === 'host') {
72
+ const host = inference.host;
73
+ if (!isObject(host) || !isUsableEndpoint(host.endpoint)) {
74
+ return fallback('host mode needs host.endpoint, an http(s) URL or path');
75
+ }
76
+ return {
77
+ config: { mode: 'host', host: { endpoint: host.endpoint.trim() } },
78
+ };
79
+ }
80
+ if (mode === 'byo') {
81
+ const byo = inference.byo;
82
+ if (byo === undefined)
83
+ return { config: { mode: 'byo' } };
84
+ if (!isObject(byo))
85
+ return fallback('"byo" is not an object');
86
+ if (byo.presets === undefined)
87
+ return { config: { mode: 'byo', byo: {} } };
88
+ if (!Array.isArray(byo.presets) || byo.presets.length === 0) {
89
+ return fallback('byo.presets must be a non-empty list');
90
+ }
91
+ const presets = [];
92
+ for (const entry of byo.presets) {
93
+ if (typeof entry === 'string' && entry.trim()) {
94
+ presets.push(entry.trim());
95
+ continue;
96
+ }
97
+ const definition = parsePresetDefinition(entry);
98
+ if (!definition)
99
+ return fallback('a byo preset is malformed');
100
+ presets.push(definition);
101
+ }
102
+ return { config: { mode: 'byo', byo: { presets } } };
103
+ }
104
+ return fallback(`unknown mode "${String(mode)}"`);
105
+ }
106
+ /** Parse the file's text. */
107
+ export function parseInferenceConfig(text) {
108
+ try {
109
+ const value = JSON.parse(text);
110
+ const result = validateInferenceConfig(value);
111
+ const kitchen = isObject(value)
112
+ ? parseKitchenConfig(value.kitchen)
113
+ : undefined;
114
+ return kitchen ? { ...result, kitchen } : result;
115
+ }
116
+ catch {
117
+ return fallback('it is not valid JSON');
118
+ }
119
+ }
120
+ /** The mounted component's prop, validated like the file. Invalid: browser plus a notice. */
121
+ export function configFromProp(prop) {
122
+ return validateInferenceConfig({ inference: prop });
123
+ }
124
+ /**
125
+ * Fetch `${base}/planner.config.json`. A missing file (404, network error)
126
+ * means the defaults and no notice; a file that is there but unusable means
127
+ * `browser` and a notice.
128
+ */
129
+ export async function loadInferenceConfig(base = '', fetcher = fetch) {
130
+ let response;
131
+ try {
132
+ response = await fetcher(`${base.replace(/\/$/, '')}/${CONFIG_FILE}`, {
133
+ headers: { accept: 'application/json' },
134
+ cache: 'no-cache',
135
+ });
136
+ }
137
+ catch {
138
+ return { config: DEFAULT_INFERENCE };
139
+ }
140
+ if (response.status === 404)
141
+ return { config: DEFAULT_INFERENCE };
142
+ if (!response.ok)
143
+ return fallback(`the file answered ${response.status}`);
144
+ const text = await response.text();
145
+ // A static host with a SPA fallback answers a missing file with HTML.
146
+ if (/^\s*</.test(text))
147
+ return { config: DEFAULT_INFERENCE };
148
+ return parseInferenceConfig(text);
149
+ }
@@ -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
+ }
@@ -0,0 +1,59 @@
1
+ import type { ChatModel } from '../assistant/transport.ts';
2
+ /** How hard to ask the endpoint for JSON, strictest first. */
3
+ export type JsonMode = 'json_schema' | 'json_object' | 'none';
4
+ export interface OpenAIChatOptions {
5
+ /** e.g. `http://localhost:11434/v1`. */
6
+ baseUrl: string;
7
+ model: string;
8
+ /** Sent as `Authorization: Bearer`; omit for a local server. */
9
+ apiKey?: string;
10
+ /** Strictest JSON mode to try first; it steps down when the endpoint refuses it. */
11
+ jsonMode?: JsonMode;
12
+ fetch?: typeof fetch;
13
+ /** Called with the mode that worked, so a caller can remember it. */
14
+ onJsonMode?: (mode: JsonMode) => void;
15
+ }
16
+ /** `http(s)` base without a trailing slash, or null. */
17
+ export declare function normalizeBaseUrl(value: string): string | null;
18
+ /** Hosts that are this computer: a key may travel to them over plain http. */
19
+ export declare function isLoopbackHost(hostname: string): boolean;
20
+ /** Can a key be sent to this address? `https`, or `http` to this computer only. */
21
+ export declare function keyMaySendTo(baseUrl: string): boolean;
22
+ /** The origin a key was entered for: scheme, host and port of the address. */
23
+ export declare function originOf(baseUrl: string): string | null;
24
+ /** A failure that says what happened and never carries the key. */
25
+ export declare class EndpointError extends Error {
26
+ readonly status?: number | undefined;
27
+ constructor(message: string, status?: number | undefined);
28
+ }
29
+ export interface CompleteOptions {
30
+ maxTokens?: number;
31
+ signal?: AbortSignal;
32
+ /** Ask for JSON-mode output (default true). */
33
+ json?: boolean;
34
+ temperature?: number;
35
+ schema?: Record<string, unknown> | string;
36
+ }
37
+ export interface OpenAIChat extends ChatModel {
38
+ complete(messages: {
39
+ role: string;
40
+ content: string;
41
+ }[], extra?: CompleteOptions): Promise<string>;
42
+ }
43
+ /**
44
+ * A `ChatModel` over `${baseUrl}/chat/completions`. JSON-mode output is asked
45
+ * for with the planner's schema; an endpoint that answers 400/422 to it (many
46
+ * local servers know only `json_object`, some nothing) is retried one step
47
+ * down, and the step that worked is kept for the rest of the session.
48
+ */
49
+ export declare function createOpenAIChat(options: OpenAIChatOptions): OpenAIChat;
50
+ export interface ConnectionResult {
51
+ ok: boolean;
52
+ /** One sentence for the visitor. */
53
+ message: string;
54
+ }
55
+ /**
56
+ * Test connection: one tiny completion, so the address, the model and the key
57
+ * are all exercised. Never throws and never echoes the key.
58
+ */
59
+ export declare function testConnection(options: OpenAIChatOptions): Promise<ConnectionResult>;
@@ -0,0 +1,202 @@
1
+ const JSON_MODES = ['json_schema', 'json_object', 'none'];
2
+ const REQUEST_TIMEOUT_MS = 120_000;
3
+ /** `http(s)` base without a trailing slash, or null. */
4
+ export function normalizeBaseUrl(value) {
5
+ try {
6
+ const url = new URL(value.trim());
7
+ if (url.protocol !== 'http:' && url.protocol !== 'https:')
8
+ return null;
9
+ // Credentials in a URL would travel in the clear as part of it.
10
+ if (url.username || url.password)
11
+ return null;
12
+ return `${url.origin}${url.pathname.replace(/\/+$/, '')}`;
13
+ }
14
+ catch {
15
+ return null;
16
+ }
17
+ }
18
+ /** Hosts that are this computer: a key may travel to them over plain http. */
19
+ export function isLoopbackHost(hostname) {
20
+ const host = hostname.toLowerCase().replace(/^\[|\]$/g, '');
21
+ return (host === 'localhost' ||
22
+ host.endsWith('.localhost') ||
23
+ host === '::1' ||
24
+ /^127(\.\d{1,3}){3}$/.test(host));
25
+ }
26
+ /** Can a key be sent to this address? `https`, or `http` to this computer only. */
27
+ export function keyMaySendTo(baseUrl) {
28
+ try {
29
+ const url = new URL(baseUrl.trim());
30
+ return (url.protocol === 'https:' ||
31
+ (url.protocol === 'http:' && isLoopbackHost(url.hostname)));
32
+ }
33
+ catch {
34
+ return false;
35
+ }
36
+ }
37
+ /** The origin a key was entered for: scheme, host and port of the address. */
38
+ export function originOf(baseUrl) {
39
+ try {
40
+ return new URL(baseUrl.trim()).origin;
41
+ }
42
+ catch {
43
+ return null;
44
+ }
45
+ }
46
+ /** A failure that says what happened and never carries the key. */
47
+ export class EndpointError extends Error {
48
+ status;
49
+ constructor(message, status) {
50
+ super(message);
51
+ this.status = status;
52
+ this.name = 'EndpointError';
53
+ }
54
+ }
55
+ function describeStatus(status) {
56
+ if (status === 401 || status === 403) {
57
+ return `the endpoint refused the key (${status})`;
58
+ }
59
+ if (status === 404) {
60
+ return 'the endpoint or model was not found (404), check the address and model name';
61
+ }
62
+ if (status === 429)
63
+ return 'the endpoint is rate limiting you (429)';
64
+ return `the endpoint answered ${status}`;
65
+ }
66
+ /** The text of the first choice, or a reason there is none. */
67
+ function textOf(payload) {
68
+ const choice = payload?.choices?.[0];
69
+ const content = choice?.message?.content;
70
+ if (typeof content === 'string')
71
+ return content;
72
+ if (Array.isArray(content)) {
73
+ return content
74
+ .map((part) => part && typeof part === 'object' && 'text' in part
75
+ ? String(part.text)
76
+ : '')
77
+ .join('');
78
+ }
79
+ throw new EndpointError('the endpoint sent no reply text');
80
+ }
81
+ function responseFormat(mode, schema) {
82
+ if (mode === 'none')
83
+ return undefined;
84
+ if (mode === 'json_schema' && schema && typeof schema === 'object') {
85
+ return {
86
+ type: 'json_schema',
87
+ json_schema: { name: 'planner_turn', strict: false, schema },
88
+ };
89
+ }
90
+ return { type: 'json_object' };
91
+ }
92
+ /**
93
+ * A `ChatModel` over `${baseUrl}/chat/completions`. JSON-mode output is asked
94
+ * for with the planner's schema; an endpoint that answers 400/422 to it (many
95
+ * local servers know only `json_object`, some nothing) is retried one step
96
+ * down, and the step that worked is kept for the rest of the session.
97
+ */
98
+ export function createOpenAIChat(options) {
99
+ const base = normalizeBaseUrl(options.baseUrl);
100
+ if (!base)
101
+ throw new EndpointError('the address is not a valid http(s) URL');
102
+ if (options.apiKey && !keyMaySendTo(base)) {
103
+ throw new EndpointError('a key is only sent over https, or to this computer; use an https address');
104
+ }
105
+ const url = `${base}/chat/completions`;
106
+ const doFetch = options.fetch ?? fetch;
107
+ let level = Math.max(0, JSON_MODES.indexOf(options.jsonMode ?? 'json_schema'));
108
+ async function post(body, signal) {
109
+ const timeout = AbortSignal.timeout(REQUEST_TIMEOUT_MS);
110
+ try {
111
+ return await doFetch(url, {
112
+ method: 'POST',
113
+ headers: {
114
+ 'content-type': 'application/json',
115
+ ...(options.apiKey
116
+ ? { authorization: `Bearer ${options.apiKey}` }
117
+ : {}),
118
+ },
119
+ body: JSON.stringify(body),
120
+ // No cookies for a third-party endpoint.
121
+ credentials: 'omit',
122
+ signal: signal ? AbortSignal.any([signal, timeout]) : timeout,
123
+ });
124
+ }
125
+ catch (error) {
126
+ if (signal?.aborted)
127
+ throw error;
128
+ // A blocked cross-origin call and an unreachable server look the same
129
+ // to a page: a TypeError with no detail.
130
+ throw new EndpointError('could not reach the endpoint. Is it running, and does it allow this page (CORS)?');
131
+ }
132
+ }
133
+ async function complete(messages, extra = {}) {
134
+ const wantJson = extra.json !== false;
135
+ for (;;) {
136
+ const mode = wantJson ? (JSON_MODES[level] ?? 'none') : 'none';
137
+ const format = responseFormat(mode, extra.schema);
138
+ const response = await post({
139
+ model: options.model,
140
+ messages,
141
+ stream: false,
142
+ temperature: extra.temperature ?? 0,
143
+ ...(extra.maxTokens ? { max_tokens: extra.maxTokens } : {}),
144
+ ...(format ? { response_format: format } : {}),
145
+ }, extra.signal);
146
+ if (response.ok) {
147
+ if (wantJson)
148
+ options.onJsonMode?.(mode);
149
+ return textOf(await response.json().catch(() => null));
150
+ }
151
+ // The endpoint refused the JSON mode: step down and ask again.
152
+ if (wantJson &&
153
+ (response.status === 400 || response.status === 422) &&
154
+ level < JSON_MODES.length - 1) {
155
+ level += 1;
156
+ continue;
157
+ }
158
+ throw new EndpointError(describeStatus(response.status), response.status);
159
+ }
160
+ }
161
+ return {
162
+ complete,
163
+ message(text, callOptions) {
164
+ return complete([
165
+ ...(callOptions?.history ?? []).map(({ role, content }) => ({
166
+ role,
167
+ content,
168
+ })),
169
+ { role: 'user', content: text },
170
+ ], {
171
+ maxTokens: callOptions?.maxTokens,
172
+ signal: callOptions?.signal,
173
+ temperature: callOptions?.temperature,
174
+ schema: callOptions?.responseSchema,
175
+ });
176
+ },
177
+ };
178
+ }
179
+ /**
180
+ * Test connection: one tiny completion, so the address, the model and the key
181
+ * are all exercised. Never throws and never echoes the key.
182
+ */
183
+ export async function testConnection(options) {
184
+ try {
185
+ const chat = createOpenAIChat({ ...options, jsonMode: 'none' });
186
+ const reply = await chat.complete([{ role: 'user', content: 'Reply with the single word OK.' }], { maxTokens: 8, json: false });
187
+ return {
188
+ ok: true,
189
+ message: reply.trim()
190
+ ? `Connected to ${options.model}.`
191
+ : `Connected to ${options.model}, but it sent an empty reply.`,
192
+ };
193
+ }
194
+ catch (error) {
195
+ return {
196
+ ok: false,
197
+ message: error instanceof EndpointError
198
+ ? `Could not connect: ${error.message}.`
199
+ : 'Could not connect.',
200
+ };
201
+ }
202
+ }
@@ -0,0 +1,5 @@
1
+ import type { ByoPresetDefinition } from './config.ts';
2
+ /** The first-party presets; a config's `byo.presets` picks from or adds to these. */
3
+ export declare const BUILT_IN_PRESETS: readonly ByoPresetDefinition[];
4
+ /** Presets a config offers, in its order; unknown ids are dropped. Default: all built-ins. */
5
+ export declare function resolvePresets(requested?: readonly (string | ByoPresetDefinition)[]): ByoPresetDefinition[];
@@ -0,0 +1,46 @@
1
+ /** The first-party presets; a config's `byo.presets` picks from or adds to these. */
2
+ export const BUILT_IN_PRESETS = [
3
+ {
4
+ id: 'ollama',
5
+ label: 'Ollama (on this computer)',
6
+ baseUrl: 'http://localhost:11434/v1',
7
+ model: 'llama3.2',
8
+ keyless: true,
9
+ cors: 'Ollama only answers pages it trusts. Start it with OLLAMA_ORIGINS set to this site, for example OLLAMA_ORIGINS=https://your-site.example ollama serve (on macOS: launchctl setenv OLLAMA_ORIGINS https://your-site.example, then restart Ollama). A page served from http://localhost needs no change.',
10
+ },
11
+ {
12
+ id: 'openrouter',
13
+ label: 'OpenRouter',
14
+ baseUrl: 'https://openrouter.ai/api/v1',
15
+ model: 'openai/gpt-4o-mini',
16
+ cors: 'OpenRouter accepts calls from any web page, so no setup is needed. Use a key with a spending limit.',
17
+ },
18
+ {
19
+ id: 'openai',
20
+ label: 'OpenAI',
21
+ baseUrl: 'https://api.openai.com/v1',
22
+ model: 'gpt-4o-mini',
23
+ cors: 'OpenAI accepts calls from web pages when the request carries a key. Use a restricted key with a low spending limit: anyone with access to this browser profile can read it.',
24
+ },
25
+ {
26
+ id: 'custom',
27
+ label: 'Custom OpenAI-compatible endpoint',
28
+ baseUrl: '',
29
+ customUrl: true,
30
+ cors: 'The server must answer the browser\'s CORS preflight: allow this site\'s origin, the "authorization" and "content-type" headers, and the POST and OPTIONS methods.',
31
+ },
32
+ ];
33
+ /** Presets a config offers, in its order; unknown ids are dropped. Default: all built-ins. */
34
+ export function resolvePresets(requested) {
35
+ if (!requested?.length)
36
+ return [...BUILT_IN_PRESETS];
37
+ const out = [];
38
+ for (const entry of requested) {
39
+ const preset = typeof entry === 'string'
40
+ ? BUILT_IN_PRESETS.find((p) => p.id === entry)
41
+ : entry;
42
+ if (preset && !out.some((p) => p.id === preset.id))
43
+ out.push(preset);
44
+ }
45
+ return out.length ? out : [...BUILT_IN_PRESETS];
46
+ }
@@ -0,0 +1,39 @@
1
+ import type { Cookbook } from '../cookbook/types.ts';
2
+ /** Where to send, from the config. Absent from the config means no kitchen. */
3
+ export interface KitchenEndpoint {
4
+ endpoint: string;
5
+ /**
6
+ * True when the file still carried a `token`: an older `smrt` CLI that serves
7
+ * it where any local process can read it. The value is never kept, and
8
+ * sending is off until the CLI is updated.
9
+ */
10
+ tokenInConfig?: true;
11
+ }
12
+ /** Where and how to send: the config's endpoint and the address's token. */
13
+ export interface KitchenConfig extends KitchenEndpoint {
14
+ token: string;
15
+ }
16
+ /** The header the CLI checks the one-time token in. */
17
+ export declare const KITCHEN_TOKEN_HEADER = "x-kitchen-token";
18
+ /** What the kitchen reports after writing the project. */
19
+ export interface KitchenResult {
20
+ dir: string;
21
+ mode: 'new' | 'update';
22
+ installed: boolean;
23
+ added: string[];
24
+ nextSteps: string[];
25
+ }
26
+ export type KitchenOutcome = {
27
+ ok: true;
28
+ result: KitchenResult;
29
+ } | {
30
+ ok: false;
31
+ errors: string[];
32
+ };
33
+ /**
34
+ * Validate the config's `kitchen` block. Anything unusable means no kitchen.
35
+ * Only the endpoint is read: a `token` here is ignored, never used.
36
+ */
37
+ export declare function parseKitchenConfig(value: unknown): KitchenEndpoint | undefined;
38
+ /** POST the cookbook to the kitchen. Never throws; a failure is an outcome. */
39
+ export declare function sendToKitchen(config: KitchenConfig, cookbook: Cookbook, fetcher?: typeof fetch): Promise<KitchenOutcome>;