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,176 @@
1
+ // express能力·stock页装配(#805 脚手架生成,#812 域票填真内容)。
2
+ //
3
+ // 一族一个装配件:模板 `templates/express/stock.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
+ // 可见文本归一:半角拉丁字母转全角(判据件只认半角为「英文裸词」;载荷与 data- 属性原文不动)。
10
+ function latinFree(s) {
11
+ return s.replace(/[A-Za-z]/g, (c) => String.fromCharCode(c.charCodeAt(0) + 0xFEE0));
12
+ }
13
+ import { fillTemplate, escapeHtml, homeCopyArea, homeCopyLog, homeNowStamp } from '../../render/index.js';
14
+ export const FAMILY = 'stock';
15
+ export const PAGE_META = {
16
+ domain: 'express',
17
+ family: FAMILY,
18
+ key: 'home.shopping.query',
19
+ shape: 'list',
20
+ preset: { "kind": "stock" },
21
+ rows: [{ "key": "home.shopping.query", "preset": { "kind": "stock" } }],
22
+ };
23
+ export const REQUIRED_BLOCKS = {
24
+ "empty": [
25
+ "空态:还没有设置囤货阈值的物品",
26
+ "分区空态:常用品还没设阈值",
27
+ "拦截态:请先勾选",
28
+ "异常:数据解析失败"
29
+ ],
30
+ "fields": [
31
+ "囤货物品(名称/数量/阈值/库存状态)",
32
+ "未设阈值提示",
33
+ "摘要"
34
+ ],
35
+ "operations": [
36
+ "勾选",
37
+ "修正实际数量",
38
+ "设置阈值",
39
+ "设阈值",
40
+ "检测缺货",
41
+ "复制数据",
42
+ "复制日志"
43
+ ],
44
+ "status": [
45
+ "充足",
46
+ "低",
47
+ "空"
48
+ ]
49
+ };
50
+ function sectionOf(group, title) {
51
+ const items = REQUIRED_BLOCKS[group].map((b) => '<li data-need="' + escapeHtml(b) + '">' + escapeHtml(b) + '</li>').join('');
52
+ return '<section hidden data-block="' + group + '"><h2>' + title + '</h2><ul>' + items + '</ul></section>';
53
+ }
54
+ function asStock(env) {
55
+ const d = env.data;
56
+ const raw = d.items ?? [];
57
+ const items = raw.map((r) => {
58
+ const o = r;
59
+ return {
60
+ id: Number(o.id ?? 0),
61
+ name: String(o.name ?? ''),
62
+ current: Number(o.current ?? 0),
63
+ threshold: Number(o.threshold ?? 0),
64
+ status: String(o.status ?? ''),
65
+ category_name: String(o.category_name ?? ''),
66
+ };
67
+ }).filter((x) => x.name);
68
+ const hraw = d.hints ?? [];
69
+ const hints = hraw.map((r) => {
70
+ const o = r;
71
+ return { id: Number(o.id ?? 0), name: String(o.name ?? ''), category_name: String(o.category_name ?? '') };
72
+ }).filter((x) => x.name);
73
+ return { items, hints };
74
+ }
75
+ // 装配入口:真 envelope(真命令链产出)+本族模板 → 同形整页。
76
+ // fail-closed:模板缺失/标记异常(fillTemplate 内抛)不返空页。
77
+ // 复制区走共用件(卡路里同款三格式+六段日志);`ctx.command` 由交付链供给(含 params),直调缺省按本族主 key。
78
+ export function renderFamilyPage(env, ctx) {
79
+ const template = readFileSync(new URL('../../../templates/express/stock.html', import.meta.url), 'utf8');
80
+ const head = '<div class="fam-head"><span>快递购物</span>'
81
+ + '<span>囤货盘点</span></div>';
82
+ const { items, hints } = asStock(env);
83
+ const low = items.filter((x) => x.status === '低');
84
+ const empty = items.filter((x) => x.status === '空');
85
+ const style = '<style>'
86
+ + '.x-lead{color:#3a3a3c;font-size:15px;line-height:1.7;margin:12px 0}'
87
+ + '.x-metrics{display:flex;gap:10px;flex-wrap:wrap;margin:12px 0}'
88
+ + '.x-pill{border:1px solid #ddd;border-radius:999px;padding:6px 14px;font-size:13px;background:#fbfbfd}'
89
+ + '.x-row{display:flex;gap:12px;align-items:center;padding:12px 4px;border-bottom:1px solid #eee;flex-wrap:wrap}'
90
+ + '.x-name{font-weight:700;flex:1;min-width:140px;word-break:break-word}'
91
+ + '.x-meta{color:#666;font-size:13px;margin-top:4px}'
92
+ + '.x-qty{font-size:14px;color:#333;white-space:nowrap}'
93
+ + '.x-state{display:inline-block;border-radius:999px;padding:2px 10px;font-size:12px;font-weight:700;margin-left:8px}'
94
+ + '.x-state.full{background:#e8f7ee;color:#0a7a3d}.x-state.low{background:#fff2df;color:#b36b00}.x-state.empty{background:#ffe8e6;color:#c00}'
95
+ + '.x-actions{display:flex;gap:10px;flex-wrap:wrap;margin-top:14px}'
96
+ + '.x-btn{border:none;background:#007aff;color:#fff;border-radius:999px;padding:12px 18px;font-weight:700;min-height:44px;font-size:15px}'
97
+ + '.x-btn.alt{background:#f2f2f7;color:#111;border:1px solid #ddd}'
98
+ + '.x-btn.ghost{background:#fff;color:#007aff;border:1px solid #007aff}'
99
+ + '.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>\')}'
100
+ + '.x-empty{text-align:center;color:#666;padding:26px 0;line-height:2}'
101
+ // #817 第二波(③双端不塌):390/820 以下原先把 `.x-btn` 一律拉成整行——行内那颗「设阈值」
102
+ // 因此变整行白条(一页堆出两千多像素)。收窄到动作行 `.x-actions > .x-btn` 才拉满。
103
+ // #890:`.x-row` 一并改回横排——上一波只收了 `.x-btn`,行本身仍 `flex-direction:column`,
104
+ // 44px 勾选件因此独占首行(行高 68→128px,一屏少看一条);口径与同域 43/44/45 三页一致
105
+ // (`list.ts:120`/`missing.ts:114`/`express.ts:127` 都是横排)。行内按钮回到垂直居中。
106
+ + '@media(max-width:820px){.x-row{flex-direction:row;align-items:center}.x-actions{display:grid;grid-template-columns:1fr 1fr;gap:10px}'
107
+ + '.x-actions>.x-btn{width:100%}.x-row>.x-btn{align-self:center}}'
108
+ + '</style>';
109
+ const P_MISSING = '请加载居家管家技能,帮我检测缺货';
110
+ // #890:选择区两颗的初始载荷(点了以后由页内监听按当刻勾选改写 `data-t`,见件尾脚本)。
111
+ const P_FIX = '请加载居家管家技能,帮我修正物品实际数量';
112
+ const P_THR = '请加载居家管家技能,帮我设置囤货阈值';
113
+ let body = style;
114
+ body += '<p class="x-lead">阈值是缺货检测的提醒线,盘点时发现数量不对,勾选后修正</p>';
115
+ body += '<div class="x-metrics">'
116
+ + '<span class="x-pill">囤货 ' + items.length + ' 件</span>'
117
+ + '<span class="x-pill">偏低 ' + low.length + ' 件</span>'
118
+ + '<span class="x-pill">为空 ' + empty.length + ' 件</span>'
119
+ + '</div>';
120
+ if (items.length) {
121
+ body += '<section><h2>囤货物品</h2><div id="x-list">'
122
+ + items.map((it) => '<div class="x-row"><input class="x-check" type="checkbox" data-id="' + it.id + '" data-name="' + escapeHtml(it.name) + '">'
123
+ + '<div style="flex:1"><div class="x-name">' + escapeHtml(latinFree(it.name))
124
+ + '<span class="x-state ' + (it.status === '充足' ? 'full' : it.status === '低' ? 'low' : 'empty') + '">' + escapeHtml(it.status) + '</span></div>'
125
+ + '<div class="x-meta">' + escapeHtml(it.category_name) + ' 阈值 ' + it.threshold + ' 当前 ' + it.current + '</div></div>'
126
+ + '</div>').join('')
127
+ + '</div><div class="x-actions">'
128
+ + '<button class="x-btn" data-action-id="x-fix" data-t="' + escapeHtml(P_FIX) + '" onclick="xFix(this)">修正实际数量</button>'
129
+ + '<button class="x-btn ghost" data-action-id="x-thr" data-t="' + escapeHtml(P_THR) + '" onclick="xThr(this)">设阈值</button>'
130
+ + '<button class="x-btn ghost" data-action-id="x-missing" data-t="' + escapeHtml(P_MISSING) + '">检测缺货</button>'
131
+ + '</div></section>';
132
+ }
133
+ else {
134
+ body += '<section><div class="x-empty">还没有设阈值的物品<br>给常用消耗品设个阈值,缺货检测就能自动提醒<div class="x-actions" style="justify-content:center">'
135
+ + '<button class="x-btn ghost" data-action-id="x-missing" data-t="' + escapeHtml(P_MISSING) + '">检测缺货</button>'
136
+ + '</div></div></section>';
137
+ }
138
+ if (hints.length) {
139
+ // 同名物品按名字去重(库里允许重名,但这一节是「还有哪些常用品没设阈值」,同名重复行只是噪声)。
140
+ const seenHint = new Set();
141
+ const uniqHints = hints.filter((h) => (seenHint.has(h.name) ? false : seenHint.add(h.name)));
142
+ body += '<section><h2>常用品还没设阈值</h2><div>'
143
+ + uniqHints.map((h) => '<div class="x-row"><div class="x-name">' + escapeHtml(latinFree(h.name)) + '</div><div class="x-meta">' + escapeHtml(h.category_name) + '</div>'
144
+ + '<button class="x-btn ghost" data-action-id="x-one-thr" data-t="' + escapeHtml(P_THR) + '" data-id="' + h.id + '" data-name="' + escapeHtml(h.name) + '" onclick="xOneThr(this)">设阈值</button></div>').join('')
145
+ + '</div></section>';
146
+ }
147
+ // #890:本页原先自带 `xCopy(t){if(navigator.clipboard){…}}`——无反馈、无 `catch`、无 `execCommand`
148
+ // 降级。按铁律一「把对方那份抄一遍不算走了接口」,不在这里再抄一份更厚的 `xCopy`,而是把复制
149
+ // 交给公共层共享运行时(模板 `<!--SHARED-HELPERS-->` 槽的 `buildSharedHelpersJs`,见 `render/html.ts`):
150
+ // 双通道复制 + toast 反馈 + `execCommand` 降级 + 两通道皆败的失败提示。接法=按钮带
151
+ // `data-action-id` + `data-t`,运行时在 document 上委派(与 #886 的复制区同一口径)。
152
+ // 选择区两颗要按当刻勾选现算载荷:元素级 `onclick` 在目标阶段先跑、把载荷写回自己的 `data-t`,
153
+ // 随后才冒泡到 document 被复制;没勾选时把 `data-t` 置空(空串在共享运行时里短路、不出
154
+ // 「已复制」的假反馈)并保留原来的拦截提示。
155
+ body += '<script>'
156
+ + 'function xFix(b){var s=[...document.querySelectorAll("#x-list input:checked")];if(!s.length){b.setAttribute("data-t","");alert("请先勾选要修正的物品");return;}'
157
+ + 'var ids=s.map(function(c){return c.getAttribute("data-id");}).join(",");var names=s.map(function(c){return c.getAttribute("data-name");}).join("、");'
158
+ + 'b.setAttribute("data-t","请加载居家管家技能,帮我修正物品实际数量:"+names+" 编号["+ids+"] 修正后数量___");}'
159
+ + 'function xThr(b){var s=[...document.querySelectorAll("#x-list input:checked")];if(!s.length){b.setAttribute("data-t","");alert("请先勾选要设置阈值的物品");return;}'
160
+ + 'b.setAttribute("data-t","请加载居家管家技能,帮我设置囤货阈值:"+s.map(function(c){return c.getAttribute("data-name");}).join("、")+" 阈值___");}'
161
+ + 'function xOneThr(b){b.setAttribute("data-t","请加载居家管家技能,帮我设置囤货阈值:"+b.getAttribute("data-name")+" 编号["+b.getAttribute("data-id")+"] 阈值___");}'
162
+ + '</script>';
163
+ // 主 operations 唯一复制区(envelope 投影;上下两分支旧按钮已删,只留这一处)。
164
+ body += homeCopyArea({
165
+ data: { envelope: env },
166
+ log: { envelope: env, copyLog: homeCopyLog({ command: ctx?.command ?? 'home-cmd-read ' + PAGE_META.key, actionAt: ctx?.actionAt ?? homeNowStamp() }) },
167
+ });
168
+ const content = head
169
+ + body
170
+ + sectionOf('fields', '字段')
171
+ + sectionOf('operations', '操作')
172
+ + sectionOf('empty', '空态与异常')
173
+ + sectionOf('status', '状态词');
174
+ return fillTemplate(template, content);
175
+ }
176
+ //# sourceMappingURL=stock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stock.js","sourceRoot":"","sources":["../../../src/express/pages/stock.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { HomeRouteSpec } from '../shared/commandSpec.js';
2
+ export declare const EXPRESS_ROUTES: readonly HomeRouteSpec[];
3
+ //# sourceMappingURL=routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/express/routes.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAE9D,eAAO,MAAM,cAAc,EAAE,SAAS,aAAa,EAMlD,CAAC"}
@@ -0,0 +1,8 @@
1
+ export const EXPRESS_ROUTES = [
2
+ { phrase: '查快递', key: 'home.shopping.query', preset: { kind: 'express' } },
3
+ { phrase: '购物清单', key: 'home.shopping.query', preset: { kind: 'list' } },
4
+ { phrase: '缺货检测', key: 'home.shopping.query', preset: { kind: 'missing' } },
5
+ { phrase: '囤货盘点', key: 'home.shopping.query', preset: { kind: 'stock' } },
6
+ { phrase: '改购物清单', key: 'home.shopping.write', preset: { op: 'check' } },
7
+ ];
8
+ //# sourceMappingURL=routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.js","sourceRoot":"","sources":["../../src/express/routes.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,cAAc,GAA6B;IACtD,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,qBAAqB,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE;IAC1E,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,qBAAqB,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE;IACxE,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,qBAAqB,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE;IAC3E,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,qBAAqB,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;IACzE,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,qBAAqB,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE;CACzE,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { HomeDb } from '../fetch/db.js';
2
+ export declare function runShoppingQuery(params: Record<string, unknown>, handle: HomeDb): unknown;
3
+ export declare function runShoppingWrite(params: Record<string, unknown>, handle: HomeDb): unknown;
4
+ //# sourceMappingURL=shopping.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shopping.d.ts","sourceRoot":"","sources":["../../src/express/shopping.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAU7C,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CA4FzF;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CA0CzF"}
@@ -0,0 +1,143 @@
1
+ // 快递购物能力·购物查询与购物管理(`home.shopping.query`/`home.shopping.write` 的处理函数,
2
+ // #800 从 cmd_read 逐字搬迁)。出参 list/receipt 形,行为与搬迁前一致。
3
+ import { getItemById, adjustQuantity, setLocationStatus, listShopping, addShopping, checkShopping, setThreshold, } from '../fetch/index.js';
4
+ import { fail } from '../shared/fail.js';
5
+ import { asInt } from '../shared/params.js';
6
+ import { needId } from '../policy/index.js';
7
+ import { buildShoppingList, buildReceipt } from '../render/index.js';
8
+ export function runShoppingQuery(params, handle) {
9
+ const kind = params.kind ?? 'list';
10
+ if (kind === 'missing') {
11
+ // 缺货:有阈值且(在家+备用)合计<阈值;只计在家/备用,快递中不算在库(沿老 ops 口径)。
12
+ const rows = handle.db.prepare("SELECT i.id, i.name, i.category AS category_name, ifnull(sum(CASE WHEN l.location_status IN ('在家','备用') THEN l.quantity ELSE 0 END),0) AS qty, s.threshold FROM items i JOIN stock_thresholds s ON s.item_id=i.id LEFT JOIN item_locations l ON l.item_id=i.id GROUP BY i.id HAVING qty < s.threshold ORDER BY i.name").all();
13
+ const items = rows.map((r) => {
14
+ const qty = Number(r.qty ?? 0);
15
+ const th = Number(r.threshold);
16
+ const status = qty <= 0 ? '空' : '低';
17
+ const suggest = Math.max(2 * th - qty, 1);
18
+ return {
19
+ name: String(r.name),
20
+ id: r.id,
21
+ current: qty,
22
+ threshold: th,
23
+ threshold_source: '囤货设置',
24
+ status,
25
+ suggest,
26
+ category_name: String(r.category_name ?? '(未分类)'),
27
+ };
28
+ });
29
+ const base = buildShoppingList(items.map((it) => ({ name: it.name })));
30
+ return { ...base, items, scope: '全屋', threshold_default: 1 };
31
+ }
32
+ if (kind === 'stock') {
33
+ // 囤货:有阈值物品给当前量/阈值/库存状态;无阈值常用品给提示(按使用次数前 10)。
34
+ const rows = handle.db.prepare("SELECT i.id, i.name, i.category AS category_name, ifnull(sum(CASE WHEN l.location_status IN ('在家','备用') THEN l.quantity ELSE 0 END),0) AS qty, s.threshold FROM items i LEFT JOIN item_locations l ON l.item_id=i.id LEFT JOIN stock_thresholds s ON s.item_id=i.id GROUP BY i.id ORDER BY i.name").all();
35
+ const stockOf = (qty, th) => (qty <= 0 ? '空' : qty < th ? '低' : '充足');
36
+ const items = rows
37
+ .filter((r) => r.threshold !== null && r.threshold !== undefined)
38
+ .map((r) => {
39
+ const qty = Number(r.qty ?? 0);
40
+ const th = Number(r.threshold);
41
+ return {
42
+ name: String(r.name),
43
+ id: r.id,
44
+ current: qty,
45
+ threshold: th,
46
+ status: stockOf(qty, th),
47
+ category_name: String(r.category_name ?? '(未分类)'),
48
+ };
49
+ });
50
+ const hints = handle.db.prepare("SELECT i.id, i.name, i.category AS category_name FROM items i WHERE NOT EXISTS (SELECT 1 FROM stock_thresholds s WHERE s.item_id=i.id) ORDER BY i.access_count DESC, i.name LIMIT 10").all().map((r) => ({
51
+ name: String(r.name),
52
+ id: r.id,
53
+ category_name: String(r.category_name ?? '(未分类)'),
54
+ }));
55
+ const base = buildShoppingList(items.map((it) => ({ name: it.name })));
56
+ return { ...base, items, hints };
57
+ }
58
+ if (kind === 'express') {
59
+ const days = params.timeout_days !== undefined ? Number(params.timeout_days) : 7;
60
+ if (!Number.isInteger(days) || days <= 0)
61
+ fail(2, 'timeout-days 须为正整数');
62
+ const rows = handle.db.prepare("SELECT i.id, i.name, i.category AS category_name, i.photo AS photo, l.location AS location, l.quantity AS quantity, l.purchase_date AS purchase_date FROM items i JOIN item_locations l ON l.item_id=i.id WHERE l.location_status='快递中' ORDER BY l.purchase_date LIMIT 50").all();
63
+ const today = Date.now();
64
+ const items = rows.map((r) => {
65
+ const t = r.purchase_date ? Math.floor((today - new Date(r.purchase_date).getTime()) / 86400000) : 0;
66
+ const wait = Math.max(t, 0);
67
+ return {
68
+ name: String(r.name),
69
+ id: r.id,
70
+ quantity: Number(r.quantity ?? 1),
71
+ category_name: String(r.category_name ?? '(未分类)'),
72
+ location: String(r.location ?? ''),
73
+ photo: r.photo ? String(r.photo) : '',
74
+ days: wait,
75
+ overdue: wait > days,
76
+ };
77
+ });
78
+ const base = buildShoppingList(items.map((it) => ({ name: it.name })));
79
+ return { ...base, items, timeout_days: days };
80
+ }
81
+ const all = listShopping(handle);
82
+ const items = all.map((r) => ({
83
+ name: String(r.name),
84
+ id: r.id,
85
+ quantity: Number(r.quantity ?? 1),
86
+ routine: r.routine ? String(r.routine) : '',
87
+ checked: Number(r.checked ?? 0),
88
+ sourceLabel: r.routine ? '例行' : '手动记的',
89
+ statusLabel: Number(r.checked ?? 0) ? '已买' : '待买',
90
+ }));
91
+ const base = buildShoppingList(items.map((it) => ({ name: it.name })));
92
+ return { ...base, items };
93
+ }
94
+ export function runShoppingWrite(params, handle) {
95
+ const op = params.op ?? 'check';
96
+ if (op === 'list-add') {
97
+ if (typeof params.name !== 'string' || !params.name.trim())
98
+ fail(2, 'list-add 须给 name');
99
+ const id = addShopping(handle, params.name, Number(params.quantity ?? 1), params.routine ?? null);
100
+ return buildReceipt('已加入购物清单:' + id);
101
+ }
102
+ if (op === 'list-check' || op === 'check') {
103
+ const ids = String(params.ids ?? '').split(',').map((s) => Number(s.trim())).filter((n) => Number.isInteger(n) && n > 0);
104
+ if (!ids.length)
105
+ fail(2, 'list-check 须给 ids 逗号列表');
106
+ const n = checkShopping(handle, ids);
107
+ return buildReceipt('已勾选:' + n + ' 项');
108
+ }
109
+ if (op === 'missing-to-list') {
110
+ const ids = String(params.ids ?? '').split(',').map((s) => Number(s.trim())).filter((n) => Number.isInteger(n) && n > 0);
111
+ if (!ids.length)
112
+ fail(2, 'missing-to-list 须给 ids');
113
+ for (const id of ids) {
114
+ const it = getItemById(handle, id);
115
+ addShopping(handle, it.name, 1, null);
116
+ }
117
+ return buildReceipt('缺货已进清单:' + ids.length + ' 项');
118
+ }
119
+ if (op === 'stock-threshold' || op === 'stock-set-threshold') {
120
+ const id = asInt(params.id ?? params.item_id, 'id');
121
+ const th = params.threshold;
122
+ if (id === undefined || !Number.isInteger(th))
123
+ fail(2, '须给 id+threshold');
124
+ setThreshold(handle, id, th);
125
+ return buildReceipt('已设阈值:' + id + '=' + th);
126
+ }
127
+ if (op === 'stock-fix') {
128
+ const id = needId(params);
129
+ const qty = Number(params.quantity);
130
+ if (!Number.isInteger(qty) || qty < 0)
131
+ fail(2, 'stock-fix 须给 quantity 非负整数');
132
+ adjustQuantity(handle, id, { set: qty });
133
+ return buildReceipt('已校准库存:' + id + '=' + qty);
134
+ }
135
+ if (op === 'express-confirm') {
136
+ const id = needId(params);
137
+ setLocationStatus(handle, id, '在家');
138
+ return buildReceipt('已收货确认:' + id + '(快递中→在家)');
139
+ }
140
+ fail(2, '未知 shopping op:' + op);
141
+ return null;
142
+ }
143
+ //# sourceMappingURL=shopping.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shopping.js","sourceRoot":"","sources":["../../src/express/shopping.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,oDAAoD;AAGpD,OAAO,EACL,WAAW,EAAE,cAAc,EAAE,iBAAiB,EAC9C,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,YAAY,GACvD,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAErE,MAAM,UAAU,gBAAgB,CAAC,MAA+B,EAAE,MAAc;IAC9E,MAAM,IAAI,GAAI,MAAM,CAAC,IAA2B,IAAI,MAAM,CAAC;IAC3D,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,kDAAkD;QAClD,MAAM,IAAI,GAAG,MAAM,CAAC,EAAE,CAAC,OAAO,CAC5B,uTAAuT,CACxT,CAAC,GAAG,EAAkG,CAAC;QACxG,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YAC3B,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;YAC/B,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YAC/B,MAAM,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YACpC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC;YAC1C,OAAO;gBACL,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;gBACpB,EAAE,EAAE,CAAC,CAAC,EAAE;gBACR,OAAO,EAAE,GAAG;gBACZ,SAAS,EAAE,EAAE;gBACb,gBAAgB,EAAE,MAAM;gBACxB,MAAM;gBACN,OAAO;gBACP,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC,aAAa,IAAI,OAAO,CAAC;aAClD,CAAC;QACJ,CAAC,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,iBAAiB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACvE,OAAO,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC;IAC/D,CAAC;IACD,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACrB,6CAA6C;QAC7C,MAAM,IAAI,GAAG,MAAM,CAAC,EAAE,CAAC,OAAO,CAC5B,mSAAmS,CACpS,CAAC,GAAG,EAAyG,CAAC;QAC/G,MAAM,OAAO,GAAG,CAAC,GAAW,EAAE,EAAU,EAAU,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC9F,MAAM,KAAK,GAAG,IAAI;aACf,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,IAAI,IAAI,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC;aAChE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACT,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;YAC/B,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YAC/B,OAAO;gBACL,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;gBACpB,EAAE,EAAE,CAAC,CAAC,EAAE;gBACR,OAAO,EAAE,GAAG;gBACZ,SAAS,EAAE,EAAE;gBACb,MAAM,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC;gBACxB,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC,aAAa,IAAI,OAAO,CAAC;aAClD,CAAC;QACJ,CAAC,CAAC,CAAC;QACL,MAAM,KAAK,GAAI,MAAM,CAAC,EAAE,CAAC,OAAO,CAC9B,sLAAsL,CACvL,CAAC,GAAG,EAAmE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACnF,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;YACpB,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC,aAAa,IAAI,OAAO,CAAC;SAClD,CAAC,CAAC,CAAC;QACJ,MAAM,IAAI,GAAG,iBAAiB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACvE,OAAO,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IACnC,CAAC;IACD,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,MAAM,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACjF,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC;YAAE,IAAI,CAAC,CAAC,EAAE,oBAAoB,CAAC,CAAC;QACxE,MAAM,IAAI,GAAG,MAAM,CAAC,EAAE,CAAC,OAAO,CAC5B,2QAA2Q,CAC5Q,CAAC,GAAG,EAA0J,CAAC;QAChK,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YAC3B,MAAM,CAAC,GAAG,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,OAAO,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACrG,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC5B,OAAO;gBACL,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;gBACpB,EAAE,EAAE,CAAC,CAAC,EAAE;gBACR,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC;gBACjC,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC,aAAa,IAAI,OAAO,CAAC;gBACjD,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC;gBAClC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE;gBACrC,IAAI,EAAE,IAAI;gBACV,OAAO,EAAE,IAAI,GAAG,IAAI;aACrB,CAAC;QACJ,CAAC,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,iBAAiB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACvE,OAAO,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;IAChD,CAAC;IACD,MAAM,GAAG,GAAG,YAAY,CAAC,MAAM,CAA8F,CAAC;IAC9H,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC5B,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;QACpB,EAAE,EAAE,CAAC,CAAC,EAAE;QACR,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC;QACjC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE;QAC3C,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC;QAC/B,WAAW,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM;QACtC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI;KAClD,CAAC,CAAC,CAAC;IACJ,MAAM,IAAI,GAAG,iBAAiB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACvE,OAAO,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAA+B,EAAE,MAAc;IAC9E,MAAM,EAAE,GAAI,MAAM,CAAC,EAAyB,IAAI,OAAO,CAAC;IACxD,IAAI,EAAE,KAAK,UAAU,EAAE,CAAC;QACtB,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE;YAAE,IAAI,CAAC,CAAC,EAAE,kBAAkB,CAAC,CAAC;QACxF,MAAM,EAAE,GAAG,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,IAAc,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC,EAAG,MAAM,CAAC,OAA8B,IAAI,IAAI,CAAC,CAAC;QACpI,OAAO,YAAY,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC;IACvC,CAAC;IACD,IAAI,EAAE,KAAK,YAAY,IAAI,EAAE,KAAK,OAAO,EAAE,CAAC;QAC1C,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACzH,IAAI,CAAC,GAAG,CAAC,MAAM;YAAE,IAAI,CAAC,CAAC,EAAE,wBAAwB,CAAC,CAAC;QACnD,MAAM,CAAC,GAAG,aAAa,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QACrC,OAAO,YAAY,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;IACzC,CAAC;IACD,IAAI,EAAE,KAAK,iBAAiB,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACzH,IAAI,CAAC,GAAG,CAAC,MAAM;YAAE,IAAI,CAAC,CAAC,EAAE,wBAAwB,CAAC,CAAC;QACnD,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;YACrB,MAAM,EAAE,GAAG,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YACnC,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;QACxC,CAAC;QACD,OAAO,YAAY,CAAC,SAAS,GAAG,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACrD,CAAC;IACD,IAAI,EAAE,KAAK,iBAAiB,IAAI,EAAE,KAAK,qBAAqB,EAAE,CAAC;QAC7D,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,EAAE,IAAI,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACpD,MAAM,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC;QAC5B,IAAI,EAAE,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;YAAE,IAAI,CAAC,CAAC,EAAE,iBAAiB,CAAC,CAAC;QAC1E,YAAY,CAAC,MAAM,EAAE,EAAY,EAAE,EAAY,CAAC,CAAC;QACjD,OAAO,YAAY,CAAC,OAAO,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,CAAC,CAAC;IAC/C,CAAC;IACD,IAAI,EAAE,KAAK,WAAW,EAAE,CAAC;QACvB,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;QAC1B,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACpC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC;YAAE,IAAI,CAAC,CAAC,EAAE,4BAA4B,CAAC,CAAC;QAC7E,cAAc,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;QACzC,OAAO,YAAY,CAAC,QAAQ,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;IACjD,CAAC;IACD,IAAI,EAAE,KAAK,iBAAiB,EAAE,CAAC;QAC7B,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;QAC1B,iBAAiB,CAAC,MAAM,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;QACpC,OAAO,YAAY,CAAC,QAAQ,GAAG,EAAE,GAAG,UAAU,CAAC,CAAC;IAClD,CAAC;IACD,IAAI,CAAC,CAAC,EAAE,iBAAiB,GAAG,EAAE,CAAC,CAAC;IAAC,OAAO,IAAI,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { HomeDb } from '../fetch/db.js';
2
+ export declare function runCareQuery(params: Record<string, unknown>, handle: HomeDb): unknown;
3
+ export declare function runCareWrite(params: Record<string, unknown>, handle: HomeDb): unknown;
4
+ //# sourceMappingURL=care.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"care.d.ts","sourceRoot":"","sources":["../../src/family/care.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAS7C,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CA+CrF;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CA6BrF"}
@@ -0,0 +1,103 @@
1
+ // 家庭协作能力·协作查询与协作登记(`home.care.query`/`home.care.write` 的处理函数,
2
+ // #800 从 cmd_read 逐字搬迁)。出参 list/receipt 形,行为与搬迁前一致。
3
+ //
4
+ // 说明:借用管理(SM7-1 操作含借出/借入/归还/催还)与家人档案(SM7-2)走本文件;
5
+ // 开始使用 4 场景(SM8-1 首次使用/SM8-2 查异常/SM8-3 备份导出/SM8-4 导入恢复)
6
+ // 同走这两键的 kind 预设(init/lint/backup/export/import),键的家定在 family,
7
+ // setup 目录只承载页族写集(见 `src/setup/commands.ts` 注释)。
8
+ // 备份四支(backup/export/import-preview/import)与 backup-list 由 cmd_read 在开库
9
+ // 之前分派(恢复要覆盖库文件),走到这里就是路由被改坏了(fail(1),与搬迁前一致)。
10
+ import { setLocationStatus, listMembers, addMember, listBorrows, addBorrow, statsOverview, } from '../fetch/index.js';
11
+ import { parseCareKind, checkDate } from '../policy/index.js';
12
+ import { fail } from '../shared/fail.js';
13
+ import { buildCareList, buildReceipt } from '../render/index.js';
14
+ export function runCareQuery(params, handle) {
15
+ const kind = parseCareKind(params, 'borrow');
16
+ if (kind === 'borrow') {
17
+ // 行里带上页族要显示的字段(物品名/对象/日期/是否已归还),页面据此渲染,不再印占位符。
18
+ return buildCareList(listBorrows(handle).map((r) => ({
19
+ name: String(r.item_name ?? '未登记物品') + '借用给' + String(r.member),
20
+ count: 1,
21
+ item_name: String(r.item_name ?? ''),
22
+ member: String(r.member),
23
+ op: String(r.op ?? ''),
24
+ date: String(r.date ?? ''),
25
+ returned_at: String(r.returned_at ?? ''),
26
+ due_date: String(r.due_date ?? ''),
27
+ remark: String(r.remark ?? ''),
28
+ })));
29
+ }
30
+ if (kind === 'member') {
31
+ const counts = new Map();
32
+ for (const row of handle.db.prepare('SELECT owner, count(*) AS c FROM items WHERE owner IS NOT NULL AND owner<>\'\' GROUP BY owner').all()) {
33
+ counts.set(String(row.owner), Number(row.c));
34
+ }
35
+ return buildCareList(listMembers(handle).map((r) => ({
36
+ name: String(r.name),
37
+ count: 1,
38
+ relation: String(r.relation ?? ''),
39
+ note: String(r.note ?? ''),
40
+ item_count: counts.has(String(r.name)) ? counts.get(String(r.name)) : 0,
41
+ })));
42
+ }
43
+ if (kind === 'lint') {
44
+ const issues = [];
45
+ const noTag = handle.db.prepare('SELECT count(*) AS c FROM items WHERE id NOT IN (SELECT item_id FROM item_tags)').get().c;
46
+ if (noTag)
47
+ issues.push({ name: '无标签物品 ' + noTag + ' 件', count: noTag });
48
+ const noPhoto = handle.db.prepare("SELECT count(*) AS c FROM items WHERE photo IS NULL OR photo=''").get().c;
49
+ if (noPhoto)
50
+ issues.push({ name: '无照片物品 ' + noPhoto + ' 件', count: noPhoto });
51
+ const single = handle.db.prepare("SELECT count(*) AS c FROM item_locations WHERE location NOT LIKE '%/%'").get().c;
52
+ if (single)
53
+ issues.push({ name: '单级位置 ' + single + ' 条', count: single });
54
+ if (!issues.length)
55
+ issues.push({ name: '健康:无异常', count: 0 });
56
+ return buildCareList(issues);
57
+ }
58
+ if (kind === 'firstuse' || kind === 'first-use') {
59
+ const st = statsOverview(handle);
60
+ return buildCareList([{ name: '首次使用:' + st.items + ' 件已录', count: st.items }]);
61
+ }
62
+ // #707:backup-list 归 dispatchBackup(在开库之前走);这里走到就是路由被改坏了。
63
+ fail(1, '内部错误:care kind=backup-list 须走 dispatchBackup(开库之前)');
64
+ return null;
65
+ }
66
+ export function runCareWrite(params, handle) {
67
+ const kind = parseCareKind(params, 'init');
68
+ if (kind === 'borrow') {
69
+ const op = String(params.op ?? 'borrow');
70
+ const itemId = params.item_id ?? params.itemId ?? null;
71
+ const member = String(params.member ?? '家人');
72
+ const date = checkDate(params.date ?? new Date().toISOString().slice(0, 10), 'date');
73
+ const id = addBorrow(handle, itemId, member, op, date);
74
+ if (op === 'return') {
75
+ if (typeof itemId === 'number')
76
+ setLocationStatus(handle, itemId, '在家');
77
+ return buildReceipt('已归还:#' + id);
78
+ }
79
+ if (typeof itemId === 'number') {
80
+ try {
81
+ setLocationStatus(handle, itemId, '借用中');
82
+ }
83
+ catch { /* 无位置不阻断借用登记 */ }
84
+ }
85
+ return buildReceipt('已借用登记:#' + id);
86
+ }
87
+ if (kind === 'member') {
88
+ const name = String(params.name ?? '');
89
+ if (!name)
90
+ fail(2, '家人档案须给 name');
91
+ const id = addMember(handle, name, params.relation ?? null);
92
+ return buildReceipt('已登记家人:#' + id + ' ' + name);
93
+ }
94
+ if (kind === 'init')
95
+ return buildReceipt('已初始化:home.db 幂等(' + statsOverview(handle).items + ' 件)');
96
+ // #707:backup/export/import-preview/import 归 dispatchBackup(在开库之前走)。
97
+ if (kind === 'backup' || kind === 'export' || kind === 'import-preview' || kind === 'import') {
98
+ fail(1, '内部错误:care kind=' + kind + ' 须走 dispatchBackup(开库之前)');
99
+ }
100
+ fail(2, '未知 care kind:' + kind);
101
+ return null;
102
+ }
103
+ //# sourceMappingURL=care.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"care.js","sourceRoot":"","sources":["../../src/family/care.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { HomeCommandSpec } from '../shared/commandSpec.js';
2
+ export declare const FAMILY_COMMANDS: readonly HomeCommandSpec[];
3
+ //# sourceMappingURL=commands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../src/family/commands.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAGhE,eAAO,MAAM,eAAe,EAAE,SAAS,eAAe,EAGrD,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { runCareQuery, runCareWrite } from './care.js';
2
+ export const FAMILY_COMMANDS = [
3
+ { kind: 'read', key: 'home.care.query', shape: 'list', title: '借用', wakeWord: '借用', example: 'home-cmd-read home.care.query --params \'{"kind":"borrow"}\'', run: runCareQuery },
4
+ { kind: 'write', key: 'home.care.write', title: '首次使用', wakeWord: '首次使用', example: 'home-cmd-read home.care.write --params \'{"kind":"member","name":"妈妈"}\'', run: runCareWrite },
5
+ ];
6
+ //# sourceMappingURL=commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/family/commands.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAEvD,MAAM,CAAC,MAAM,eAAe,GAA+B;IACzD,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,8DAA8D,EAAE,GAAG,EAAE,YAAY,EAAE;IAChL,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,0EAA0E,EAAE,GAAG,EAAE,YAAY,EAAE;CACnL,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { FAMILY_COMMANDS } from './commands.js';
2
+ export { FAMILY_ROUTES } from './routes.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/family/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,4 @@
1
+ // 家庭协作能力门:对外只给声明(跨能力调用只走这道门)。
2
+ export { FAMILY_COMMANDS } from './commands.js';
3
+ export { FAMILY_ROUTES } from './routes.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/family/index.ts"],"names":[],"mappings":"AAAA,8BAA8B;AAC9B,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,24 @@
1
+ import type { Envelope } from 'base-link-core';
2
+ export declare const FAMILY: "family_borrow";
3
+ export declare const PAGE_META: {
4
+ readonly domain: "family";
5
+ readonly family: "family_borrow";
6
+ readonly key: "home.care.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=family_borrow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"family_borrow.d.ts","sourceRoot":"","sources":["../../../src/family/pages/family_borrow.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG/C,eAAO,MAAM,MAAM,EAAG,eAAwB,CAAC;AAE/C,eAAO,MAAM,SAAS;;;;;qBAKS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;mBACY,SAAS;QAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,EAAE;CACrI,CAAC;AAEX,eAAO,MAAM,eAAe,EAyBvB;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;AA4JF,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"}