skill-home 0.3.1 → 0.3.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (477) 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/keys.d.ts +4 -0
  5. package/dist/cli/keys.d.ts.map +1 -0
  6. package/dist/cli/keys.js +51 -0
  7. package/dist/cli/keys.js.map +1 -0
  8. package/dist/cli/registry.d.ts +4 -0
  9. package/dist/cli/registry.d.ts.map +1 -0
  10. package/dist/cli/registry.js +30 -0
  11. package/dist/cli/registry.js.map +1 -0
  12. package/dist/express/commands.d.ts +3 -0
  13. package/dist/express/commands.d.ts.map +1 -0
  14. package/dist/express/commands.js +6 -0
  15. package/dist/express/commands.js.map +1 -0
  16. package/dist/express/index.d.ts +3 -0
  17. package/dist/express/index.d.ts.map +1 -0
  18. package/dist/express/index.js +4 -0
  19. package/dist/express/index.js.map +1 -0
  20. package/dist/express/pages/express.d.ts +21 -0
  21. package/dist/express/pages/express.d.ts.map +1 -0
  22. package/dist/express/pages/express.js +156 -0
  23. package/dist/express/pages/express.js.map +1 -0
  24. package/dist/express/pages/list.d.ts +21 -0
  25. package/dist/express/pages/list.d.ts.map +1 -0
  26. package/dist/express/pages/list.js +161 -0
  27. package/dist/express/pages/list.js.map +1 -0
  28. package/dist/express/pages/missing.d.ts +21 -0
  29. package/dist/express/pages/missing.d.ts.map +1 -0
  30. package/dist/express/pages/missing.js +141 -0
  31. package/dist/express/pages/missing.js.map +1 -0
  32. package/dist/express/pages/stock.d.ts +21 -0
  33. package/dist/express/pages/stock.d.ts.map +1 -0
  34. package/dist/express/pages/stock.js +164 -0
  35. package/dist/express/pages/stock.js.map +1 -0
  36. package/dist/express/routes.d.ts +3 -0
  37. package/dist/express/routes.d.ts.map +1 -0
  38. package/dist/express/routes.js +8 -0
  39. package/dist/express/routes.js.map +1 -0
  40. package/dist/express/shopping.d.ts +4 -0
  41. package/dist/express/shopping.d.ts.map +1 -0
  42. package/dist/express/shopping.js +143 -0
  43. package/dist/express/shopping.js.map +1 -0
  44. package/dist/family/care.d.ts +4 -0
  45. package/dist/family/care.d.ts.map +1 -0
  46. package/dist/family/care.js +103 -0
  47. package/dist/family/care.js.map +1 -0
  48. package/dist/family/commands.d.ts +3 -0
  49. package/dist/family/commands.d.ts.map +1 -0
  50. package/dist/family/commands.js +6 -0
  51. package/dist/family/commands.js.map +1 -0
  52. package/dist/family/index.d.ts +3 -0
  53. package/dist/family/index.d.ts.map +1 -0
  54. package/dist/family/index.js +4 -0
  55. package/dist/family/index.js.map +1 -0
  56. package/dist/family/pages/family_borrow.d.ts +21 -0
  57. package/dist/family/pages/family_borrow.d.ts.map +1 -0
  58. package/dist/family/pages/family_borrow.js +267 -0
  59. package/dist/family/pages/family_borrow.js.map +1 -0
  60. package/dist/family/pages/family_members.d.ts +21 -0
  61. package/dist/family/pages/family_members.d.ts.map +1 -0
  62. package/dist/family/pages/family_members.js +171 -0
  63. package/dist/family/pages/family_members.js.map +1 -0
  64. package/dist/family/routes.d.ts +3 -0
  65. package/dist/family/routes.d.ts.map +1 -0
  66. package/dist/family/routes.js +20 -0
  67. package/dist/family/routes.js.map +1 -0
  68. package/dist/fetch/db.d.ts.map +1 -1
  69. package/dist/fetch/db.js +9 -1
  70. package/dist/fetch/db.js.map +1 -1
  71. package/dist/fetch/domains.d.ts +3 -0
  72. package/dist/fetch/domains.d.ts.map +1 -1
  73. package/dist/fetch/domains.js +5 -4
  74. package/dist/fetch/domains.js.map +1 -1
  75. package/dist/fetch/index.d.ts +1 -0
  76. package/dist/fetch/index.d.ts.map +1 -1
  77. package/dist/fetch/index.js +1 -0
  78. package/dist/fetch/index.js.map +1 -1
  79. package/dist/help/helpAssets.js +1 -1
  80. package/dist/items/add.d.ts +3 -0
  81. package/dist/items/add.d.ts.map +1 -0
  82. package/dist/items/add.js +34 -0
  83. package/dist/items/add.js.map +1 -0
  84. package/dist/items/commands.d.ts +3 -0
  85. package/dist/items/commands.d.ts.map +1 -0
  86. package/dist/items/commands.js +22 -0
  87. package/dist/items/commands.js.map +1 -0
  88. package/dist/items/detail.d.ts +3 -0
  89. package/dist/items/detail.d.ts.map +1 -0
  90. package/dist/items/detail.js +31 -0
  91. package/dist/items/detail.js.map +1 -0
  92. package/dist/items/index.d.ts +3 -0
  93. package/dist/items/index.d.ts.map +1 -0
  94. package/dist/items/index.js +4 -0
  95. package/dist/items/index.js.map +1 -0
  96. package/dist/items/inventory.d.ts +4 -0
  97. package/dist/items/inventory.d.ts.map +1 -0
  98. package/dist/items/inventory.js +41 -0
  99. package/dist/items/inventory.js.map +1 -0
  100. package/dist/items/pages/add_form.d.ts +21 -0
  101. package/dist/items/pages/add_form.d.ts.map +1 -0
  102. package/dist/items/pages/add_form.js +169 -0
  103. package/dist/items/pages/add_form.js.map +1 -0
  104. package/dist/items/pages/browse.d.ts +21 -0
  105. package/dist/items/pages/browse.d.ts.map +1 -0
  106. package/dist/items/pages/browse.js +143 -0
  107. package/dist/items/pages/browse.js.map +1 -0
  108. package/dist/items/pages/category_manage.d.ts +21 -0
  109. package/dist/items/pages/category_manage.d.ts.map +1 -0
  110. package/dist/items/pages/category_manage.js +153 -0
  111. package/dist/items/pages/category_manage.js.map +1 -0
  112. package/dist/items/pages/confirm.d.ts +21 -0
  113. package/dist/items/pages/confirm.d.ts.map +1 -0
  114. package/dist/items/pages/confirm.js +147 -0
  115. package/dist/items/pages/confirm.js.map +1 -0
  116. package/dist/items/pages/detail.d.ts +21 -0
  117. package/dist/items/pages/detail.d.ts.map +1 -0
  118. package/dist/items/pages/detail.js +160 -0
  119. package/dist/items/pages/detail.js.map +1 -0
  120. package/dist/items/pages/duplicates.d.ts +21 -0
  121. package/dist/items/pages/duplicates.d.ts.map +1 -0
  122. package/dist/items/pages/duplicates.js +138 -0
  123. package/dist/items/pages/duplicates.js.map +1 -0
  124. package/dist/items/pages/history.d.ts +21 -0
  125. package/dist/items/pages/history.d.ts.map +1 -0
  126. package/dist/items/pages/history.js +213 -0
  127. package/dist/items/pages/history.js.map +1 -0
  128. package/dist/items/pages/inventory_diff.d.ts +21 -0
  129. package/dist/items/pages/inventory_diff.d.ts.map +1 -0
  130. package/dist/items/pages/inventory_diff.js +126 -0
  131. package/dist/items/pages/inventory_diff.js.map +1 -0
  132. package/dist/items/pages/inventory_records.d.ts +21 -0
  133. package/dist/items/pages/inventory_records.d.ts.map +1 -0
  134. package/dist/items/pages/inventory_records.js +142 -0
  135. package/dist/items/pages/inventory_records.js.map +1 -0
  136. package/dist/items/pages/inventory_round.d.ts +21 -0
  137. package/dist/items/pages/inventory_round.d.ts.map +1 -0
  138. package/dist/items/pages/inventory_round.js +145 -0
  139. package/dist/items/pages/inventory_round.js.map +1 -0
  140. package/dist/items/pages/locate.d.ts +21 -0
  141. package/dist/items/pages/locate.d.ts.map +1 -0
  142. package/dist/items/pages/locate.js +126 -0
  143. package/dist/items/pages/locate.js.map +1 -0
  144. package/dist/items/pages/move_checklist.d.ts +21 -0
  145. package/dist/items/pages/move_checklist.d.ts.map +1 -0
  146. package/dist/items/pages/move_checklist.js +112 -0
  147. package/dist/items/pages/move_checklist.js.map +1 -0
  148. package/dist/items/pages/photo_wall.d.ts +21 -0
  149. package/dist/items/pages/photo_wall.d.ts.map +1 -0
  150. package/dist/items/pages/photo_wall.js +145 -0
  151. package/dist/items/pages/photo_wall.js.map +1 -0
  152. package/dist/items/pages/photos.d.ts +21 -0
  153. package/dist/items/pages/photos.d.ts.map +1 -0
  154. package/dist/items/pages/photos.js +180 -0
  155. package/dist/items/pages/photos.js.map +1 -0
  156. package/dist/items/pages/receipt.d.ts +21 -0
  157. package/dist/items/pages/receipt.d.ts.map +1 -0
  158. package/dist/items/pages/receipt.js +252 -0
  159. package/dist/items/pages/receipt.js.map +1 -0
  160. package/dist/items/pages/relations.d.ts +21 -0
  161. package/dist/items/pages/relations.d.ts.map +1 -0
  162. package/dist/items/pages/relations.js +144 -0
  163. package/dist/items/pages/relations.js.map +1 -0
  164. package/dist/items/pages/search_list.d.ts +21 -0
  165. package/dist/items/pages/search_list.d.ts.map +1 -0
  166. package/dist/items/pages/search_list.js +133 -0
  167. package/dist/items/pages/search_list.js.map +1 -0
  168. package/dist/items/pages/tag_manage.d.ts +21 -0
  169. package/dist/items/pages/tag_manage.d.ts.map +1 -0
  170. package/dist/items/pages/tag_manage.js +213 -0
  171. package/dist/items/pages/tag_manage.js.map +1 -0
  172. package/dist/items/pages/undo_select.d.ts +21 -0
  173. package/dist/items/pages/undo_select.d.ts.map +1 -0
  174. package/dist/items/pages/undo_select.js +143 -0
  175. package/dist/items/pages/undo_select.js.map +1 -0
  176. package/dist/items/routes.d.ts +3 -0
  177. package/dist/items/routes.d.ts.map +1 -0
  178. package/dist/items/routes.js +62 -0
  179. package/dist/items/routes.js.map +1 -0
  180. package/dist/items/search.d.ts +3 -0
  181. package/dist/items/search.d.ts.map +1 -0
  182. package/dist/items/search.js +47 -0
  183. package/dist/items/search.js.map +1 -0
  184. package/dist/items/tag.d.ts +25 -0
  185. package/dist/items/tag.d.ts.map +1 -0
  186. package/dist/items/tag.js +133 -0
  187. package/dist/items/tag.js.map +1 -0
  188. package/dist/items/update.d.ts +20 -0
  189. package/dist/items/update.d.ts.map +1 -0
  190. package/dist/items/update.js +211 -0
  191. package/dist/items/update.js.map +1 -0
  192. package/dist/outfit/commands.d.ts +3 -0
  193. package/dist/outfit/commands.d.ts.map +1 -0
  194. package/dist/outfit/commands.js +7 -0
  195. package/dist/outfit/commands.js.map +1 -0
  196. package/dist/outfit/index.d.ts +3 -0
  197. package/dist/outfit/index.d.ts.map +1 -0
  198. package/dist/outfit/index.js +4 -0
  199. package/dist/outfit/index.js.map +1 -0
  200. package/dist/outfit/outfit.d.ts +3 -0
  201. package/dist/outfit/outfit.d.ts.map +1 -0
  202. package/dist/outfit/outfit.js +182 -0
  203. package/dist/outfit/outfit.js.map +1 -0
  204. package/dist/outfit/pages/outfit_picker.d.ts +21 -0
  205. package/dist/outfit/pages/outfit_picker.d.ts.map +1 -0
  206. package/dist/outfit/pages/outfit_picker.js +185 -0
  207. package/dist/outfit/pages/outfit_picker.js.map +1 -0
  208. package/dist/outfit/pages/travel_trip.d.ts +21 -0
  209. package/dist/outfit/pages/travel_trip.d.ts.map +1 -0
  210. package/dist/outfit/pages/travel_trip.js +185 -0
  211. package/dist/outfit/pages/travel_trip.js.map +1 -0
  212. package/dist/outfit/pages/trip_outfit_plan.d.ts +21 -0
  213. package/dist/outfit/pages/trip_outfit_plan.d.ts.map +1 -0
  214. package/dist/outfit/pages/trip_outfit_plan.js +173 -0
  215. package/dist/outfit/pages/trip_outfit_plan.js.map +1 -0
  216. package/dist/outfit/pages/wardrobe_analyze.d.ts +21 -0
  217. package/dist/outfit/pages/wardrobe_analyze.d.ts.map +1 -0
  218. package/dist/outfit/pages/wardrobe_analyze.js +171 -0
  219. package/dist/outfit/pages/wardrobe_analyze.js.map +1 -0
  220. package/dist/outfit/pages/wardrobe_season.d.ts +21 -0
  221. package/dist/outfit/pages/wardrobe_season.d.ts.map +1 -0
  222. package/dist/outfit/pages/wardrobe_season.js +167 -0
  223. package/dist/outfit/pages/wardrobe_season.js.map +1 -0
  224. package/dist/outfit/routes.d.ts +3 -0
  225. package/dist/outfit/routes.d.ts.map +1 -0
  226. package/dist/outfit/routes.js +9 -0
  227. package/dist/outfit/routes.js.map +1 -0
  228. package/dist/outfit/trip.d.ts +3 -0
  229. package/dist/outfit/trip.d.ts.map +1 -0
  230. package/dist/outfit/trip.js +59 -0
  231. package/dist/outfit/trip.js.map +1 -0
  232. package/dist/output.d.ts +13 -0
  233. package/dist/output.d.ts.map +1 -0
  234. package/dist/output.js +57 -0
  235. package/dist/output.js.map +1 -0
  236. package/dist/policy/routes.generated.d.ts +3 -0
  237. package/dist/policy/routes.generated.d.ts.map +1 -0
  238. package/dist/policy/routes.generated.js +128 -0
  239. package/dist/policy/routes.generated.js.map +1 -0
  240. package/dist/policy/wakewords.d.ts +1 -0
  241. package/dist/policy/wakewords.d.ts.map +1 -1
  242. package/dist/policy/wakewords.js +11 -93
  243. package/dist/policy/wakewords.js.map +1 -1
  244. package/dist/receipt/commands.d.ts +3 -0
  245. package/dist/receipt/commands.d.ts.map +1 -0
  246. package/dist/receipt/commands.js +6 -0
  247. package/dist/receipt/commands.js.map +1 -0
  248. package/dist/receipt/index.d.ts +3 -0
  249. package/dist/receipt/index.d.ts.map +1 -0
  250. package/dist/receipt/index.js +4 -0
  251. package/dist/receipt/index.js.map +1 -0
  252. package/dist/receipt/pages/accounts.d.ts +21 -0
  253. package/dist/receipt/pages/accounts.d.ts.map +1 -0
  254. package/dist/receipt/pages/accounts.js +217 -0
  255. package/dist/receipt/pages/accounts.js.map +1 -0
  256. package/dist/receipt/pages/certificates.d.ts +21 -0
  257. package/dist/receipt/pages/certificates.d.ts.map +1 -0
  258. package/dist/receipt/pages/certificates.js +236 -0
  259. package/dist/receipt/pages/certificates.js.map +1 -0
  260. package/dist/receipt/pages/purchase_records.d.ts +21 -0
  261. package/dist/receipt/pages/purchase_records.d.ts.map +1 -0
  262. package/dist/receipt/pages/purchase_records.js +250 -0
  263. package/dist/receipt/pages/purchase_records.js.map +1 -0
  264. package/dist/receipt/pages/warranty.d.ts +21 -0
  265. package/dist/receipt/pages/warranty.d.ts.map +1 -0
  266. package/dist/receipt/pages/warranty.js +142 -0
  267. package/dist/receipt/pages/warranty.js.map +1 -0
  268. package/dist/receipt/routes.d.ts +3 -0
  269. package/dist/receipt/routes.d.ts.map +1 -0
  270. package/dist/receipt/routes.js +21 -0
  271. package/dist/receipt/routes.js.map +1 -0
  272. package/dist/receipt/ticket.d.ts +4 -0
  273. package/dist/receipt/ticket.d.ts.map +1 -0
  274. package/dist/receipt/ticket.js +173 -0
  275. package/dist/receipt/ticket.js.map +1 -0
  276. package/dist/render/copyArea.d.ts +45 -0
  277. package/dist/render/copyArea.d.ts.map +1 -0
  278. package/dist/render/copyArea.js +74 -0
  279. package/dist/render/copyArea.js.map +1 -0
  280. package/dist/render/envelope.d.ts.map +1 -1
  281. package/dist/render/envelope.js +4 -23
  282. package/dist/render/envelope.js.map +1 -1
  283. package/dist/render/errors.d.ts +1 -1
  284. package/dist/render/errors.d.ts.map +1 -1
  285. package/dist/render/errors.js.map +1 -1
  286. package/dist/render/familyPage.d.ts +20 -0
  287. package/dist/render/familyPage.d.ts.map +1 -0
  288. package/dist/render/familyPage.js +108 -0
  289. package/dist/render/familyPage.js.map +1 -0
  290. package/dist/render/html.d.ts +7 -2
  291. package/dist/render/html.d.ts.map +1 -1
  292. package/dist/render/html.js +21 -5
  293. package/dist/render/html.js.map +1 -1
  294. package/dist/render/index.d.ts +7 -1
  295. package/dist/render/index.d.ts.map +1 -1
  296. package/dist/render/index.js +8 -1
  297. package/dist/render/index.js.map +1 -1
  298. package/dist/render/pageFamilies.d.ts +8 -0
  299. package/dist/render/pageFamilies.d.ts.map +1 -0
  300. package/dist/render/pageFamilies.js +169 -0
  301. package/dist/render/pageFamilies.js.map +1 -0
  302. package/dist/render/sceneNaming.d.ts +14 -0
  303. package/dist/render/sceneNaming.d.ts.map +1 -0
  304. package/dist/render/sceneNaming.js +171 -0
  305. package/dist/render/sceneNaming.js.map +1 -0
  306. package/dist/setup/commands.d.ts +3 -0
  307. package/dist/setup/commands.d.ts.map +1 -0
  308. package/dist/setup/commands.js +9 -0
  309. package/dist/setup/commands.js.map +1 -0
  310. package/dist/setup/index.d.ts +3 -0
  311. package/dist/setup/index.d.ts.map +1 -0
  312. package/dist/setup/index.js +4 -0
  313. package/dist/setup/index.js.map +1 -0
  314. package/dist/setup/pages/backup_receipt.d.ts +21 -0
  315. package/dist/setup/pages/backup_receipt.d.ts.map +1 -0
  316. package/dist/setup/pages/backup_receipt.js +198 -0
  317. package/dist/setup/pages/backup_receipt.js.map +1 -0
  318. package/dist/setup/pages/first_use_wizard.d.ts +21 -0
  319. package/dist/setup/pages/first_use_wizard.d.ts.map +1 -0
  320. package/dist/setup/pages/first_use_wizard.js +169 -0
  321. package/dist/setup/pages/first_use_wizard.js.map +1 -0
  322. package/dist/setup/pages/health_report.d.ts +21 -0
  323. package/dist/setup/pages/health_report.d.ts.map +1 -0
  324. package/dist/setup/pages/health_report.js +152 -0
  325. package/dist/setup/pages/health_report.js.map +1 -0
  326. package/dist/setup/pages/import_restore.d.ts +21 -0
  327. package/dist/setup/pages/import_restore.d.ts.map +1 -0
  328. package/dist/setup/pages/import_restore.js +179 -0
  329. package/dist/setup/pages/import_restore.js.map +1 -0
  330. package/dist/setup/routes.d.ts +3 -0
  331. package/dist/setup/routes.d.ts.map +1 -0
  332. package/dist/setup/routes.js +2 -0
  333. package/dist/setup/routes.js.map +1 -0
  334. package/dist/shared/commandSpec.d.ts +30 -0
  335. package/dist/shared/commandSpec.d.ts.map +1 -0
  336. package/dist/shared/commandSpec.js +8 -0
  337. package/dist/shared/commandSpec.js.map +1 -0
  338. package/dist/shared/fail.d.ts +4 -0
  339. package/dist/shared/fail.d.ts.map +1 -0
  340. package/dist/shared/fail.js +16 -0
  341. package/dist/shared/fail.js.map +1 -0
  342. package/dist/shared/params.d.ts +2 -0
  343. package/dist/shared/params.d.ts.map +1 -0
  344. package/dist/shared/params.js +12 -0
  345. package/dist/shared/params.js.map +1 -0
  346. package/dist/space/commands.d.ts +3 -0
  347. package/dist/space/commands.d.ts.map +1 -0
  348. package/dist/space/commands.js +6 -0
  349. package/dist/space/commands.js.map +1 -0
  350. package/dist/space/index.d.ts +3 -0
  351. package/dist/space/index.d.ts.map +1 -0
  352. package/dist/space/index.js +4 -0
  353. package/dist/space/index.js.map +1 -0
  354. package/dist/space/location.d.ts +82 -0
  355. package/dist/space/location.d.ts.map +1 -0
  356. package/dist/space/location.js +310 -0
  357. package/dist/space/location.js.map +1 -0
  358. package/dist/space/pages/fixed_spot.d.ts +21 -0
  359. package/dist/space/pages/fixed_spot.d.ts.map +1 -0
  360. package/dist/space/pages/fixed_spot.js +122 -0
  361. package/dist/space/pages/fixed_spot.js.map +1 -0
  362. package/dist/space/pages/location_manage.d.ts +21 -0
  363. package/dist/space/pages/location_manage.d.ts.map +1 -0
  364. package/dist/space/pages/location_manage.js +169 -0
  365. package/dist/space/pages/location_manage.js.map +1 -0
  366. package/dist/space/pages/space_view.d.ts +21 -0
  367. package/dist/space/pages/space_view.d.ts.map +1 -0
  368. package/dist/space/pages/space_view.js +185 -0
  369. package/dist/space/pages/space_view.js.map +1 -0
  370. package/dist/space/pages/suggest_storage.d.ts +21 -0
  371. package/dist/space/pages/suggest_storage.d.ts.map +1 -0
  372. package/dist/space/pages/suggest_storage.js +179 -0
  373. package/dist/space/pages/suggest_storage.js.map +1 -0
  374. package/dist/space/routes.d.ts +3 -0
  375. package/dist/space/routes.d.ts.map +1 -0
  376. package/dist/space/routes.js +24 -0
  377. package/dist/space/routes.js.map +1 -0
  378. package/dist/stats/commands.d.ts +3 -0
  379. package/dist/stats/commands.d.ts.map +1 -0
  380. package/dist/stats/commands.js +6 -0
  381. package/dist/stats/commands.js.map +1 -0
  382. package/dist/stats/index.d.ts +3 -0
  383. package/dist/stats/index.d.ts.map +1 -0
  384. package/dist/stats/index.js +4 -0
  385. package/dist/stats/index.js.map +1 -0
  386. package/dist/stats/pages/expiring.d.ts +21 -0
  387. package/dist/stats/pages/expiring.d.ts.map +1 -0
  388. package/dist/stats/pages/expiring.js +204 -0
  389. package/dist/stats/pages/expiring.js.map +1 -0
  390. package/dist/stats/pages/idle.d.ts +21 -0
  391. package/dist/stats/pages/idle.d.ts.map +1 -0
  392. package/dist/stats/pages/idle.js +163 -0
  393. package/dist/stats/pages/idle.js.map +1 -0
  394. package/dist/stats/pages/inventory_stat.d.ts +21 -0
  395. package/dist/stats/pages/inventory_stat.d.ts.map +1 -0
  396. package/dist/stats/pages/inventory_stat.js +133 -0
  397. package/dist/stats/pages/inventory_stat.js.map +1 -0
  398. package/dist/stats/pages/overview.d.ts +21 -0
  399. package/dist/stats/pages/overview.d.ts.map +1 -0
  400. package/dist/stats/pages/overview.js +179 -0
  401. package/dist/stats/pages/overview.js.map +1 -0
  402. package/dist/stats/routes.d.ts +3 -0
  403. package/dist/stats/routes.d.ts.map +1 -0
  404. package/dist/stats/routes.js +16 -0
  405. package/dist/stats/routes.js.map +1 -0
  406. package/dist/stats/stats.d.ts +4 -0
  407. package/dist/stats/stats.d.ts.map +1 -0
  408. package/dist/stats/stats.js +38 -0
  409. package/dist/stats/stats.js.map +1 -0
  410. package/package.json +8 -5
  411. package/templates/care_query.html +1 -0
  412. package/templates/care_receipt.html +1 -0
  413. package/templates/express/express.html +17 -0
  414. package/templates/express/list.html +17 -0
  415. package/templates/express/missing.html +17 -0
  416. package/templates/express/stock.html +17 -0
  417. package/templates/family/family_borrow.html +17 -0
  418. package/templates/family/family_members.html +17 -0
  419. package/templates/help.html +1 -0
  420. package/templates/inventory_records.html +1 -0
  421. package/templates/inventory_round.html +1 -0
  422. package/templates/item_detail.html +1 -0
  423. package/templates/item_receipt.html +1 -0
  424. package/templates/item_search.html +1 -0
  425. package/templates/item_update_receipt.html +1 -0
  426. package/templates/items/add_form.html +17 -0
  427. package/templates/items/browse.html +17 -0
  428. package/templates/items/category_manage.html +17 -0
  429. package/templates/items/confirm.html +17 -0
  430. package/templates/items/detail.html +17 -0
  431. package/templates/items/duplicates.html +17 -0
  432. package/templates/items/history.html +17 -0
  433. package/templates/items/inventory_diff.html +17 -0
  434. package/templates/items/inventory_records.html +17 -0
  435. package/templates/items/inventory_round.html +17 -0
  436. package/templates/items/locate.html +17 -0
  437. package/templates/items/move_checklist.html +17 -0
  438. package/templates/items/photo_wall.html +17 -0
  439. package/templates/items/photos.html +17 -0
  440. package/templates/items/receipt.html +17 -0
  441. package/templates/items/relations.html +17 -0
  442. package/templates/items/search_list.html +17 -0
  443. package/templates/items/tag_manage.html +17 -0
  444. package/templates/items/undo_select.html +17 -0
  445. package/templates/location_query.html +1 -0
  446. package/templates/location_receipt.html +1 -0
  447. package/templates/outfit/outfit_picker.html +17 -0
  448. package/templates/outfit/travel_trip.html +17 -0
  449. package/templates/outfit/trip_outfit_plan.html +17 -0
  450. package/templates/outfit/wardrobe_analyze.html +17 -0
  451. package/templates/outfit/wardrobe_season.html +17 -0
  452. package/templates/outfit_pick.html +1 -0
  453. package/templates/receipt/accounts.html +17 -0
  454. package/templates/receipt/certificates.html +17 -0
  455. package/templates/receipt/purchase_records.html +17 -0
  456. package/templates/receipt/warranty.html +17 -0
  457. package/templates/setup/backup_receipt.html +17 -0
  458. package/templates/setup/first_use_wizard.html +17 -0
  459. package/templates/setup/health_report.html +17 -0
  460. package/templates/setup/import_restore.html +17 -0
  461. package/templates/shopping_query.html +1 -0
  462. package/templates/shopping_receipt.html +1 -0
  463. package/templates/space/fixed_spot.html +63 -0
  464. package/templates/space/location_manage.html +70 -0
  465. package/templates/space/space_view.html +65 -0
  466. package/templates/space/suggest_storage.html +58 -0
  467. package/templates/stats/expiring.html +17 -0
  468. package/templates/stats/idle.html +17 -0
  469. package/templates/stats/inventory_stat.html +17 -0
  470. package/templates/stats/overview.html +17 -0
  471. package/templates/stats_alert.html +1 -0
  472. package/templates/stats_overview.html +1 -0
  473. package/templates/tag_query.html +1 -0
  474. package/templates/tag_receipt.html +1 -0
  475. package/templates/ticket_query.html +1 -0
  476. package/templates/ticket_receipt.html +1 -0
  477. package/templates/trip_receipt.html +1 -0
@@ -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":"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"}
@@ -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,21 @@
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 scenarios: readonly string[];
10
+ };
11
+ export declare const REQUIRED_BLOCKS: {
12
+ readonly fields: readonly string[];
13
+ readonly operations: readonly string[];
14
+ readonly empty: readonly string[];
15
+ readonly status: readonly string[];
16
+ };
17
+ export declare function renderFamilyPage(env: Envelope, ctx?: {
18
+ readonly command?: string;
19
+ readonly actionAt?: string;
20
+ }): string;
21
+ //# sourceMappingURL=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;wBAC5B,SAAS,MAAM,EAAE;CACjC,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"}
@@ -0,0 +1,267 @@
1
+ // family能力·family_borrow页装配(#815 域票填内容,#805 脚手架生成的外壳保留)。
2
+ //
3
+ // 信息结构对齐老模板 `templates/family_borrow.html`(158 行):借出区与借入区
4
+ // 双向分区、超期件数、记录行、登记表单、确认归还与复制催还文案、超期提醒。
5
+ // 四个写操作的页面形态都在本页:借出/借入走登记表单的方向下拉(借入带
6
+ // 库外物品名自由输入),归还走每行的确认归还,催还走超期横幅与复制催还文案。
7
+ //
8
+ // 取数缺口(诚实声明,回写票 3):`home.care.query kind=borrow` 当前只回
9
+ // `{name: '借用'+成员名, count: 1}` 行(见 `src/family/care.ts:22`),没有方向、
10
+ // 借出日、约定归还日、备注字段。故分区按行自带的方向字段分(有则分,没有
11
+ // 全进借出区、借入区留诚实空态),超期按约定归还日算(没有则记零并明示)。
12
+ // 本页不伪造任何记录行,不猜方向。
13
+ //
14
+ // 审计约束(票 6 三件判据):长必需块原文(超 6 字)只出现在文末折叠对照区
15
+ // 一次,避免重复句;可见正文不用英文、不用中点竖线分隔符;可点件高度不
16
+ // 小于四十四像素(`audit-responsive.mjs`)。
17
+ import { readFileSync } from 'node:fs';
18
+ import { fillTemplate, renderEnvelopeHtml, escapeHtml, homeCopyArea, homeCopyLog, homeNowStamp } from '../../render/index.js';
19
+ export const FAMILY = 'family_borrow';
20
+ export const PAGE_META = {
21
+ domain: 'family',
22
+ family: FAMILY,
23
+ key: 'home.care.query',
24
+ shape: 'list',
25
+ preset: { "kind": "borrow" },
26
+ scenarios: ["SM7-1"],
27
+ };
28
+ export const REQUIRED_BLOCKS = {
29
+ "empty": [
30
+ "空态:暂无借用记录",
31
+ "超期提醒",
32
+ "异常:数据解析失败/数据校验失败"
33
+ ],
34
+ "fields": [
35
+ "借出/借入双向分区",
36
+ "超期件数",
37
+ "记录(物品名/对象/借出日/约定归还日/状态/已借天数/备注)",
38
+ "登记表单"
39
+ ],
40
+ "operations": [
41
+ "确认归还",
42
+ "复制催还文案",
43
+ "确认登记",
44
+ "复制数据",
45
+ "复制日志"
46
+ ],
47
+ "status": [
48
+ "已超期",
49
+ "今日到期",
50
+ "已归还",
51
+ "借用中"
52
+ ]
53
+ };
54
+ const CSS = [
55
+ '.bw-lead{color:#6e6e73;font-size:15px;margin:2px 0 12px}',
56
+ '.bw-metrics{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:12px;margin:12px 0 16px}',
57
+ '.bw-num{background:#fff;border:1px solid #e3e3e8;border-radius:14px;padding:12px 14px}',
58
+ '.bw-num b{display:block;color:#6e6e73;font-size:12px;margin-bottom:4px;font-weight:600}',
59
+ '.bw-num span{font-size:24px;font-weight:700}',
60
+ '.bw-warn{background:#fff1f0;border:1px solid #ffd9d5;color:#c0392b;border-radius:14px;padding:12px 16px;font-weight:600;margin-bottom:14px}',
61
+ '.bw-calm{background:#f0fff4;border:1px solid #d3f5dd;color:#1e8e4a;border-radius:14px;padding:12px 16px;margin-bottom:14px}',
62
+ '.bw-sec{background:#fff;border:1px solid #e3e3e8;border-radius:16px;padding:18px;margin-bottom:14px}',
63
+ '.bw-sec h2{font-size:17px;margin-bottom:12px}',
64
+ '.bw-hint{color:#86868b;font-size:12px;margin-bottom:10px}',
65
+ '.bw-rec{border:1px solid #e3e3e8;border-radius:14px;padding:12px 14px;margin-bottom:10px}',
66
+ '.bw-rec.done{opacity:.62}',
67
+ '.bw-top{display:flex;align-items:center;gap:10px;flex-wrap:wrap}',
68
+ '.bw-thumb{width:44px;height:44px;border-radius:10px;background:linear-gradient(135deg,#e8f1ff,#f0e9ff);color:#007aff;display:inline-flex;align-items:center;justify-content:center;font-weight:800;font-size:16px;flex-shrink:0}',
69
+ '.bw-name{font-size:16px;font-weight:700}',
70
+ '.bw-pill{font-size:12px;font-weight:700;padding:2px 10px;border-radius:99px;background:#eaf3ff;color:#007aff}',
71
+ '.bw-pill.warn{background:#fff4e5;color:#c76a00}',
72
+ '.bw-pill.bad{background:#ffebea;color:#d70015}',
73
+ '.bw-pill.mute{background:#eef1f4;color:#86868b}',
74
+ '.bw-meta{color:#6e6e73;font-size:13px;margin-top:6px}',
75
+ '.bw-seq{font-size:12px;color:#86868b;margin-left:auto}',
76
+ // #817 第二波(⑥ 分隔符不懒政):明细原先是「物品…,借出日…,约定归还…,已借天数…,备注…」
77
+ // 五段事实逗号串一行(390 档折行、行行相似);改成四组(有备注时五组)标签+值。
78
+ '.bw-fields{display:grid;grid-template-columns:repeat(auto-fit,minmax(132px,1fr));gap:4px 12px;margin:8px 0 0;font-size:13px}',
79
+ '.bw-fields>div{min-width:0}',
80
+ '.bw-fields dt{color:#86868b;font-size:12px}',
81
+ '.bw-fields dd{margin:0;font-weight:600;overflow-wrap:anywhere}',
82
+ '.bw-actions{display:flex;gap:8px;flex-wrap:wrap;margin-top:10px}',
83
+ '.bw-btn{font:inherit;font-size:14px;font-weight:600;border:1px solid #d2d2d7;background:#fff;border-radius:99px;padding:6px 16px;cursor:pointer;min-height:44px}',
84
+ '.bw-btn.primary{background:#007aff;border-color:#007aff;color:#fff}',
85
+ '.bw-fgrid{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:12px;margin-bottom:12px}',
86
+ '.bw-fgrid label{display:block;font-size:12px;font-weight:700;color:#6e6e73}',
87
+ '.bw-fgrid input,.bw-fgrid select{display:block;border:1px solid #d2d2d7;border-radius:10px;padding:8px 10px;font:inherit;font-weight:400;color:#1d1d1f;width:100%;background:#fff;margin-top:4px;min-height:44px;box-sizing:border-box}',
88
+ '.bw-copy2{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-top:12px}',
89
+ '.bw-copy{border:1.5px solid #007aff;background:#fff;color:#007aff;border-radius:999px;padding:10px 22px;font-weight:700;cursor:pointer;font-size:14px;min-height:48px}',
90
+ '.bw-legend{color:#86868b;font-size:12px;margin-top:10px}',
91
+ '.bw-need{font-size:12px;color:#86868b}',
92
+ '.bw-need summary{cursor:pointer;min-height:44px;display:flex;align-items:center;font-weight:600}',
93
+ '.bw-need ul{margin:6px 0 10px 18px}',
94
+ '@media(max-width:720px){.bw-copy2{grid-template-columns:1fr 1fr}}',
95
+ ].join('\n');
96
+ function str(v) {
97
+ return typeof v === 'string' ? v : '';
98
+ }
99
+ function todayStr() {
100
+ return new Date().toISOString().slice(0, 10);
101
+ }
102
+ // 富化一行:只用行自带的字段,不猜。分区与状态按记录自己的 op(借出/借入/归还)判,缺省才退回 direction/action。
103
+ function toRec(item, idx) {
104
+ const op = str(item.op) || str(item.direction) || str(item.action);
105
+ const name = str(item.name);
106
+ const objectName = name.startsWith('借用') && name.length > 2 ? name.slice(2) : (str(item.member) || str(item.object_name) || name || '未留对象');
107
+ const itemName = str(item.item_name) || (typeof item.item_id === 'number' ? '库内物品' : '');
108
+ const borrowed = str(item.borrowed_at) || str(item.date);
109
+ const due = str(item.due_date) || str(item.due);
110
+ const returnedAt = str(item.returned_at);
111
+ const days = str(item.days_borrowed) || (/^\d+$/.test(str(item.days)) ? str(item.days) : '');
112
+ const remark = str(item.remark);
113
+ const returned = op === '归还' || op === 'return' || returnedAt !== '';
114
+ const direction = op === '借入' ? '借入' : '借出';
115
+ let status = '借用中';
116
+ if (returned)
117
+ status = '已归还';
118
+ else if (due) {
119
+ const t = todayStr();
120
+ if (due < t)
121
+ status = '已超期';
122
+ else if (due === t)
123
+ status = '今日到期';
124
+ }
125
+ const id = str(item.id) || String(idx + 1);
126
+ const shownItem = itemName || '未登记';
127
+ // 对象名已在卡头,明细行不再重复;物品名与三个日期位各占一组「标签+值」,无值的位写「—」。
128
+ const dateLabel = returned ? '归还' : direction === '借入' ? '借入' : '借出';
129
+ const returnPrompt = '【确认归还】请帮我在居家管家确认归还一笔借用。\n借用记录:' + id + '\n物品:' + shownItem + '\n借用对象:' + objectName;
130
+ const remindBase = objectName + ',之前借的' + shownItem;
131
+ const remindPrompt = returned
132
+ ? '感谢' + remindBase + '已还清'
133
+ : status === '今日到期'
134
+ ? remindBase + '今天到归还日了,记得还哦'
135
+ : direction === '借出'
136
+ ? remindBase + '记得还哦'
137
+ : remindBase + '我记着呢';
138
+ return { id, objectName, direction, status, due, itemName: shownItem, dateLabel, borrowed, days, remark, returnPrompt, remindPrompt, returned };
139
+ }
140
+ /** 明细四组「标签+值」(有备注时五组):一格一事实,窄屏按 `auto-fit` 折成两列或一列,
141
+ * 不再把五段事实逗号串一行(#817 第二波 ⑥)。 */
142
+ function detailFields(r) {
143
+ const pairs = [
144
+ ['物品', r.itemName],
145
+ [r.dateLabel, r.borrowed || '—'],
146
+ ['约定归还', r.due || '—'],
147
+ ['已借天数', r.days || '—'],
148
+ ];
149
+ if (r.remark !== '')
150
+ pairs.push(['备注', r.remark]);
151
+ return '<dl class="bw-fields">' + pairs.map(([k, v]) => '<div><dt>' + escapeHtml(k) + '</dt><dd>' + escapeHtml(v) + '</dd></div>').join('') + '</dl>';
152
+ }
153
+ function pill(status) {
154
+ if (status.startsWith('已超期'))
155
+ return '<span class="bw-pill bad">' + escapeHtml(status) + '</span>';
156
+ if (status === '今日到期')
157
+ return '<span class="bw-pill warn">今日到期</span>';
158
+ if (status === '已归还')
159
+ return '<span class="bw-pill mute">已归还</span>';
160
+ return '<span class="bw-pill">借用中</span>';
161
+ }
162
+ // 同分区内编号(行自带字段相同时仍逐行可区分,不合并、不虚构)。
163
+ function recCard(r, seq) {
164
+ const thumb = '<span class="bw-thumb">' + escapeHtml((r.objectName || '?').slice(0, 1)) + '</span>';
165
+ const btns = r.returned
166
+ ? '<span class="bw-hint">已还清</span>'
167
+ : '<div class="bw-actions"><button class="bw-btn primary" data-t="' + escapeHtml(r.returnPrompt)
168
+ + '" onclick="copyText(this.dataset.t)">确认归还</button><button class="bw-btn" data-t="'
169
+ + escapeHtml(r.remindPrompt) + '" onclick="copyText(this.dataset.t)">复制催还文案</button></div>';
170
+ return '<div class="bw-rec' + (r.returned ? ' done' : '') + '"><div class="bw-top">' + thumb
171
+ + '<span class="bw-name">' + escapeHtml(r.objectName) + '</span>' + pill(r.status)
172
+ + '<span class="bw-seq">' + escapeHtml(seq) + '</span></div>'
173
+ + detailFields(r) + btns + '</div>';
174
+ }
175
+ // 数据快照:真链回执的逐行编号呈现(行内容原样,只加序号;同成员多行
176
+ // 不再渲染成相同可见句)。回执形直接走共用渲染。
177
+ function snapshotHtml(env, rows) {
178
+ if (env.shape === 'receipt')
179
+ return renderEnvelopeHtml(env);
180
+ if (rows.length === 0)
181
+ return '<div class="bw-meta">暂无记录</div>';
182
+ return '<ol class="bw-rows">' + rows.map((it, i) => '<li>第' + (i + 1) + '行:' + escapeHtml(str(it.name) || '未命名行')).join('') + '</ol>';
183
+ }
184
+ function needList(group, title) {
185
+ const items = REQUIRED_BLOCKS[group].map((b) => '<li data-need="' + escapeHtml(b) + '">' + escapeHtml(b) + '</li>').join('');
186
+ return '<details hidden class="bw-need" data-block="' + group + '"><summary>' + title + '</summary><ul>' + items + '</ul></details>';
187
+ }
188
+ // 装配入口:真 envelope(真命令链产出)+本族模板 → 同形整页。
189
+ // fail-closed:模板缺失/标记异常(fillTemplate 内抛)不返空页。
190
+ // 复制区走共用件(卡路里同款三格式+六段日志);`ctx.command` 由交付链供给(含 params),直调缺省按本族主 key。
191
+ export function renderFamilyPage(env, ctx) {
192
+ const template = readFileSync(new URL('../../../templates/family/family_borrow.html', import.meta.url), 'utf8');
193
+ const d = env.data;
194
+ const isReceipt = env.shape === 'receipt';
195
+ const rows = !isReceipt && Array.isArray(d.items) ? d.items : [];
196
+ const recs = rows.map((it, i) => toRec(it, i));
197
+ const out = recs.filter((r) => r.direction === '借出');
198
+ const inn = recs.filter((r) => r.direction === '借入');
199
+ const overdue = recs.filter((r) => r.status.startsWith('已超期')).length;
200
+ const hasDue = recs.some((r) => r.due !== ''); // 约定归还日一个都没有 → 超期算不出来,值位写「—」
201
+ const receiptMsg = isReceipt ? str(d.message) : '';
202
+ const banner = recs.length === 0 || (hasDue && overdue === 0)
203
+ ? '<div class="bw-calm">超期提醒:当前没有超期记录</div>'
204
+ : hasDue
205
+ ? '<div class="bw-warn">超期提醒:有' + overdue + '件超期未还,记得催一下</div>'
206
+ : '<div class="bw-calm">超期提醒:约定归还日未记录,暂时算不出超期</div>';
207
+ const emptyNote = recs.length === 0
208
+ ? '<div class="bw-sec"><div class="bw-meta">还没有借用记录,先在下面登记第一笔吧</div></div>'
209
+ : '';
210
+ const thinNote = recs.length > 0 && rows.every((it) => !str(it.borrowed_at) && !str(it.due_date) && !str(it.item_name))
211
+ ? '<p class="bw-hint">清单行当前只带成员名,物品与日期明细待数据补齐后自动列出</p>'
212
+ : '';
213
+ const receiptBanner = receiptMsg !== ''
214
+ ? '<div class="bw-sec"><div class="bw-meta">写操作回执</div><div>' + escapeHtml(receiptMsg) + '</div></div>'
215
+ : '';
216
+ const memberOpts = Array.from(new Set(recs.map((r) => r.objectName).filter(Boolean)))
217
+ .map((m) => '<option value="' + escapeHtml(m) + '">' + escapeHtml(m) + '</option>').join('');
218
+ const content = '<style>' + CSS + '</style>'
219
+ // #817:导语原说「超期自动提醒」,与下面那条「约定归还日未记录,暂时算不出超期」两种口径;导语改成口径本身。
220
+ + '<p class="bw-lead">借出与借入分开记,超期按约定归还日算</p>'
221
+ + '<div class="bw-metrics">'
222
+ + '<div class="bw-num"><b>借出中</b><span>' + out.filter((r) => !r.returned).length + '</span></div>'
223
+ + '<div class="bw-num"><b>借入中</b><span>' + inn.filter((r) => !r.returned).length + '</span></div>'
224
+ + '<div class="bw-num"><b>超期件数</b><span>' + (hasDue ? String(overdue) : recs.length === 0 ? '0' : '—') + '</span></div>'
225
+ + '</div>'
226
+ + banner + receiptBanner + emptyNote + thinNote
227
+ + '<section class="bw-sec"><h2>借出区</h2>'
228
+ + (out.length > 0 ? out.map((r, i) => recCard(r, '借出第' + (i + 1) + '笔')).join('') : '<p class="bw-hint">借出区暂无记录</p>')
229
+ + '</section>'
230
+ + '<section class="bw-sec"><h2>借入区</h2>'
231
+ + (inn.length > 0 ? inn.map((r, i) => recCard(r, '借入第' + (i + 1) + '笔')).join('') : '<p class="bw-hint">借入区暂无记录,有借入登记会自动列在这里</p>')
232
+ + '</section>'
233
+ + '<section class="bw-sec"><h2>登记表单</h2>'
234
+ + '<div class="bw-fgrid">'
235
+ + '<label>方向<select id="fDir"><option value="借出">借出</option><option value="借入">借入</option></select></label>'
236
+ + '<label>对象(家人)<select id="fObj"><option value="">请选择</option>' + memberOpts + '</select></label>'
237
+ + '<label>对象自由输入<input id="fObjName" placeholder="外部联系人"></label>'
238
+ // #817:方向下拉默认「借出」,标签写「库外物品名」会把借出方向的人带偏;按中性的「物品名」写。
239
+ + '<label>物品名<input id="fItemName" placeholder="借入时填这里"></label>'
240
+ + '<label>借出日期<input id="fBorrowed" type="date"></label>'
241
+ + '<label>约定归还日<input id="fDue" type="date"></label>'
242
+ + '</div>'
243
+ + '<button class="bw-btn primary" id="btnReg">确认登记</button>'
244
+ + '<p class="bw-legend">状态分四种:已超期,今日到期,已归还,借用中</p>'
245
+ + '</section>'
246
+ + '<section hidden class="bw-sec"><h2>数据快照</h2>' + snapshotHtml(env, rows)
247
+ + '<div class="bw-copy2">' + homeCopyArea({
248
+ data: { envelope: env },
249
+ log: { envelope: env, copyLog: homeCopyLog({ command: ctx?.command ?? 'home-cmd-read ' + PAGE_META.key, actionAt: ctx?.actionAt ?? homeNowStamp() }) },
250
+ }) + '</div></section>'
251
+ + needList('fields', '必需块对照(字段)')
252
+ + needList('operations', '必需块对照(操作)')
253
+ + needList('empty', '必需块对照(空态与异常)')
254
+ + needList('status', '必需块对照(状态词)')
255
+ + '<noscript><p class="bw-hint">当前为静态产物页,登记与复制按钮需要脚本支持</p></noscript>'
256
+ + '<script>function esc(s){return String(s).replace(/&/g,"&amp;").replace(/</g,"&lt;")}'
257
+ + 'function copyText(t){if(navigator.clipboard){navigator.clipboard.writeText(t)}}'
258
+ + 'var b=document.getElementById("btnReg");if(b){b.onclick=function(){'
259
+ + 'var dir=document.getElementById("fDir").value;'
260
+ + 'var obj=document.getElementById("fObj").value||document.getElementById("fObjName").value.trim()||"___";'
261
+ + 'var item=document.getElementById("fItemName").value.trim()||"___";'
262
+ + 'var bd=document.getElementById("fBorrowed").value||"___";'
263
+ + 'var due=document.getElementById("fDue").value||"___";'
264
+ + 'copyText("【登记借用】请帮我在居家管家登记一笔借用。\\n方向: "+dir+"\\n物品: "+item+"\\n借用对象: "+obj+"\\n借出日期: "+bd+"\\n约定归还日: "+due);};}</script>';
265
+ return fillTemplate(template, content);
266
+ }
267
+ //# sourceMappingURL=family_borrow.js.map