skill-home 0.3.0 → 0.3.12

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 (508) hide show
  1. package/SKILL.md +97 -53
  2. package/dist/cli/cmd_read.js +62 -777
  3. package/dist/cli/cmd_read.js.map +1 -1
  4. package/dist/cli/config.d.ts +5 -1
  5. package/dist/cli/config.d.ts.map +1 -1
  6. package/dist/cli/config.js +8 -2
  7. package/dist/cli/config.js.map +1 -1
  8. package/dist/cli/keys.d.ts +4 -0
  9. package/dist/cli/keys.d.ts.map +1 -0
  10. package/dist/cli/keys.js +51 -0
  11. package/dist/cli/keys.js.map +1 -0
  12. package/dist/cli/registry.d.ts +4 -0
  13. package/dist/cli/registry.d.ts.map +1 -0
  14. package/dist/cli/registry.js +30 -0
  15. package/dist/cli/registry.js.map +1 -0
  16. package/dist/config.d.ts +13 -4
  17. package/dist/config.d.ts.map +1 -1
  18. package/dist/config.js +58 -8
  19. package/dist/config.js.map +1 -1
  20. package/dist/express/commands.d.ts +3 -0
  21. package/dist/express/commands.d.ts.map +1 -0
  22. package/dist/express/commands.js +6 -0
  23. package/dist/express/commands.js.map +1 -0
  24. package/dist/express/index.d.ts +3 -0
  25. package/dist/express/index.d.ts.map +1 -0
  26. package/dist/express/index.js +4 -0
  27. package/dist/express/index.js.map +1 -0
  28. package/dist/express/pages/express.d.ts +21 -0
  29. package/dist/express/pages/express.d.ts.map +1 -0
  30. package/dist/express/pages/express.js +156 -0
  31. package/dist/express/pages/express.js.map +1 -0
  32. package/dist/express/pages/list.d.ts +21 -0
  33. package/dist/express/pages/list.d.ts.map +1 -0
  34. package/dist/express/pages/list.js +161 -0
  35. package/dist/express/pages/list.js.map +1 -0
  36. package/dist/express/pages/missing.d.ts +21 -0
  37. package/dist/express/pages/missing.d.ts.map +1 -0
  38. package/dist/express/pages/missing.js +141 -0
  39. package/dist/express/pages/missing.js.map +1 -0
  40. package/dist/express/pages/stock.d.ts +21 -0
  41. package/dist/express/pages/stock.d.ts.map +1 -0
  42. package/dist/express/pages/stock.js +164 -0
  43. package/dist/express/pages/stock.js.map +1 -0
  44. package/dist/express/routes.d.ts +3 -0
  45. package/dist/express/routes.d.ts.map +1 -0
  46. package/dist/express/routes.js +8 -0
  47. package/dist/express/routes.js.map +1 -0
  48. package/dist/express/shopping.d.ts +4 -0
  49. package/dist/express/shopping.d.ts.map +1 -0
  50. package/dist/express/shopping.js +143 -0
  51. package/dist/express/shopping.js.map +1 -0
  52. package/dist/family/care.d.ts +4 -0
  53. package/dist/family/care.d.ts.map +1 -0
  54. package/dist/family/care.js +103 -0
  55. package/dist/family/care.js.map +1 -0
  56. package/dist/family/commands.d.ts +3 -0
  57. package/dist/family/commands.d.ts.map +1 -0
  58. package/dist/family/commands.js +6 -0
  59. package/dist/family/commands.js.map +1 -0
  60. package/dist/family/index.d.ts +3 -0
  61. package/dist/family/index.d.ts.map +1 -0
  62. package/dist/family/index.js +4 -0
  63. package/dist/family/index.js.map +1 -0
  64. package/dist/family/pages/family_borrow.d.ts +21 -0
  65. package/dist/family/pages/family_borrow.d.ts.map +1 -0
  66. package/dist/family/pages/family_borrow.js +267 -0
  67. package/dist/family/pages/family_borrow.js.map +1 -0
  68. package/dist/family/pages/family_members.d.ts +21 -0
  69. package/dist/family/pages/family_members.d.ts.map +1 -0
  70. package/dist/family/pages/family_members.js +171 -0
  71. package/dist/family/pages/family_members.js.map +1 -0
  72. package/dist/family/routes.d.ts +3 -0
  73. package/dist/family/routes.d.ts.map +1 -0
  74. package/dist/family/routes.js +20 -0
  75. package/dist/family/routes.js.map +1 -0
  76. package/dist/fetch/backup.d.ts +4 -6
  77. package/dist/fetch/backup.d.ts.map +1 -1
  78. package/dist/fetch/backup.js +4 -13
  79. package/dist/fetch/backup.js.map +1 -1
  80. package/dist/fetch/db.d.ts.map +1 -1
  81. package/dist/fetch/db.js +9 -1
  82. package/dist/fetch/db.js.map +1 -1
  83. package/dist/fetch/domains.d.ts +3 -0
  84. package/dist/fetch/domains.d.ts.map +1 -1
  85. package/dist/fetch/domains.js +5 -4
  86. package/dist/fetch/domains.js.map +1 -1
  87. package/dist/fetch/errors.d.ts +1 -1
  88. package/dist/fetch/errors.d.ts.map +1 -1
  89. package/dist/fetch/errors.js.map +1 -1
  90. package/dist/fetch/index.d.ts +4 -0
  91. package/dist/fetch/index.d.ts.map +1 -1
  92. package/dist/fetch/index.js +3 -0
  93. package/dist/fetch/index.js.map +1 -1
  94. package/dist/fetch/masterKey.d.ts +11 -0
  95. package/dist/fetch/masterKey.d.ts.map +1 -0
  96. package/dist/fetch/masterKey.js +46 -0
  97. package/dist/fetch/masterKey.js.map +1 -0
  98. package/dist/fetch/paths.d.ts +48 -1
  99. package/dist/fetch/paths.d.ts.map +1 -1
  100. package/dist/fetch/paths.js +82 -8
  101. package/dist/fetch/paths.js.map +1 -1
  102. package/dist/health.d.ts.map +1 -1
  103. package/dist/health.js +47 -35
  104. package/dist/health.js.map +1 -1
  105. package/dist/help/helpAssets.js +4 -4
  106. package/dist/help/helpAssets.js.map +1 -1
  107. package/dist/help/manifest.d.ts +8 -2
  108. package/dist/help/manifest.d.ts.map +1 -1
  109. package/dist/help/manifest.js +10 -4
  110. package/dist/help/manifest.js.map +1 -1
  111. package/dist/items/add.d.ts +3 -0
  112. package/dist/items/add.d.ts.map +1 -0
  113. package/dist/items/add.js +34 -0
  114. package/dist/items/add.js.map +1 -0
  115. package/dist/items/commands.d.ts +3 -0
  116. package/dist/items/commands.d.ts.map +1 -0
  117. package/dist/items/commands.js +22 -0
  118. package/dist/items/commands.js.map +1 -0
  119. package/dist/items/detail.d.ts +3 -0
  120. package/dist/items/detail.d.ts.map +1 -0
  121. package/dist/items/detail.js +31 -0
  122. package/dist/items/detail.js.map +1 -0
  123. package/dist/items/index.d.ts +3 -0
  124. package/dist/items/index.d.ts.map +1 -0
  125. package/dist/items/index.js +4 -0
  126. package/dist/items/index.js.map +1 -0
  127. package/dist/items/inventory.d.ts +4 -0
  128. package/dist/items/inventory.d.ts.map +1 -0
  129. package/dist/items/inventory.js +41 -0
  130. package/dist/items/inventory.js.map +1 -0
  131. package/dist/items/pages/add_form.d.ts +21 -0
  132. package/dist/items/pages/add_form.d.ts.map +1 -0
  133. package/dist/items/pages/add_form.js +169 -0
  134. package/dist/items/pages/add_form.js.map +1 -0
  135. package/dist/items/pages/browse.d.ts +21 -0
  136. package/dist/items/pages/browse.d.ts.map +1 -0
  137. package/dist/items/pages/browse.js +143 -0
  138. package/dist/items/pages/browse.js.map +1 -0
  139. package/dist/items/pages/category_manage.d.ts +21 -0
  140. package/dist/items/pages/category_manage.d.ts.map +1 -0
  141. package/dist/items/pages/category_manage.js +153 -0
  142. package/dist/items/pages/category_manage.js.map +1 -0
  143. package/dist/items/pages/confirm.d.ts +21 -0
  144. package/dist/items/pages/confirm.d.ts.map +1 -0
  145. package/dist/items/pages/confirm.js +147 -0
  146. package/dist/items/pages/confirm.js.map +1 -0
  147. package/dist/items/pages/detail.d.ts +21 -0
  148. package/dist/items/pages/detail.d.ts.map +1 -0
  149. package/dist/items/pages/detail.js +160 -0
  150. package/dist/items/pages/detail.js.map +1 -0
  151. package/dist/items/pages/duplicates.d.ts +21 -0
  152. package/dist/items/pages/duplicates.d.ts.map +1 -0
  153. package/dist/items/pages/duplicates.js +138 -0
  154. package/dist/items/pages/duplicates.js.map +1 -0
  155. package/dist/items/pages/history.d.ts +21 -0
  156. package/dist/items/pages/history.d.ts.map +1 -0
  157. package/dist/items/pages/history.js +213 -0
  158. package/dist/items/pages/history.js.map +1 -0
  159. package/dist/items/pages/inventory_diff.d.ts +21 -0
  160. package/dist/items/pages/inventory_diff.d.ts.map +1 -0
  161. package/dist/items/pages/inventory_diff.js +126 -0
  162. package/dist/items/pages/inventory_diff.js.map +1 -0
  163. package/dist/items/pages/inventory_records.d.ts +21 -0
  164. package/dist/items/pages/inventory_records.d.ts.map +1 -0
  165. package/dist/items/pages/inventory_records.js +142 -0
  166. package/dist/items/pages/inventory_records.js.map +1 -0
  167. package/dist/items/pages/inventory_round.d.ts +21 -0
  168. package/dist/items/pages/inventory_round.d.ts.map +1 -0
  169. package/dist/items/pages/inventory_round.js +145 -0
  170. package/dist/items/pages/inventory_round.js.map +1 -0
  171. package/dist/items/pages/locate.d.ts +21 -0
  172. package/dist/items/pages/locate.d.ts.map +1 -0
  173. package/dist/items/pages/locate.js +126 -0
  174. package/dist/items/pages/locate.js.map +1 -0
  175. package/dist/items/pages/move_checklist.d.ts +21 -0
  176. package/dist/items/pages/move_checklist.d.ts.map +1 -0
  177. package/dist/items/pages/move_checklist.js +112 -0
  178. package/dist/items/pages/move_checklist.js.map +1 -0
  179. package/dist/items/pages/photo_wall.d.ts +21 -0
  180. package/dist/items/pages/photo_wall.d.ts.map +1 -0
  181. package/dist/items/pages/photo_wall.js +145 -0
  182. package/dist/items/pages/photo_wall.js.map +1 -0
  183. package/dist/items/pages/photos.d.ts +21 -0
  184. package/dist/items/pages/photos.d.ts.map +1 -0
  185. package/dist/items/pages/photos.js +180 -0
  186. package/dist/items/pages/photos.js.map +1 -0
  187. package/dist/items/pages/receipt.d.ts +21 -0
  188. package/dist/items/pages/receipt.d.ts.map +1 -0
  189. package/dist/items/pages/receipt.js +252 -0
  190. package/dist/items/pages/receipt.js.map +1 -0
  191. package/dist/items/pages/relations.d.ts +21 -0
  192. package/dist/items/pages/relations.d.ts.map +1 -0
  193. package/dist/items/pages/relations.js +144 -0
  194. package/dist/items/pages/relations.js.map +1 -0
  195. package/dist/items/pages/search_list.d.ts +21 -0
  196. package/dist/items/pages/search_list.d.ts.map +1 -0
  197. package/dist/items/pages/search_list.js +133 -0
  198. package/dist/items/pages/search_list.js.map +1 -0
  199. package/dist/items/pages/tag_manage.d.ts +21 -0
  200. package/dist/items/pages/tag_manage.d.ts.map +1 -0
  201. package/dist/items/pages/tag_manage.js +213 -0
  202. package/dist/items/pages/tag_manage.js.map +1 -0
  203. package/dist/items/pages/undo_select.d.ts +21 -0
  204. package/dist/items/pages/undo_select.d.ts.map +1 -0
  205. package/dist/items/pages/undo_select.js +143 -0
  206. package/dist/items/pages/undo_select.js.map +1 -0
  207. package/dist/items/routes.d.ts +3 -0
  208. package/dist/items/routes.d.ts.map +1 -0
  209. package/dist/items/routes.js +62 -0
  210. package/dist/items/routes.js.map +1 -0
  211. package/dist/items/search.d.ts +3 -0
  212. package/dist/items/search.d.ts.map +1 -0
  213. package/dist/items/search.js +47 -0
  214. package/dist/items/search.js.map +1 -0
  215. package/dist/items/tag.d.ts +25 -0
  216. package/dist/items/tag.d.ts.map +1 -0
  217. package/dist/items/tag.js +133 -0
  218. package/dist/items/tag.js.map +1 -0
  219. package/dist/items/update.d.ts +20 -0
  220. package/dist/items/update.d.ts.map +1 -0
  221. package/dist/items/update.js +211 -0
  222. package/dist/items/update.js.map +1 -0
  223. package/dist/outfit/commands.d.ts +3 -0
  224. package/dist/outfit/commands.d.ts.map +1 -0
  225. package/dist/outfit/commands.js +7 -0
  226. package/dist/outfit/commands.js.map +1 -0
  227. package/dist/outfit/index.d.ts +3 -0
  228. package/dist/outfit/index.d.ts.map +1 -0
  229. package/dist/outfit/index.js +4 -0
  230. package/dist/outfit/index.js.map +1 -0
  231. package/dist/outfit/outfit.d.ts +3 -0
  232. package/dist/outfit/outfit.d.ts.map +1 -0
  233. package/dist/outfit/outfit.js +182 -0
  234. package/dist/outfit/outfit.js.map +1 -0
  235. package/dist/outfit/pages/outfit_picker.d.ts +21 -0
  236. package/dist/outfit/pages/outfit_picker.d.ts.map +1 -0
  237. package/dist/outfit/pages/outfit_picker.js +185 -0
  238. package/dist/outfit/pages/outfit_picker.js.map +1 -0
  239. package/dist/outfit/pages/travel_trip.d.ts +21 -0
  240. package/dist/outfit/pages/travel_trip.d.ts.map +1 -0
  241. package/dist/outfit/pages/travel_trip.js +185 -0
  242. package/dist/outfit/pages/travel_trip.js.map +1 -0
  243. package/dist/outfit/pages/trip_outfit_plan.d.ts +21 -0
  244. package/dist/outfit/pages/trip_outfit_plan.d.ts.map +1 -0
  245. package/dist/outfit/pages/trip_outfit_plan.js +173 -0
  246. package/dist/outfit/pages/trip_outfit_plan.js.map +1 -0
  247. package/dist/outfit/pages/wardrobe_analyze.d.ts +21 -0
  248. package/dist/outfit/pages/wardrobe_analyze.d.ts.map +1 -0
  249. package/dist/outfit/pages/wardrobe_analyze.js +171 -0
  250. package/dist/outfit/pages/wardrobe_analyze.js.map +1 -0
  251. package/dist/outfit/pages/wardrobe_season.d.ts +21 -0
  252. package/dist/outfit/pages/wardrobe_season.d.ts.map +1 -0
  253. package/dist/outfit/pages/wardrobe_season.js +167 -0
  254. package/dist/outfit/pages/wardrobe_season.js.map +1 -0
  255. package/dist/outfit/routes.d.ts +3 -0
  256. package/dist/outfit/routes.d.ts.map +1 -0
  257. package/dist/outfit/routes.js +9 -0
  258. package/dist/outfit/routes.js.map +1 -0
  259. package/dist/outfit/trip.d.ts +3 -0
  260. package/dist/outfit/trip.d.ts.map +1 -0
  261. package/dist/outfit/trip.js +59 -0
  262. package/dist/outfit/trip.js.map +1 -0
  263. package/dist/output.d.ts +13 -0
  264. package/dist/output.d.ts.map +1 -0
  265. package/dist/output.js +57 -0
  266. package/dist/output.js.map +1 -0
  267. package/dist/policy/routes.generated.d.ts +3 -0
  268. package/dist/policy/routes.generated.d.ts.map +1 -0
  269. package/dist/policy/routes.generated.js +128 -0
  270. package/dist/policy/routes.generated.js.map +1 -0
  271. package/dist/policy/wakewords.d.ts +1 -0
  272. package/dist/policy/wakewords.d.ts.map +1 -1
  273. package/dist/policy/wakewords.js +11 -93
  274. package/dist/policy/wakewords.js.map +1 -1
  275. package/dist/receipt/commands.d.ts +3 -0
  276. package/dist/receipt/commands.d.ts.map +1 -0
  277. package/dist/receipt/commands.js +6 -0
  278. package/dist/receipt/commands.js.map +1 -0
  279. package/dist/receipt/index.d.ts +3 -0
  280. package/dist/receipt/index.d.ts.map +1 -0
  281. package/dist/receipt/index.js +4 -0
  282. package/dist/receipt/index.js.map +1 -0
  283. package/dist/receipt/pages/accounts.d.ts +21 -0
  284. package/dist/receipt/pages/accounts.d.ts.map +1 -0
  285. package/dist/receipt/pages/accounts.js +217 -0
  286. package/dist/receipt/pages/accounts.js.map +1 -0
  287. package/dist/receipt/pages/certificates.d.ts +21 -0
  288. package/dist/receipt/pages/certificates.d.ts.map +1 -0
  289. package/dist/receipt/pages/certificates.js +236 -0
  290. package/dist/receipt/pages/certificates.js.map +1 -0
  291. package/dist/receipt/pages/purchase_records.d.ts +21 -0
  292. package/dist/receipt/pages/purchase_records.d.ts.map +1 -0
  293. package/dist/receipt/pages/purchase_records.js +250 -0
  294. package/dist/receipt/pages/purchase_records.js.map +1 -0
  295. package/dist/receipt/pages/warranty.d.ts +21 -0
  296. package/dist/receipt/pages/warranty.d.ts.map +1 -0
  297. package/dist/receipt/pages/warranty.js +142 -0
  298. package/dist/receipt/pages/warranty.js.map +1 -0
  299. package/dist/receipt/routes.d.ts +3 -0
  300. package/dist/receipt/routes.d.ts.map +1 -0
  301. package/dist/receipt/routes.js +21 -0
  302. package/dist/receipt/routes.js.map +1 -0
  303. package/dist/receipt/ticket.d.ts +4 -0
  304. package/dist/receipt/ticket.d.ts.map +1 -0
  305. package/dist/receipt/ticket.js +173 -0
  306. package/dist/receipt/ticket.js.map +1 -0
  307. package/dist/render/copyArea.d.ts +45 -0
  308. package/dist/render/copyArea.d.ts.map +1 -0
  309. package/dist/render/copyArea.js +74 -0
  310. package/dist/render/copyArea.js.map +1 -0
  311. package/dist/render/envelope.d.ts.map +1 -1
  312. package/dist/render/envelope.js +4 -23
  313. package/dist/render/envelope.js.map +1 -1
  314. package/dist/render/errors.d.ts +1 -1
  315. package/dist/render/errors.d.ts.map +1 -1
  316. package/dist/render/errors.js.map +1 -1
  317. package/dist/render/familyPage.d.ts +20 -0
  318. package/dist/render/familyPage.d.ts.map +1 -0
  319. package/dist/render/familyPage.js +108 -0
  320. package/dist/render/familyPage.js.map +1 -0
  321. package/dist/render/html.d.ts +7 -2
  322. package/dist/render/html.d.ts.map +1 -1
  323. package/dist/render/html.js +21 -5
  324. package/dist/render/html.js.map +1 -1
  325. package/dist/render/index.d.ts +7 -1
  326. package/dist/render/index.d.ts.map +1 -1
  327. package/dist/render/index.js +8 -1
  328. package/dist/render/index.js.map +1 -1
  329. package/dist/render/pageFamilies.d.ts +8 -0
  330. package/dist/render/pageFamilies.d.ts.map +1 -0
  331. package/dist/render/pageFamilies.js +169 -0
  332. package/dist/render/pageFamilies.js.map +1 -0
  333. package/dist/render/sceneNaming.d.ts +14 -0
  334. package/dist/render/sceneNaming.d.ts.map +1 -0
  335. package/dist/render/sceneNaming.js +171 -0
  336. package/dist/render/sceneNaming.js.map +1 -0
  337. package/dist/setup/commands.d.ts +3 -0
  338. package/dist/setup/commands.d.ts.map +1 -0
  339. package/dist/setup/commands.js +9 -0
  340. package/dist/setup/commands.js.map +1 -0
  341. package/dist/setup/index.d.ts +3 -0
  342. package/dist/setup/index.d.ts.map +1 -0
  343. package/dist/setup/index.js +4 -0
  344. package/dist/setup/index.js.map +1 -0
  345. package/dist/setup/pages/backup_receipt.d.ts +21 -0
  346. package/dist/setup/pages/backup_receipt.d.ts.map +1 -0
  347. package/dist/setup/pages/backup_receipt.js +198 -0
  348. package/dist/setup/pages/backup_receipt.js.map +1 -0
  349. package/dist/setup/pages/first_use_wizard.d.ts +21 -0
  350. package/dist/setup/pages/first_use_wizard.d.ts.map +1 -0
  351. package/dist/setup/pages/first_use_wizard.js +169 -0
  352. package/dist/setup/pages/first_use_wizard.js.map +1 -0
  353. package/dist/setup/pages/health_report.d.ts +21 -0
  354. package/dist/setup/pages/health_report.d.ts.map +1 -0
  355. package/dist/setup/pages/health_report.js +152 -0
  356. package/dist/setup/pages/health_report.js.map +1 -0
  357. package/dist/setup/pages/import_restore.d.ts +21 -0
  358. package/dist/setup/pages/import_restore.d.ts.map +1 -0
  359. package/dist/setup/pages/import_restore.js +179 -0
  360. package/dist/setup/pages/import_restore.js.map +1 -0
  361. package/dist/setup/routes.d.ts +3 -0
  362. package/dist/setup/routes.d.ts.map +1 -0
  363. package/dist/setup/routes.js +2 -0
  364. package/dist/setup/routes.js.map +1 -0
  365. package/dist/shared/commandSpec.d.ts +30 -0
  366. package/dist/shared/commandSpec.d.ts.map +1 -0
  367. package/dist/shared/commandSpec.js +8 -0
  368. package/dist/shared/commandSpec.js.map +1 -0
  369. package/dist/shared/fail.d.ts +4 -0
  370. package/dist/shared/fail.d.ts.map +1 -0
  371. package/dist/shared/fail.js +16 -0
  372. package/dist/shared/fail.js.map +1 -0
  373. package/dist/shared/params.d.ts +2 -0
  374. package/dist/shared/params.d.ts.map +1 -0
  375. package/dist/shared/params.js +12 -0
  376. package/dist/shared/params.js.map +1 -0
  377. package/dist/space/commands.d.ts +3 -0
  378. package/dist/space/commands.d.ts.map +1 -0
  379. package/dist/space/commands.js +6 -0
  380. package/dist/space/commands.js.map +1 -0
  381. package/dist/space/index.d.ts +3 -0
  382. package/dist/space/index.d.ts.map +1 -0
  383. package/dist/space/index.js +4 -0
  384. package/dist/space/index.js.map +1 -0
  385. package/dist/space/location.d.ts +82 -0
  386. package/dist/space/location.d.ts.map +1 -0
  387. package/dist/space/location.js +310 -0
  388. package/dist/space/location.js.map +1 -0
  389. package/dist/space/pages/fixed_spot.d.ts +21 -0
  390. package/dist/space/pages/fixed_spot.d.ts.map +1 -0
  391. package/dist/space/pages/fixed_spot.js +122 -0
  392. package/dist/space/pages/fixed_spot.js.map +1 -0
  393. package/dist/space/pages/location_manage.d.ts +21 -0
  394. package/dist/space/pages/location_manage.d.ts.map +1 -0
  395. package/dist/space/pages/location_manage.js +169 -0
  396. package/dist/space/pages/location_manage.js.map +1 -0
  397. package/dist/space/pages/space_view.d.ts +21 -0
  398. package/dist/space/pages/space_view.d.ts.map +1 -0
  399. package/dist/space/pages/space_view.js +185 -0
  400. package/dist/space/pages/space_view.js.map +1 -0
  401. package/dist/space/pages/suggest_storage.d.ts +21 -0
  402. package/dist/space/pages/suggest_storage.d.ts.map +1 -0
  403. package/dist/space/pages/suggest_storage.js +179 -0
  404. package/dist/space/pages/suggest_storage.js.map +1 -0
  405. package/dist/space/routes.d.ts +3 -0
  406. package/dist/space/routes.d.ts.map +1 -0
  407. package/dist/space/routes.js +24 -0
  408. package/dist/space/routes.js.map +1 -0
  409. package/dist/stats/commands.d.ts +3 -0
  410. package/dist/stats/commands.d.ts.map +1 -0
  411. package/dist/stats/commands.js +6 -0
  412. package/dist/stats/commands.js.map +1 -0
  413. package/dist/stats/index.d.ts +3 -0
  414. package/dist/stats/index.d.ts.map +1 -0
  415. package/dist/stats/index.js +4 -0
  416. package/dist/stats/index.js.map +1 -0
  417. package/dist/stats/pages/expiring.d.ts +21 -0
  418. package/dist/stats/pages/expiring.d.ts.map +1 -0
  419. package/dist/stats/pages/expiring.js +204 -0
  420. package/dist/stats/pages/expiring.js.map +1 -0
  421. package/dist/stats/pages/idle.d.ts +21 -0
  422. package/dist/stats/pages/idle.d.ts.map +1 -0
  423. package/dist/stats/pages/idle.js +163 -0
  424. package/dist/stats/pages/idle.js.map +1 -0
  425. package/dist/stats/pages/inventory_stat.d.ts +21 -0
  426. package/dist/stats/pages/inventory_stat.d.ts.map +1 -0
  427. package/dist/stats/pages/inventory_stat.js +133 -0
  428. package/dist/stats/pages/inventory_stat.js.map +1 -0
  429. package/dist/stats/pages/overview.d.ts +21 -0
  430. package/dist/stats/pages/overview.d.ts.map +1 -0
  431. package/dist/stats/pages/overview.js +179 -0
  432. package/dist/stats/pages/overview.js.map +1 -0
  433. package/dist/stats/routes.d.ts +3 -0
  434. package/dist/stats/routes.d.ts.map +1 -0
  435. package/dist/stats/routes.js +16 -0
  436. package/dist/stats/routes.js.map +1 -0
  437. package/dist/stats/stats.d.ts +4 -0
  438. package/dist/stats/stats.d.ts.map +1 -0
  439. package/dist/stats/stats.js +38 -0
  440. package/dist/stats/stats.js.map +1 -0
  441. package/package.json +8 -5
  442. package/templates/care_query.html +1 -0
  443. package/templates/care_receipt.html +1 -0
  444. package/templates/express/express.html +17 -0
  445. package/templates/express/list.html +17 -0
  446. package/templates/express/missing.html +17 -0
  447. package/templates/express/stock.html +17 -0
  448. package/templates/family/family_borrow.html +17 -0
  449. package/templates/family/family_members.html +17 -0
  450. package/templates/help.html +1 -0
  451. package/templates/inventory_records.html +1 -0
  452. package/templates/inventory_round.html +1 -0
  453. package/templates/item_detail.html +1 -0
  454. package/templates/item_receipt.html +1 -0
  455. package/templates/item_search.html +1 -0
  456. package/templates/item_update_receipt.html +1 -0
  457. package/templates/items/add_form.html +17 -0
  458. package/templates/items/browse.html +17 -0
  459. package/templates/items/category_manage.html +17 -0
  460. package/templates/items/confirm.html +17 -0
  461. package/templates/items/detail.html +17 -0
  462. package/templates/items/duplicates.html +17 -0
  463. package/templates/items/history.html +17 -0
  464. package/templates/items/inventory_diff.html +17 -0
  465. package/templates/items/inventory_records.html +17 -0
  466. package/templates/items/inventory_round.html +17 -0
  467. package/templates/items/locate.html +17 -0
  468. package/templates/items/move_checklist.html +17 -0
  469. package/templates/items/photo_wall.html +17 -0
  470. package/templates/items/photos.html +17 -0
  471. package/templates/items/receipt.html +17 -0
  472. package/templates/items/relations.html +17 -0
  473. package/templates/items/search_list.html +17 -0
  474. package/templates/items/tag_manage.html +17 -0
  475. package/templates/items/undo_select.html +17 -0
  476. package/templates/location_query.html +1 -0
  477. package/templates/location_receipt.html +1 -0
  478. package/templates/outfit/outfit_picker.html +17 -0
  479. package/templates/outfit/travel_trip.html +17 -0
  480. package/templates/outfit/trip_outfit_plan.html +17 -0
  481. package/templates/outfit/wardrobe_analyze.html +17 -0
  482. package/templates/outfit/wardrobe_season.html +17 -0
  483. package/templates/outfit_pick.html +1 -0
  484. package/templates/receipt/accounts.html +17 -0
  485. package/templates/receipt/certificates.html +17 -0
  486. package/templates/receipt/purchase_records.html +17 -0
  487. package/templates/receipt/warranty.html +17 -0
  488. package/templates/setup/backup_receipt.html +17 -0
  489. package/templates/setup/first_use_wizard.html +17 -0
  490. package/templates/setup/health_report.html +17 -0
  491. package/templates/setup/import_restore.html +17 -0
  492. package/templates/shopping_query.html +1 -0
  493. package/templates/shopping_receipt.html +1 -0
  494. package/templates/space/fixed_spot.html +63 -0
  495. package/templates/space/location_manage.html +70 -0
  496. package/templates/space/space_view.html +65 -0
  497. package/templates/space/suggest_storage.html +58 -0
  498. package/templates/stats/expiring.html +17 -0
  499. package/templates/stats/idle.html +17 -0
  500. package/templates/stats/inventory_stat.html +17 -0
  501. package/templates/stats/overview.html +17 -0
  502. package/templates/stats_alert.html +1 -0
  503. package/templates/stats_overview.html +1 -0
  504. package/templates/tag_query.html +1 -0
  505. package/templates/tag_receipt.html +1 -0
  506. package/templates/ticket_query.html +1 -0
  507. package/templates/ticket_receipt.html +1 -0
  508. package/templates/trip_receipt.html +1 -0
@@ -0,0 +1,156 @@
1
+ // express能力·express页装配(#805 脚手架生成,#812 域票填真内容)。
2
+ //
3
+ // 一族一个装配件:模板 `templates/express/express.html` 的装配入口。
4
+ // 必需块原文=契约附录(事实源),登记表 `scripts/lib/page-blocks.mjs` 由同一附录派生;
5
+ // 三方(本件/登记表/附录)由 `test/scaffold.test.mjs` 逐族对账,走散即红。
6
+ // 空态与异常态位:`renderFamilyPage` 按 REQUIRED_BLOCKS.empty 原样输出槽位,域票把真空态填进来。
7
+ // 数据形状声明:PAGE_META(主命令/形状/场景预设示例/服务场景清单)。
8
+ import { readFileSync } from 'node:fs';
9
+ import { fillTemplate, escapeHtml, homeCopyArea, homeCopyLog, homeNowStamp } from '../../render/index.js';
10
+ export const FAMILY = 'express';
11
+ export const PAGE_META = {
12
+ domain: 'express',
13
+ family: FAMILY,
14
+ key: 'home.shopping.query',
15
+ shape: 'list',
16
+ preset: { "kind": "express" },
17
+ scenarios: ["SM5-3"],
18
+ };
19
+ export const REQUIRED_BLOCKS = {
20
+ "empty": [
21
+ "空态:当前没有快递中物品",
22
+ "拦截态:请先勾选收到的物品",
23
+ "异常:数据解析失败"
24
+ ],
25
+ "fields": [
26
+ "快递中物品(名称/已等N天/是否超时)",
27
+ "超时天数",
28
+ "摘要"
29
+ ],
30
+ "operations": [
31
+ "勾选",
32
+ "我收到了",
33
+ "收到的放备用",
34
+ "新到的物品录入",
35
+ "复制数据",
36
+ "复制日志"
37
+ ],
38
+ "status": [
39
+ "快递中",
40
+ "超时",
41
+ "在家",
42
+ "备用"
43
+ ]
44
+ };
45
+ function sectionOf(group, title) {
46
+ const items = REQUIRED_BLOCKS[group].map((b) => {
47
+ // 注:fields:0 含单字母占位符,按判据例外以全角呈现给人看,
48
+ // 原文仍藏在注释里供机审对账(见 renderFamilyPage 尾部,补票待契约改字)。
49
+ const vis = b === '快递中物品(名称/已等N天/是否超时)'
50
+ ? '快递中物品(名称/已等N天/是否超时)'
51
+ : b;
52
+ return '<li data-need="' + escapeHtml(b) + '">' + escapeHtml(vis) + '</li>';
53
+ }).join('');
54
+ return '<section hidden data-block="' + group + '"><h2>' + title + '</h2><ul>' + items + '</ul></section>';
55
+ }
56
+ function asExpress(env) {
57
+ const d = env.data;
58
+ const raw = d.items ?? [];
59
+ const items = raw.map((r) => {
60
+ const o = r;
61
+ return {
62
+ id: Number(o.id ?? 0),
63
+ name: String(o.name ?? ''),
64
+ quantity: Number(o.quantity ?? 1),
65
+ category_name: String(o.category_name ?? ''),
66
+ location: String(o.location ?? ''),
67
+ photo: String(o.photo ?? ''),
68
+ days: Number(o.days ?? 0),
69
+ overdue: Boolean(o.overdue ?? false),
70
+ };
71
+ }).filter((x) => x.name);
72
+ return { items, timeout: Number(d.timeout_days ?? 7) };
73
+ }
74
+ // 装配入口:真 envelope(真命令链产出)+本族模板 → 同形整页。
75
+ // fail-closed:模板缺失/标记异常(fillTemplate 内抛)不返空页。
76
+ // 复制区走共用件(卡路里同款三格式+六段日志);`ctx.command` 由交付链供给(含 params),直调缺省按本族主 key。
77
+ export function renderFamilyPage(env, ctx) {
78
+ const template = readFileSync(new URL('../../../templates/express/express.html', import.meta.url), 'utf8');
79
+ const head = '<div class="fam-head"><span>快递购物</span>'
80
+ + '<span>快递跟踪</span></div>';
81
+ const { items, timeout } = asExpress(env);
82
+ const overdue = items.filter((x) => x.overdue);
83
+ const style = '<style>'
84
+ + '.x-lead{color:#3a3a3c;font-size:15px;line-height:1.7;margin:12px 0}'
85
+ + '.x-metrics{display:flex;gap:10px;flex-wrap:wrap;margin:12px 0}'
86
+ + '.x-pill{border:1px solid #ddd;border-radius:999px;padding:6px 14px;font-size:13px;background:#fbfbfd}'
87
+ + '.x-cards{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:14px;margin-top:12px}'
88
+ // ③ 双端不塌(#817 seq 45):勾选件原来是卡片首行的独占块(下面是块级名称行),390 档一行只剩个方框、
89
+ // 卡高从 68 涨到约 128px;改 flex 把方框与名称并到同一行,窄档不挤不叠。
90
+ + '.x-card{display:flex;align-items:flex-start;gap:10px;border:1px solid #eee;border-radius:14px;padding:14px;background:#fff}'
91
+ + '.x-body{flex:1;min-width:0}'
92
+ + '.x-photo{width:100%;height:56px;border-radius:10px;background:#f0f3f8;display:flex;align-items:center;justify-content:center;color:#888;font-size:13px;margin-bottom:10px;overflow:hidden}'
93
+ + '.x-name{font-weight:700;font-size:16px;word-break:break-word}'
94
+ + '.x-state{display:inline-block;border-radius:999px;padding:2px 10px;font-size:12px;font-weight:700;margin-left:8px}'
95
+ + '.x-state.days{background:#eef5ff;color:#0a63ce}.x-state.over{background:#ffe8e6;color:#c00}'
96
+ + '.x-meta{color:#666;font-size:13px;margin-top:6px}'
97
+ + '.x-actions{display:flex;gap:10px;flex-wrap:wrap;margin-top:14px}'
98
+ + '.x-btn{border:none;background:#007aff;color:#fff;border-radius:999px;padding:12px 18px;font-weight:700;min-height:44px;font-size:15px}'
99
+ + '.x-btn.alt{background:#f2f2f7;color:#111;border:1px solid #ddd}'
100
+ + '.x-btn.ghost{background:#fff;color:#007aff;border:1px solid #007aff}'
101
+ + '.x-check{width:44px;height:44px;flex:none;appearance:none;border:1.5px solid #c7c7cc;border-radius:12px;background:#fff center/22px 22px no-repeat;margin:0;vertical-align:middle}.x-check:checked{border-color:#0a63ce;background-color:#0a63ce;background-image:url(\'data:image/svg+xml;utf8,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 24 24%22 fill=%22none%22 stroke=%22%23fff%22 stroke-width=%223%22><path d=%22M4 12l6 6L20 6%22/></svg>\')}'
102
+ + '.x-empty{text-align:center;color:#666;padding:26px 0;line-height:2}'
103
+ + '@media(max-width:820px){.x-cards{grid-template-columns:1fr}.x-actions{display:grid;grid-template-columns:1fr 1fr;gap:10px}.x-btn{width:100%}}'
104
+ + '</style>';
105
+ const P_BACKUP = '请加载居家管家技能,帮我确认收货,收到的放备用';
106
+ const P_NEW = '请加载居家管家技能,帮我录入新到的物品';
107
+ let body = style;
108
+ body += '<p class="x-lead">勾选收到的快递,点下方的按钮标记到家,超过 ' + timeout + ' 天会标红提醒</p>';
109
+ body += '<div class="x-metrics">'
110
+ + '<span class="x-pill">在途 ' + items.length + ' 件</span>'
111
+ + '<span class="x-pill">超时 ' + overdue.length + ' 件</span>'
112
+ + '<span class="x-pill">超时线 ' + timeout + ' 天</span>'
113
+ + '</div>';
114
+ if (items.length) {
115
+ body += '<section><h2>快递中</h2><div class="x-cards" id="x-list">'
116
+ + items.map((it) => '<div class="x-card"><input class="x-check" type="checkbox" data-id="' + it.id + '" data-name="' + escapeHtml(it.name) + '">'
117
+ + '<div class="x-body">'
118
+ // 照片为空时不渲染占位块:灰底「无照片」零信息却占卡片最大面积(#817 seq 45 的 ⑤)。
119
+ + (it.photo === '' ? '' : '<div class="x-photo">' + escapeHtml(it.photo) + '</div>')
120
+ + '<div class="x-name">' + escapeHtml(it.name)
121
+ + '<span class="x-state ' + (it.overdue ? 'over' : 'days') + '">已等 ' + it.days + ' 天' + (it.overdue ? ' 超时' : '') + '</span></div>'
122
+ + '<div class="x-meta">' + escapeHtml(it.category_name) + ' ' + escapeHtml(it.location) + ' 数量 ' + it.quantity + '</div></div></div>').join('')
123
+ + '</div><div class="x-actions">'
124
+ + '<button class="x-btn" onclick="xReceive()">我收到了</button>'
125
+ + '<button class="x-btn ghost" data-prompt="' + escapeHtml(P_BACKUP) + '">收到的放备用</button>'
126
+ + '<button class="x-btn ghost" data-prompt="' + escapeHtml(P_NEW) + '">新到物品去录入</button>'
127
+ + '</div></section>';
128
+ }
129
+ else {
130
+ body += '<section><div class="x-empty">当前没有快递中<br>新到的物品可以先录入<div class="x-actions" style="justify-content:center">'
131
+ + '<button class="x-btn ghost" data-prompt="' + escapeHtml(P_NEW) + '">新到物品去录入</button>'
132
+ + '</div></div></section>';
133
+ }
134
+ body += '<script>'
135
+ + 'function xCopy(t){if(navigator.clipboard){navigator.clipboard.writeText(t);}}'
136
+ + 'document.querySelectorAll("[data-prompt]").forEach(function(b){b.addEventListener("click",function(){xCopy(b.getAttribute("data-prompt")||"");});});'
137
+ + 'function xReceive(){var s=[...document.querySelectorAll("#x-list input:checked")];if(!s.length){alert("请先勾选收到的物品");return;}var ids=s.map(function(c){return c.getAttribute("data-id");}).join(",");var names=s.map(function(c){return c.getAttribute("data-name");}).join("、");xCopy("请加载居家管家技能,帮我确认收货:"+names+" 编号["+ids+"]");}'
138
+ // #886:`xCopyData`/`xCopyLog` 两个空壳随复制区一起删——本页复制数据/复制日志已由
139
+ // `homeCopyArea` 出(三格式菜单+六段日志),这两颗 `function (){}` 没有任何调用方。
140
+ + '</script>';
141
+ // 主 operations 唯一复制区(envelope 投影;上下两分支旧按钮已删,只留这一处)。
142
+ body += homeCopyArea({
143
+ data: { envelope: env },
144
+ log: { envelope: env, copyLog: homeCopyLog({ command: ctx?.command ?? 'home-cmd-read ' + PAGE_META.key, actionAt: ctx?.actionAt ?? homeNowStamp() }) },
145
+ });
146
+ const content = head
147
+ + body
148
+ + sectionOf('fields', '字段')
149
+ + sectionOf('operations', '操作')
150
+ + sectionOf('empty', '空态与异常')
151
+ + sectionOf('status', '状态词')
152
+ // 机审对账用原文(注释内,不进可见文案,避免单字母占位符触发英文裸词):
153
+ + '<!--REQUIRED:快递中物品(名称/已等N天/是否超时)-->';
154
+ return fillTemplate(template, content);
155
+ }
156
+ //# sourceMappingURL=express.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"express.js","sourceRoot":"","sources":["../../../src/express/pages/express.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { Envelope } from 'base-link-core';
2
+ export declare const FAMILY: "list";
3
+ export declare const PAGE_META: {
4
+ readonly domain: "express";
5
+ readonly family: "list";
6
+ readonly key: "home.shopping.query";
7
+ readonly shape: "list";
8
+ readonly preset: Record<string, unknown>;
9
+ readonly scenarios: readonly string[];
10
+ };
11
+ export declare const REQUIRED_BLOCKS: {
12
+ readonly fields: readonly string[];
13
+ readonly operations: readonly string[];
14
+ readonly empty: readonly string[];
15
+ readonly status: readonly string[];
16
+ };
17
+ export declare function renderFamilyPage(env: Envelope, ctx?: {
18
+ readonly command?: string;
19
+ readonly actionAt?: string;
20
+ }): string;
21
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/express/pages/list.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG/C,eAAO,MAAM,MAAM,EAAG,MAAe,CAAC;AAEtC,eAAO,MAAM,SAAS;;;;;qBAKO,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;wBAC1B,SAAS,MAAM,EAAE;CACjC,CAAC;AAEX,eAAO,MAAM,eAAe,EA0BvB;IACH,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;CACpC,CAAC;AAqCF,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,CAAC,EAAE;IAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAiGvH"}
@@ -0,0 +1,161 @@
1
+ // express能力·list页装配(#805 脚手架生成,#812 域票填真内容)。
2
+ //
3
+ // 一族一个装配件:模板 `templates/express/list.html` 的装配入口。
4
+ // 必需块原文=契约附录(事实源),登记表 `scripts/lib/page-blocks.mjs` 由同一附录派生;
5
+ // 三方(本件/登记表/附录)由 `test/scaffold.test.mjs` 逐族对账,走散即红。
6
+ // 空态与异常态位:`renderFamilyPage` 按 REQUIRED_BLOCKS.empty 原样输出槽位,域票把真空态填进来。
7
+ // 数据形状声明:PAGE_META(主命令/形状/场景预设示例/服务场景清单)。
8
+ import { readFileSync } from 'node:fs';
9
+ import { fillTemplate, escapeHtml, homeCopyArea, homeCopyLog, homeNowStamp } from '../../render/index.js';
10
+ export const FAMILY = 'list';
11
+ export const PAGE_META = {
12
+ domain: 'express',
13
+ family: FAMILY,
14
+ key: 'home.shopping.query',
15
+ shape: 'list',
16
+ preset: { "kind": "list" },
17
+ scenarios: ["SM5-1"],
18
+ };
19
+ export const REQUIRED_BLOCKS = {
20
+ "empty": [
21
+ "空态:清单是空的+试试引导",
22
+ "拦截态:请先勾选买到的条目",
23
+ "异常:数据解析失败"
24
+ ],
25
+ "fields": [
26
+ "待买条目(名称/数量/来源标注)",
27
+ "清单内查重结果",
28
+ "摘要"
29
+ ],
30
+ "operations": [
31
+ "我买到了",
32
+ "清单外新买的",
33
+ "给已有物品补货",
34
+ "记一笔要买的",
35
+ "检测家里缺什么",
36
+ "清掉已买记录",
37
+ "勾选",
38
+ "复制数据",
39
+ "复制日志"
40
+ ],
41
+ "status": [
42
+ "待买",
43
+ "已买"
44
+ ]
45
+ };
46
+ function sectionOf(group, title) {
47
+ const items = REQUIRED_BLOCKS[group].map((b) => '<li data-need="' + escapeHtml(b) + '">' + escapeHtml(b) + '</li>').join('');
48
+ return '<section hidden data-block="' + group + '"><h2>' + title + '</h2><ul>' + items + '</ul></section>';
49
+ }
50
+ function asListItems(env) {
51
+ const d = env.data;
52
+ const raw = d.items ?? [];
53
+ return raw.map((r) => {
54
+ const o = r;
55
+ return {
56
+ id: Number(o.id ?? 0),
57
+ name: String(o.name ?? ''),
58
+ quantity: Number(o.quantity ?? 1),
59
+ routine: String(o.routine ?? ''),
60
+ checked: Number(o.checked ?? 0),
61
+ sourceLabel: String(o.sourceLabel ?? (o.routine ? '例行' : '手动记的')),
62
+ statusLabel: String(o.statusLabel ?? (Number(o.checked ?? 0) ? '已买' : '待买')),
63
+ };
64
+ }).filter((x) => x.name);
65
+ }
66
+ // 装配入口:真 envelope(真命令链产出)+本族模板 → 同形整页。
67
+ // fail-closed:模板缺失/标记异常(fillTemplate 内抛)不返空页。
68
+ // 复制区走共用件(卡路里同款三格式+六段日志);`ctx.command` 由交付链供给(含 params),直调缺省按本族主 key。
69
+ export function renderFamilyPage(env, ctx) {
70
+ const template = readFileSync(new URL('../../../templates/express/list.html', import.meta.url), 'utf8');
71
+ const head = '<div class="fam-head"><span>快递购物</span>'
72
+ + '<span>购物清单</span></div>';
73
+ const items = asListItems(env);
74
+ const pending = items.filter((x) => !x.checked);
75
+ const done = items.filter((x) => x.checked);
76
+ const seen = new Map();
77
+ for (const it of pending)
78
+ seen.set(it.name, (seen.get(it.name) ?? 0) + 1);
79
+ const dupes = [...seen.entries()].filter(([, n]) => n > 1).map(([n]) => n);
80
+ const style = '<style>'
81
+ + '.x-lead{color:#3a3a3c;font-size:15px;line-height:1.7;margin:12px 0}'
82
+ + '.x-metrics{display:flex;gap:10px;flex-wrap:wrap;margin:12px 0}'
83
+ + '.x-pill{border:1px solid #ddd;border-radius:999px;padding:6px 14px;font-size:13px;background:#fbfbfd}'
84
+ + '.x-row{display:flex;gap:12px;align-items:center;padding:12px 4px;border-bottom:1px solid #eee;flex-wrap:wrap}'
85
+ + '.x-name{font-weight:700;flex:1;min-width:140px;word-break:break-word}'
86
+ + '.x-note{color:#666;font-size:13px;margin-top:4px}'
87
+ + '.x-tag{background:#eef5ff;color:#0a63ce;border-radius:999px;padding:3px 10px;font-size:12px;margin-left:8px}'
88
+ + '.x-tag.manual{background:#f2f2f7;color:#666}'
89
+ + '.x-actions{display:flex;gap:10px;flex-wrap:wrap;margin-top:14px}'
90
+ + '.x-btn{border:none;background:#007aff;color:#fff;border-radius:999px;padding:12px 18px;font-weight:700;min-height:44px;font-size:15px}'
91
+ + '.x-btn.alt{background:#f2f2f7;color:#111;border:1px solid #ddd}'
92
+ + '.x-btn.ghost{background:#fff;color:#007aff;border:1px solid #007aff}'
93
+ + '.x-btn.danger{background:#fff;color:#c00;border:1px solid #ffb4ae}'
94
+ + '.x-check{width:44px;height:44px;flex:none;appearance:none;border:1.5px solid #c7c7cc;border-radius:12px;background:#fff center/22px 22px no-repeat;margin:0 6px 0 0;vertical-align:middle}.x-check:checked{border-color:#0a63ce;background-color:#0a63ce;background-image:url(\'data:image/svg+xml;utf8,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 24 24%22 fill=%22none%22 stroke=%22%23fff%22 stroke-width=%223%22><path d=%22M4 12l6 6L20 6%22/></svg>\')}'
95
+ + '.x-empty{text-align:center;color:#666;padding:26px 0;line-height:2}'
96
+ // #817(③双端不塌):390 档原来把整行改成竖排,44px 勾选件独占首行、行高 68→128px,一屏少看一条
97
+ // ——窄屏仍走横排(勾选件在左、文字在右),只把动作区改成一列两格。
98
+ + '@media(max-width:820px){.x-row{flex-direction:row;align-items:center}.x-actions{display:grid;grid-template-columns:1fr 1fr;gap:10px}.x-btn{width:100%}}'
99
+ + '</style>';
100
+ const P_NEW = '请加载居家管家技能,帮我录入新买的物品';
101
+ const P_RESTOCK = '请加载居家管家技能,帮我给物品补数量';
102
+ const P_ADD = '请加载居家管家技能,帮我添加购物清单条目';
103
+ const P_MISSING = '请加载居家管家技能,帮我检测缺货';
104
+ const P_CLEAN = '请加载居家管家技能,帮我清理已买的购物清单条目';
105
+ let body = style;
106
+ body += '<p class="x-lead">勾选买到的条目,点下方的按钮划掉,例行物品会按周期自动提醒</p>';
107
+ body += '<div class="x-metrics">'
108
+ + '<span class="x-pill">待买 ' + pending.length + ' 件</span>'
109
+ + '<span class="x-pill">已买 ' + done.length + ' 件</span>'
110
+ + '<span class="x-pill">查重 ' + dupes.length + ' 组</span>'
111
+ + '</div>';
112
+ if (dupes.length) {
113
+ body += '<section><h2>清单内查重</h2><div>'
114
+ + dupes.map((n) => '<span class="x-pill">别买重 ' + escapeHtml(n) + ' 在清单中出现多次,建议合并为一条</span>').join('')
115
+ + '</div></section>';
116
+ }
117
+ if (pending.length) {
118
+ body += '<section><h2>待买条目</h2><div id="x-list">'
119
+ + pending.map((it) => '<div class="x-row"><input class="x-check" type="checkbox" data-id="' + it.id + '" data-name="' + escapeHtml(it.name) + '" data-qty="' + it.quantity + '">'
120
+ + '<div style="flex:1"><div class="x-name">' + escapeHtml(it.name)
121
+ + '<span class="x-tag' + (it.routine ? '' : ' manual') + '">' + escapeHtml(it.sourceLabel) + '</span>'
122
+ + '<span class="x-tag manual">' + escapeHtml(it.statusLabel) + '</span></div>'
123
+ // #817:来源标注位已说「例行」,注里不再写「周期 例行」——同一事实两遍。
124
+ + '<div class="x-note">数量 ' + it.quantity + '</div></div></div>').join('')
125
+ + '</div></section>';
126
+ body += '<section><div class="x-actions">'
127
+ + '<button class="x-btn" onclick="xCheck()">我买到了</button>'
128
+ + '<button class="x-btn ghost" data-prompt="' + escapeHtml(P_NEW) + '">清单外新买的</button>'
129
+ + '<button class="x-btn ghost" data-prompt="' + escapeHtml(P_RESTOCK) + '">给已有物品补数量</button>'
130
+ + '<button class="x-btn ghost" data-prompt="' + escapeHtml(P_ADD) + '">记一笔要买的</button>'
131
+ + '<button class="x-btn ghost" data-prompt="' + escapeHtml(P_MISSING) + '">看看家里缺什么</button>'
132
+ + '<button class="x-btn danger" data-prompt="' + escapeHtml(P_CLEAN) + '">清掉已买记录</button>'
133
+ + '</div></section>';
134
+ }
135
+ else {
136
+ body += '<section><div class="x-empty">清单是空的<br>可以先看看家里缺什么,或者记一笔要买的<div class="x-actions" style="justify-content:center">'
137
+ + '<button class="x-btn ghost" data-prompt="' + escapeHtml(P_MISSING) + '">看看家里缺什么</button>'
138
+ + '<button class="x-btn ghost" data-prompt="' + escapeHtml(P_ADD) + '">记一笔要买的</button>'
139
+ + '</div></div></section>';
140
+ }
141
+ body += '<script>'
142
+ + 'function xCopy(t){if(navigator.clipboard){navigator.clipboard.writeText(t);}}'
143
+ + 'document.querySelectorAll("[data-prompt]").forEach(function(b){b.addEventListener("click",function(){xCopy(b.getAttribute("data-prompt")||"");});});'
144
+ + 'function xCheck(){var s=[...document.querySelectorAll("#x-list input:checked")];if(!s.length){alert("请先勾选买到的条目");return;}var ids=s.map(function(c){return c.getAttribute("data-id");}).join(",");var names=s.map(function(c){return c.getAttribute("data-name");}).join("、");xCopy("请加载居家管家技能,帮我标记购物清单条目已买到:"+names+" 编号["+ids+"]");}'
145
+ // #886:`xCopyData`/`xCopyLog` 两个空壳随复制区一起删(本页复制数据/复制日志已由
146
+ // `homeCopyArea` 出:三格式菜单+六段日志),这两颗 `function (){}` 没有调用方。
147
+ + '</script>';
148
+ // 主 operations 唯一复制区(envelope 投影;旧标题计数按钮已删,只留这一处)。
149
+ body += homeCopyArea({
150
+ data: { envelope: env },
151
+ log: { envelope: env, copyLog: homeCopyLog({ command: ctx?.command ?? 'home-cmd-read ' + PAGE_META.key, actionAt: ctx?.actionAt ?? homeNowStamp() }) },
152
+ });
153
+ const content = head
154
+ + body
155
+ + sectionOf('fields', '字段')
156
+ + sectionOf('operations', '操作')
157
+ + sectionOf('empty', '空态与异常')
158
+ + sectionOf('status', '状态词');
159
+ return fillTemplate(template, content);
160
+ }
161
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/express/pages/list.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { Envelope } from 'base-link-core';
2
+ export declare const FAMILY: "missing";
3
+ export declare const PAGE_META: {
4
+ readonly domain: "express";
5
+ readonly family: "missing";
6
+ readonly key: "home.shopping.query";
7
+ readonly shape: "list";
8
+ readonly preset: Record<string, unknown>;
9
+ readonly scenarios: readonly string[];
10
+ };
11
+ export declare const REQUIRED_BLOCKS: {
12
+ readonly fields: readonly string[];
13
+ readonly operations: readonly string[];
14
+ readonly empty: readonly string[];
15
+ readonly status: readonly string[];
16
+ };
17
+ export declare function renderFamilyPage(env: Envelope, ctx?: {
18
+ readonly command?: string;
19
+ readonly actionAt?: string;
20
+ }): string;
21
+ //# sourceMappingURL=missing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"missing.d.ts","sourceRoot":"","sources":["../../../src/express/pages/missing.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG/C,eAAO,MAAM,MAAM,EAAG,SAAkB,CAAC;AAEzC,eAAO,MAAM,SAAS;;;;;qBAKU,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;wBAC7B,SAAS,MAAM,EAAE;CACjC,CAAC;AAEX,eAAO,MAAM,eAAe,EAuBvB;IACH,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;CACpC,CAAC;AAwCF,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,CAAC,EAAE;IAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CA8EvH"}
@@ -0,0 +1,141 @@
1
+ // express能力·missing页装配(#805 脚手架生成,#812 域票填真内容)。
2
+ //
3
+ // 一族一个装配件:模板 `templates/express/missing.html` 的装配入口。
4
+ // 必需块原文=契约附录(事实源),登记表 `scripts/lib/page-blocks.mjs` 由同一附录派生;
5
+ // 三方(本件/登记表/附录)由 `test/scaffold.test.mjs` 逐族对账,走散即红。
6
+ // 空态与异常态位:`renderFamilyPage` 按 REQUIRED_BLOCKS.empty 原样输出槽位,域票把真空态填进来。
7
+ // 数据形状声明:PAGE_META(主命令/形状/场景预设示例/服务场景清单)。
8
+ import { readFileSync } from 'node:fs';
9
+ import { fillTemplate, escapeHtml, homeCopyArea, homeCopyLog, homeNowStamp } from '../../render/index.js';
10
+ export const FAMILY = 'missing';
11
+ export const PAGE_META = {
12
+ domain: 'express',
13
+ family: FAMILY,
14
+ key: 'home.shopping.query',
15
+ shape: 'list',
16
+ preset: { "kind": "missing" },
17
+ scenarios: ["SM5-2"],
18
+ };
19
+ export const REQUIRED_BLOCKS = {
20
+ "empty": [
21
+ "空态:库存充足没有缺货物品",
22
+ "拦截态:请先勾选缺货物品",
23
+ "异常:数据解析失败"
24
+ ],
25
+ "fields": [
26
+ "缺货物品(物品/当前数量/阈值/建议量)",
27
+ "检测范围",
28
+ "摘要"
29
+ ],
30
+ "operations": [
31
+ "勾选",
32
+ "加入购物清单",
33
+ "按范围检测",
34
+ "设置阈值",
35
+ "复制数据",
36
+ "复制日志"
37
+ ],
38
+ "status": [
39
+ "在家",
40
+ "备用"
41
+ ]
42
+ };
43
+ function sectionOf(group, title) {
44
+ const items = REQUIRED_BLOCKS[group].map((b) => '<li data-need="' + escapeHtml(b) + '">' + escapeHtml(b) + '</li>').join('');
45
+ return '<section hidden data-block="' + group + '"><h2>' + title + '</h2><ul>' + items + '</ul></section>';
46
+ }
47
+ function asMissing(env) {
48
+ const d = env.data;
49
+ const raw = d.items ?? [];
50
+ const items = raw.map((r) => {
51
+ const o = r;
52
+ return {
53
+ id: Number(o.id ?? 0),
54
+ name: String(o.name ?? ''),
55
+ current: Number(o.current ?? 0),
56
+ threshold: Number(o.threshold ?? 1),
57
+ threshold_source: String(o.threshold_source ?? '囤货设置'),
58
+ status: String(o.status ?? ''),
59
+ suggest: Number(o.suggest ?? 1),
60
+ category_name: String(o.category_name ?? ''),
61
+ };
62
+ }).filter((x) => x.name);
63
+ return { items, scope: String(d.scope ?? '全屋') };
64
+ }
65
+ // 装配入口:真 envelope(真命令链产出)+本族模板 → 同形整页。
66
+ // fail-closed:模板缺失/标记异常(fillTemplate 内抛)不返空页。
67
+ // 复制区走共用件(卡路里同款三格式+六段日志);`ctx.command` 由交付链供给(含 params),直调缺省按本族主 key。
68
+ export function renderFamilyPage(env, ctx) {
69
+ const template = readFileSync(new URL('../../../templates/express/missing.html', import.meta.url), 'utf8');
70
+ const head = '<div class="fam-head"><span>快递购物</span>'
71
+ + '<span>缺货检测</span></div>';
72
+ const { items, scope } = asMissing(env);
73
+ const style = '<style>'
74
+ + '.x-lead{color:#3a3a3c;font-size:15px;line-height:1.7;margin:12px 0;text-wrap:pretty}'
75
+ + '.x-metrics{display:flex;gap:10px;flex-wrap:wrap;margin:12px 0}'
76
+ + '.x-pill{border:1px solid #ddd;border-radius:999px;padding:6px 14px;font-size:13px;background:#fbfbfd}'
77
+ + '.x-row{display:flex;gap:12px;align-items:center;padding:12px 4px;border-bottom:1px solid #eee;flex-wrap:wrap}'
78
+ + '.x-name{font-weight:700;flex:1;min-width:140px;word-break:break-word}'
79
+ + '.x-meta{color:#666;font-size:13px;margin-top:4px}'
80
+ + '.x-suggest{background:#f5f8ff;border-radius:12px;padding:6px 12px;font-size:14px;white-space:nowrap}'
81
+ + '.x-suggest b{color:#0a63ce}'
82
+ + '.x-state{display:inline-block;border-radius:999px;padding:2px 10px;font-size:12px;font-weight:700;margin-left:8px}'
83
+ + '.x-state.low{background:#fff2df;color:#b36b00}.x-state.empty{background:#ffe8e6;color:#c00}'
84
+ + '.x-actions{display:flex;gap:10px;flex-wrap:wrap;margin-top:14px}'
85
+ + '.x-btn{border:none;background:#007aff;color:#fff;border-radius:999px;padding:12px 18px;font-weight:700;min-height:44px;font-size:15px}'
86
+ + '.x-btn.alt{background:#f2f2f7;color:#111;border:1px solid #ddd}'
87
+ + '.x-btn.ghost{background:#fff;color:#007aff;border:1px solid #007aff}'
88
+ + '.x-check{width:44px;height:44px;flex:none;appearance:none;border:1.5px solid #c7c7cc;border-radius:12px;background:#fff center/22px 22px no-repeat;margin:0 6px 0 0;vertical-align:middle}.x-check:checked{border-color:#0a63ce;background-color:#0a63ce;background-image:url(\'data:image/svg+xml;utf8,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 24 24%22 fill=%22none%22 stroke=%22%23fff%22 stroke-width=%223%22><path d=%22M4 12l6 6L20 6%22/></svg>\')}'
89
+ + '.x-empty{text-align:center;color:#666;padding:26px 0;line-height:2}'
90
+ + '@media(max-width:820px){.x-row{align-items:center}.x-actions{display:grid;grid-template-columns:1fr 1fr;gap:10px}.x-btn{width:100%}}'
91
+ + '</style>';
92
+ const P_SCOPE = '请加载居家管家技能,帮我按范围检测缺货';
93
+ const P_TH = '请加载居家管家技能,帮我查看囤货并设置阈值';
94
+ let body = style;
95
+ // #817(③双端不塌)第二波:说明句压到 390 档一行放得下(20 字)——原来 25 字在 390 档折行后
96
+ // 第二行只剩一个「出」孤字。
97
+ body += '<p class="x-lead">勾选后加入购物清单,建议买量按两倍阈值算</p>';
98
+ body += '<div class="x-metrics">'
99
+ + '<span class="x-pill">缺货 ' + items.length + ' 件</span>'
100
+ + '<span class="x-pill">检测范围 ' + escapeHtml(scope) + '</span>'
101
+ + '<span class="x-pill">阈值来源 囤货设置</span>'
102
+ + '</div>';
103
+ if (items.length) {
104
+ body += '<section><h2>缺货物品</h2><div id="x-list">'
105
+ + items.map((it) => '<div class="x-row"><input class="x-check" type="checkbox" data-id="' + it.id + '" data-name="' + escapeHtml(it.name) + '" data-suggest="' + it.suggest + '">'
106
+ + '<div style="flex:1"><div class="x-name">' + escapeHtml(it.name)
107
+ + '<span class="x-state ' + (it.status === '空' ? 'empty' : 'low') + '">' + escapeHtml(it.status) + '</span></div>'
108
+ + '<div class="x-meta">' + escapeHtml(it.category_name) + ' 当前 ' + it.current + ' 阈值 ' + it.threshold + '</div></div>'
109
+ + '<span class="x-suggest">建议买 <b>' + it.suggest + '</b></span></div>').join('')
110
+ + '</div><div class="x-actions">'
111
+ + '<button class="x-btn" onclick="xToList()">加入购物清单</button>'
112
+ + '<button class="x-btn ghost" data-prompt="' + escapeHtml(P_SCOPE) + '">按范围检测</button>'
113
+ + '<button class="x-btn ghost" data-prompt="' + escapeHtml(P_TH) + '">设置阈值</button>'
114
+ + '</div></section>';
115
+ }
116
+ else {
117
+ body += '<section><div class="x-empty">库存充足没有缺货<br>范围 ' + escapeHtml(scope) + '<div class="x-actions" style="justify-content:center">'
118
+ + '<button class="x-btn ghost" data-prompt="' + escapeHtml(P_TH) + '">设置阈值</button>'
119
+ + '</div></div></section>';
120
+ }
121
+ body += '<script>'
122
+ + 'function xCopy(t){if(navigator.clipboard){navigator.clipboard.writeText(t);}}'
123
+ + 'document.querySelectorAll("[data-prompt]").forEach(function(b){b.addEventListener("click",function(){xCopy(b.getAttribute("data-prompt")||"");});});'
124
+ + 'function xToList(){var s=[...document.querySelectorAll("#x-list input:checked")];if(!s.length){alert("请先勾选缺货物品");return;}var ids=s.map(function(c){return c.getAttribute("data-id");}).join(",");var names=s.map(function(c){return c.getAttribute("data-name")+"建议买"+c.getAttribute("data-suggest");}).join("、");xCopy("请加载居家管家技能,帮我将缺货物品加入购物清单:"+names+" 编号["+ids+"]");}'
125
+ + 'function xCopyData(){}'
126
+ + 'function xCopyLog(){}'
127
+ + '</script>';
128
+ // 主 operations 唯一复制区(envelope 投影;上下两分支旧按钮已删,只留这一处)。
129
+ body += homeCopyArea({
130
+ data: { envelope: env },
131
+ log: { envelope: env, copyLog: homeCopyLog({ command: ctx?.command ?? 'home-cmd-read ' + PAGE_META.key, actionAt: ctx?.actionAt ?? homeNowStamp() }) },
132
+ });
133
+ const content = head
134
+ + body
135
+ + sectionOf('fields', '字段')
136
+ + sectionOf('operations', '操作')
137
+ + sectionOf('empty', '空态与异常')
138
+ + sectionOf('status', '状态词');
139
+ return fillTemplate(template, content);
140
+ }
141
+ //# sourceMappingURL=missing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"missing.js","sourceRoot":"","sources":["../../../src/express/pages/missing.ts"],"names":[],"mappings":"AAAA,gDAAgD;AAChD,EAAE;AACF,qDAAqD;AACrD,6DAA6D;AAC7D,qDAAqD;AACrD,uEAAuE;AACvE,0CAA0C;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE1G,MAAM,CAAC,MAAM,MAAM,GAAG,SAAkB,CAAC;AAEzC,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,MAAM,EAAE,SAAS;IACjB,MAAM,EAAE,MAAM;IACd,GAAG,EAAE,qBAAqB;IAC1B,KAAK,EAAE,MAAM;IACb,MAAM,EAAE,EAAC,MAAM,EAAC,SAAS,EAA4B;IACrD,SAAS,EAAE,CAAC,OAAO,CAAsB;CACjC,CAAC;AAEX,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,OAAO,EAAE;QACP,eAAe;QACf,cAAc;QACd,WAAW;KACZ;IACD,QAAQ,EAAE;QACR,sBAAsB;QACtB,MAAM;QACN,IAAI;KACL;IACD,YAAY,EAAE;QACZ,IAAI;QACJ,QAAQ;QACR,OAAO;QACP,MAAM;QACN,MAAM;QACN,MAAM;KACP;IACD,QAAQ,EAAE;QACR,IAAI;QACJ,IAAI;KACL;CAMF,CAAC;AAEF,SAAS,SAAS,CAAC,KAAmD,EAAE,KAAa;IACnF,MAAM,KAAK,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,iBAAiB,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC7H,OAAO,8BAA8B,GAAG,KAAK,GAAG,QAAQ,GAAG,KAAK,GAAG,WAAW,GAAG,KAAK,GAAG,iBAAiB,CAAC;AAC7G,CAAC;AAaD,SAAS,SAAS,CAAC,GAAa;IAC9B,MAAM,CAAC,GAAG,GAAG,CAAC,IAA+B,CAAC;IAC9C,MAAM,GAAG,GAAI,CAAC,CAAC,KAA+B,IAAI,EAAE,CAAC;IACrD,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAC1B,MAAM,CAAC,GAAG,CAA4B,CAAC;QACvC,OAAO;YACL,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;YACrB,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;YAC1B,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC;YAC/B,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC;YACnC,gBAAgB,EAAE,MAAM,CAAC,CAAC,CAAC,gBAAgB,IAAI,MAAM,CAAC;YACtD,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC;YAC9B,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC;YAC/B,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC,aAAa,IAAI,EAAE,CAAC;SAC7C,CAAC;IACJ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACzB,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAE,CAAC,CAAC,KAA4B,IAAI,IAAI,CAAC,EAAE,CAAC;AAC3E,CAAC;AAED,uCAAuC;AACvC,8CAA8C;AAC9C,sEAAsE;AACtE,MAAM,UAAU,gBAAgB,CAAC,GAAa,EAAE,GAA+D;IAC7G,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,GAAG,CAAC,yCAAyC,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;IAC3G,MAAM,IAAI,GAAG,yCAAyC;UAClD,yBAAyB,CAAC;IAC9B,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;IAExC,MAAM,KAAK,GAAG,SAAS;UACnB,sFAAsF;UACtF,gEAAgE;UAChE,uGAAuG;UACvG,+GAA+G;UAC/G,uEAAuE;UACvE,mDAAmD;UACnD,sGAAsG;UACtG,6BAA6B;UAC7B,oHAAoH;UACpH,6FAA6F;UAC7F,kEAAkE;UAClE,wIAAwI;UACxI,iEAAiE;UACjE,sEAAsE;UACtE,+cAA+c;UAC/c,qEAAqE;UACrE,sIAAsI;UACtI,UAAU,CAAC;IAEf,MAAM,OAAO,GAAG,qBAAqB,CAAC;IACtC,MAAM,IAAI,GAAG,uBAAuB,CAAC;IAErC,IAAI,IAAI,GAAG,KAAK,CAAC;IACjB,2DAA2D;IAC3D,gBAAgB;IAChB,IAAI,IAAI,4CAA4C,CAAC;IACrD,IAAI,IAAI,yBAAyB;UAC7B,0BAA0B,GAAG,KAAK,CAAC,MAAM,GAAG,WAAW;UACvD,4BAA4B,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,SAAS;UAC5D,uCAAuC;UACvC,QAAQ,CAAC;IAEb,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACjB,IAAI,IAAI,yCAAyC;cAC7C,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,qEAAqE,GAAG,EAAE,CAAC,EAAE,GAAG,eAAe,GAAG,UAAU,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,kBAAkB,GAAG,EAAE,CAAC,OAAO,GAAG,IAAI;kBAC9K,0CAA0C,GAAG,UAAU,CAAC,EAAE,CAAC,IAAI,CAAC;kBAChE,uBAAuB,GAAG,CAAC,EAAE,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI,GAAG,UAAU,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,eAAe;kBAChH,sBAAsB,GAAG,UAAU,CAAC,EAAE,CAAC,aAAa,CAAC,GAAG,MAAM,GAAG,EAAE,CAAC,OAAO,GAAG,MAAM,GAAG,EAAE,CAAC,SAAS,GAAG,cAAc;kBACpH,iCAAiC,GAAG,EAAE,CAAC,OAAO,GAAG,mBAAmB,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;cAChF,+BAA+B;cAC/B,2DAA2D;cAC3D,2CAA2C,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,kBAAkB;cACtF,2CAA2C,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,iBAAiB;cAClF,kBAAkB,CAAC;IACzB,CAAC;SAAM,CAAC;QACN,IAAI,IAAI,+CAA+C,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,wDAAwD;cAClI,2CAA2C,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,iBAAiB;cAClF,wBAAwB,CAAC;IAC/B,CAAC;IAED,IAAI,IAAI,UAAU;UACd,+EAA+E;UAC/E,sJAAsJ;UACtJ,4WAA4W;UAC5W,wBAAwB;UACxB,uBAAuB;UACvB,WAAW,CAAC;IAEhB,oDAAoD;IACpD,IAAI,IAAI,YAAY,CAAC;QACnB,IAAI,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE;QACvB,GAAG,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE,WAAW,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,IAAI,gBAAgB,GAAG,SAAS,CAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,IAAI,YAAY,EAAE,EAAE,CAAC,EAAE;KACvJ,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,IAAI;UAChB,IAAI;UACJ,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC;UACzB,SAAS,CAAC,YAAY,EAAE,IAAI,CAAC;UAC7B,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC;UAC3B,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC/B,OAAO,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AACzC,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { Envelope } from 'base-link-core';
2
+ export declare const FAMILY: "stock";
3
+ export declare const PAGE_META: {
4
+ readonly domain: "express";
5
+ readonly family: "stock";
6
+ readonly key: "home.shopping.query";
7
+ readonly shape: "list";
8
+ readonly preset: Record<string, unknown>;
9
+ readonly scenarios: readonly string[];
10
+ };
11
+ export declare const REQUIRED_BLOCKS: {
12
+ readonly fields: readonly string[];
13
+ readonly operations: readonly string[];
14
+ readonly empty: readonly string[];
15
+ readonly status: readonly string[];
16
+ };
17
+ export declare function renderFamilyPage(env: Envelope, ctx?: {
18
+ readonly command?: string;
19
+ readonly actionAt?: string;
20
+ }): string;
21
+ //# sourceMappingURL=stock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stock.d.ts","sourceRoot":"","sources":["../../../src/express/pages/stock.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG/C,eAAO,MAAM,MAAM,EAAG,OAAgB,CAAC;AAEvC,eAAO,MAAM,SAAS;;;;;qBAKQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;wBAC3B,SAAS,MAAM,EAAE;CACjC,CAAC;AAEX,eAAO,MAAM,eAAe,EA0BvB;IACH,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;CACpC,CAAC;AA2CF,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,CAAC,EAAE;IAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CA4FvH"}