@happyvertical/smrt-planner 0.0.1 → 0.1.0

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 (763) hide show
  1. package/README.md +81 -8
  2. package/app/404.html +42 -49
  3. package/app/_app/immutable/assets/0.BvXq1Svw.css +1 -0
  4. package/app/_app/immutable/assets/10.CdYxvH4G.css +1 -0
  5. package/app/_app/immutable/assets/11.nOT5Z4Fv.css +1 -0
  6. package/app/_app/immutable/assets/12.F7A7zP4J.css +1 -0
  7. package/app/_app/immutable/assets/13.JoySu8W5.css +1 -0
  8. package/app/_app/immutable/assets/14.nsp62-4b.css +1 -0
  9. package/app/_app/immutable/assets/2.CbPiqdz5.css +1 -0
  10. package/app/_app/immutable/assets/3.D518dbB5.css +1 -0
  11. package/app/_app/immutable/assets/4.B3vt1gMJ.css +1 -0
  12. package/app/_app/immutable/assets/AiSetup.4fXjMpTZ.css +1 -0
  13. package/app/_app/immutable/assets/AppShell.DKPbJFmw.css +1 -0
  14. package/app/_app/immutable/assets/ConnectTools.DTleL8YA.css +1 -0
  15. package/app/_app/immutable/assets/FieldMapForm.C8SZ3t4N.css +1 -0
  16. package/app/_app/immutable/assets/ModelPage.DzDhJQz3.css +1 -0
  17. package/app/_app/immutable/assets/SectionActions.BE1CPmxk.css +1 -0
  18. package/app/_app/immutable/assets/SectionIcons.BGFcFuOf.css +1 -0
  19. package/app/_app/immutable/assets/SegmentedControl.T_hJQXHk.css +1 -0
  20. package/app/_app/immutable/assets/app.BS7nbUi0.css +1 -0
  21. package/app/_app/immutable/assets/currency-metadata.CJIy0Dzm.css +1 -0
  22. package/app/_app/immutable/assets/data.DQcbQG_b.css +1 -0
  23. package/app/_app/immutable/assets/feedback.FjY5wqsa.css +1 -0
  24. package/app/_app/immutable/assets/forms.DA06CFM9.css +1 -0
  25. package/app/_app/immutable/assets/labels.Dny6zd23.css +1 -0
  26. package/app/_app/immutable/assets/percent.CBivq97O.css +1 -0
  27. package/app/_app/immutable/assets/state.C9Put0ur.css +1 -0
  28. package/app/_app/immutable/assets/webmcp-ui-context.CC5pQLNE.css +1 -0
  29. package/app/_app/immutable/assets/workspace.Dtoe2fRU.css +1 -0
  30. package/app/_app/immutable/chunks/3ouNUakh.js +1 -0
  31. package/app/_app/immutable/chunks/B3FAegW4.js +4 -0
  32. package/app/_app/immutable/chunks/B8iReL-r.js +1 -0
  33. package/app/_app/immutable/chunks/BCmdRE3j.js +4 -0
  34. package/app/_app/immutable/chunks/BV3NwM01.js +1 -0
  35. package/app/_app/immutable/chunks/BVicq_6F.js +1 -0
  36. package/app/_app/immutable/chunks/Ba1g71Sq.js +1 -0
  37. package/app/_app/immutable/chunks/BdjvgMW6.js +1 -0
  38. package/app/_app/immutable/chunks/BiO_bqNH.js +2 -0
  39. package/app/_app/immutable/chunks/{DyGfbRG-.js → BrorvU4B.js} +1 -1
  40. package/app/_app/immutable/chunks/By-QJdbA.js +980 -0
  41. package/app/_app/immutable/chunks/{CyUMm_Wp.js → BzITuwgY.js} +1 -1
  42. package/app/_app/immutable/chunks/BzMfoxBk.js +1 -0
  43. package/app/_app/immutable/chunks/C-AoRalq.js +1 -0
  44. package/app/_app/immutable/chunks/CGKL_Nlh.js +1 -0
  45. package/app/_app/immutable/chunks/CNj-_B0j.js +1 -0
  46. package/app/_app/immutable/chunks/CU8cbxOZ.js +1 -0
  47. package/app/_app/immutable/chunks/CZGhPAoL.js +2 -0
  48. package/app/_app/immutable/chunks/CaEdOwVf.js +1 -0
  49. package/app/_app/immutable/chunks/Cas1hq-y.js +1 -0
  50. package/app/_app/immutable/chunks/CfOMUCNN.js +1 -0
  51. package/app/_app/immutable/chunks/Cm0VMWZu.js +1 -0
  52. package/app/_app/immutable/chunks/CsmXMAyE.js +1 -0
  53. package/app/_app/immutable/chunks/{BWPhGFHl.js → D0FW0z6R.js} +1 -1
  54. package/app/_app/immutable/chunks/D3nyL-ZK.js +1 -0
  55. package/app/_app/immutable/chunks/DEe2Vsu9.js +1 -0
  56. package/app/_app/immutable/chunks/DTs3DOB0.js +10 -0
  57. package/app/_app/immutable/chunks/Dm6R8q7G.js +1 -0
  58. package/app/_app/immutable/chunks/Dreozana.js +1 -0
  59. package/app/_app/immutable/chunks/Dx8H44Wq.js +2 -0
  60. package/app/_app/immutable/chunks/DxR35SQx.js +24 -0
  61. package/app/_app/immutable/chunks/EcFojPiU.js +11 -0
  62. package/app/_app/immutable/chunks/JBS2nHGN.js +1 -0
  63. package/app/_app/immutable/chunks/TjbilXEg.js +1 -0
  64. package/app/_app/immutable/chunks/ZLqixH7j.js +9 -0
  65. package/app/_app/immutable/chunks/auwiz8v4.js +1 -0
  66. package/app/_app/immutable/chunks/dbZ3U29n.js +1 -0
  67. package/app/_app/immutable/chunks/{D333l2GL.js → gHjidpzw.js} +2 -2
  68. package/app/_app/immutable/chunks/vNEnXNLV.js +3 -0
  69. package/app/_app/immutable/entry/app.vuScBcN4.js +2 -0
  70. package/app/_app/immutable/entry/start.C_vMied2.js +1 -0
  71. package/app/_app/immutable/nodes/0.BeNJfVow.js +9 -0
  72. package/app/_app/immutable/nodes/1.huiLmf4w.js +1 -0
  73. package/app/_app/immutable/nodes/10.B3buyRS-.js +3 -0
  74. package/app/_app/immutable/nodes/11.FNeDQehr.js +1 -0
  75. package/app/_app/immutable/nodes/12.umrKgKLQ.js +4 -0
  76. package/app/_app/immutable/nodes/13.DFr7i0IY.js +1 -0
  77. package/app/_app/immutable/nodes/14.BNgJ8cEq.js +1 -0
  78. package/app/_app/immutable/nodes/2.B3v0JtfB.js +24 -0
  79. package/app/_app/immutable/nodes/3.FLW3AkwU.js +1 -0
  80. package/app/_app/immutable/nodes/4.50B7EkB9.js +1 -0
  81. package/app/_app/immutable/nodes/5.Din7W_Et.js +1 -0
  82. package/app/_app/immutable/nodes/6.7dOUE7nr.js +1 -0
  83. package/app/_app/immutable/nodes/7.C4XsW0qI.js +1 -0
  84. package/app/_app/immutable/nodes/8.D_MREd8V.js +1 -0
  85. package/app/_app/immutable/nodes/9.cn87hhI-.js +1 -0
  86. package/app/_app/version.json +1 -1
  87. package/app/advanced-styles/index.html +84 -0
  88. package/app/ai/index.html +60 -52
  89. package/app/blueprint/index.html +46 -53
  90. package/app/cookbook/index.html +46 -53
  91. package/app/index.html +92 -64
  92. package/app/m/ads/AdDeliveryTier/index.html +52 -59
  93. package/app/m/ads/AdEvent/index.html +52 -59
  94. package/app/m/ads/AdFormat/index.html +52 -59
  95. package/app/m/ads/AdGroup/index.html +52 -59
  96. package/app/m/ads/AdVariation/index.html +52 -59
  97. package/app/m/analytics/AnalyticsDataStream/index.html +52 -59
  98. package/app/m/analytics/AnalyticsEvent/index.html +52 -59
  99. package/app/m/analytics/AnalyticsProperty/index.html +52 -59
  100. package/app/m/analytics/AnalyticsReport/index.html +52 -59
  101. package/app/m/approvals/ApprovalEvent/index.html +52 -59
  102. package/app/m/approvals/ApprovalPolicy/index.html +52 -59
  103. package/app/m/approvals/ApprovalRequest/index.html +52 -59
  104. package/app/m/assets/Asset/attachments/index.html +91 -0
  105. package/app/m/assets/Asset/index.html +52 -59
  106. package/app/m/assets/AssetAssociation/index.html +53 -60
  107. package/app/m/assets/AssetMetafield/index.html +52 -59
  108. package/app/m/assets/AssetStatus/index.html +52 -59
  109. package/app/m/assets/AssetType/index.html +52 -59
  110. package/app/m/assets/Folder/index.html +52 -59
  111. package/app/m/chat/AgentSession/index.html +52 -59
  112. package/app/m/chat/ChatMessage/index.html +53 -60
  113. package/app/m/chat/ChatParticipant/index.html +53 -60
  114. package/app/m/chat/ChatReaction/index.html +52 -59
  115. package/app/m/chat/ChatRoom/index.html +52 -59
  116. package/app/m/chat/ChatThread/index.html +53 -60
  117. package/app/m/chat/VoiceGatewayTurn/index.html +52 -59
  118. package/app/m/chat/VoiceSession/index.html +52 -59
  119. package/app/m/commerce/Agreement/index.html +52 -59
  120. package/app/m/commerce/Cart/index.html +52 -59
  121. package/app/m/commerce/Contract/index.html +52 -59
  122. package/app/m/commerce/ContractLineItem/index.html +53 -60
  123. package/app/m/commerce/Customer/index.html +52 -59
  124. package/app/m/commerce/DocumentTax/index.html +89 -0
  125. package/app/m/commerce/Estimate/index.html +52 -59
  126. package/app/m/commerce/Fulfillment/index.html +52 -59
  127. package/app/m/commerce/FulfillmentLineItem/index.html +53 -60
  128. package/app/m/commerce/Invoice/index.html +52 -59
  129. package/app/m/commerce/InvoiceLineItem/index.html +53 -60
  130. package/app/m/commerce/Lease/index.html +52 -59
  131. package/app/m/commerce/LicenseSale/index.html +52 -59
  132. package/app/m/commerce/Order/index.html +52 -59
  133. package/app/m/commerce/Payment/index.html +52 -59
  134. package/app/m/commerce/PaymentAllocation/index.html +53 -60
  135. package/app/m/commerce/PaymentInstrument/index.html +52 -59
  136. package/app/m/commerce/PaymentIntent/index.html +52 -59
  137. package/app/m/commerce/Payout/index.html +52 -59
  138. package/app/m/commerce/ProductionOrder/index.html +52 -59
  139. package/app/m/commerce/PurchaseContract/index.html +89 -0
  140. package/app/m/commerce/PurchaseOrder/index.html +52 -59
  141. package/app/m/commerce/SalesContract/index.html +89 -0
  142. package/app/m/commerce/SupplierQuote/index.html +89 -0
  143. package/app/m/commerce/TaxCode/index.html +89 -0
  144. package/app/m/commerce/TaxComponent/index.html +89 -0
  145. package/app/m/commerce/TaxSettings/index.html +89 -0
  146. package/app/m/commerce/TaxSummaryReport/index.html +89 -0
  147. package/app/m/commerce/Vendor/index.html +52 -59
  148. package/app/m/commerce/WholesaleOrder/index.html +52 -59
  149. package/app/m/content/Content/index.html +52 -59
  150. package/app/m/content/ContentContribution/index.html +52 -59
  151. package/app/m/content/ContentContributionAttachment/index.html +52 -59
  152. package/app/m/content/ContentContributionRevision/index.html +52 -59
  153. package/app/m/content/ContentContributionType/index.html +52 -59
  154. package/app/m/content/ContentContributor/index.html +52 -59
  155. package/app/m/content/ContentCorrection/index.html +52 -59
  156. package/app/m/content/ContentFeedSource/index.html +52 -59
  157. package/app/m/content/ContentGovernanceAssignment/index.html +52 -59
  158. package/app/m/content/ContentGovernancePolicy/index.html +52 -59
  159. package/app/m/content/ContentGovernanceProfile/index.html +52 -59
  160. package/app/m/content/ContentReference/index.html +52 -59
  161. package/app/m/content/ContentReview/index.html +52 -59
  162. package/app/m/content/ContentVersion/index.html +52 -59
  163. package/app/m/events/Event/index.html +52 -59
  164. package/app/m/events/EventParticipant/index.html +53 -60
  165. package/app/m/events/EventSeries/index.html +52 -59
  166. package/app/m/events/EventType/index.html +52 -59
  167. package/app/m/expenses/Expense/index.html +89 -0
  168. package/app/m/facts/Fact/index.html +52 -59
  169. package/app/m/facts/FactContent/index.html +52 -59
  170. package/app/m/facts/FactEvidence/index.html +52 -59
  171. package/app/m/facts/FactSource/index.html +52 -59
  172. package/app/m/facts/FactSubject/index.html +52 -59
  173. package/app/m/facts/FactTag/index.html +52 -59
  174. package/app/m/fields/FieldPolicy/index.html +52 -59
  175. package/app/m/fields/FieldPolicySuggestion/index.html +52 -59
  176. package/app/m/fields/FieldUsageCounter/index.html +52 -59
  177. package/app/m/images/Image/index.html +52 -59
  178. package/app/m/inventory/InventoryLocation/index.html +52 -59
  179. package/app/m/inventory/StockLevel/index.html +52 -59
  180. package/app/m/inventory/StockMovement/index.html +52 -59
  181. package/app/m/ledgers/Account/index.html +52 -59
  182. package/app/m/ledgers/Journal/index.html +52 -59
  183. package/app/m/ledgers/JournalEntry/index.html +53 -60
  184. package/app/m/manufacturing/Assembly/index.html +52 -59
  185. package/app/m/manufacturing/BillOfMaterials/index.html +52 -59
  186. package/app/m/manufacturing/BomLine/index.html +52 -59
  187. package/app/m/manufacturing/Operation/index.html +52 -59
  188. package/app/m/manufacturing/ProductionRun/index.html +52 -59
  189. package/app/m/manufacturing/ProductionRunCompletion/index.html +52 -59
  190. package/app/m/manufacturing/RoutingStep/index.html +52 -59
  191. package/app/m/marketing/Campaign/index.html +52 -59
  192. package/app/m/marketing/CampaignChannel/index.html +52 -59
  193. package/app/m/marketing/CampaignMetricSnapshot/index.html +52 -59
  194. package/app/m/messages/Account/index.html +52 -59
  195. package/app/m/messages/Attachment/index.html +52 -59
  196. package/app/m/messages/Blacklist/index.html +52 -59
  197. package/app/m/messages/Email/failed-sends/index.html +54 -59
  198. package/app/m/messages/Email/index.html +52 -59
  199. package/app/m/messages/Email/mailbox/index.html +54 -59
  200. package/app/m/messages/EmailAccount/index.html +52 -59
  201. package/app/m/messages/EmailAttachment/index.html +89 -0
  202. package/app/m/messages/EmailFolder/index.html +52 -59
  203. package/app/m/messages/Message/index.html +52 -59
  204. package/app/m/messages/MessagingEndpoint/index.html +52 -59
  205. package/app/m/messages/PersonaMessageRoute/index.html +52 -59
  206. package/app/m/messages/SlackAccount/index.html +52 -59
  207. package/app/m/messages/SlackMessage/index.html +52 -59
  208. package/app/m/messages/TelegramAccount/index.html +52 -59
  209. package/app/m/messages/Tweet/index.html +52 -59
  210. package/app/m/messages/TwitterAccount/index.html +52 -59
  211. package/app/m/messages/Whitelist/index.html +52 -59
  212. package/app/m/messages/ZulipAccount/index.html +52 -59
  213. package/app/m/places/Place/index.html +52 -59
  214. package/app/m/places/PlaceType/index.html +52 -59
  215. package/app/m/products/Category/index.html +52 -59
  216. package/app/m/products/Material/index.html +52 -59
  217. package/app/m/products/Product/index.html +52 -59
  218. package/app/m/products/Product/ingredients/index.html +54 -59
  219. package/app/m/products/ProductVariant/index.html +53 -60
  220. package/app/m/products/Sku/index.html +53 -60
  221. package/app/m/profiles/ApiKey/index.html +52 -59
  222. package/app/m/profiles/Bot/index.html +52 -59
  223. package/app/m/profiles/MagicLinkToken/index.html +52 -59
  224. package/app/m/profiles/NostrIdentity/index.html +52 -59
  225. package/app/m/profiles/OidcIdentity/index.html +52 -59
  226. package/app/m/profiles/Organization/index.html +52 -59
  227. package/app/m/profiles/Person/index.html +52 -59
  228. package/app/m/profiles/Profile/index.html +52 -59
  229. package/app/m/profiles/ProfileMetadata/index.html +52 -59
  230. package/app/m/profiles/ProfileMetafield/index.html +52 -59
  231. package/app/m/profiles/ProfileRelationship/index.html +52 -59
  232. package/app/m/profiles/ProfileRelationshipTerm/index.html +52 -59
  233. package/app/m/profiles/ProfileRelationshipType/index.html +52 -59
  234. package/app/m/profiles/ProfileType/index.html +52 -59
  235. package/app/m/projects/Comment/index.html +53 -60
  236. package/app/m/projects/Issue/index.html +52 -59
  237. package/app/m/projects/Label/index.html +52 -59
  238. package/app/m/projects/Project/index.html +52 -59
  239. package/app/m/projects/ProjectIntegration/index.html +52 -59
  240. package/app/m/projects/PullRequest/index.html +52 -59
  241. package/app/m/projects/Repository/index.html +52 -59
  242. package/app/m/properties/Property/index.html +52 -59
  243. package/app/m/properties/Zone/index.html +52 -59
  244. package/app/m/reports/RuntimeReport/index.html +52 -59
  245. package/app/m/reports/SmrtPrincipalReportRefreshTask/index.html +52 -59
  246. package/app/m/reports/SmrtReportLock/index.html +52 -59
  247. package/app/m/reports/SmrtReportRefreshTask/index.html +52 -59
  248. package/app/m/reports/SmrtReportRun/index.html +52 -59
  249. package/app/m/reports/SmrtReportSchedule/index.html +52 -59
  250. package/app/m/reports/SmrtReportWatermark/index.html +52 -59
  251. package/app/m/sales/AttributionException/index.html +52 -59
  252. package/app/m/sales/AttributionPolicy/index.html +52 -59
  253. package/app/m/sales/Commission/index.html +52 -59
  254. package/app/m/sales/CommissionAdjustment/index.html +52 -59
  255. package/app/m/sales/CommissionPayout/index.html +52 -59
  256. package/app/m/sales/CommissionPlan/index.html +52 -59
  257. package/app/m/sales/Earner/index.html +52 -59
  258. package/app/m/sales/EarnerSourceAttribution/index.html +52 -59
  259. package/app/m/sales/EarningEvent/index.html +52 -59
  260. package/app/m/sales/ExecutedAgreement/index.html +52 -59
  261. package/app/m/sales/Lead/index.html +52 -59
  262. package/app/m/sales/Opportunity/index.html +52 -59
  263. package/app/m/sales/OpportunityConversion/index.html +52 -59
  264. package/app/m/sales/PipelineDefinition/index.html +52 -59
  265. package/app/m/sales/PipelineStage/index.html +53 -60
  266. package/app/m/sales/Referral/index.html +52 -59
  267. package/app/m/sales/ReferralAgreement/index.html +52 -59
  268. package/app/m/sales/ReferralLink/index.html +52 -59
  269. package/app/m/sales/ReferralProgram/index.html +52 -59
  270. package/app/m/sales/ReferralTermSnapshot/index.html +52 -59
  271. package/app/m/sales/ReferralTouch/index.html +52 -59
  272. package/app/m/sales/Referrer/index.html +52 -59
  273. package/app/m/sales/SalesActivity/index.html +52 -59
  274. package/app/m/sales/SalesRepresentative/index.html +52 -59
  275. package/app/m/sites/Site/index.html +52 -59
  276. package/app/m/sites/SiteAgentBinding/index.html +52 -59
  277. package/app/m/social/OAuthState/index.html +52 -59
  278. package/app/m/social/SocialAccount/index.html +52 -59
  279. package/app/m/social/SocialPost/index.html +52 -59
  280. package/app/m/social/SocialPostAnalyticsSnapshot/index.html +52 -59
  281. package/app/m/subscriptions/BillingAdjustment/index.html +52 -59
  282. package/app/m/subscriptions/ClientCharge/index.html +52 -59
  283. package/app/m/subscriptions/CreditGrant/index.html +52 -59
  284. package/app/m/subscriptions/PricingRule/index.html +52 -59
  285. package/app/m/subscriptions/RetailCharge/index.html +52 -59
  286. package/app/m/subscriptions/SpendingPolicy/index.html +52 -59
  287. package/app/m/subscriptions/SubscriptionPlan/index.html +52 -59
  288. package/app/m/subscriptions/TenantSubscription/index.html +52 -59
  289. package/app/m/subscriptions/TenantUsageMetric/index.html +52 -59
  290. package/app/m/support/ServiceTimeEntry/index.html +52 -59
  291. package/app/m/support/SupportAiRun/index.html +52 -59
  292. package/app/m/support/SupportAvailability/index.html +52 -59
  293. package/app/m/support/SupportCase/index.html +52 -59
  294. package/app/m/support/SupportCaseEvent/index.html +52 -59
  295. package/app/m/support/SupportChannelBinding/index.html +52 -59
  296. package/app/m/support/SupportCharge/index.html +52 -59
  297. package/app/m/support/SupportCompensation/index.html +52 -59
  298. package/app/m/support/SupportCompensationPlan/index.html +52 -59
  299. package/app/m/support/SupportEscalation/index.html +52 -59
  300. package/app/m/support/SupportInteraction/index.html +52 -59
  301. package/app/m/support/SupportPlan/index.html +52 -59
  302. package/app/m/support/SupportPolicy/index.html +52 -59
  303. package/app/m/support/SupportQualification/index.html +52 -59
  304. package/app/m/support/SupportServiceTarget/index.html +52 -59
  305. package/app/m/support/SupportSpecialist/index.html +52 -59
  306. package/app/m/support/SupportWorkLink/index.html +52 -59
  307. package/app/m/tags/Tag/index.html +52 -59
  308. package/app/m/tags/TagAlias/index.html +52 -59
  309. package/app/m/timesheets/AttendanceBreak/index.html +52 -59
  310. package/app/m/timesheets/AttendancePunch/index.html +52 -59
  311. package/app/m/timesheets/AttendanceSegment/index.html +89 -0
  312. package/app/m/timesheets/ServiceChargeSnapshot/index.html +52 -59
  313. package/app/m/timesheets/ServiceCompensationSnapshot/index.html +52 -59
  314. package/app/m/timesheets/ServiceTimeEntry/index.html +52 -59
  315. package/app/m/users/Group/index.html +52 -59
  316. package/app/m/users/GroupMember/index.html +52 -59
  317. package/app/m/users/GroupRole/index.html +52 -59
  318. package/app/m/users/Membership/index.html +53 -60
  319. package/app/m/users/MembershipOverride/index.html +52 -59
  320. package/app/m/users/Permission/index.html +52 -59
  321. package/app/m/users/Role/index.html +52 -59
  322. package/app/m/users/RolePermission/index.html +52 -59
  323. package/app/m/users/Session/index.html +52 -59
  324. package/app/m/users/Tenant/index.html +52 -59
  325. package/app/m/users/TenantIntegration/index.html +52 -59
  326. package/app/m/users/TenantPermissionOverride/index.html +52 -59
  327. package/app/m/users/User/index.html +52 -59
  328. package/app/m/video/Character/index.html +52 -59
  329. package/app/m/video/CharacterAsset/index.html +52 -59
  330. package/app/m/video/CompositeJob/index.html +52 -59
  331. package/app/m/video/Performer/index.html +52 -59
  332. package/app/m/video/PerformerAsset/index.html +52 -59
  333. package/app/m/video/Scene/index.html +52 -59
  334. package/app/m/video/SceneAsset/index.html +52 -59
  335. package/app/m/video/VideoComposition/index.html +52 -59
  336. package/app/m/video/VideoCompositionAsset/index.html +52 -59
  337. package/app/m/video/VideoSequence/index.html +52 -59
  338. package/app/m/video/VideoSequenceAsset/index.html +52 -59
  339. package/app/m/video/VideoShot/index.html +52 -59
  340. package/app/m/video/VideoShotAsset/index.html +52 -59
  341. package/app/m/video/VideoShotCharacter/index.html +52 -59
  342. package/app/m/video/VideoWorkflow/index.html +52 -59
  343. package/app/m/voice/VoiceOutput/index.html +52 -59
  344. package/app/m/voice/VoiceProfile/index.html +52 -59
  345. package/app/m/voice/VoiceSample/index.html +52 -59
  346. package/app/packages/ads/index.html +50 -57
  347. package/app/packages/analytics/index.html +50 -57
  348. package/app/packages/approvals/index.html +50 -57
  349. package/app/packages/assets/index.html +50 -57
  350. package/app/packages/chat/index.html +50 -57
  351. package/app/packages/comments/index.html +50 -57
  352. package/app/packages/commerce/index.html +50 -57
  353. package/app/packages/content/index.html +50 -57
  354. package/app/packages/events/index.html +50 -57
  355. package/app/packages/expenses/index.html +50 -57
  356. package/app/packages/facts/index.html +50 -57
  357. package/app/packages/fields/index.html +50 -57
  358. package/app/packages/human-resources/index.html +50 -57
  359. package/app/packages/images/index.html +50 -57
  360. package/app/packages/index.html +49 -55
  361. package/app/packages/ingestion/index.html +85 -0
  362. package/app/packages/inventory/index.html +50 -57
  363. package/app/packages/ledgers/index.html +50 -57
  364. package/app/packages/manufacturing/index.html +50 -57
  365. package/app/packages/marketing/index.html +50 -57
  366. package/app/packages/messages/index.html +50 -57
  367. package/app/packages/places/index.html +50 -57
  368. package/app/packages/preferences/index.html +50 -57
  369. package/app/packages/products/index.html +50 -57
  370. package/app/packages/profiles/index.html +50 -57
  371. package/app/packages/projects/index.html +50 -57
  372. package/app/packages/properties/index.html +50 -57
  373. package/app/packages/reports/index.html +50 -57
  374. package/app/packages/sales/index.html +50 -57
  375. package/app/packages/sites/index.html +50 -57
  376. package/app/packages/social/index.html +50 -57
  377. package/app/packages/subscriptions/index.html +50 -57
  378. package/app/packages/support/index.html +50 -57
  379. package/app/packages/tags/index.html +50 -57
  380. package/app/packages/timesheets/index.html +50 -57
  381. package/app/packages/users/index.html +50 -57
  382. package/app/packages/video/index.html +50 -57
  383. package/app/packages/voice/index.html +50 -57
  384. package/app/packages/webhooks/index.html +85 -0
  385. package/app/recipes/account-access/help/index.html +52 -57
  386. package/app/recipes/account-access/index.html +57 -59
  387. package/app/recipes/activity/help/index.html +52 -57
  388. package/app/recipes/activity/index.html +57 -59
  389. package/app/recipes/agreements/help/index.html +52 -57
  390. package/app/recipes/agreements/index.html +57 -59
  391. package/app/recipes/analytics.reports/help/index.html +52 -57
  392. package/app/recipes/analytics.reports/index.html +57 -59
  393. package/app/recipes/assets/help/index.html +52 -57
  394. package/app/recipes/assets/index.html +57 -59
  395. package/app/recipes/billing/help/index.html +52 -57
  396. package/app/recipes/billing/index.html +57 -59
  397. package/app/recipes/chat.assistant/help/index.html +52 -57
  398. package/app/recipes/chat.assistant/index.html +57 -59
  399. package/app/recipes/comments/help/index.html +52 -57
  400. package/app/recipes/comments/index.html +57 -59
  401. package/app/recipes/commerce.customers/help/index.html +52 -57
  402. package/app/recipes/commerce.customers/index.html +57 -59
  403. package/app/recipes/commerce.estimates/help/index.html +52 -57
  404. package/app/recipes/commerce.estimates/index.html +57 -59
  405. package/app/recipes/commerce.purchases/help/index.html +52 -57
  406. package/app/recipes/commerce.purchases/index.html +57 -59
  407. package/app/recipes/commerce.sales/help/index.html +52 -57
  408. package/app/recipes/commerce.sales/index.html +57 -59
  409. package/app/recipes/commerce.vendors/help/index.html +52 -57
  410. package/app/recipes/commerce.vendors/index.html +57 -59
  411. package/app/recipes/commerce.wholesale/help/index.html +52 -57
  412. package/app/recipes/commerce.wholesale/index.html +57 -59
  413. package/app/recipes/events.calendar/help/index.html +52 -57
  414. package/app/recipes/events.calendar/index.html +57 -59
  415. package/app/recipes/expenses.tracking/help/index.html +88 -0
  416. package/app/recipes/expenses.tracking/index.html +92 -0
  417. package/app/recipes/fields.form-customization/help/index.html +52 -57
  418. package/app/recipes/fields.form-customization/index.html +57 -59
  419. package/app/recipes/ingestion/help/index.html +88 -0
  420. package/app/recipes/ingestion/index.html +93 -0
  421. package/app/recipes/integrations/help/index.html +88 -0
  422. package/app/recipes/integrations/index.html +92 -0
  423. package/app/recipes/inventory.stock/help/index.html +52 -57
  424. package/app/recipes/inventory.stock/index.html +57 -59
  425. package/app/recipes/ledgers.bookkeeping/help/index.html +52 -57
  426. package/app/recipes/ledgers.bookkeeping/index.html +57 -59
  427. package/app/recipes/messages/help/index.html +52 -57
  428. package/app/recipes/messages/index.html +57 -59
  429. package/app/recipes/products/help/index.html +52 -57
  430. package/app/recipes/products/index.html +57 -59
  431. package/app/recipes/projects.tracker/help/index.html +52 -57
  432. package/app/recipes/projects.tracker/index.html +57 -59
  433. package/app/recipes/reports.materialized/help/index.html +52 -57
  434. package/app/recipes/reports.materialized/index.html +57 -59
  435. package/app/recipes/reports.runtime/help/index.html +88 -0
  436. package/app/recipes/reports.runtime/index.html +92 -0
  437. package/app/recipes/sales.pipeline/help/index.html +52 -57
  438. package/app/recipes/sales.pipeline/index.html +57 -59
  439. package/app/recipes/tags.taxonomy/help/index.html +52 -57
  440. package/app/recipes/tags.taxonomy/index.html +57 -59
  441. package/app/recipes/team-collaboration/help/index.html +52 -57
  442. package/app/recipes/team-collaboration/index.html +57 -59
  443. package/app/recipes/timesheets.time-entries/help/index.html +88 -0
  444. package/app/recipes/timesheets.time-entries/index.html +92 -0
  445. package/app/s/custom-accounts/index.html +82 -0
  446. package/app/s/custom-appointments/index.html +82 -0
  447. package/app/s/custom-billing/index.html +47 -54
  448. package/app/s/custom-buying/index.html +47 -54
  449. package/app/s/custom-checkout/index.html +82 -0
  450. package/app/s/custom-classes/index.html +47 -54
  451. package/app/s/custom-clients/index.html +82 -0
  452. package/app/s/custom-events/index.html +82 -0
  453. package/app/s/custom-fleet/index.html +82 -0
  454. package/app/s/custom-giving/index.html +82 -0
  455. package/app/s/custom-jobs/index.html +47 -54
  456. package/app/s/custom-kitchen/index.html +47 -54
  457. package/app/s/custom-material/index.html +47 -54
  458. package/app/s/custom-meetings/index.html +82 -0
  459. package/app/s/custom-members/index.html +47 -54
  460. package/app/s/custom-parts/index.html +47 -54
  461. package/app/s/custom-rentals/index.html +82 -0
  462. package/app/s/custom-roastery/index.html +82 -0
  463. package/app/s/custom-schedule/index.html +47 -54
  464. package/app/s/custom-shelf/index.html +82 -0
  465. package/app/s/custom-shop/index.html +47 -54
  466. package/app/s/custom-wholesale/index.html +47 -54
  467. package/app/s/custom-work/index.html +82 -0
  468. package/app/s/custom-yard/index.html +82 -0
  469. package/app/s/section-access-control/index.html +47 -54
  470. package/app/s/section-account-security/index.html +47 -54
  471. package/app/s/section-accounting/index.html +47 -54
  472. package/app/s/section-activity/index.html +47 -54
  473. package/app/s/section-agreements/index.html +47 -54
  474. package/app/s/section-analytics/index.html +47 -54
  475. package/app/s/section-assets/index.html +47 -54
  476. package/app/s/section-billing/index.html +47 -54
  477. package/app/s/section-calendar/index.html +47 -54
  478. package/app/s/section-catalog/index.html +47 -54
  479. package/app/s/section-chat.assistant/index.html +47 -54
  480. package/app/s/section-comments/index.html +47 -54
  481. package/app/s/section-fields.form-customization/index.html +47 -54
  482. package/app/s/section-ingestion/index.html +82 -0
  483. package/app/s/section-integrations/index.html +82 -0
  484. package/app/s/section-messages/index.html +47 -54
  485. package/app/s/section-more/index.html +47 -54
  486. package/app/s/section-operations/index.html +47 -54
  487. package/app/s/section-projects/index.html +47 -54
  488. package/app/s/section-purchasing/index.html +47 -54
  489. package/app/s/section-reports.materialized/index.html +47 -54
  490. package/app/s/section-reports.runtime/index.html +82 -0
  491. package/app/s/section-sales/index.html +47 -54
  492. package/app/s/section-taxonomy/index.html +47 -54
  493. package/app/s/section-team/index.html +47 -54
  494. package/app/s/section-work/index.html +82 -0
  495. package/dist/ai/state.svelte.d.ts +22 -4
  496. package/dist/ai/state.svelte.js +78 -15
  497. package/dist/ai/status.js +8 -0
  498. package/dist/assistant/change.d.ts +14 -3
  499. package/dist/assistant/change.js +26 -3
  500. package/dist/assistant/engine.js +5 -1
  501. package/dist/assistant/prompt.js +7 -3
  502. package/dist/assistant/session.svelte.d.ts +1 -0
  503. package/dist/assistant/session.svelte.js +22 -4
  504. package/dist/catalog/catalog.json +11244 -14189
  505. package/dist/catalog/generate/exclusions.d.ts +8 -0
  506. package/dist/catalog/generate/exclusions.js +29 -0
  507. package/dist/catalog/generate/extract.js +29 -8
  508. package/dist/catalog/types.d.ts +7 -0
  509. package/dist/components/AdvancedStyles.svelte +138 -0
  510. package/dist/components/AdvancedStyles.svelte.d.ts +6 -0
  511. package/dist/components/AiModelsPage.svelte +40 -0
  512. package/dist/components/AiModelsPage.svelte.d.ts +7 -0
  513. package/dist/components/AiSetup.svelte +40 -8
  514. package/dist/components/AiStatusIcons.svelte +8 -5
  515. package/dist/components/AppSettings.svelte +105 -1
  516. package/dist/components/BrowserAssistant.svelte +25 -22
  517. package/dist/components/BrowserAssistant.svelte.d.ts +2 -0
  518. package/dist/components/ChildRecords.svelte +61 -14
  519. package/dist/components/ChildRecords.svelte.d.ts +1 -0
  520. package/dist/components/ConnectTools.svelte +5 -2
  521. package/dist/components/CookbooksPanel.svelte +56 -33
  522. package/dist/components/CopyButton.svelte +65 -0
  523. package/dist/components/CopyButton.svelte.d.ts +24 -0
  524. package/dist/components/ExportPanel.svelte +292 -57
  525. package/dist/components/ExportPanel.svelte.d.ts +10 -1
  526. package/dist/components/FeatureCard.svelte +21 -10
  527. package/dist/components/FeaturesPanel.svelte +4 -1
  528. package/dist/components/FieldInput.svelte +6 -3
  529. package/dist/components/FieldMapForm.svelte +6 -10
  530. package/dist/components/FieldMapForm.svelte.d.ts +1 -0
  531. package/dist/components/FormWorkspace.svelte +80 -9
  532. package/dist/components/FormWorkspace.svelte.d.ts +1 -0
  533. package/dist/components/HeaderIconLink.svelte +86 -0
  534. package/dist/components/HeaderIconLink.svelte.d.ts +14 -0
  535. package/dist/components/HelpView.svelte +3 -0
  536. package/dist/components/ModelOptions.svelte +13 -2
  537. package/dist/components/ModelPage.svelte +33 -5
  538. package/dist/components/ModelPage.svelte.d.ts +4 -0
  539. package/dist/components/ModelWorkspace.svelte +148 -50
  540. package/dist/components/ModelWorkspace.svelte.d.ts +4 -0
  541. package/dist/components/PackagePage.svelte +96 -0
  542. package/dist/components/PackagePage.svelte.d.ts +9 -0
  543. package/dist/components/ProductMedia.svelte +95 -0
  544. package/dist/components/ProductMedia.svelte.d.ts +10 -0
  545. package/dist/components/RecipeCards.svelte +13 -1
  546. package/dist/components/RecipeHelp.svelte +3 -0
  547. package/dist/components/RecipeOptions.svelte +13 -1
  548. package/dist/components/RecordFeatures.svelte +22 -8
  549. package/dist/components/RecordView.svelte +354 -0
  550. package/dist/components/RecordView.svelte.d.ts +14 -0
  551. package/dist/components/RelationField.svelte +5 -2
  552. package/dist/components/SectionActions.svelte +8 -5
  553. package/dist/components/SectionHeading.svelte +63 -0
  554. package/dist/components/SectionHeading.svelte.d.ts +11 -0
  555. package/dist/components/SectionIcons.svelte +15 -3
  556. package/dist/components/SectionOverview.svelte +33 -3
  557. package/dist/components/SectionOverview.svelte.d.ts +4 -0
  558. package/dist/components/SectionPage.svelte +25 -165
  559. package/dist/components/SectionView.svelte +172 -0
  560. package/dist/components/SectionView.svelte.d.ts +18 -0
  561. package/dist/components/SettingsPanel.svelte +3 -9
  562. package/dist/components/SettingsPanel.svelte.d.ts +1 -5
  563. package/dist/components/ThemeBridge.svelte +80 -4
  564. package/dist/components/ThemeBridge.svelte.d.ts +5 -1
  565. package/dist/components/ThemeSection.svelte +208 -117
  566. package/dist/components/ThemeSection.svelte.d.ts +3 -7
  567. package/dist/components/VariantGridForm.svelte +9 -13
  568. package/dist/components/VariantGridForm.svelte.d.ts +1 -0
  569. package/dist/components/VoiceTyping.svelte +3 -0
  570. package/dist/cookbook/describe.d.ts +29 -0
  571. package/dist/cookbook/describe.js +164 -0
  572. package/dist/cookbook/file.d.ts +6 -0
  573. package/dist/cookbook/file.js +18 -4
  574. package/dist/cookbook/prompt.d.ts +49 -0
  575. package/dist/cookbook/prompt.js +100 -0
  576. package/dist/cookbook/store.svelte.d.ts +13 -0
  577. package/dist/cookbook/store.svelte.js +36 -8
  578. package/dist/core/app.d.ts +33 -8
  579. package/dist/core/app.js +112 -8
  580. package/dist/core/prompt.js +10 -1
  581. package/dist/core/reply.d.ts +6 -1
  582. package/dist/data/children.d.ts +50 -6
  583. package/dist/data/children.js +146 -16
  584. package/dist/data/derived.d.ts +37 -29
  585. package/dist/data/derived.js +49 -30
  586. package/dist/data/display.d.ts +21 -8
  587. package/dist/data/display.js +74 -11
  588. package/dist/data/fakes.d.ts +48 -9
  589. package/dist/data/fakes.js +146 -22
  590. package/dist/data/labels.d.ts +7 -2
  591. package/dist/data/labels.js +12 -2
  592. package/dist/data/list-sort.d.ts +8 -0
  593. package/dist/data/list-sort.js +45 -0
  594. package/dist/data/money.d.ts +227 -0
  595. package/dist/data/money.js +413 -0
  596. package/dist/data/packs.d.ts +13 -0
  597. package/dist/data/packs.js +1224 -0
  598. package/dist/data/planner-source.js +123 -3
  599. package/dist/data/source.d.ts +13 -2
  600. package/dist/data/source.js +274 -40
  601. package/dist/features/palette.d.ts +2 -0
  602. package/dist/features/palette.js +1 -1
  603. package/dist/forms/stock.d.ts +1 -1
  604. package/dist/forms/stock.js +3 -1
  605. package/dist/index.d.ts +8 -3
  606. package/dist/index.js +6 -1
  607. package/dist/inference/byo.svelte.d.ts +8 -4
  608. package/dist/inference/byo.svelte.js +36 -8
  609. package/dist/inference/config.d.ts +12 -5
  610. package/dist/inference/config.js +96 -40
  611. package/dist/inference/openai.js +5 -0
  612. package/dist/kitchen/LiveKitchenBridge.svelte +73 -0
  613. package/dist/kitchen/LiveKitchenBridge.svelte.d.ts +8 -0
  614. package/dist/kitchen/client.js +10 -4
  615. package/dist/kitchen/live.d.ts +7 -0
  616. package/dist/kitchen/live.js +51 -0
  617. package/dist/library/icons.js +34 -0
  618. package/dist/library/library.json +1546 -15
  619. package/dist/library/pending.json +5 -0
  620. package/dist/library/types.d.ts +4 -0
  621. package/dist/motion/tokens.d.ts +6 -0
  622. package/dist/motion/tokens.js +32 -0
  623. package/dist/motion/view-transition.d.ts +13 -0
  624. package/dist/motion/view-transition.js +17 -0
  625. package/dist/overviews/definitions.d.ts +41 -2
  626. package/dist/overviews/definitions.js +111 -4
  627. package/dist/overviews/models.d.ts +10 -0
  628. package/dist/overviews/models.js +19 -0
  629. package/dist/overviews/registry.d.ts +92 -5
  630. package/dist/overviews/registry.js +468 -58
  631. package/dist/overviews/validate.js +2 -2
  632. package/dist/planner/Planner.svelte +374 -166
  633. package/dist/planner/PlannerControls.svelte +255 -0
  634. package/dist/planner/PlannerControls.svelte.d.ts +17 -0
  635. package/dist/planner/PlannerLifecycle.svelte +73 -0
  636. package/dist/planner/PlannerLifecycle.svelte.d.ts +9 -0
  637. package/dist/planner/app.svelte.d.ts +12 -2
  638. package/dist/planner/app.svelte.js +13 -3
  639. package/dist/planner/assistant.js +21 -3
  640. package/dist/planner/commands/adapter.js +9 -2
  641. package/dist/planner/commands/types.d.ts +1 -1
  642. package/dist/planner/commands/types.js +1 -0
  643. package/dist/planner/header-icons.d.ts +12 -0
  644. package/dist/planner/header-icons.js +12 -0
  645. package/dist/planner/host/HostPlanner.svelte +70 -0
  646. package/dist/planner/host/HostPlanner.svelte.d.ts +17 -0
  647. package/dist/planner/host/session.svelte.d.ts +28 -0
  648. package/dist/planner/host/session.svelte.js +186 -0
  649. package/dist/planner/routes.d.ts +49 -0
  650. package/dist/planner/routes.js +64 -0
  651. package/dist/planner/shell.d.ts +40 -0
  652. package/dist/planner/shell.js +56 -0
  653. package/dist/planner/tab.svelte.d.ts +6 -3
  654. package/dist/planner/tab.svelte.js +11 -4
  655. package/dist/planner/title.d.ts +15 -0
  656. package/dist/planner/title.js +21 -0
  657. package/dist/planner/title.svelte.d.ts +6 -0
  658. package/dist/planner/title.svelte.js +11 -0
  659. package/dist/planner/types.d.ts +39 -7
  660. package/dist/products/media.d.ts +20 -0
  661. package/dist/products/media.js +65 -0
  662. package/dist/recipes/help/descriptions.json +1 -3
  663. package/dist/recipes/index.d.ts +2 -0
  664. package/dist/recipes/index.js +6 -0
  665. package/dist/recipes/plumbing.d.ts +35 -1
  666. package/dist/recipes/plumbing.js +74 -0
  667. package/dist/screens/definition.d.ts +35 -0
  668. package/dist/screens/definition.js +132 -0
  669. package/dist/screens/relations.d.ts +17 -0
  670. package/dist/screens/relations.js +98 -0
  671. package/dist/screens/totals.d.ts +37 -0
  672. package/dist/screens/totals.js +65 -0
  673. package/dist/sections/info.d.ts +1 -1
  674. package/dist/sections/info.js +2 -2
  675. package/dist/settings/app-settings.d.ts +17 -1
  676. package/dist/settings/app-settings.js +40 -3
  677. package/dist/smrt-version.d.ts +2 -0
  678. package/dist/smrt-version.js +4 -0
  679. package/dist/styles/planner-forms.css +53 -0
  680. package/dist/styles/planner-lists.css +43 -0
  681. package/dist/theme/css-highlight.d.ts +6 -0
  682. package/dist/theme/css-highlight.js +34 -0
  683. package/dist/theme/custom-css.svelte.d.ts +34 -0
  684. package/dist/theme/custom-css.svelte.js +246 -0
  685. package/dist/theme/runtime.js +25 -5
  686. package/dist/theme/theme.d.ts +26 -3
  687. package/dist/theme/theme.js +70 -2
  688. package/dist/upstream/overlay.d.ts +14 -5
  689. package/dist/upstream/overlay.js +20 -2
  690. package/package.json +13 -6
  691. package/app/_app/immutable/assets/0.B5zXkXe_.css +0 -1
  692. package/app/_app/immutable/assets/10.hpcnxvK1.css +0 -1
  693. package/app/_app/immutable/assets/11.D7zoXfVV.css +0 -1
  694. package/app/_app/immutable/assets/12.CPobm1ED.css +0 -1
  695. package/app/_app/immutable/assets/2.CyaWdRdI.css +0 -1
  696. package/app/_app/immutable/assets/3.BlPQOes8.css +0 -1
  697. package/app/_app/immutable/assets/8.2gQeKBp_.css +0 -1
  698. package/app/_app/immutable/assets/9.HOPT4xtg.css +0 -1
  699. package/app/_app/immutable/assets/AiSetup.Cb22AigN.css +0 -1
  700. package/app/_app/immutable/assets/Button.DkP0qkG9.css +0 -1
  701. package/app/_app/immutable/assets/ConnectTools.BgIJOOGW.css +0 -1
  702. package/app/_app/immutable/assets/FieldMapForm.BCU-4pO4.css +0 -1
  703. package/app/_app/immutable/assets/ModelPage.Dd3LcMta.css +0 -1
  704. package/app/_app/immutable/assets/SectionActions.CTkVuNMF.css +0 -1
  705. package/app/_app/immutable/assets/SectionIcons.5Udq9vN-.css +0 -1
  706. package/app/_app/immutable/assets/SegmentedControl.B8SrQacd.css +0 -1
  707. package/app/_app/immutable/assets/dist.C5nHBk_O.css +0 -1
  708. package/app/_app/immutable/assets/feedback.BVKAwFck.css +0 -1
  709. package/app/_app/immutable/assets/forms.BChZ2RWM.css +0 -1
  710. package/app/_app/immutable/assets/percent.LH0z-ozZ.css +0 -1
  711. package/app/_app/immutable/assets/store.CGDwHkkF.css +0 -1
  712. package/app/_app/immutable/assets/ui.B1A1Zl2p.css +0 -1
  713. package/app/_app/immutable/assets/workspace.BIMkuZDb.css +0 -1
  714. package/app/_app/immutable/chunks/1okeBSoq.js +0 -1
  715. package/app/_app/immutable/chunks/B32EWqI8.js +0 -9
  716. package/app/_app/immutable/chunks/B4Kevpe0.js +0 -1
  717. package/app/_app/immutable/chunks/BKwRT_1p.js +0 -1
  718. package/app/_app/immutable/chunks/BS4h9ES-.js +0 -1
  719. package/app/_app/immutable/chunks/BYde9M_U.js +0 -1
  720. package/app/_app/immutable/chunks/CMhpRMKg.js +0 -1
  721. package/app/_app/immutable/chunks/CPRHZZeW.js +0 -1
  722. package/app/_app/immutable/chunks/CRQ1Pmzr.js +0 -1
  723. package/app/_app/immutable/chunks/CV-2zt0K.js +0 -2
  724. package/app/_app/immutable/chunks/CWtfVMDz.js +0 -1
  725. package/app/_app/immutable/chunks/Chyo8rdT.js +0 -3
  726. package/app/_app/immutable/chunks/CmmuWmp6.js +0 -2
  727. package/app/_app/immutable/chunks/CrFNLK0f.js +0 -1
  728. package/app/_app/immutable/chunks/CygC84VT.js +0 -2
  729. package/app/_app/immutable/chunks/D0VgZnk1.js +0 -1
  730. package/app/_app/immutable/chunks/DD7gpKb2.js +0 -1
  731. package/app/_app/immutable/chunks/DJtH-lRi.js +0 -3
  732. package/app/_app/immutable/chunks/DNRgqfTx.js +0 -1
  733. package/app/_app/immutable/chunks/DVRKjN-E.js +0 -1
  734. package/app/_app/immutable/chunks/D_J_XtJy.js +0 -846
  735. package/app/_app/immutable/chunks/Dp9GVO-9.js +0 -1
  736. package/app/_app/immutable/chunks/DqcD-WtP.js +0 -1
  737. package/app/_app/immutable/chunks/OJ_lLTHH.js +0 -1
  738. package/app/_app/immutable/chunks/QukgIHDX.js +0 -1
  739. package/app/_app/immutable/chunks/WxSPP8QW.js +0 -4
  740. package/app/_app/immutable/chunks/leQCwW2d.js +0 -1
  741. package/app/_app/immutable/chunks/p6bgzXiY.js +0 -1
  742. package/app/_app/immutable/chunks/ufuM4XBq.js +0 -33
  743. package/app/_app/immutable/entry/app.D5JJain6.js +0 -2
  744. package/app/_app/immutable/entry/start.CH9DJLgI.js +0 -1
  745. package/app/_app/immutable/nodes/0.CL1MxOva.js +0 -10
  746. package/app/_app/immutable/nodes/1.BO731RRg.js +0 -1
  747. package/app/_app/immutable/nodes/10.1nQxyH9H.js +0 -4
  748. package/app/_app/immutable/nodes/11.Cw0JnQF3.js +0 -1
  749. package/app/_app/immutable/nodes/12.BmZyLHbM.js +0 -1
  750. package/app/_app/immutable/nodes/2.BEw046av.js +0 -17
  751. package/app/_app/immutable/nodes/3.DvwpTAQA.js +0 -1
  752. package/app/_app/immutable/nodes/4.qrT4bnmS.js +0 -1
  753. package/app/_app/immutable/nodes/5.DDLa2uhV.js +0 -1
  754. package/app/_app/immutable/nodes/6.DN0QTY6z.js +0 -1
  755. package/app/_app/immutable/nodes/7.C_8N82Wq.js +0 -1
  756. package/app/_app/immutable/nodes/8.D2Mszsua.js +0 -3
  757. package/app/_app/immutable/nodes/9.CLYsywul.js +0 -1
  758. package/app/m/content/Contents/index.html +0 -96
  759. package/app/m/preferences/UiPreferenceRecord/index.html +0 -96
  760. package/app/m/users/AccessRequest/index.html +0 -96
  761. package/app/m/users/ResourceGrant/index.html +0 -96
  762. package/app/m/users/UsersCliAuthRequest/index.html +0 -96
  763. package/app/m/users/UsersMagicLinkToken/index.html +0 -96
package/dist/index.js CHANGED
@@ -1,5 +1,6 @@
1
1
  /**
2
- * smrt planner as a package: mount the `Planner` component in a host layout,
2
+ * smrt planner as a package: mount `Planner` for the full app shell, or
3
+ * `PlannerControls` inside a host-owned shell,
3
4
  * drive it with the typed command set (`./commands` has no UI in it), and read
4
5
  * its plan as a compact snapshot.
5
6
  *
@@ -12,5 +13,9 @@ export { parseKitchenConfig, sendToKitchen, } from "./kitchen/client.js";
12
13
  export { KITCHEN_FRAGMENT_KEY, readKitchenFragment, } from "./kitchen/fragment.js";
13
14
  export { createPlannerAssistant, } from "./planner/assistant.js";
14
15
  export * from "./planner/commands/index.js";
16
+ export { default as HostPlanner } from './planner/host/HostPlanner.svelte';
17
+ export { createHostSession, } from "./planner/host/session.svelte.js";
15
18
  export { plannerController } from "./planner/instance.js";
16
19
  export { default as Planner } from './planner/Planner.svelte';
20
+ export { default as PlannerControls } from './planner/PlannerControls.svelte';
21
+ export { PLANNER_SHELL_EDGE_TOGGLES, PLANNER_SHELL_PANEL_DEFAULTS, plannerShellProps, } from "./planner/shell.js";
@@ -1,5 +1,5 @@
1
1
  import type { ChatModel } from '../assistant/transport.ts';
2
- import type { ByoPresetDefinition } from './config.ts';
2
+ import type { ByoPresetDefinition, CredentialPersistence } from './config.ts';
3
3
  import { type ConnectionResult } from './openai.ts';
4
4
  /** Choices (not the key): which endpoint, its address and model, and whether it is in use. */
5
5
  export declare const BYO_PREFS_KEY = "smrt-planner:inference:v1";
@@ -24,6 +24,8 @@ export declare function loadByoKeys(storage: Storage | null): Record<string, Byo
24
24
  export type ByoTestStatus = 'idle' | 'testing' | 'ok' | 'failed';
25
25
  export interface ByoOptions {
26
26
  storage: Storage | null;
27
+ /** Credentials default to local storage for compatibility; hosted apps use memory. */
28
+ credentialPersistence?: CredentialPersistence;
27
29
  /** The config's `byo.presets`; default all built-ins. */
28
30
  presets?: readonly (string | ByoPresetDefinition)[];
29
31
  fetch?: typeof fetch;
@@ -33,8 +35,9 @@ export interface ByoOptions {
33
35
  /**
34
36
  * The visitor's own OpenAI-compatible endpoint: the preset they picked, its
35
37
  * address, model and key, a connection test, and whether the assistant uses
36
- * it. The key lives only in this browser's localStorage and is only ever sent
37
- * as the Authorization header to the chosen address.
38
+ * it. The key lives in the configured credential store (tab memory for hosted
39
+ * policies, localStorage for the compatible standalone default) and is only
40
+ * ever sent as the Authorization header to the chosen address.
38
41
  */
39
42
  export declare class ByoModel {
40
43
  readonly presets: ByoPresetDefinition[];
@@ -45,6 +48,7 @@ export declare class ByoModel {
45
48
  testStatus: ByoTestStatus;
46
49
  testMessage: string;
47
50
  private readonly options;
51
+ private readonly credentialStorage;
48
52
  constructor(options: ByoOptions);
49
53
  get preset(): ByoPresetDefinition | undefined;
50
54
  get baseUrl(): string;
@@ -82,5 +86,5 @@ export declare class ByoModel {
82
86
  * (a mounted `Planner` in byo mode has no AI page of its own). Null when none
83
87
  * is connected or what was saved is incomplete.
84
88
  */
85
- export declare function savedByoChat(storage: Storage | null, presets?: readonly (string | ByoPresetDefinition)[], fetcher?: typeof fetch): ChatModel | null;
89
+ export declare function savedByoChat(storage: Storage | null, presets?: readonly (string | ByoPresetDefinition)[], fetcher?: typeof fetch, credentialPersistence?: CredentialPersistence): ChatModel | null;
86
90
  export {};
@@ -17,15 +17,22 @@ export function loadByoPrefs(storage) {
17
17
  if (typeof value.preset === 'string')
18
18
  prefs.preset = value.preset;
19
19
  prefs.active = value.active === true;
20
+ let sanitized = false;
20
21
  if (isObject(value.entries)) {
21
22
  for (const [id, entry] of Object.entries(value.entries)) {
22
23
  if (isObject(entry) &&
23
24
  typeof entry.baseUrl === 'string' &&
24
25
  typeof entry.model === 'string') {
25
- prefs.entries[id] = { baseUrl: entry.baseUrl, model: entry.model };
26
+ const baseUrl = normalizeBaseUrl(entry.baseUrl) ?? '';
27
+ sanitized ||= baseUrl !== entry.baseUrl;
28
+ prefs.entries[id] = { baseUrl, model: entry.model };
26
29
  }
27
30
  }
28
31
  }
32
+ if (sanitized) {
33
+ prefs.active = false;
34
+ storage?.setItem(BYO_PREFS_KEY, JSON.stringify(prefs));
35
+ }
29
36
  }
30
37
  catch {
31
38
  // Unreadable or unavailable: start empty.
@@ -59,8 +66,9 @@ export function loadByoKeys(storage) {
59
66
  /**
60
67
  * The visitor's own OpenAI-compatible endpoint: the preset they picked, its
61
68
  * address, model and key, a connection test, and whether the assistant uses
62
- * it. The key lives only in this browser's localStorage and is only ever sent
63
- * as the Authorization header to the chosen address.
69
+ * it. The key lives in the configured credential store (tab memory for hosted
70
+ * policies, localStorage for the compatible standalone default) and is only
71
+ * ever sent as the Authorization header to the chosen address.
64
72
  */
65
73
  export class ByoModel {
66
74
  presets;
@@ -71,11 +79,24 @@ export class ByoModel {
71
79
  testStatus = $state('idle');
72
80
  testMessage = $state('');
73
81
  options;
82
+ credentialStorage;
74
83
  constructor(options) {
75
84
  this.options = options;
85
+ this.credentialStorage =
86
+ options.credentialPersistence === 'memory' ? null : options.storage;
87
+ if (options.credentialPersistence === 'memory') {
88
+ // A hosted memory-only policy also removes a key an older local policy
89
+ // may have left on this origin. Endpoint/model preferences stay put.
90
+ try {
91
+ options.storage?.removeItem(BYO_KEYS_KEY);
92
+ }
93
+ catch {
94
+ // Storage can be unavailable; memory-only behavior still holds.
95
+ }
96
+ }
76
97
  this.presets = resolvePresets(options.presets);
77
98
  const prefs = loadByoPrefs(options.storage);
78
- this.keys = loadByoKeys(options.storage);
99
+ this.keys = loadByoKeys(this.credentialStorage);
79
100
  this.entries = prefs.entries;
80
101
  this.presetId = this.presets.some((p) => p.id === prefs.preset)
81
102
  ? prefs.preset
@@ -226,13 +247,20 @@ export class ByoModel {
226
247
  }
227
248
  save() {
228
249
  try {
250
+ const entries = Object.fromEntries(Object.entries(this.entries).map(([id, entry]) => [
251
+ id,
252
+ {
253
+ baseUrl: normalizeBaseUrl(entry.baseUrl) ?? '',
254
+ model: entry.model,
255
+ },
256
+ ]));
229
257
  const prefs = {
230
258
  preset: this.presetId,
231
259
  active: this.active,
232
- entries: { ...this.entries },
260
+ entries,
233
261
  };
234
262
  this.options.storage?.setItem(BYO_PREFS_KEY, JSON.stringify(prefs));
235
- this.options.storage?.setItem(BYO_KEYS_KEY, JSON.stringify(this.keys));
263
+ this.credentialStorage?.setItem(BYO_KEYS_KEY, JSON.stringify(this.keys));
236
264
  }
237
265
  catch {
238
266
  // Not saved; the choice still holds for this visit.
@@ -244,7 +272,7 @@ export class ByoModel {
244
272
  * (a mounted `Planner` in byo mode has no AI page of its own). Null when none
245
273
  * is connected or what was saved is incomplete.
246
274
  */
247
- export function savedByoChat(storage, presets, fetcher) {
275
+ export function savedByoChat(storage, presets, fetcher, credentialPersistence = 'local') {
248
276
  const prefs = loadByoPrefs(storage);
249
277
  if (!prefs.active)
250
278
  return null;
@@ -252,7 +280,7 @@ export function savedByoChat(storage, presets, fetcher) {
252
280
  const entry = prefs.entries[prefs.preset];
253
281
  const baseUrl = normalizeBaseUrl(entry?.baseUrl ?? preset?.baseUrl ?? '');
254
282
  const model = (entry?.model ?? preset?.model ?? '').trim();
255
- const saved = loadByoKeys(storage)[prefs.preset];
283
+ const saved = loadByoKeys(credentialPersistence === 'memory' ? null : storage)[prefs.preset];
256
284
  const key = saved && saved.origin === originOf(baseUrl ?? '') ? saved.key : '';
257
285
  if (!preset || !baseUrl || !model)
258
286
  return null;
@@ -9,7 +9,9 @@ import { type KitchenEndpoint } from '../kitchen/client.ts';
9
9
  * - `byo`: the visitor's own OpenAI-compatible endpoint (Ollama, OpenRouter,
10
10
  * OpenAI, custom), configured on the AI page.
11
11
  */
12
- export type InferenceMode = 'browser' | 'host' | 'byo';
12
+ export type InferenceMode = 'manual' | 'browser' | 'host' | 'byo';
13
+ /** Where BYO provider credentials may live. Preferences are always separate. */
14
+ export type CredentialPersistence = 'local' | 'memory';
13
15
  export declare const INFERENCE_MODES: readonly InferenceMode[];
14
16
  /** A bring-your-own endpoint the AI page offers. */
15
17
  export interface ByoPresetDefinition {
@@ -28,6 +30,10 @@ export interface ByoPresetDefinition {
28
30
  }
29
31
  export interface InferenceConfig {
30
32
  mode: InferenceMode;
33
+ /** Other modes the visitor may deliberately select, in display order. */
34
+ alternatives?: InferenceMode[];
35
+ /** Defaults to `local` for compatibility. Hosted apps should use `memory`. */
36
+ credentialPersistence?: CredentialPersistence;
31
37
  host?: {
32
38
  endpoint: string;
33
39
  };
@@ -41,21 +47,22 @@ export interface InferenceConfig {
41
47
  };
42
48
  }
43
49
  export declare const DEFAULT_INFERENCE: InferenceConfig;
50
+ export declare const MANUAL_INFERENCE: InferenceConfig;
44
51
  /** The file name, served at `${base}/planner.config.json`. */
45
52
  export declare const CONFIG_FILE = "planner.config.json";
46
53
  export interface ConfigResult {
47
54
  config: InferenceConfig;
48
55
  /** The `kitchen` block (`smrt kitchen`), when the file has a usable one. */
49
56
  kitchen?: KitchenEndpoint;
50
- /** Shown to the visitor when the config was unusable and `browser` is used instead. */
57
+ /** Shown when a present config was unusable and inference was disabled. */
51
58
  notice?: string;
52
59
  }
53
60
  /** http(s) only; a path-only endpoint (`/api/planner/chat`) is the host's own origin. */
54
61
  export declare function isUsableEndpoint(value: unknown): value is string;
55
62
  /**
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.
63
+ * Validate a parsed config. A missing config keeps the standalone browser
64
+ * default. A present but invalid config fails closed to manual planning with a
65
+ * visible notice; it never selects a provider or downloads a model.
59
66
  */
60
67
  export declare function validateInferenceConfig(value: unknown): ConfigResult;
61
68
  /** Parse the file's text. */
@@ -1,10 +1,12 @@
1
1
  import { parseKitchenConfig } from "../kitchen/client.js";
2
2
  export const INFERENCE_MODES = [
3
+ 'manual',
3
4
  'browser',
4
5
  'host',
5
6
  'byo',
6
7
  ];
7
8
  export const DEFAULT_INFERENCE = { mode: 'browser' };
9
+ export const MANUAL_INFERENCE = { mode: 'manual' };
8
10
  /** The file name, served at `${base}/planner.config.json`. */
9
11
  export const CONFIG_FILE = 'planner.config.json';
10
12
  const isObject = (v) => !!v && typeof v === 'object' && !Array.isArray(v);
@@ -15,11 +17,22 @@ export function isUsableEndpoint(value) {
15
17
  const text = value.trim();
16
18
  if (!text)
17
19
  return false;
18
- if (text.startsWith('/') && !text.startsWith('//'))
19
- return true;
20
20
  try {
21
- const url = new URL(text);
22
- return url.protocol === 'http:' || url.protocol === 'https:';
21
+ const relative = text.startsWith('/') && !text.startsWith('//');
22
+ const url = new URL(text, relative ? 'https://planner.invalid' : undefined);
23
+ if (!relative && url.protocol !== 'http:' && url.protocol !== 'https:') {
24
+ return false;
25
+ }
26
+ if (url.username || url.password)
27
+ return false;
28
+ if (url.hash)
29
+ return false;
30
+ for (const name of url.searchParams.keys()) {
31
+ if (/^(?:api[-_]?key|key|token|authorization|secret|password)$/i.test(name)) {
32
+ return false;
33
+ }
34
+ }
35
+ return true;
23
36
  }
24
37
  catch {
25
38
  return false;
@@ -48,13 +61,52 @@ function parsePresetDefinition(value) {
48
61
  };
49
62
  }
50
63
  const fallback = (why) => ({
51
- config: DEFAULT_INFERENCE,
52
- notice: `The assistant settings could not be used (${why}), so it runs in your browser instead.`,
64
+ config: MANUAL_INFERENCE,
65
+ notice: `The assistant settings could not be used (${why}), so inference is off. The planner still works manually.`,
53
66
  });
67
+ function parseAlternatives(value, initial) {
68
+ if (value === undefined)
69
+ return [];
70
+ if (!Array.isArray(value) || value.length === 0)
71
+ return null;
72
+ const modes = [];
73
+ for (const entry of value) {
74
+ if (typeof entry !== 'string' ||
75
+ !INFERENCE_MODES.includes(entry) ||
76
+ entry === initial ||
77
+ modes.includes(entry)) {
78
+ return null;
79
+ }
80
+ modes.push(entry);
81
+ }
82
+ return modes;
83
+ }
84
+ function parseByo(value) {
85
+ if (value === undefined)
86
+ return {};
87
+ if (!isObject(value))
88
+ return null;
89
+ if (value.presets === undefined)
90
+ return {};
91
+ if (!Array.isArray(value.presets) || value.presets.length === 0)
92
+ return null;
93
+ const presets = [];
94
+ for (const entry of value.presets) {
95
+ if (typeof entry === 'string' && entry.trim()) {
96
+ presets.push(entry.trim());
97
+ continue;
98
+ }
99
+ const definition = parsePresetDefinition(entry);
100
+ if (!definition)
101
+ return null;
102
+ presets.push(definition);
103
+ }
104
+ return { presets };
105
+ }
54
106
  /**
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.
107
+ * Validate a parsed config. A missing config keeps the standalone browser
108
+ * default. A present but invalid config fails closed to manual planning with a
109
+ * visible notice; it never selects a provider or downloads a model.
58
110
  */
59
111
  export function validateInferenceConfig(value) {
60
112
  if (!isObject(value))
@@ -65,43 +117,47 @@ export function validateInferenceConfig(value) {
65
117
  if (!isObject(inference))
66
118
  return fallback('"inference" is not an object');
67
119
  const mode = inference.mode;
68
- if (mode === undefined || mode === 'browser') {
120
+ if (mode === undefined)
69
121
  return { config: DEFAULT_INFERENCE };
122
+ if (!INFERENCE_MODES.includes(mode)) {
123
+ return fallback(`unknown mode "${String(mode)}"`);
124
+ }
125
+ const selected = mode;
126
+ const alternatives = parseAlternatives(inference.alternatives, selected);
127
+ if (!alternatives) {
128
+ return fallback('alternatives must be unique supported modes other than mode');
129
+ }
130
+ const credentialPersistence = inference.credentialPersistence;
131
+ if (credentialPersistence !== undefined &&
132
+ credentialPersistence !== 'local' &&
133
+ credentialPersistence !== 'memory') {
134
+ return fallback('credentialPersistence must be "local" or "memory"');
70
135
  }
71
- if (mode === 'host') {
72
- const host = inference.host;
73
- if (!isObject(host) || !isUsableEndpoint(host.endpoint)) {
136
+ const modes = [selected, ...alternatives];
137
+ let host;
138
+ if (modes.includes('host')) {
139
+ const configuredHost = inference.host;
140
+ if (!isObject(configuredHost) ||
141
+ !isUsableEndpoint(configuredHost.endpoint)) {
74
142
  return fallback('host mode needs host.endpoint, an http(s) URL or path');
75
143
  }
76
- return {
77
- config: { mode: 'host', host: { endpoint: host.endpoint.trim() } },
78
- };
144
+ host = { endpoint: configuredHost.endpoint.trim() };
79
145
  }
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 } } };
146
+ let byo;
147
+ if (modes.includes('byo')) {
148
+ byo = parseByo(inference.byo) ?? undefined;
149
+ if (!byo)
150
+ return fallback('byo.presets must be a non-empty valid list');
103
151
  }
104
- return fallback(`unknown mode "${String(mode)}"`);
152
+ return {
153
+ config: {
154
+ mode: selected,
155
+ ...(alternatives.length ? { alternatives } : {}),
156
+ ...(credentialPersistence ? { credentialPersistence } : {}),
157
+ ...(host ? { host } : {}),
158
+ ...(byo ? { byo } : {}),
159
+ },
160
+ };
105
161
  }
106
162
  /** Parse the file's text. */
107
163
  export function parseInferenceConfig(text) {
@@ -9,6 +9,11 @@ export function normalizeBaseUrl(value) {
9
9
  // Credentials in a URL would travel in the clear as part of it.
10
10
  if (url.username || url.password)
11
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
+ }
12
17
  return `${url.origin}${url.pathname.replace(/\/+$/, '')}`;
13
18
  }
14
19
  catch {
@@ -0,0 +1,73 @@
1
+ <script lang="ts">
2
+ import { onMount } from 'svelte';
3
+ import { createHostSession } from '../planner/host/session.svelte.js';
4
+ import { callLiveKitchen, type LiveKitchenBinding } from './live.js';
5
+
6
+ let {
7
+ binding,
8
+ onlock,
9
+ }: { binding: LiveKitchenBinding; onlock?: (locked: boolean) => void } =
10
+ $props();
11
+ const session = createHostSession((name, args) =>
12
+ callLiveKitchen(binding, name, args),
13
+ );
14
+
15
+ $effect(() => {
16
+ onlock?.(session.locked);
17
+ return () => onlock?.(false);
18
+ });
19
+
20
+ onMount(() => {
21
+ const stop = session.mount();
22
+ void session.connect(binding.planId);
23
+ const timer = setInterval(() => {
24
+ if (
25
+ !session.busy &&
26
+ !session.retryable &&
27
+ document.visibilityState === 'visible'
28
+ ) {
29
+ void session.connect(binding.planId);
30
+ }
31
+ }, 1500);
32
+ return () => {
33
+ clearInterval(timer);
34
+ stop();
35
+ };
36
+ });
37
+ </script>
38
+
39
+ {#if session.error}
40
+ <p role="alert" class="bridge-error">Kitchen live preview: {session.error}</p>
41
+ {/if}
42
+ {#if session.preservedDraft && !session.retryable}
43
+ <details class="bridge-preserved">
44
+ <summary>Preserved edit</summary>
45
+ <textarea readonly aria-label="Preserved cookbook edit" value={JSON.stringify(session.preservedDraft, null, 2)}></textarea>
46
+ <button type="button" onclick={() => session.dismissPreservedDraft()}>Dismiss preserved edit</button>
47
+ </details>
48
+ {/if}
49
+ {#if session.retryable}
50
+ <div class="bridge-backdrop" aria-hidden="true"></div>
51
+ <div class="bridge-recovery" role="dialog" aria-modal="true" aria-labelledby="bridge-recovery-title">
52
+ <h2 id="bridge-recovery-title">Kitchen edit needs attention</h2>
53
+ <p>The app is paused until this edit is retried. The same command will be sent so Kitchen can safely recognize a previous success.</p>
54
+ {#if session.draft}
55
+ <label for="bridge-draft">Preserved cookbook edit</label>
56
+ <textarea id="bridge-draft" readonly value={JSON.stringify(session.draft, null, 2)}></textarea>
57
+ {/if}
58
+ <button type="button" disabled={session.busy} onclick={() => session.retry()}>Retry same edit</button>
59
+ </div>
60
+ {/if}
61
+
62
+ <style>
63
+ @layer smrt.reset, smrt.structure, smrt.theme;
64
+ @layer smrt.theme {
65
+ .bridge-error { margin: 0; padding: var(--smrt-spacing-2, .5rem) var(--smrt-spacing-4, 1rem); color: var(--smrt-color-on-error-container, #b91c1c); background: var(--smrt-color-error-container, #fef2f2); }
66
+ .bridge-backdrop { position: fixed; inset: 0; z-index: 9998; background: rgb(0 0 0 / .45); }
67
+ .bridge-recovery { position: fixed; z-index: 9999; inset-inline: max(1rem, calc((100vw - 32rem) / 2)); top: 15vh; display: grid; gap: .75rem; padding: 1.5rem; border-radius: var(--smrt-radius-large, .75rem); background: var(--smrt-surface-raised, white); color: var(--smrt-color-on-surface, black); box-shadow: var(--smrt-elevation-4); }
68
+ .bridge-recovery h2, .bridge-recovery p { margin: 0; }
69
+ .bridge-preserved { padding: var(--smrt-spacing-2, .5rem) var(--smrt-spacing-4, 1rem); color: var(--smrt-color-on-error-container, #b91c1c); background: var(--smrt-color-error-container, #fef2f2); }
70
+ .bridge-preserved textarea { width: 100%; min-height: 8rem; }
71
+ .bridge-recovery textarea { min-height: 10rem; max-height: 35vh; width: 100%; }
72
+ }
73
+ </style>
@@ -0,0 +1,8 @@
1
+ import { type LiveKitchenBinding } from './live.ts';
2
+ type $$ComponentProps = {
3
+ binding: LiveKitchenBinding;
4
+ onlock?: (locked: boolean) => void;
5
+ };
6
+ declare const LiveKitchenBridge: import("svelte").Component<$$ComponentProps, {}, "">;
7
+ type LiveKitchenBridge = ReturnType<typeof LiveKitchenBridge>;
8
+ export default LiveKitchenBridge;
@@ -27,11 +27,17 @@ function usableEndpoint(value) {
27
27
  if (typeof value !== 'string')
28
28
  return false;
29
29
  const text = value.trim();
30
- if (text.startsWith('/') && !text.startsWith('//'))
31
- return true;
32
30
  try {
33
- const url = new URL(text);
34
- return url.protocol === 'http:' || url.protocol === 'https:';
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));
35
41
  }
36
42
  catch {
37
43
  return false;
@@ -0,0 +1,7 @@
1
+ /** Development preview binding: a single Kitchen plan and loopback bridge. */
2
+ export interface LiveKitchenBinding {
3
+ planId: string;
4
+ port: number;
5
+ }
6
+ export declare function liveKitchenBinding(search: string): LiveKitchenBinding | null;
7
+ export declare function callLiveKitchen(binding: LiveKitchenBinding, name: string, args: Record<string, unknown>): Promise<unknown>;
@@ -0,0 +1,51 @@
1
+ const KEY = 'smrt-planner:live-kitchen:v1';
2
+ const PLAN_ID = /^plan-[a-f0-9-]{8,36}$/;
3
+ function valid(value) {
4
+ const binding = value;
5
+ return (!!binding &&
6
+ PLAN_ID.test(binding.planId) &&
7
+ Number.isInteger(binding.port) &&
8
+ binding.port > 0 &&
9
+ binding.port <= 65535);
10
+ }
11
+ export function liveKitchenBinding(search) {
12
+ const params = new URLSearchParams(search);
13
+ const planId = params.get('kitchenPlan');
14
+ const port = Number(params.get('kitchenPort'));
15
+ const fromUrl = { planId, port };
16
+ if (valid(fromUrl)) {
17
+ try {
18
+ sessionStorage.setItem(KEY, JSON.stringify(fromUrl));
19
+ }
20
+ catch {
21
+ /* URL still binds this tab. */
22
+ }
23
+ return fromUrl;
24
+ }
25
+ try {
26
+ const saved = JSON.parse(sessionStorage.getItem(KEY) ?? 'null');
27
+ return valid(saved) ? saved : null;
28
+ }
29
+ catch {
30
+ return null;
31
+ }
32
+ }
33
+ export async function callLiveKitchen(binding, name, args) {
34
+ if (args.planId !== binding.planId)
35
+ throw new Error('Preview plan id changed.');
36
+ const root = `http://127.0.0.1:${binding.port}/plans/${binding.planId}`;
37
+ const response = name === 'get_plan'
38
+ ? await fetch(root, { cache: 'no-store' })
39
+ : name === 'run_commands'
40
+ ? await fetch(`${root}/commands`, {
41
+ method: 'POST',
42
+ headers: { 'Content-Type': 'application/json' },
43
+ body: JSON.stringify(args),
44
+ })
45
+ : null;
46
+ if (!response)
47
+ throw new Error(`Preview tool ${name} is unavailable.`);
48
+ if (!response.ok)
49
+ throw new Error(`Kitchen preview answered ${response.status}.`);
50
+ return response.json();
51
+ }
@@ -23,4 +23,38 @@ export const COOKBOOK_ICONS = {
23
23
  'M17 20l-1-5h-5l1-7',
24
24
  'M4 10l4-1l4-1l4 1.5l4 1.5',
25
25
  ],
26
+ leaf: [
27
+ 'M5 21c.5-4.5 2.5-8 7-10',
28
+ 'M9 18c6.218 0 10.5-3.288 11-12v-2h-4.014c-9 0-11.986 4-12 9c0 1 0 3 2 5h3z',
29
+ ],
30
+ scissors: [
31
+ 'M6 7m-3 0a3 3 0 1 0 6 0a3 3 0 1 0-6 0',
32
+ 'M6 17m-3 0a3 3 0 1 0 6 0a3 3 0 1 0-6 0',
33
+ 'M8.6 8.6l10.4 10.4',
34
+ 'M8.6 15.4l10.4-10.4',
35
+ ],
36
+ coffee: [
37
+ 'M3 14c.83.642 2.077 1.017 3.5 1c1.423.017 2.67-.358 3.5-1c.83-.642 2.077-1.017 3.5-1c1.423-.017 2.67.358 3.5 1',
38
+ 'M8 3a2.4 2.4 0 0 0-1 2a2.4 2.4 0 0 0 1 2',
39
+ 'M12 3a2.4 2.4 0 0 0-1 2a2.4 2.4 0 0 0 1 2',
40
+ 'M3 10h14v5a6 6 0 0 1-6 6h-2a6 6 0 0 1-6-6v-5z',
41
+ 'M16.746 16.726a3 3 0 1 0 .252-5.555',
42
+ ],
43
+ forklift: [
44
+ 'M5 17m-2 0a2 2 0 1 0 4 0a2 2 0 1 0-4 0',
45
+ 'M13 17m-2 0a2 2 0 1 0 4 0a2 2 0 1 0-4 0',
46
+ 'M7 17h4',
47
+ 'M3 17v-6h13v6',
48
+ 'M5 11v-4h4',
49
+ 'M9 11v-6h4l3 6',
50
+ 'M22 15h-3v-10',
51
+ 'M16 13h3',
52
+ ],
53
+ heart: [
54
+ 'M19.5 12.572l-7.5 7.428l-7.5-7.428a5 5 0 1 1 7.5-6.566a5 5 0 1 1 7.5 6.572',
55
+ ],
56
+ pencil: [
57
+ 'M4 20h4l10.5-10.5a2.828 2.828 0 1 0-4-4l-10.5 10.5v4',
58
+ 'M13.5 6.5l4 4',
59
+ ],
26
60
  };