@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,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,207 @@
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
+ for (const name of url.searchParams.keys()) {
13
+ if (/^(?:api[-_]?key|key|token|authorization|secret|password)$/i.test(name)) {
14
+ return null;
15
+ }
16
+ }
17
+ return `${url.origin}${url.pathname.replace(/\/+$/, '')}`;
18
+ }
19
+ catch {
20
+ return null;
21
+ }
22
+ }
23
+ /** Hosts that are this computer: a key may travel to them over plain http. */
24
+ export function isLoopbackHost(hostname) {
25
+ const host = hostname.toLowerCase().replace(/^\[|\]$/g, '');
26
+ return (host === 'localhost' ||
27
+ host.endsWith('.localhost') ||
28
+ host === '::1' ||
29
+ /^127(\.\d{1,3}){3}$/.test(host));
30
+ }
31
+ /** Can a key be sent to this address? `https`, or `http` to this computer only. */
32
+ export function keyMaySendTo(baseUrl) {
33
+ try {
34
+ const url = new URL(baseUrl.trim());
35
+ return (url.protocol === 'https:' ||
36
+ (url.protocol === 'http:' && isLoopbackHost(url.hostname)));
37
+ }
38
+ catch {
39
+ return false;
40
+ }
41
+ }
42
+ /** The origin a key was entered for: scheme, host and port of the address. */
43
+ export function originOf(baseUrl) {
44
+ try {
45
+ return new URL(baseUrl.trim()).origin;
46
+ }
47
+ catch {
48
+ return null;
49
+ }
50
+ }
51
+ /** A failure that says what happened and never carries the key. */
52
+ export class EndpointError extends Error {
53
+ status;
54
+ constructor(message, status) {
55
+ super(message);
56
+ this.status = status;
57
+ this.name = 'EndpointError';
58
+ }
59
+ }
60
+ function describeStatus(status) {
61
+ if (status === 401 || status === 403) {
62
+ return `the endpoint refused the key (${status})`;
63
+ }
64
+ if (status === 404) {
65
+ return 'the endpoint or model was not found (404), check the address and model name';
66
+ }
67
+ if (status === 429)
68
+ return 'the endpoint is rate limiting you (429)';
69
+ return `the endpoint answered ${status}`;
70
+ }
71
+ /** The text of the first choice, or a reason there is none. */
72
+ function textOf(payload) {
73
+ const choice = payload?.choices?.[0];
74
+ const content = choice?.message?.content;
75
+ if (typeof content === 'string')
76
+ return content;
77
+ if (Array.isArray(content)) {
78
+ return content
79
+ .map((part) => part && typeof part === 'object' && 'text' in part
80
+ ? String(part.text)
81
+ : '')
82
+ .join('');
83
+ }
84
+ throw new EndpointError('the endpoint sent no reply text');
85
+ }
86
+ function responseFormat(mode, schema) {
87
+ if (mode === 'none')
88
+ return undefined;
89
+ if (mode === 'json_schema' && schema && typeof schema === 'object') {
90
+ return {
91
+ type: 'json_schema',
92
+ json_schema: { name: 'planner_turn', strict: false, schema },
93
+ };
94
+ }
95
+ return { type: 'json_object' };
96
+ }
97
+ /**
98
+ * A `ChatModel` over `${baseUrl}/chat/completions`. JSON-mode output is asked
99
+ * for with the planner's schema; an endpoint that answers 400/422 to it (many
100
+ * local servers know only `json_object`, some nothing) is retried one step
101
+ * down, and the step that worked is kept for the rest of the session.
102
+ */
103
+ export function createOpenAIChat(options) {
104
+ const base = normalizeBaseUrl(options.baseUrl);
105
+ if (!base)
106
+ throw new EndpointError('the address is not a valid http(s) URL');
107
+ if (options.apiKey && !keyMaySendTo(base)) {
108
+ throw new EndpointError('a key is only sent over https, or to this computer; use an https address');
109
+ }
110
+ const url = `${base}/chat/completions`;
111
+ const doFetch = options.fetch ?? fetch;
112
+ let level = Math.max(0, JSON_MODES.indexOf(options.jsonMode ?? 'json_schema'));
113
+ async function post(body, signal) {
114
+ const timeout = AbortSignal.timeout(REQUEST_TIMEOUT_MS);
115
+ try {
116
+ return await doFetch(url, {
117
+ method: 'POST',
118
+ headers: {
119
+ 'content-type': 'application/json',
120
+ ...(options.apiKey
121
+ ? { authorization: `Bearer ${options.apiKey}` }
122
+ : {}),
123
+ },
124
+ body: JSON.stringify(body),
125
+ // No cookies for a third-party endpoint.
126
+ credentials: 'omit',
127
+ signal: signal ? AbortSignal.any([signal, timeout]) : timeout,
128
+ });
129
+ }
130
+ catch (error) {
131
+ if (signal?.aborted)
132
+ throw error;
133
+ // A blocked cross-origin call and an unreachable server look the same
134
+ // to a page: a TypeError with no detail.
135
+ throw new EndpointError('could not reach the endpoint. Is it running, and does it allow this page (CORS)?');
136
+ }
137
+ }
138
+ async function complete(messages, extra = {}) {
139
+ const wantJson = extra.json !== false;
140
+ for (;;) {
141
+ const mode = wantJson ? (JSON_MODES[level] ?? 'none') : 'none';
142
+ const format = responseFormat(mode, extra.schema);
143
+ const response = await post({
144
+ model: options.model,
145
+ messages,
146
+ stream: false,
147
+ temperature: extra.temperature ?? 0,
148
+ ...(extra.maxTokens ? { max_tokens: extra.maxTokens } : {}),
149
+ ...(format ? { response_format: format } : {}),
150
+ }, extra.signal);
151
+ if (response.ok) {
152
+ if (wantJson)
153
+ options.onJsonMode?.(mode);
154
+ return textOf(await response.json().catch(() => null));
155
+ }
156
+ // The endpoint refused the JSON mode: step down and ask again.
157
+ if (wantJson &&
158
+ (response.status === 400 || response.status === 422) &&
159
+ level < JSON_MODES.length - 1) {
160
+ level += 1;
161
+ continue;
162
+ }
163
+ throw new EndpointError(describeStatus(response.status), response.status);
164
+ }
165
+ }
166
+ return {
167
+ complete,
168
+ message(text, callOptions) {
169
+ return complete([
170
+ ...(callOptions?.history ?? []).map(({ role, content }) => ({
171
+ role,
172
+ content,
173
+ })),
174
+ { role: 'user', content: text },
175
+ ], {
176
+ maxTokens: callOptions?.maxTokens,
177
+ signal: callOptions?.signal,
178
+ temperature: callOptions?.temperature,
179
+ schema: callOptions?.responseSchema,
180
+ });
181
+ },
182
+ };
183
+ }
184
+ /**
185
+ * Test connection: one tiny completion, so the address, the model and the key
186
+ * are all exercised. Never throws and never echoes the key.
187
+ */
188
+ export async function testConnection(options) {
189
+ try {
190
+ const chat = createOpenAIChat({ ...options, jsonMode: 'none' });
191
+ const reply = await chat.complete([{ role: 'user', content: 'Reply with the single word OK.' }], { maxTokens: 8, json: false });
192
+ return {
193
+ ok: true,
194
+ message: reply.trim()
195
+ ? `Connected to ${options.model}.`
196
+ : `Connected to ${options.model}, but it sent an empty reply.`,
197
+ };
198
+ }
199
+ catch (error) {
200
+ return {
201
+ ok: false,
202
+ message: error instanceof EndpointError
203
+ ? `Could not connect: ${error.message}.`
204
+ : 'Could not connect.',
205
+ };
206
+ }
207
+ }
@@ -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>;
@@ -0,0 +1,115 @@
1
+ /**
2
+ * Send to kitchen: the hand-off to `smrt kitchen`, the CLI that serves this
3
+ * app on localhost and turns the cookbook into a project. The CLI announces
4
+ * itself in `planner.config.json` with where to send, and in the address it
5
+ * opens with the one-time token, as a fragment (`fragment.ts`):
6
+ *
7
+ * planner.config.json { "kitchen": { "endpoint": "/api/kitchen/cookbook" } }
8
+ * address http://127.0.0.1:<port>/#kitchen=<token>
9
+ *
10
+ * The config never carries a token (any local process sending the right Host
11
+ * header could read it); a `token` in the file is ignored (and reported, see
12
+ * `tokenInConfig`). The page POSTs the
13
+ * cookbook to the endpoint with the token in `x-kitchen-token`. Wire contract,
14
+ * version 1:
15
+ *
16
+ * - `200 { ok: true, dir, mode, installed, added, nextSteps }`: the project
17
+ * was written (`mode` is `new` or `update`).
18
+ * - `4xx/5xx { ok: false, errors: string[] }`: the cookbook was not applied;
19
+ * the server keeps listening, so the visitor can fix it and send again.
20
+ */
21
+ import { serializeCookbook } from "../cookbook/file.js";
22
+ /** The header the CLI checks the one-time token in. */
23
+ export const KITCHEN_TOKEN_HEADER = 'x-kitchen-token';
24
+ const isObject = (v) => !!v && typeof v === 'object' && !Array.isArray(v);
25
+ /** An http(s) URL, or a path on the page's own origin. */
26
+ function usableEndpoint(value) {
27
+ if (typeof value !== 'string')
28
+ return false;
29
+ const text = value.trim();
30
+ try {
31
+ const relative = text.startsWith('/') && !text.startsWith('//');
32
+ const url = new URL(text, relative ? 'https://planner.invalid' : undefined);
33
+ if (!relative && url.protocol !== 'http:' && url.protocol !== 'https:') {
34
+ return false;
35
+ }
36
+ if (url.username || url.password)
37
+ return false;
38
+ if (url.hash)
39
+ return false;
40
+ return ![...url.searchParams.keys()].some((name) => /^(?:api[-_]?key|key|token|authorization|secret|password)$/i.test(name));
41
+ }
42
+ catch {
43
+ return false;
44
+ }
45
+ }
46
+ /**
47
+ * Validate the config's `kitchen` block. Anything unusable means no kitchen.
48
+ * Only the endpoint is read: a `token` here is ignored, never used.
49
+ */
50
+ export function parseKitchenConfig(value) {
51
+ if (!isObject(value))
52
+ return undefined;
53
+ const { endpoint } = value;
54
+ if (!usableEndpoint(endpoint))
55
+ return undefined;
56
+ return {
57
+ endpoint: endpoint.trim(),
58
+ ...(Object.hasOwn(value, 'token') ? { tokenInConfig: true } : {}),
59
+ };
60
+ }
61
+ const strings = (value) => Array.isArray(value)
62
+ ? value.filter((x) => typeof x === 'string')
63
+ : [];
64
+ /** POST the cookbook to the kitchen. Never throws; a failure is an outcome. */
65
+ export async function sendToKitchen(config, cookbook, fetcher = fetch) {
66
+ let response;
67
+ try {
68
+ response = await fetcher(config.endpoint, {
69
+ method: 'POST',
70
+ headers: {
71
+ 'content-type': 'application/json',
72
+ accept: 'application/json',
73
+ [KITCHEN_TOKEN_HEADER]: config.token,
74
+ },
75
+ body: serializeCookbook(cookbook),
76
+ });
77
+ }
78
+ catch {
79
+ return {
80
+ ok: false,
81
+ errors: [
82
+ 'The kitchen could not be reached. Is `smrt kitchen` still running?',
83
+ ],
84
+ };
85
+ }
86
+ let body;
87
+ try {
88
+ body = await response.json();
89
+ }
90
+ catch {
91
+ body = undefined;
92
+ }
93
+ if (response.ok && isObject(body) && body.ok === true) {
94
+ return {
95
+ ok: true,
96
+ result: {
97
+ dir: typeof body.dir === 'string' ? body.dir : '',
98
+ mode: body.mode === 'update' ? 'update' : 'new',
99
+ installed: body.installed === true,
100
+ added: strings(body.added),
101
+ nextSteps: strings(body.nextSteps),
102
+ },
103
+ };
104
+ }
105
+ const errors = isObject(body) ? strings(body.errors) : [];
106
+ if (isObject(body) && typeof body.error === 'string') {
107
+ errors.push(body.error);
108
+ }
109
+ return {
110
+ ok: false,
111
+ errors: errors.length
112
+ ? errors
113
+ : [`The kitchen answered ${response.status}.`],
114
+ };
115
+ }
@@ -0,0 +1,30 @@
1
+ /**
2
+ * The kitchen token arrives in the address, never in a file the server serves.
3
+ * `smrt kitchen` opens `http://127.0.0.1:<port>/#kitchen=<token>`: a fragment is
4
+ * never sent to a server, so no endpoint (and no other local process sending
5
+ * the right `Host`) can read it from `planner.config.json`. The page reads the
6
+ * fragment once at startup, keeps the token in memory only, and removes the
7
+ * `kitchen` parameter from the address (`replaceState`) so it is not left in
8
+ * the history entry either.
9
+ */
10
+ /** The fragment key the token is under. */
11
+ export declare const KITCHEN_FRAGMENT_KEY = "kitchen";
12
+ export interface KitchenFragment {
13
+ /** The token, when the fragment carried a usable one. */
14
+ token?: string;
15
+ /** True when the fragment had a `kitchen` parameter (usable or not) to strip. */
16
+ present: boolean;
17
+ /**
18
+ * The fragment without the `kitchen` parameter, as it belongs in the address:
19
+ * `''` or `#other=1`. Other parameters are kept.
20
+ */
21
+ hash: string;
22
+ }
23
+ /**
24
+ * Read `location.hash` (with or without the `#`). Never throws. Only the
25
+ * `kitchen` parameter is touched: every other part of the fragment is returned
26
+ * exactly as it was (no re-encoding), so an in-page anchor survives. The token
27
+ * is read raw (it must already be URL-safe), so a percent-encoded or `+`-spaced
28
+ * value is not a token; the parameter is removed all the same.
29
+ */
30
+ export declare function readKitchenFragment(hash: string): KitchenFragment;
@@ -0,0 +1,49 @@
1
+ /**
2
+ * The kitchen token arrives in the address, never in a file the server serves.
3
+ * `smrt kitchen` opens `http://127.0.0.1:<port>/#kitchen=<token>`: a fragment is
4
+ * never sent to a server, so no endpoint (and no other local process sending
5
+ * the right `Host`) can read it from `planner.config.json`. The page reads the
6
+ * fragment once at startup, keeps the token in memory only, and removes the
7
+ * `kitchen` parameter from the address (`replaceState`) so it is not left in
8
+ * the history entry either.
9
+ */
10
+ /** The fragment key the token is under. */
11
+ export const KITCHEN_FRAGMENT_KEY = 'kitchen';
12
+ /** URL-safe characters only (RFC 3986 unreserved): what `base64url` and hex produce. */
13
+ const TOKEN = /^[A-Za-z0-9._~-]{1,256}$/;
14
+ /**
15
+ * Read `location.hash` (with or without the `#`). Never throws. Only the
16
+ * `kitchen` parameter is touched: every other part of the fragment is returned
17
+ * exactly as it was (no re-encoding), so an in-page anchor survives. The token
18
+ * is read raw (it must already be URL-safe), so a percent-encoded or `+`-spaced
19
+ * value is not a token; the parameter is removed all the same.
20
+ */
21
+ export function readKitchenFragment(hash) {
22
+ const text = hash.startsWith('#') ? hash.slice(1) : hash;
23
+ if (!text)
24
+ return { present: false, hash: '' };
25
+ let token;
26
+ let present = false;
27
+ const kept = [];
28
+ for (const part of text.split('&')) {
29
+ const equals = part.indexOf('=');
30
+ const key = equals < 0 ? part : part.slice(0, equals);
31
+ if (key !== KITCHEN_FRAGMENT_KEY) {
32
+ kept.push(part);
33
+ continue;
34
+ }
35
+ // The first `kitchen` wins; all of them are removed.
36
+ if (!present && equals >= 0) {
37
+ const value = part.slice(equals + 1);
38
+ if (TOKEN.test(value))
39
+ token = value;
40
+ }
41
+ present = true;
42
+ }
43
+ const rest = kept.filter((part) => part !== '').join('&');
44
+ return {
45
+ ...(token ? { token } : {}),
46
+ present,
47
+ hash: rest ? `#${rest}` : '',
48
+ };
49
+ }
@@ -0,0 +1,26 @@
1
+ import type { Cookbook } from '../cookbook/types.ts';
2
+ import { type KitchenConfig, type KitchenEndpoint, type KitchenOutcome } from './client.ts';
3
+ export type KitchenStatus = 'idle' | 'sending' | 'sent' | 'failed';
4
+ /** Whether a kitchen is listening, and the state of the current send. */
5
+ export declare class KitchenState {
6
+ /** Where the kitchen listens, from `planner.config.json`. */
7
+ endpoint: string | undefined;
8
+ /** An older CLI still puts its token in the config: never used, and sending is off. */
9
+ tokenInConfig: boolean;
10
+ /** The one-time token, from the address's fragment. Memory only. */
11
+ private token;
12
+ status: KitchenStatus;
13
+ outcome: KitchenOutcome | undefined;
14
+ /** A kitchen is listening and this page holds its token: sending is possible. */
15
+ get config(): KitchenConfig | undefined;
16
+ /**
17
+ * A kitchen is listening but this page was opened without its token (the
18
+ * address had no `#kitchen=` fragment, or the page was reloaded after the
19
+ * fragment was removed): the person needs the address `smrt kitchen` printed.
20
+ */
21
+ get needsLink(): boolean;
22
+ configure(config: KitchenEndpoint | undefined, token?: string): void;
23
+ send(cookbook: Cookbook, fetcher?: typeof fetch): Promise<void>;
24
+ }
25
+ /** The app's one kitchen state, set from `planner.config.json`. */
26
+ export declare const kitchenState: KitchenState;
@@ -0,0 +1,45 @@
1
+ import { sendToKitchen, } from "./client.js";
2
+ /** Whether a kitchen is listening, and the state of the current send. */
3
+ export class KitchenState {
4
+ /** Where the kitchen listens, from `planner.config.json`. */
5
+ endpoint = $state(undefined);
6
+ /** An older CLI still puts its token in the config: never used, and sending is off. */
7
+ tokenInConfig = $state(false);
8
+ /** The one-time token, from the address's fragment. Memory only. */
9
+ token = $state(undefined);
10
+ status = $state('idle');
11
+ outcome = $state(undefined);
12
+ /** A kitchen is listening and this page holds its token: sending is possible. */
13
+ get config() {
14
+ return this.endpoint && this.token && !this.tokenInConfig
15
+ ? { endpoint: this.endpoint, token: this.token }
16
+ : undefined;
17
+ }
18
+ /**
19
+ * A kitchen is listening but this page was opened without its token (the
20
+ * address had no `#kitchen=` fragment, or the page was reloaded after the
21
+ * fragment was removed): the person needs the address `smrt kitchen` printed.
22
+ */
23
+ get needsLink() {
24
+ return !!this.endpoint && !this.token && !this.tokenInConfig;
25
+ }
26
+ configure(config, token) {
27
+ this.endpoint = config?.endpoint;
28
+ this.tokenInConfig = config?.tokenInConfig === true;
29
+ this.token = config ? token : undefined;
30
+ this.status = 'idle';
31
+ this.outcome = undefined;
32
+ }
33
+ async send(cookbook, fetcher) {
34
+ const config = this.config;
35
+ if (!config || this.status === 'sending')
36
+ return;
37
+ this.status = 'sending';
38
+ this.outcome = undefined;
39
+ const outcome = await sendToKitchen(config, cookbook, fetcher);
40
+ this.outcome = outcome;
41
+ this.status = outcome.ok ? 'sent' : 'failed';
42
+ }
43
+ }
44
+ /** The app's one kitchen state, set from `planner.config.json`. */
45
+ export const kitchenState = new KitchenState();
@@ -0,0 +1,17 @@
1
+ import type { CookbookStore } from '../cookbook/store.svelte.ts';
2
+ import type { Cookbook, CookbookResult } from '../cookbook/types.ts';
3
+ import type { AppSettings } from '../settings/app-settings.ts';
4
+ import type { LibraryCookbook } from './types.ts';
5
+ export { isCookbookEmpty } from './document.ts';
6
+ /** Applying replaces the current recipes and menu, so it asks first unless empty. */
7
+ export declare function needsConfirm(store: Pick<CookbookStore, 'snapshot'>): boolean;
8
+ /**
9
+ * Replace the cookbook with the cookbook's: recipes, features, options,
10
+ * exposure and layout. Goes through the same strict check an import does, and
11
+ * applies nothing on failure. Also switches the sample-data pack to the
12
+ * cookbook's; rows already generated are regenerated by the caller resetting
13
+ * the data source (records are not part of a cookbook).
14
+ */
15
+ export declare function applyLibraryCookbook(cookbook: LibraryCookbook, store: Pick<CookbookStore, 'replace'> & Partial<Pick<CookbookStore, 'theme'>>, settings?: AppSettings): CookbookResult;
16
+ /** Does the current cookbook still hold everything the cookbook added? */
17
+ export declare function holdsCookbook(cookbook: LibraryCookbook, current: Pick<Cookbook, 'recipes' | 'features'>): boolean;