skill-home 0.3.1 → 0.3.13

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 (491) hide show
  1. package/SKILL.md +96 -52
  2. package/dist/cli/cmd_read.js +59 -778
  3. package/dist/cli/cmd_read.js.map +1 -1
  4. package/dist/cli/config.d.ts.map +1 -1
  5. package/dist/cli/config.js +11 -1
  6. package/dist/cli/config.js.map +1 -1
  7. package/dist/cli/keys.d.ts +4 -0
  8. package/dist/cli/keys.d.ts.map +1 -0
  9. package/dist/cli/keys.js +51 -0
  10. package/dist/cli/keys.js.map +1 -0
  11. package/dist/cli/registry.d.ts +4 -0
  12. package/dist/cli/registry.d.ts.map +1 -0
  13. package/dist/cli/registry.js +30 -0
  14. package/dist/cli/registry.js.map +1 -0
  15. package/dist/config.d.ts.map +1 -1
  16. package/dist/config.js +14 -7
  17. package/dist/config.js.map +1 -1
  18. package/dist/express/commands.d.ts +3 -0
  19. package/dist/express/commands.d.ts.map +1 -0
  20. package/dist/express/commands.js +6 -0
  21. package/dist/express/commands.js.map +1 -0
  22. package/dist/express/index.d.ts +3 -0
  23. package/dist/express/index.d.ts.map +1 -0
  24. package/dist/express/index.js +4 -0
  25. package/dist/express/index.js.map +1 -0
  26. package/dist/express/pages/express.d.ts +24 -0
  27. package/dist/express/pages/express.d.ts.map +1 -0
  28. package/dist/express/pages/express.js +160 -0
  29. package/dist/express/pages/express.js.map +1 -0
  30. package/dist/express/pages/list.d.ts +24 -0
  31. package/dist/express/pages/list.d.ts.map +1 -0
  32. package/dist/express/pages/list.js +167 -0
  33. package/dist/express/pages/list.js.map +1 -0
  34. package/dist/express/pages/missing.d.ts +24 -0
  35. package/dist/express/pages/missing.d.ts.map +1 -0
  36. package/dist/express/pages/missing.js +146 -0
  37. package/dist/express/pages/missing.js.map +1 -0
  38. package/dist/express/pages/stock.d.ts +24 -0
  39. package/dist/express/pages/stock.d.ts.map +1 -0
  40. package/dist/express/pages/stock.js +176 -0
  41. package/dist/express/pages/stock.js.map +1 -0
  42. package/dist/express/routes.d.ts +3 -0
  43. package/dist/express/routes.d.ts.map +1 -0
  44. package/dist/express/routes.js +8 -0
  45. package/dist/express/routes.js.map +1 -0
  46. package/dist/express/shopping.d.ts +4 -0
  47. package/dist/express/shopping.d.ts.map +1 -0
  48. package/dist/express/shopping.js +143 -0
  49. package/dist/express/shopping.js.map +1 -0
  50. package/dist/family/care.d.ts +4 -0
  51. package/dist/family/care.d.ts.map +1 -0
  52. package/dist/family/care.js +103 -0
  53. package/dist/family/care.js.map +1 -0
  54. package/dist/family/commands.d.ts +3 -0
  55. package/dist/family/commands.d.ts.map +1 -0
  56. package/dist/family/commands.js +6 -0
  57. package/dist/family/commands.js.map +1 -0
  58. package/dist/family/index.d.ts +3 -0
  59. package/dist/family/index.d.ts.map +1 -0
  60. package/dist/family/index.js +4 -0
  61. package/dist/family/index.js.map +1 -0
  62. package/dist/family/pages/family_borrow.d.ts +24 -0
  63. package/dist/family/pages/family_borrow.d.ts.map +1 -0
  64. package/dist/family/pages/family_borrow.js +267 -0
  65. package/dist/family/pages/family_borrow.js.map +1 -0
  66. package/dist/family/pages/family_members.d.ts +24 -0
  67. package/dist/family/pages/family_members.d.ts.map +1 -0
  68. package/dist/family/pages/family_members.js +171 -0
  69. package/dist/family/pages/family_members.js.map +1 -0
  70. package/dist/family/routes.d.ts +3 -0
  71. package/dist/family/routes.d.ts.map +1 -0
  72. package/dist/family/routes.js +20 -0
  73. package/dist/family/routes.js.map +1 -0
  74. package/dist/fetch/db.d.ts.map +1 -1
  75. package/dist/fetch/db.js +9 -1
  76. package/dist/fetch/db.js.map +1 -1
  77. package/dist/fetch/domains.d.ts +92 -0
  78. package/dist/fetch/domains.d.ts.map +1 -1
  79. package/dist/fetch/domains.js +165 -26
  80. package/dist/fetch/domains.js.map +1 -1
  81. package/dist/fetch/index.d.ts +2 -1
  82. package/dist/fetch/index.d.ts.map +1 -1
  83. package/dist/fetch/index.js +6 -1
  84. package/dist/fetch/index.js.map +1 -1
  85. package/dist/health.d.ts +9 -0
  86. package/dist/health.d.ts.map +1 -1
  87. package/dist/health.js +19 -0
  88. package/dist/health.js.map +1 -1
  89. package/dist/help/helpAssets.js +1 -1
  90. package/dist/items/add.d.ts +3 -0
  91. package/dist/items/add.d.ts.map +1 -0
  92. package/dist/items/add.js +34 -0
  93. package/dist/items/add.js.map +1 -0
  94. package/dist/items/commands.d.ts +3 -0
  95. package/dist/items/commands.d.ts.map +1 -0
  96. package/dist/items/commands.js +22 -0
  97. package/dist/items/commands.js.map +1 -0
  98. package/dist/items/detail.d.ts +3 -0
  99. package/dist/items/detail.d.ts.map +1 -0
  100. package/dist/items/detail.js +31 -0
  101. package/dist/items/detail.js.map +1 -0
  102. package/dist/items/index.d.ts +3 -0
  103. package/dist/items/index.d.ts.map +1 -0
  104. package/dist/items/index.js +4 -0
  105. package/dist/items/index.js.map +1 -0
  106. package/dist/items/inventory.d.ts +4 -0
  107. package/dist/items/inventory.d.ts.map +1 -0
  108. package/dist/items/inventory.js +41 -0
  109. package/dist/items/inventory.js.map +1 -0
  110. package/dist/items/pages/add_form.d.ts +24 -0
  111. package/dist/items/pages/add_form.d.ts.map +1 -0
  112. package/dist/items/pages/add_form.js +174 -0
  113. package/dist/items/pages/add_form.js.map +1 -0
  114. package/dist/items/pages/browse.d.ts +24 -0
  115. package/dist/items/pages/browse.d.ts.map +1 -0
  116. package/dist/items/pages/browse.js +143 -0
  117. package/dist/items/pages/browse.js.map +1 -0
  118. package/dist/items/pages/category_manage.d.ts +24 -0
  119. package/dist/items/pages/category_manage.d.ts.map +1 -0
  120. package/dist/items/pages/category_manage.js +153 -0
  121. package/dist/items/pages/category_manage.js.map +1 -0
  122. package/dist/items/pages/confirm.d.ts +24 -0
  123. package/dist/items/pages/confirm.d.ts.map +1 -0
  124. package/dist/items/pages/confirm.js +149 -0
  125. package/dist/items/pages/confirm.js.map +1 -0
  126. package/dist/items/pages/detail.d.ts +24 -0
  127. package/dist/items/pages/detail.d.ts.map +1 -0
  128. package/dist/items/pages/detail.js +160 -0
  129. package/dist/items/pages/detail.js.map +1 -0
  130. package/dist/items/pages/duplicates.d.ts +24 -0
  131. package/dist/items/pages/duplicates.d.ts.map +1 -0
  132. package/dist/items/pages/duplicates.js +138 -0
  133. package/dist/items/pages/duplicates.js.map +1 -0
  134. package/dist/items/pages/history.d.ts +24 -0
  135. package/dist/items/pages/history.d.ts.map +1 -0
  136. package/dist/items/pages/history.js +213 -0
  137. package/dist/items/pages/history.js.map +1 -0
  138. package/dist/items/pages/inventory_diff.d.ts +24 -0
  139. package/dist/items/pages/inventory_diff.d.ts.map +1 -0
  140. package/dist/items/pages/inventory_diff.js +126 -0
  141. package/dist/items/pages/inventory_diff.js.map +1 -0
  142. package/dist/items/pages/inventory_records.d.ts +24 -0
  143. package/dist/items/pages/inventory_records.d.ts.map +1 -0
  144. package/dist/items/pages/inventory_records.js +147 -0
  145. package/dist/items/pages/inventory_records.js.map +1 -0
  146. package/dist/items/pages/inventory_round.d.ts +24 -0
  147. package/dist/items/pages/inventory_round.d.ts.map +1 -0
  148. package/dist/items/pages/inventory_round.js +145 -0
  149. package/dist/items/pages/inventory_round.js.map +1 -0
  150. package/dist/items/pages/locate.d.ts +24 -0
  151. package/dist/items/pages/locate.d.ts.map +1 -0
  152. package/dist/items/pages/locate.js +129 -0
  153. package/dist/items/pages/locate.js.map +1 -0
  154. package/dist/items/pages/move_checklist.d.ts +24 -0
  155. package/dist/items/pages/move_checklist.d.ts.map +1 -0
  156. package/dist/items/pages/move_checklist.js +112 -0
  157. package/dist/items/pages/move_checklist.js.map +1 -0
  158. package/dist/items/pages/photo_wall.d.ts +24 -0
  159. package/dist/items/pages/photo_wall.d.ts.map +1 -0
  160. package/dist/items/pages/photo_wall.js +145 -0
  161. package/dist/items/pages/photo_wall.js.map +1 -0
  162. package/dist/items/pages/photos.d.ts +24 -0
  163. package/dist/items/pages/photos.d.ts.map +1 -0
  164. package/dist/items/pages/photos.js +182 -0
  165. package/dist/items/pages/photos.js.map +1 -0
  166. package/dist/items/pages/receipt.d.ts +24 -0
  167. package/dist/items/pages/receipt.d.ts.map +1 -0
  168. package/dist/items/pages/receipt.js +252 -0
  169. package/dist/items/pages/receipt.js.map +1 -0
  170. package/dist/items/pages/relations.d.ts +24 -0
  171. package/dist/items/pages/relations.d.ts.map +1 -0
  172. package/dist/items/pages/relations.js +144 -0
  173. package/dist/items/pages/relations.js.map +1 -0
  174. package/dist/items/pages/search_list.d.ts +24 -0
  175. package/dist/items/pages/search_list.d.ts.map +1 -0
  176. package/dist/items/pages/search_list.js +133 -0
  177. package/dist/items/pages/search_list.js.map +1 -0
  178. package/dist/items/pages/tag_manage.d.ts +24 -0
  179. package/dist/items/pages/tag_manage.d.ts.map +1 -0
  180. package/dist/items/pages/tag_manage.js +213 -0
  181. package/dist/items/pages/tag_manage.js.map +1 -0
  182. package/dist/items/pages/undo_select.d.ts +24 -0
  183. package/dist/items/pages/undo_select.d.ts.map +1 -0
  184. package/dist/items/pages/undo_select.js +143 -0
  185. package/dist/items/pages/undo_select.js.map +1 -0
  186. package/dist/items/routes.d.ts +3 -0
  187. package/dist/items/routes.d.ts.map +1 -0
  188. package/dist/items/routes.js +62 -0
  189. package/dist/items/routes.js.map +1 -0
  190. package/dist/items/search.d.ts +3 -0
  191. package/dist/items/search.d.ts.map +1 -0
  192. package/dist/items/search.js +47 -0
  193. package/dist/items/search.js.map +1 -0
  194. package/dist/items/tag.d.ts +25 -0
  195. package/dist/items/tag.d.ts.map +1 -0
  196. package/dist/items/tag.js +133 -0
  197. package/dist/items/tag.js.map +1 -0
  198. package/dist/items/update.d.ts +20 -0
  199. package/dist/items/update.d.ts.map +1 -0
  200. package/dist/items/update.js +211 -0
  201. package/dist/items/update.js.map +1 -0
  202. package/dist/outfit/commands.d.ts +3 -0
  203. package/dist/outfit/commands.d.ts.map +1 -0
  204. package/dist/outfit/commands.js +7 -0
  205. package/dist/outfit/commands.js.map +1 -0
  206. package/dist/outfit/index.d.ts +3 -0
  207. package/dist/outfit/index.d.ts.map +1 -0
  208. package/dist/outfit/index.js +4 -0
  209. package/dist/outfit/index.js.map +1 -0
  210. package/dist/outfit/outfit.d.ts +3 -0
  211. package/dist/outfit/outfit.d.ts.map +1 -0
  212. package/dist/outfit/outfit.js +182 -0
  213. package/dist/outfit/outfit.js.map +1 -0
  214. package/dist/outfit/pages/outfit_picker.d.ts +24 -0
  215. package/dist/outfit/pages/outfit_picker.d.ts.map +1 -0
  216. package/dist/outfit/pages/outfit_picker.js +185 -0
  217. package/dist/outfit/pages/outfit_picker.js.map +1 -0
  218. package/dist/outfit/pages/travel_trip.d.ts +24 -0
  219. package/dist/outfit/pages/travel_trip.d.ts.map +1 -0
  220. package/dist/outfit/pages/travel_trip.js +185 -0
  221. package/dist/outfit/pages/travel_trip.js.map +1 -0
  222. package/dist/outfit/pages/trip_outfit_plan.d.ts +24 -0
  223. package/dist/outfit/pages/trip_outfit_plan.d.ts.map +1 -0
  224. package/dist/outfit/pages/trip_outfit_plan.js +173 -0
  225. package/dist/outfit/pages/trip_outfit_plan.js.map +1 -0
  226. package/dist/outfit/pages/wardrobe_analyze.d.ts +24 -0
  227. package/dist/outfit/pages/wardrobe_analyze.d.ts.map +1 -0
  228. package/dist/outfit/pages/wardrobe_analyze.js +171 -0
  229. package/dist/outfit/pages/wardrobe_analyze.js.map +1 -0
  230. package/dist/outfit/pages/wardrobe_season.d.ts +24 -0
  231. package/dist/outfit/pages/wardrobe_season.d.ts.map +1 -0
  232. package/dist/outfit/pages/wardrobe_season.js +167 -0
  233. package/dist/outfit/pages/wardrobe_season.js.map +1 -0
  234. package/dist/outfit/routes.d.ts +3 -0
  235. package/dist/outfit/routes.d.ts.map +1 -0
  236. package/dist/outfit/routes.js +9 -0
  237. package/dist/outfit/routes.js.map +1 -0
  238. package/dist/outfit/trip.d.ts +3 -0
  239. package/dist/outfit/trip.d.ts.map +1 -0
  240. package/dist/outfit/trip.js +59 -0
  241. package/dist/outfit/trip.js.map +1 -0
  242. package/dist/output.d.ts +13 -0
  243. package/dist/output.d.ts.map +1 -0
  244. package/dist/output.js +57 -0
  245. package/dist/output.js.map +1 -0
  246. package/dist/policy/routes.generated.d.ts +3 -0
  247. package/dist/policy/routes.generated.d.ts.map +1 -0
  248. package/dist/policy/routes.generated.js +128 -0
  249. package/dist/policy/routes.generated.js.map +1 -0
  250. package/dist/policy/wakewords.d.ts +1 -0
  251. package/dist/policy/wakewords.d.ts.map +1 -1
  252. package/dist/policy/wakewords.js +11 -93
  253. package/dist/policy/wakewords.js.map +1 -1
  254. package/dist/receipt/commands.d.ts +3 -0
  255. package/dist/receipt/commands.d.ts.map +1 -0
  256. package/dist/receipt/commands.js +6 -0
  257. package/dist/receipt/commands.js.map +1 -0
  258. package/dist/receipt/index.d.ts +3 -0
  259. package/dist/receipt/index.d.ts.map +1 -0
  260. package/dist/receipt/index.js +4 -0
  261. package/dist/receipt/index.js.map +1 -0
  262. package/dist/receipt/pages/accounts.d.ts +24 -0
  263. package/dist/receipt/pages/accounts.d.ts.map +1 -0
  264. package/dist/receipt/pages/accounts.js +217 -0
  265. package/dist/receipt/pages/accounts.js.map +1 -0
  266. package/dist/receipt/pages/certificates.d.ts +24 -0
  267. package/dist/receipt/pages/certificates.d.ts.map +1 -0
  268. package/dist/receipt/pages/certificates.js +231 -0
  269. package/dist/receipt/pages/certificates.js.map +1 -0
  270. package/dist/receipt/pages/purchase_records.d.ts +24 -0
  271. package/dist/receipt/pages/purchase_records.d.ts.map +1 -0
  272. package/dist/receipt/pages/purchase_records.js +267 -0
  273. package/dist/receipt/pages/purchase_records.js.map +1 -0
  274. package/dist/receipt/pages/warranty.d.ts +24 -0
  275. package/dist/receipt/pages/warranty.d.ts.map +1 -0
  276. package/dist/receipt/pages/warranty.js +142 -0
  277. package/dist/receipt/pages/warranty.js.map +1 -0
  278. package/dist/receipt/routes.d.ts +3 -0
  279. package/dist/receipt/routes.d.ts.map +1 -0
  280. package/dist/receipt/routes.js +21 -0
  281. package/dist/receipt/routes.js.map +1 -0
  282. package/dist/receipt/ticket.d.ts +4 -0
  283. package/dist/receipt/ticket.d.ts.map +1 -0
  284. package/dist/receipt/ticket.js +282 -0
  285. package/dist/receipt/ticket.js.map +1 -0
  286. package/dist/render/copyArea.d.ts +45 -0
  287. package/dist/render/copyArea.d.ts.map +1 -0
  288. package/dist/render/copyArea.js +74 -0
  289. package/dist/render/copyArea.js.map +1 -0
  290. package/dist/render/envelope.d.ts.map +1 -1
  291. package/dist/render/envelope.js +4 -23
  292. package/dist/render/envelope.js.map +1 -1
  293. package/dist/render/errors.d.ts +1 -1
  294. package/dist/render/errors.d.ts.map +1 -1
  295. package/dist/render/errors.js.map +1 -1
  296. package/dist/render/familyPage.d.ts +20 -0
  297. package/dist/render/familyPage.d.ts.map +1 -0
  298. package/dist/render/familyPage.js +106 -0
  299. package/dist/render/familyPage.js.map +1 -0
  300. package/dist/render/html.d.ts +7 -2
  301. package/dist/render/html.d.ts.map +1 -1
  302. package/dist/render/html.js +78 -6
  303. package/dist/render/html.js.map +1 -1
  304. package/dist/render/index.d.ts +8 -2
  305. package/dist/render/index.d.ts.map +1 -1
  306. package/dist/render/index.js +9 -2
  307. package/dist/render/index.js.map +1 -1
  308. package/dist/render/pageFamilies.d.ts +8 -0
  309. package/dist/render/pageFamilies.d.ts.map +1 -0
  310. package/dist/render/pageFamilies.js +169 -0
  311. package/dist/render/pageFamilies.js.map +1 -0
  312. package/dist/render/sceneNaming.d.ts +14 -0
  313. package/dist/render/sceneNaming.d.ts.map +1 -0
  314. package/dist/render/sceneNaming.js +173 -0
  315. package/dist/render/sceneNaming.js.map +1 -0
  316. package/dist/render/views.d.ts +34 -2
  317. package/dist/render/views.d.ts.map +1 -1
  318. package/dist/render/views.js +28 -4
  319. package/dist/render/views.js.map +1 -1
  320. package/dist/setup/commands.d.ts +3 -0
  321. package/dist/setup/commands.d.ts.map +1 -0
  322. package/dist/setup/commands.js +9 -0
  323. package/dist/setup/commands.js.map +1 -0
  324. package/dist/setup/index.d.ts +3 -0
  325. package/dist/setup/index.d.ts.map +1 -0
  326. package/dist/setup/index.js +4 -0
  327. package/dist/setup/index.js.map +1 -0
  328. package/dist/setup/pages/backup_receipt.d.ts +24 -0
  329. package/dist/setup/pages/backup_receipt.d.ts.map +1 -0
  330. package/dist/setup/pages/backup_receipt.js +198 -0
  331. package/dist/setup/pages/backup_receipt.js.map +1 -0
  332. package/dist/setup/pages/first_use_wizard.d.ts +24 -0
  333. package/dist/setup/pages/first_use_wizard.d.ts.map +1 -0
  334. package/dist/setup/pages/first_use_wizard.js +169 -0
  335. package/dist/setup/pages/first_use_wizard.js.map +1 -0
  336. package/dist/setup/pages/health_report.d.ts +24 -0
  337. package/dist/setup/pages/health_report.d.ts.map +1 -0
  338. package/dist/setup/pages/health_report.js +152 -0
  339. package/dist/setup/pages/health_report.js.map +1 -0
  340. package/dist/setup/pages/import_restore.d.ts +24 -0
  341. package/dist/setup/pages/import_restore.d.ts.map +1 -0
  342. package/dist/setup/pages/import_restore.js +179 -0
  343. package/dist/setup/pages/import_restore.js.map +1 -0
  344. package/dist/setup/routes.d.ts +3 -0
  345. package/dist/setup/routes.d.ts.map +1 -0
  346. package/dist/setup/routes.js +2 -0
  347. package/dist/setup/routes.js.map +1 -0
  348. package/dist/shared/commandSpec.d.ts +30 -0
  349. package/dist/shared/commandSpec.d.ts.map +1 -0
  350. package/dist/shared/commandSpec.js +8 -0
  351. package/dist/shared/commandSpec.js.map +1 -0
  352. package/dist/shared/fail.d.ts +4 -0
  353. package/dist/shared/fail.d.ts.map +1 -0
  354. package/dist/shared/fail.js +16 -0
  355. package/dist/shared/fail.js.map +1 -0
  356. package/dist/shared/params.d.ts +2 -0
  357. package/dist/shared/params.d.ts.map +1 -0
  358. package/dist/shared/params.js +12 -0
  359. package/dist/shared/params.js.map +1 -0
  360. package/dist/space/commands.d.ts +3 -0
  361. package/dist/space/commands.d.ts.map +1 -0
  362. package/dist/space/commands.js +6 -0
  363. package/dist/space/commands.js.map +1 -0
  364. package/dist/space/index.d.ts +3 -0
  365. package/dist/space/index.d.ts.map +1 -0
  366. package/dist/space/index.js +4 -0
  367. package/dist/space/index.js.map +1 -0
  368. package/dist/space/location.d.ts +82 -0
  369. package/dist/space/location.d.ts.map +1 -0
  370. package/dist/space/location.js +310 -0
  371. package/dist/space/location.js.map +1 -0
  372. package/dist/space/pages/fixed_spot.d.ts +24 -0
  373. package/dist/space/pages/fixed_spot.d.ts.map +1 -0
  374. package/dist/space/pages/fixed_spot.js +122 -0
  375. package/dist/space/pages/fixed_spot.js.map +1 -0
  376. package/dist/space/pages/location_manage.d.ts +24 -0
  377. package/dist/space/pages/location_manage.d.ts.map +1 -0
  378. package/dist/space/pages/location_manage.js +169 -0
  379. package/dist/space/pages/location_manage.js.map +1 -0
  380. package/dist/space/pages/space_view.d.ts +24 -0
  381. package/dist/space/pages/space_view.d.ts.map +1 -0
  382. package/dist/space/pages/space_view.js +185 -0
  383. package/dist/space/pages/space_view.js.map +1 -0
  384. package/dist/space/pages/suggest_storage.d.ts +24 -0
  385. package/dist/space/pages/suggest_storage.d.ts.map +1 -0
  386. package/dist/space/pages/suggest_storage.js +179 -0
  387. package/dist/space/pages/suggest_storage.js.map +1 -0
  388. package/dist/space/routes.d.ts +3 -0
  389. package/dist/space/routes.d.ts.map +1 -0
  390. package/dist/space/routes.js +24 -0
  391. package/dist/space/routes.js.map +1 -0
  392. package/dist/stats/commands.d.ts +3 -0
  393. package/dist/stats/commands.d.ts.map +1 -0
  394. package/dist/stats/commands.js +6 -0
  395. package/dist/stats/commands.js.map +1 -0
  396. package/dist/stats/index.d.ts +3 -0
  397. package/dist/stats/index.d.ts.map +1 -0
  398. package/dist/stats/index.js +4 -0
  399. package/dist/stats/index.js.map +1 -0
  400. package/dist/stats/pages/expiring.d.ts +24 -0
  401. package/dist/stats/pages/expiring.d.ts.map +1 -0
  402. package/dist/stats/pages/expiring.js +220 -0
  403. package/dist/stats/pages/expiring.js.map +1 -0
  404. package/dist/stats/pages/idle.d.ts +24 -0
  405. package/dist/stats/pages/idle.d.ts.map +1 -0
  406. package/dist/stats/pages/idle.js +181 -0
  407. package/dist/stats/pages/idle.js.map +1 -0
  408. package/dist/stats/pages/inventory_stat.d.ts +24 -0
  409. package/dist/stats/pages/inventory_stat.d.ts.map +1 -0
  410. package/dist/stats/pages/inventory_stat.js +165 -0
  411. package/dist/stats/pages/inventory_stat.js.map +1 -0
  412. package/dist/stats/pages/overview.d.ts +24 -0
  413. package/dist/stats/pages/overview.d.ts.map +1 -0
  414. package/dist/stats/pages/overview.js +238 -0
  415. package/dist/stats/pages/overview.js.map +1 -0
  416. package/dist/stats/routes.d.ts +3 -0
  417. package/dist/stats/routes.d.ts.map +1 -0
  418. package/dist/stats/routes.js +16 -0
  419. package/dist/stats/routes.js.map +1 -0
  420. package/dist/stats/stats.d.ts +4 -0
  421. package/dist/stats/stats.d.ts.map +1 -0
  422. package/dist/stats/stats.js +73 -0
  423. package/dist/stats/stats.js.map +1 -0
  424. package/package.json +8 -5
  425. package/templates/care_query.html +1 -0
  426. package/templates/care_receipt.html +1 -0
  427. package/templates/express/express.html +17 -0
  428. package/templates/express/list.html +17 -0
  429. package/templates/express/missing.html +17 -0
  430. package/templates/express/stock.html +17 -0
  431. package/templates/family/family_borrow.html +17 -0
  432. package/templates/family/family_members.html +17 -0
  433. package/templates/help.html +1 -0
  434. package/templates/inventory_records.html +1 -0
  435. package/templates/inventory_round.html +1 -0
  436. package/templates/item_detail.html +1 -0
  437. package/templates/item_receipt.html +1 -0
  438. package/templates/item_search.html +1 -0
  439. package/templates/item_update_receipt.html +1 -0
  440. package/templates/items/add_form.html +17 -0
  441. package/templates/items/browse.html +17 -0
  442. package/templates/items/category_manage.html +17 -0
  443. package/templates/items/confirm.html +17 -0
  444. package/templates/items/detail.html +17 -0
  445. package/templates/items/duplicates.html +17 -0
  446. package/templates/items/history.html +17 -0
  447. package/templates/items/inventory_diff.html +17 -0
  448. package/templates/items/inventory_records.html +17 -0
  449. package/templates/items/inventory_round.html +17 -0
  450. package/templates/items/locate.html +17 -0
  451. package/templates/items/move_checklist.html +17 -0
  452. package/templates/items/photo_wall.html +17 -0
  453. package/templates/items/photos.html +17 -0
  454. package/templates/items/receipt.html +17 -0
  455. package/templates/items/relations.html +17 -0
  456. package/templates/items/search_list.html +17 -0
  457. package/templates/items/tag_manage.html +17 -0
  458. package/templates/items/undo_select.html +17 -0
  459. package/templates/location_query.html +1 -0
  460. package/templates/location_receipt.html +1 -0
  461. package/templates/outfit/outfit_picker.html +17 -0
  462. package/templates/outfit/travel_trip.html +17 -0
  463. package/templates/outfit/trip_outfit_plan.html +17 -0
  464. package/templates/outfit/wardrobe_analyze.html +17 -0
  465. package/templates/outfit/wardrobe_season.html +17 -0
  466. package/templates/outfit_pick.html +1 -0
  467. package/templates/receipt/accounts.html +17 -0
  468. package/templates/receipt/certificates.html +17 -0
  469. package/templates/receipt/purchase_records.html +17 -0
  470. package/templates/receipt/warranty.html +17 -0
  471. package/templates/setup/backup_receipt.html +17 -0
  472. package/templates/setup/first_use_wizard.html +17 -0
  473. package/templates/setup/health_report.html +17 -0
  474. package/templates/setup/import_restore.html +17 -0
  475. package/templates/shopping_query.html +1 -0
  476. package/templates/shopping_receipt.html +1 -0
  477. package/templates/space/fixed_spot.html +63 -0
  478. package/templates/space/location_manage.html +70 -0
  479. package/templates/space/space_view.html +65 -0
  480. package/templates/space/suggest_storage.html +58 -0
  481. package/templates/stats/expiring.html +17 -0
  482. package/templates/stats/idle.html +17 -0
  483. package/templates/stats/inventory_stat.html +17 -0
  484. package/templates/stats/overview.html +17 -0
  485. package/templates/stats_alert.html +1 -0
  486. package/templates/stats_overview.html +1 -0
  487. package/templates/tag_query.html +1 -0
  488. package/templates/tag_receipt.html +1 -0
  489. package/templates/ticket_query.html +1 -0
  490. package/templates/ticket_receipt.html +1 -0
  491. package/templates/trip_receipt.html +1 -0
@@ -0,0 +1,160 @@
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
+ rows: [{ "key": "home.shopping.query", "preset": { "kind": "express" } }],
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
+ // #890:「我收到了」的初始载荷(点后由页内 `onclick` 按当刻勾选改写 `data-t`)。
108
+ const P_RECEIVE = '请加载居家管家技能,帮我确认收货';
109
+ let body = style;
110
+ body += '<p class="x-lead">勾选收到的快递,点下方的按钮标记到家,超过 ' + timeout + ' 天会标红提醒</p>';
111
+ body += '<div class="x-metrics">'
112
+ + '<span class="x-pill">在途 ' + items.length + ' 件</span>'
113
+ + '<span class="x-pill">超时 ' + overdue.length + ' 件</span>'
114
+ + '<span class="x-pill">超时线 ' + timeout + ' 天</span>'
115
+ + '</div>';
116
+ if (items.length) {
117
+ body += '<section><h2>快递中</h2><div class="x-cards" id="x-list">'
118
+ + items.map((it) => '<div class="x-card"><input class="x-check" type="checkbox" data-id="' + it.id + '" data-name="' + escapeHtml(it.name) + '">'
119
+ + '<div class="x-body">'
120
+ // 照片为空时不渲染占位块:灰底「无照片」零信息却占卡片最大面积(#817 seq 45 的 ⑤)。
121
+ + (it.photo === '' ? '' : '<div class="x-photo">' + escapeHtml(it.photo) + '</div>')
122
+ + '<div class="x-name">' + escapeHtml(it.name)
123
+ + '<span class="x-state ' + (it.overdue ? 'over' : 'days') + '">已等 ' + it.days + ' 天' + (it.overdue ? ' 超时' : '') + '</span></div>'
124
+ + '<div class="x-meta">' + escapeHtml(it.category_name) + ' ' + escapeHtml(it.location) + ' 数量 ' + it.quantity + '</div></div></div>').join('')
125
+ + '</div><div class="x-actions">'
126
+ + '<button class="x-btn" data-action-id="x-receive" data-t="' + escapeHtml(P_RECEIVE) + '" onclick="xReceive(this)">我收到了</button>'
127
+ + '<button class="x-btn ghost" data-action-id="x-backup" data-t="' + escapeHtml(P_BACKUP) + '">收到的放备用</button>'
128
+ + '<button class="x-btn ghost" data-action-id="x-new" data-t="' + escapeHtml(P_NEW) + '">新到物品去录入</button>'
129
+ + '</div></section>';
130
+ }
131
+ else {
132
+ body += '<section><div class="x-empty">当前没有快递中<br>新到的物品可以先录入<div class="x-actions" style="justify-content:center">'
133
+ + '<button class="x-btn ghost" data-action-id="x-new" data-t="' + escapeHtml(P_NEW) + '">新到物品去录入</button>'
134
+ + '</div></div></section>';
135
+ }
136
+ // #890:复制路径交给公共层共享运行时(`<!--SHARED-HELPERS-->` 槽的 `buildSharedHelpersJs`),
137
+ // 不再页内自造 `xCopy`(无反馈/无 `catch`/无 `execCommand` 降级)。按钮带 `data-action-id`
138
+ // + `data-t` 即由 document 委派复制;按当刻勾选现算的那一颗,用元素级 `onclick` 先把载荷写回
139
+ // 自己的 `data-t`(目标阶段先于 document 冒泡),没勾选时置空并保留拦截提示。
140
+ body += '<script>'
141
+ + 'function xReceive(b){var s=[...document.querySelectorAll("#x-list input:checked")];if(!s.length){b.setAttribute("data-t","");alert("请先勾选收到的物品");return;}'
142
+ + 'var ids=s.map(function(c){return c.getAttribute("data-id");}).join(",");var names=s.map(function(c){return c.getAttribute("data-name");}).join("、");'
143
+ + 'b.setAttribute("data-t","请加载居家管家技能,帮我确认收货:"+names+" 编号["+ids+"]");}'
144
+ + '</script>';
145
+ // 主 operations 唯一复制区(envelope 投影;上下两分支旧按钮已删,只留这一处)。
146
+ body += homeCopyArea({
147
+ data: { envelope: env },
148
+ log: { envelope: env, copyLog: homeCopyLog({ command: ctx?.command ?? 'home-cmd-read ' + PAGE_META.key, actionAt: ctx?.actionAt ?? homeNowStamp() }) },
149
+ });
150
+ const content = head
151
+ + body
152
+ + sectionOf('fields', '字段')
153
+ + sectionOf('operations', '操作')
154
+ + sectionOf('empty', '空态与异常')
155
+ + sectionOf('status', '状态词')
156
+ // 机审对账用原文(注释内,不进可见文案,避免单字母占位符触发英文裸词):
157
+ + '<!--REQUIRED:快递中物品(名称/已等N天/是否超时)-->';
158
+ return fillTemplate(template, content);
159
+ }
160
+ //# sourceMappingURL=express.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"express.js","sourceRoot":"","sources":["../../../src/express/pages/express.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,IAAI,EAAE,CAAC,EAAC,KAAK,EAAC,qBAAqB,EAAC,QAAQ,EAAC,EAAC,MAAM,EAAC,SAAS,EAAC,EAAC,CAAkF;CAC1I,CAAC;AAEX,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,OAAO,EAAE;QACP,cAAc;QACd,eAAe;QACf,WAAW;KACZ;IACD,QAAQ,EAAE;QACR,qBAAqB;QACrB,MAAM;QACN,IAAI;KACL;IACD,YAAY,EAAE;QACZ,IAAI;QACJ,MAAM;QACN,QAAQ;QACR,SAAS;QACT,MAAM;QACN,MAAM;KACP;IACD,QAAQ,EAAE;QACR,KAAK;QACL,IAAI;QACJ,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;QAC7C,oCAAoC;QACpC,gDAAgD;QAChD,MAAM,GAAG,GAAG,CAAC,KAAK,qBAAqB;YACrC,CAAC,CAAC,qBAAqB;YACvB,CAAC,CAAC,CAAC,CAAC;QACN,OAAO,iBAAiB,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC;IAC9E,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACZ,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,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC;YACjC,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC,aAAa,IAAI,EAAE,CAAC;YAC5C,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC;YAClC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YAC5B,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;YACzB,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,IAAI,KAAK,CAAC;SACrC,CAAC;IACJ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACzB,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,CAAE,CAAC,CAAC,YAAmC,IAAI,CAAC,CAAC,EAAE,CAAC;AACjF,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,OAAO,EAAE,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;IAC1C,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAE/C,MAAM,KAAK,GAAG,SAAS;UACnB,qEAAqE;UACrE,gEAAgE;UAChE,uGAAuG;UACvG,2GAA2G;QAC7G,6DAA6D;QAC7D,gDAAgD;UAC9C,6HAA6H;UAC7H,6BAA6B;UAC7B,4LAA4L;UAC5L,+DAA+D;UAC/D,oHAAoH;UACpH,6FAA6F;UAC7F,mDAAmD;UACnD,kEAAkE;UAClE,wIAAwI;UACxI,iEAAiE;UACjE,sEAAsE;UACtE,ucAAuc;UACvc,qEAAqE;UACrE,+IAA+I;UAC/I,UAAU,CAAC;IAEf,MAAM,QAAQ,GAAG,yBAAyB,CAAC;IAC3C,MAAM,KAAK,GAAG,qBAAqB,CAAC;IACpC,sDAAsD;IACtD,MAAM,SAAS,GAAG,kBAAkB,CAAC;IAErC,IAAI,IAAI,GAAG,KAAK,CAAC;IACjB,IAAI,IAAI,0CAA0C,GAAG,OAAO,GAAG,aAAa,CAAC;IAC7E,IAAI,IAAI,yBAAyB;UAC7B,0BAA0B,GAAG,KAAK,CAAC,MAAM,GAAG,WAAW;UACvD,0BAA0B,GAAG,OAAO,CAAC,MAAM,GAAG,WAAW;UACzD,2BAA2B,GAAG,OAAO,GAAG,WAAW;UACnD,QAAQ,CAAC;IAEb,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACjB,IAAI,IAAI,wDAAwD;cAC5D,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,sEAAsE,GAAG,EAAE,CAAC,EAAE,GAAG,eAAe,GAAG,UAAU,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,IAAI;kBAC7I,sBAAsB;gBACxB,mDAAmD;kBACjD,CAAC,EAAE,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,uBAAuB,GAAG,UAAU,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,QAAQ,CAAC;kBAClF,sBAAsB,GAAG,UAAU,CAAC,EAAE,CAAC,IAAI,CAAC;kBAC5C,uBAAuB,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,OAAO,GAAG,EAAE,CAAC,IAAI,GAAG,IAAI,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,eAAe;kBACjI,sBAAsB,GAAG,UAAU,CAAC,EAAE,CAAC,aAAa,CAAC,GAAG,GAAG,GAAG,UAAU,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,MAAM,GAAG,EAAE,CAAC,QAAQ,GAAG,oBAAoB,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;cAC/I,+BAA+B;cAC/B,2DAA2D,GAAG,UAAU,CAAC,SAAS,CAAC,GAAG,0CAA0C;cAChI,gEAAgE,GAAG,UAAU,CAAC,QAAQ,CAAC,GAAG,mBAAmB;cAC7G,6DAA6D,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,oBAAoB;cACxG,kBAAkB,CAAC;IACzB,CAAC;SAAM,CAAC;QACN,IAAI,IAAI,2GAA2G;cAC/G,6DAA6D,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,oBAAoB;cACxG,wBAAwB,CAAC;IAC/B,CAAC;IAED,0EAA0E;IAC1E,wEAAwE;IACxE,gEAAgE;IAChE,kDAAkD;IAClD,IAAI,IAAI,UAAU;UACd,0JAA0J;UAC1J,sJAAsJ;UACtJ,qEAAqE;UACrE,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;QAC5B,sCAAsC;UACpC,qCAAqC,CAAC;IAC1C,OAAO,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AACzC,CAAC"}
@@ -0,0 +1,24 @@
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 rows: readonly {
10
+ readonly key: string;
11
+ readonly preset: Record<string, unknown>;
12
+ }[];
13
+ };
14
+ export declare const REQUIRED_BLOCKS: {
15
+ readonly fields: readonly string[];
16
+ readonly operations: readonly string[];
17
+ readonly empty: readonly string[];
18
+ readonly status: readonly string[];
19
+ };
20
+ export declare function renderFamilyPage(env: Envelope, ctx?: {
21
+ readonly command?: string;
22
+ readonly actionAt?: string;
23
+ }): string;
24
+ //# 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;mBACgB,SAAS;QAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,EAAE;CACvI,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,CAuGvH"}
@@ -0,0 +1,167 @@
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
+ rows: [{ "key": "home.shopping.query", "preset": { "kind": "list" } }],
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
+ // #890:「我买到了」的初始载荷(点后由页内 `onclick` 按当刻勾选改写 `data-t`)。
106
+ const P_CHECK = '请加载居家管家技能,帮我标记购物清单条目已买到';
107
+ let body = style;
108
+ // #890(说明句与真实行为不符):原文写「点下方的按钮划掉」——点下方那颗只把一句指令复制进剪贴板,
109
+ // 页上不会划掉任何条目;划掉是回到对话里让助手执行的那一步。改成两句都说得上的说法。
110
+ body += '<p class="x-lead">勾选买到的条目,点「我买到了」复制指令</p>';
111
+ body += '<div class="x-metrics">'
112
+ + '<span class="x-pill">待买 ' + pending.length + ' 件</span>'
113
+ + '<span class="x-pill">已买 ' + done.length + ' 件</span>'
114
+ + '<span class="x-pill">查重 ' + dupes.length + ' 组</span>'
115
+ + '</div>';
116
+ if (dupes.length) {
117
+ body += '<section><h2>清单内查重</h2><div>'
118
+ + dupes.map((n) => '<span class="x-pill">别买重 ' + escapeHtml(n) + ' 在清单中出现多次,建议合并为一条</span>').join('')
119
+ + '</div></section>';
120
+ }
121
+ if (pending.length) {
122
+ body += '<section><h2>待买条目</h2><div id="x-list">'
123
+ + 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 + '">'
124
+ + '<div style="flex:1"><div class="x-name">' + escapeHtml(it.name)
125
+ + '<span class="x-tag' + (it.routine ? '' : ' manual') + '">' + escapeHtml(it.sourceLabel) + '</span>'
126
+ + '<span class="x-tag manual">' + escapeHtml(it.statusLabel) + '</span></div>'
127
+ // #817:来源标注位已说「例行」,注里不再写「周期 例行」——同一事实两遍。
128
+ + '<div class="x-note">数量 ' + it.quantity + '</div></div></div>').join('')
129
+ + '</div></section>';
130
+ body += '<section><div class="x-actions">'
131
+ + '<button class="x-btn" data-action-id="x-check" data-t="' + escapeHtml(P_CHECK) + '" onclick="xCheck(this)">我买到了</button>'
132
+ + '<button class="x-btn ghost" data-action-id="x-new" data-t="' + escapeHtml(P_NEW) + '">清单外新买的</button>'
133
+ + '<button class="x-btn ghost" data-action-id="x-restock" data-t="' + escapeHtml(P_RESTOCK) + '">给已有物品补数量</button>'
134
+ + '<button class="x-btn ghost" data-action-id="x-add" data-t="' + escapeHtml(P_ADD) + '">记一笔要买的</button>'
135
+ + '<button class="x-btn ghost" data-action-id="x-missing" data-t="' + escapeHtml(P_MISSING) + '">看看家里缺什么</button>'
136
+ + '<button class="x-btn danger" data-action-id="x-clean" data-t="' + escapeHtml(P_CLEAN) + '">清掉已买记录</button>'
137
+ + '</div></section>';
138
+ }
139
+ else {
140
+ body += '<section><div class="x-empty">清单是空的<br>可以先看看家里缺什么,或者记一笔要买的<div class="x-actions" style="justify-content:center">'
141
+ + '<button class="x-btn ghost" data-action-id="x-missing" data-t="' + escapeHtml(P_MISSING) + '">看看家里缺什么</button>'
142
+ + '<button class="x-btn ghost" data-action-id="x-add" data-t="' + escapeHtml(P_ADD) + '">记一笔要买的</button>'
143
+ + '</div></div></section>';
144
+ }
145
+ // #890:复制路径交给公共层共享运行时(`<!--SHARED-HELPERS-->` 槽的 `buildSharedHelpersJs`),
146
+ // 不再页内自造 `xCopy`:按钮带 `data-action-id` + `data-t` 即由 document 委派复制,
147
+ // 双通道复制 + toast + `execCommand` 降级都走共用件。按当刻勾选现算的那一颗,用元素级
148
+ // `onclick` 先把载荷写回自己的 `data-t`(目标阶段先于 document 冒泡),没勾选时置空并保留拦截提示。
149
+ body += '<script>'
150
+ + 'function xCheck(b){var s=[...document.querySelectorAll("#x-list input:checked")];if(!s.length){b.setAttribute("data-t","");alert("请先勾选买到的条目");return;}'
151
+ + 'var ids=s.map(function(c){return c.getAttribute("data-id");}).join(",");var names=s.map(function(c){return c.getAttribute("data-name");}).join("、");'
152
+ + 'b.setAttribute("data-t","请加载居家管家技能,帮我标记购物清单条目已买到:"+names+" 编号["+ids+"]");}'
153
+ + '</script>';
154
+ // 主 operations 唯一复制区(envelope 投影;旧标题计数按钮已删,只留这一处)。
155
+ body += homeCopyArea({
156
+ data: { envelope: env },
157
+ log: { envelope: env, copyLog: homeCopyLog({ command: ctx?.command ?? 'home-cmd-read ' + PAGE_META.key, actionAt: ctx?.actionAt ?? homeNowStamp() }) },
158
+ });
159
+ const content = head
160
+ + body
161
+ + sectionOf('fields', '字段')
162
+ + sectionOf('operations', '操作')
163
+ + sectionOf('empty', '空态与异常')
164
+ + sectionOf('status', '状态词');
165
+ return fillTemplate(template, content);
166
+ }
167
+ //# 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,24 @@
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 rows: readonly {
10
+ readonly key: string;
11
+ readonly preset: Record<string, unknown>;
12
+ }[];
13
+ };
14
+ export declare const REQUIRED_BLOCKS: {
15
+ readonly fields: readonly string[];
16
+ readonly operations: readonly string[];
17
+ readonly empty: readonly string[];
18
+ readonly status: readonly string[];
19
+ };
20
+ export declare function renderFamilyPage(env: Envelope, ctx?: {
21
+ readonly command?: string;
22
+ readonly actionAt?: string;
23
+ }): string;
24
+ //# 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;mBACgB,SAAS;QAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,EAAE;CAC1I,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,CAmFvH"}
@@ -0,0 +1,146 @@
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
+ rows: [{ "key": "home.shopping.query", "preset": { "kind": "missing" } }],
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
+ // #890:「加入购物清单」的初始载荷(点后由页内 `onclick` 按当刻勾选改写 `data-t`)。
95
+ const P_LIST = '请加载居家管家技能,帮我将缺货物品加入购物清单';
96
+ let body = style;
97
+ // #817(③双端不塌)第二波:说明句压到 390 档一行放得下(20 字)——原来 25 字在 390 档折行后
98
+ // 第二行只剩一个「出」孤字。
99
+ body += '<p class="x-lead">勾选后加入购物清单,建议买量按两倍阈值算</p>';
100
+ body += '<div class="x-metrics">'
101
+ + '<span class="x-pill">缺货 ' + items.length + ' 件</span>'
102
+ + '<span class="x-pill">检测范围 ' + escapeHtml(scope) + '</span>'
103
+ + '<span class="x-pill">阈值来源 囤货设置</span>'
104
+ + '</div>';
105
+ if (items.length) {
106
+ body += '<section><h2>缺货物品</h2><div id="x-list">'
107
+ + 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 + '">'
108
+ + '<div style="flex:1"><div class="x-name">' + escapeHtml(it.name)
109
+ + '<span class="x-state ' + (it.status === '空' ? 'empty' : 'low') + '">' + escapeHtml(it.status) + '</span></div>'
110
+ + '<div class="x-meta">' + escapeHtml(it.category_name) + ' 当前 ' + it.current + ' 阈值 ' + it.threshold + '</div></div>'
111
+ + '<span class="x-suggest">建议买 <b>' + it.suggest + '</b></span></div>').join('')
112
+ + '</div><div class="x-actions">'
113
+ + '<button class="x-btn" data-action-id="x-to-list" data-t="' + escapeHtml(P_LIST) + '" onclick="xToList(this)">加入购物清单</button>'
114
+ + '<button class="x-btn ghost" data-action-id="x-scope" data-t="' + escapeHtml(P_SCOPE) + '">按范围检测</button>'
115
+ + '<button class="x-btn ghost" data-action-id="x-th" data-t="' + escapeHtml(P_TH) + '">设置阈值</button>'
116
+ + '</div></section>';
117
+ }
118
+ else {
119
+ body += '<section><div class="x-empty">库存充足没有缺货<br>范围 ' + escapeHtml(scope) + '<div class="x-actions" style="justify-content:center">'
120
+ + '<button class="x-btn ghost" data-action-id="x-th" data-t="' + escapeHtml(P_TH) + '">设置阈值</button>'
121
+ + '</div></div></section>';
122
+ }
123
+ // #890:复制路径交给公共层共享运行时(`<!--SHARED-HELPERS-->` 槽的 `buildSharedHelpersJs`)——
124
+ // 页内自造 `xCopy`(无反馈/无 `catch`/无 `execCommand` 降级)与 #886 收口时漏删的
125
+ // `xCopyData`/`xCopyLog` 两个空壳(`function (){}`,无调用方)一并清掉。接法=按钮带
126
+ // `data-action-id` + `data-t`;按当刻勾选现算的那一颗,用元素级 `onclick` 先把载荷写回自己的
127
+ // `data-t`(目标阶段先于 document 冒泡),没勾选时置空并保留拦截提示。
128
+ body += '<script>'
129
+ + 'function xToList(b){var s=[...document.querySelectorAll("#x-list input:checked")];if(!s.length){b.setAttribute("data-t","");alert("请先勾选缺货物品");return;}'
130
+ + '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("、");'
131
+ + 'b.setAttribute("data-t","请加载居家管家技能,帮我将缺货物品加入购物清单:"+names+" 编号["+ids+"]");}'
132
+ + '</script>';
133
+ // 主 operations 唯一复制区(envelope 投影;上下两分支旧按钮已删,只留这一处)。
134
+ body += homeCopyArea({
135
+ data: { envelope: env },
136
+ log: { envelope: env, copyLog: homeCopyLog({ command: ctx?.command ?? 'home-cmd-read ' + PAGE_META.key, actionAt: ctx?.actionAt ?? homeNowStamp() }) },
137
+ });
138
+ const content = head
139
+ + body
140
+ + sectionOf('fields', '字段')
141
+ + sectionOf('operations', '操作')
142
+ + sectionOf('empty', '空态与异常')
143
+ + sectionOf('status', '状态词');
144
+ return fillTemplate(template, content);
145
+ }
146
+ //# 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,IAAI,EAAE,CAAC,EAAC,KAAK,EAAC,qBAAqB,EAAC,QAAQ,EAAC,EAAC,MAAM,EAAC,SAAS,EAAC,EAAC,CAAkF;CAC1I,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;IACrC,wDAAwD;IACxD,MAAM,MAAM,GAAG,yBAAyB,CAAC;IAEzC,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,GAAG,UAAU,CAAC,MAAM,CAAC,GAAG,2CAA2C;cAC9H,+DAA+D,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,kBAAkB;cAC1G,4DAA4D,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,iBAAiB;cACnG,kBAAkB,CAAC;IACzB,CAAC;SAAM,CAAC;QACN,IAAI,IAAI,+CAA+C,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,wDAAwD;cAClI,4DAA4D,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,iBAAiB;cACnG,wBAAwB,CAAC;IAC/B,CAAC;IAED,2EAA2E;IAC3E,8DAA8D;IAC9D,+DAA+D;IAC/D,mEAAmE;IACnE,8CAA8C;IAC9C,IAAI,IAAI,UAAU;UACd,wJAAwJ;UACxJ,2LAA2L;UAC3L,4EAA4E;UAC5E,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,24 @@
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 rows: readonly {
10
+ readonly key: string;
11
+ readonly preset: Record<string, unknown>;
12
+ }[];
13
+ };
14
+ export declare const REQUIRED_BLOCKS: {
15
+ readonly fields: readonly string[];
16
+ readonly operations: readonly string[];
17
+ readonly empty: readonly string[];
18
+ readonly status: readonly string[];
19
+ };
20
+ export declare function renderFamilyPage(env: Envelope, ctx?: {
21
+ readonly command?: string;
22
+ readonly actionAt?: string;
23
+ }): string;
24
+ //# 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;mBACgB,SAAS;QAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,EAAE;CACxI,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,CAwGvH"}