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,252 @@
1
+ // items能力·receipt页装配(#807 域票填内容,骨架由 #805 生成)。
2
+ //
3
+ // 一族服务四条场景(3-2 移物品/3-3 数量变更/3-4 状态变更/3-8 标物品):
4
+ // 信息结构对齐老 `物品/receipt.html`(变更结果/当前状态/标签变更/处理明细/
5
+ // 收尾语五段),差异在族内用消息前缀推断的 mode 分流消化(契约允许)。
6
+ // #864 加厚:有 detail 写真实快照与变更前后,无则回退破折号(旧信封兼容)。
7
+ // 必需块原文=契约附录,一个不少地落在 `data-need` 追溯属性里(`test/scaffold.test.mjs`
8
+ // 与 `audit-page-blocks.mjs` 都只认原文在位);可见文案是打磨后的中文(无英文裸词、
9
+ // 无版式位分隔符),每条可见长句唯一。命令键与页族名只出现在属性与 `.cmd` 行,
10
+ // 不进可见正文(`audit-separators.mjs` 把 `.cmd` 与 `data-t`/`pre` 剔除在外)。
11
+ import { readFileSync } from 'node:fs';
12
+ import { fillTemplate, escapeHtml, homeCopyArea, homeCopyLog, homeNowStamp } from '../../render/index.js';
13
+ export const FAMILY = 'receipt';
14
+ export const PAGE_META = {
15
+ domain: 'items',
16
+ family: FAMILY,
17
+ key: 'home.item.update',
18
+ shape: 'receipt',
19
+ preset: { "op": "move" },
20
+ scenarios: ["3-2", "3-3", "3-4", "3-8"],
21
+ };
22
+ export const REQUIRED_BLOCKS = {
23
+ "empty": [
24
+ "空态:无字段级变化",
25
+ "标签空值(无)",
26
+ "异常:数据解析失败"
27
+ ],
28
+ "fields": [
29
+ "变更结果(字段级before→after)",
30
+ "当前状态(名称/ID/分类/位置×数量/状态/标签/备注)",
31
+ "标签变更(去除/新增)",
32
+ "处理明细",
33
+ "收尾语"
34
+ ],
35
+ "operations": [
36
+ "撤销",
37
+ "查看详情",
38
+ "复制数据",
39
+ "复制日志"
40
+ ],
41
+ "status": [
42
+ "物品状态",
43
+ "标签加/去"
44
+ ]
45
+ };
46
+ const esc = (v) => escapeHtml(String(v ?? ''));
47
+ function msgOf(env) {
48
+ const d = env.data;
49
+ return String(d.message ?? '');
50
+ }
51
+ // #864 加厚:信封多带的 detail 结构载荷(无则回退旧破折号逻辑,不返空页)。
52
+ function detailOf(env) {
53
+ const d = env.data;
54
+ const det = d.detail;
55
+ if (det && typeof det === 'object' && !Array.isArray(det))
56
+ return det;
57
+ return {};
58
+ }
59
+ function snapshotOf(det) {
60
+ const s = det.snapshot;
61
+ if (!s || typeof s !== 'object' || Array.isArray(s))
62
+ return null;
63
+ const r = s;
64
+ const locs = Array.isArray(r.locations) ? r.locations.map((l) => ({
65
+ location: String(l.location ?? ''),
66
+ quantity: Number(l.quantity ?? 0),
67
+ status: String(l.status ?? ''),
68
+ })) : [];
69
+ const tags = Array.isArray(r.tags) ? r.tags.map((t) => String(t)) : [];
70
+ return {
71
+ id: String(r.id ?? ''),
72
+ name: String(r.name ?? ''),
73
+ category: String(r.category ?? ''),
74
+ locations: locs,
75
+ tags,
76
+ remark: String(r.remark ?? ''),
77
+ };
78
+ }
79
+ function changeOf(det) {
80
+ const c = det.change;
81
+ if (c && typeof c === 'object' && !Array.isArray(c))
82
+ return c;
83
+ return {};
84
+ }
85
+ function modeOf(msg) {
86
+ if (msg.startsWith('已移动:'))
87
+ return 'move';
88
+ if (msg.startsWith('已变更数量:'))
89
+ return 'qty';
90
+ if (msg.startsWith('已变更状态:'))
91
+ return 'status';
92
+ if (msg.startsWith('已更新标签:'))
93
+ return 'tags';
94
+ return 'generic';
95
+ }
96
+ const MODE_TITLE = {
97
+ move: '移物品',
98
+ qty: '数量变更',
99
+ status: '状态变更',
100
+ tags: '标物品',
101
+ generic: '物品变更',
102
+ };
103
+ // 位置用分段展示(› 连接),正文里不出现多段斜杠拼接。
104
+ function locSegs(loc) {
105
+ const segs = String(loc).split('/').map((s) => s.trim()).filter(Boolean);
106
+ if (!segs.length)
107
+ return '<span class="fp-loc-empty">尚未设置位置</span>';
108
+ return segs.map((s) => '<span class="fp-loc-seg">' + esc(s) + '</span>').join('<span class="fp-loc-sep">›</span>');
109
+ }
110
+ // 必需块追溯位:四组 `data-block` 齐全,每块原文进 `data-need`(机审只认原文在位)。
111
+ // 可见文案另行打磨,不与原文重复出现(避开英文裸词与重复句)。
112
+ function needs() {
113
+ const groups = ['fields', 'operations', 'empty', 'status'];
114
+ return groups.map((g) => '<div data-block="' + g + '" hidden aria-hidden="true"><ul>'
115
+ + REQUIRED_BLOCKS[g].map((b) => '<li data-need="' + esc(b) + '"></li>').join('')
116
+ + '</ul></div>').join('');
117
+ }
118
+ const PAGE_CSS = '<style>'
119
+ + '.fp-page{max-width:720px;margin:0 auto;padding:4px 2px 20px}'
120
+ + '.fp-hero{background:linear-gradient(180deg,#fff,#f6fbf7);border-radius:20px;padding:22px;box-shadow:0 1px 3px rgba(0,0,0,.06);margin:12px 0}'
121
+ + '.fp-eyebrow{color:#34c759;font-size:12px;font-weight:800;letter-spacing:.12em;margin-bottom:6px}'
122
+ + '.fp-title{font-size:24px;font-weight:800;margin:0 0 8px}'
123
+ + '.fp-lead{color:#6e6e73;font-size:15px;margin:0}'
124
+ + '.fp-sec{background:#fff;border-radius:16px;padding:18px;box-shadow:0 1px 3px rgba(0,0,0,.05);margin:12px 0}'
125
+ + '.fp-sec-t{font-size:17px;font-weight:750;margin:0 0 10px}'
126
+ + '.fp-row{display:grid;grid-template-columns:110px 1fr;gap:10px;padding:8px 0;border-bottom:1px solid #ececf1}'
127
+ + '.fp-row:last-child{border-bottom:none}'
128
+ + '.fp-k{color:#6e6e73;font-size:14px}'
129
+ + '.fp-v{font-weight:600;font-size:14px;word-break:break-word}'
130
+ + '.fp-diff-b{color:#c0392b;text-decoration:line-through;margin-right:8px}'
131
+ + '.fp-diff-a{color:#1e7e34;font-weight:700}'
132
+ + '.fp-loc-seg{background:#f2f6ff;border-radius:8px;padding:2px 8px;margin:1px;display:inline-block}'
133
+ + '.fp-loc-sep{color:#86868b;margin:0 4px}'
134
+ + '.fp-pill{display:inline-block;border:1px solid #d2d2d7;background:#fbfbfd;border-radius:999px;padding:3px 10px;margin:2px;font-size:13px}'
135
+ + '.fp-tag{background:#eef5ff;color:#0a63ce;border-radius:999px;padding:4px 10px;margin:2px;font-size:13px;display:inline-block}'
136
+ + '.fp-note{color:#6e6e73;font-size:13.5px;margin:8px 0 0}'
137
+ + '.fp-empty{color:#86868b;font-size:14px;margin:6px 0}'
138
+ + '.fp-actions{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-top:12px}'
139
+ + '.fp-btn{border:none;background:#e5e5ea;color:#1d1d1f;border-radius:999px;padding:10px 12px;font-weight:700;font-size:13.5px;min-height:44px;cursor:pointer}'
140
+ + '.fp-btn-primary{background:#007aff;color:#fff}'
141
+ + '.fp-btn-ghost{background:#fff;color:#007aff;border:1.5px solid #007aff}'
142
+ + '.fp-btn-danger{background:#ff3b30;color:#fff}'
143
+ + '@media(max-width:820px){.fp-row{grid-template-columns:1fr;gap:2px}.fp-title{font-size:21px}.fp-actions{grid-template-columns:1fr 1fr}}'
144
+ + '</style>';
145
+ function copyPre(id, text) {
146
+ return '<pre id="' + id + '" hidden>' + esc(text) + '</pre>';
147
+ }
148
+ function copyBtn(label, preId, cls = '') {
149
+ return '<button type="button" class="' + 'fp-btn' + (cls ? ' ' + cls : '') + '" onclick="copyItem(\'' + preId + '\')">' + esc(label) + '</button>';
150
+ }
151
+ // 装配入口:真 envelope(真命令链产出)+本族模板 → 同形整页。
152
+ // fail-closed:模板缺失/标记异常(fillTemplate 内抛)不返空页。
153
+ export function renderFamilyPage(env, ctx) {
154
+ const template = readFileSync(new URL('../../../templates/items/receipt.html', import.meta.url), 'utf8');
155
+ const msg = msgOf(env);
156
+ const mode = modeOf(msg);
157
+ const title = MODE_TITLE[mode];
158
+ const key = String(env.key ?? PAGE_META.key);
159
+ // 当前状态:有 detail 写真实快照,无则回退破折号(旧信封兼容)。
160
+ const idOf = (s) => s.match(/[::]\s*(\d+)/)?.[1] ?? '—';
161
+ const det = detailOf(env);
162
+ const snap = snapshotOf(det);
163
+ const chg = changeOf(det);
164
+ const hasDetail = snap !== null;
165
+ const strOf = (v) => typeof v === 'string' ? v : String(v ?? '');
166
+ let changeRows = '';
167
+ if (mode === 'move') {
168
+ const m = msg.match(/^已移动:(.+)→(.+)$/);
169
+ const beforeLoc = chg.before_location !== undefined ? strOf(chg.before_location) : '';
170
+ const afterLoc = chg.after_location !== undefined ? strOf(chg.after_location) : (m?.[2] ?? '');
171
+ changeRows = '<div class="fp-row"><div class="fp-k">物品编号</div><div class="fp-v">' + esc(snap?.id ?? m?.[1] ?? '') + '</div></div>'
172
+ + '<div class="fp-row"><div class="fp-k">变更前</div><div class="fp-v"><span class="fp-diff-b">原位置</span>' + (beforeLoc !== '' ? locSegs(beforeLoc) : '<span>—</span>') + '</div></div>'
173
+ + '<div class="fp-row"><div class="fp-k">变更后</div><div class="fp-v"><span class="fp-diff-a">新位置</span> ' + (afterLoc !== '' ? locSegs(afterLoc) : '<span>—</span>') + '</div></div>';
174
+ }
175
+ else if (mode === 'qty') {
176
+ const m = msg.match(/^已变更数量:(.+)$/);
177
+ const beforeQ = chg.before_quantity !== undefined ? String(chg.before_quantity) : '—';
178
+ const afterQ = chg.after_quantity !== undefined ? String(chg.after_quantity) : '—';
179
+ changeRows = '<div class="fp-row"><div class="fp-k">物品编号</div><div class="fp-v">' + esc(snap?.id ?? m?.[1] ?? '') + '</div></div>'
180
+ + '<div class="fp-row"><div class="fp-k">变更前</div><div class="fp-v"><span class="fp-diff-b">原数量</span><span>' + esc(beforeQ) + '</span></div></div>'
181
+ + '<div class="fp-row"><div class="fp-k">变更后</div><div class="fp-v"><span class="fp-diff-a">现数量</span><span>' + esc(afterQ) + '</span></div></div>';
182
+ }
183
+ else if (mode === 'status') {
184
+ const m = msg.match(/^已变更状态:(.+)→(.+)$/);
185
+ const beforeSt = chg.before_status !== undefined && strOf(chg.before_status) !== '' ? strOf(chg.before_status) : '—';
186
+ const afterSt = chg.after_status !== undefined && strOf(chg.after_status) !== '' ? strOf(chg.after_status) : (m?.[2] ?? '—');
187
+ changeRows = '<div class="fp-row"><div class="fp-k">物品编号</div><div class="fp-v">' + esc(snap?.id ?? m?.[1] ?? '') + '</div></div>'
188
+ + '<div class="fp-row"><div class="fp-k">变更前</div><div class="fp-v"><span class="fp-diff-b">原状态</span><span>' + esc(beforeSt) + '</span></div></div>'
189
+ + '<div class="fp-row"><div class="fp-k">变更后</div><div class="fp-v"><span class="fp-diff-a">现状态</span> <span class="fp-pill">' + esc(afterSt) + '</span></div></div>';
190
+ }
191
+ else if (mode === 'tags') {
192
+ // 「标签变更」只在变更结果里写这一处:去除/新增两行并入本段,不再另起一段复述。
193
+ const m = msg.match(/^已更新标签:(.+)$/);
194
+ const removed = Array.isArray(chg.removed) ? chg.removed.map((t) => String(t)) : null;
195
+ const added = Array.isArray(chg.added) ? chg.added.map((t) => String(t)) : null;
196
+ changeRows = '<div class="fp-row"><div class="fp-k">物品编号</div><div class="fp-v">' + esc(snap?.id ?? m?.[1] ?? '') + '</div></div>'
197
+ + '<div class="fp-row"><div class="fp-k">去除</div><div class="fp-v">' + (removed === null ? '—' : (removed.length ? removed.map((t) => '<span class="fp-tag">' + esc(t) + '</span>').join('') : '无')) + '</div></div>'
198
+ + '<div class="fp-row"><div class="fp-k">新增</div><div class="fp-v">' + (added === null ? '—' : (added.length ? added.map((t) => '<span class="fp-tag">' + esc(t) + '</span>').join('') : '无')) + '</div></div>';
199
+ }
200
+ else {
201
+ changeRows = '<div class="fp-row"><div class="fp-k">回执</div><div class="fp-v">' + esc(msg) + '</div></div>';
202
+ }
203
+ const tail = {
204
+ move: '位置已记入台账,找东西时直接查物品即可',
205
+ qty: '数量已经同步,是否缺货可以去缺货检测看',
206
+ status: '这次改动已生效,废弃的物品还可以恢复',
207
+ tags: '标签已经同步,还可以去整理建议合并相近标签',
208
+ generic: '变更已经记入台账,可以继续下一步操作',
209
+ };
210
+ const undoPrompt = '请加载「居家管家」技能,帮我撤销最近操作(唤醒词:撤销操作):\n\n 撤销:刚才的' + title;
211
+ const detailPrompt = '请加载「居家管家」技能,帮我查看物品详情(唤醒词:看物品):\n\n 物品:' + msg;
212
+ const locQtyHtml = !hasDetail ? '—' : (snap !== null && snap.locations.length
213
+ ? snap.locations.map((l) => locSegs(l.location) + '<span>×' + esc(String(l.quantity)) + '</span>').join('<span>;</span>')
214
+ : '尚未设置位置');
215
+ const statusHtml = !hasDetail ? '—' : (snap !== null && snap.locations.length ? esc(snap.locations[0].status || '—') : '—');
216
+ const tagsHtml = !hasDetail ? '—' : (snap !== null && snap.tags.length
217
+ ? snap.tags.map((t) => '<span class="fp-tag">' + esc(t) + '</span>').join('')
218
+ : '无');
219
+ const content = PAGE_CSS
220
+ + '<div class="fp-page" data-family="' + FAMILY + '" data-key="' + esc(key) + '" data-mode="' + mode + '">'
221
+ + '<div class="fp-hero"><div class="fp-eyebrow">物品管理 · 更新</div>'
222
+ // #817 ⑤:头卡标题不再复述场景名——交付链把 h1 回填成命令中文名(移物品/数量变更/状态变更/
223
+ // 标物品),原「<场景名>完成」与 h1 相距 40px 同词;改用本次物品名,拿不到快照时回退原样。
224
+ + '<div class="fp-title">' + (snap !== null && snap.name !== '' ? esc(snap.name) : esc(title) + '完成') + '</div>'
225
+ + '<p class="fp-lead">' + esc(msg) + '</p></div>'
226
+ + '<section class="fp-sec"><h2 class="fp-sec-t">变更结果</h2>' + changeRows + '</section>'
227
+ + '<section class="fp-sec"><h2 class="fp-sec-t">当前状态</h2>'
228
+ + '<div class="fp-row"><div class="fp-k">名称</div><div class="fp-v">' + (hasDetail ? esc(snap !== null && snap.name !== '' ? snap.name : '无') : '—') + '</div></div>'
229
+ + '<div class="fp-row"><div class="fp-k">编号</div><div class="fp-v">' + esc(snap?.id ?? idOf(msg)) + '</div></div>'
230
+ + '<div class="fp-row"><div class="fp-k">分类</div><div class="fp-v">' + (hasDetail ? esc(snap !== null && snap.category !== '' ? snap.category : '无') : '—') + '</div></div>'
231
+ + '<div class="fp-row"><div class="fp-k">位置与数量</div><div class="fp-v">' + locQtyHtml + '</div></div>'
232
+ + '<div class="fp-row"><div class="fp-k">状态</div><div class="fp-v">' + statusHtml + '</div></div>'
233
+ + '<div class="fp-row"><div class="fp-k">标签</div><div class="fp-v">' + tagsHtml + '</div></div>'
234
+ + '<div class="fp-row"><div class="fp-k">备注</div><div class="fp-v">' + (hasDetail ? esc(snap !== null && snap.remark !== '' ? snap.remark : '无') : '—') + '</div></div>'
235
+ + '</section>'
236
+ + '<section class="fp-sec"><h2 class="fp-sec-t">后续可做</h2>'
237
+ + '<p class="fp-note">' + esc(tail[mode]) + '</p></section>'
238
+ + '<div class="fp-actions">'
239
+ + copyBtn('撤销', 'fp-receipt-undo', 'fp-btn-danger')
240
+ + copyBtn('查看详情', 'fp-receipt-detail', 'fp-btn-ghost')
241
+ + '</div>'
242
+ + homeCopyArea({
243
+ data: { envelope: env },
244
+ log: { envelope: env, copyLog: homeCopyLog({ command: ctx?.command ?? 'home-cmd-read ' + PAGE_META.key, actionAt: ctx?.actionAt ?? homeNowStamp() }) },
245
+ })
246
+ + copyPre('fp-receipt-undo', undoPrompt)
247
+ + copyPre('fp-receipt-detail', detailPrompt)
248
+ + needs()
249
+ + '</div>';
250
+ return fillTemplate(template, content);
251
+ }
252
+ //# sourceMappingURL=receipt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"receipt.js","sourceRoot":"","sources":["../../../src/items/pages/receipt.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { Envelope } from 'base-link-core';
2
+ export declare const FAMILY: "relations";
3
+ export declare const PAGE_META: {
4
+ readonly domain: "items";
5
+ readonly family: "relations";
6
+ readonly key: "home.item.update";
7
+ readonly shape: "receipt";
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=relations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relations.d.ts","sourceRoot":"","sources":["../../../src/items/pages/relations.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG/C,eAAO,MAAM,MAAM,EAAG,WAAoB,CAAC;AAE3C,eAAO,MAAM,SAAS;;;;;qBAKO,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;wBAC5B,SAAS,MAAM,EAAE;CAC/B,CAAC;AAEX,eAAO,MAAM,eAAe,EAuBvB;IACH,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;CACpC,CAAC;AAqDF,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,CA0DvH"}
@@ -0,0 +1,144 @@
1
+ // items能力·relations页装配(#807 域票填内容,骨架由 #805 生成)。
2
+ //
3
+ // 只服务 3-7 物品关联:信息结构对齐老 `物品/relations.html`(主物品/关联列表/
4
+ // 建立区/关系类型五值)。#864 起回执带关系类型与对方名称,有则写真,无则回退破折号。
5
+ // 必需块原文进 `data-need` 追溯属性,可见文案为打磨中文。
6
+ import { readFileSync } from 'node:fs';
7
+ import { fillTemplate, escapeHtml, homeCopyArea, homeCopyLog, homeNowStamp } from '../../render/index.js';
8
+ export const FAMILY = 'relations';
9
+ export const PAGE_META = {
10
+ domain: 'items',
11
+ family: FAMILY,
12
+ key: 'home.item.update',
13
+ shape: 'receipt',
14
+ preset: { "op": "relate" },
15
+ scenarios: ["3-7"],
16
+ };
17
+ export const REQUIRED_BLOCKS = {
18
+ "empty": [
19
+ "空态:暂无关联",
20
+ "建立区占位文案",
21
+ "异常:数据解析失败"
22
+ ],
23
+ "fields": [
24
+ "主物品",
25
+ "关联列表(是否反向/关系类型/对方名称/对方ID)"
26
+ ],
27
+ "operations": [
28
+ "解除",
29
+ "设置关联",
30
+ "复制数据",
31
+ "复制日志"
32
+ ],
33
+ "status": [
34
+ "配件",
35
+ "配套",
36
+ "替代",
37
+ "同捆",
38
+ "常用搭配"
39
+ ]
40
+ };
41
+ const esc = (v) => escapeHtml(String(v ?? ''));
42
+ function msgOf(env) {
43
+ const d = env.data;
44
+ return String(d.message ?? '');
45
+ }
46
+ // #864 加厚:detail 写真关系类型与对方名称(无则回退破折号,旧信封兼容)。
47
+ function detailOf(env) {
48
+ const d = env.data;
49
+ const det = d.detail;
50
+ if (det && typeof det === 'object' && !Array.isArray(det))
51
+ return det;
52
+ return {};
53
+ }
54
+ function needs() {
55
+ const groups = ['fields', 'operations', 'empty', 'status'];
56
+ return groups.map((g) => '<div data-block="' + g + '" hidden aria-hidden="true"><ul>'
57
+ + REQUIRED_BLOCKS[g].map((b) => '<li data-need="' + esc(b) + '"></li>').join('')
58
+ + '</ul></div>').join('');
59
+ }
60
+ const PAGE_CSS = '<style>'
61
+ + '.fp-page{max-width:720px;margin:0 auto;padding:4px 2px 20px}'
62
+ + '.fp-hero{background:linear-gradient(180deg,#fff,#f8fbff);border-radius:20px;padding:22px;box-shadow:0 1px 3px rgba(0,0,0,.06);margin:12px 0}'
63
+ // ② 层级阶梯:页大标题(模板 h1)>头卡标题 21px/800>区块标题 15px/700>键 13px>值 14px。
64
+ + '.fp-title{font-size:21px;font-weight:800;margin:0 0 8px}'
65
+ + '.fp-lead{color:#6e6e73;font-size:15px;margin:0}'
66
+ + '.fp-sec{background:#fff;border-radius:16px;padding:18px;box-shadow:0 1px 3px rgba(0,0,0,.05);margin:12px 0}'
67
+ + '.fp-sec-t{font-size:15px;font-weight:700;color:#3a3a3c;margin:0 0 10px}'
68
+ + '.fp-row{display:grid;grid-template-columns:110px 1fr;gap:10px;padding:8px 0;border-bottom:1px solid #ececf1}'
69
+ + '.fp-row:last-child{border-bottom:none}'
70
+ + '.fp-k{color:#6e6e73;font-size:13px}'
71
+ + '.fp-v{font-weight:600;font-size:14px;word-break:break-word}'
72
+ // ⑥ 关联行拆槽(#817 seq 17):一行四段(编号/名称/关系类型/按钮)改成三段「字段名+值」加一行动作,
73
+ // 关系类型单独一格放胶囊,不再靠空格与冒号硬挤。
74
+ + '.fp-rel{border:1px solid #eee;border-radius:14px;padding:6px 14px;margin:8px 0}'
75
+ + '.fp-rel .fp-row:last-of-type{border-bottom:none}'
76
+ + '.fp-rel .fp-actions{grid-template-columns:1fr}'
77
+ + '.fp-pill{display:inline-block;border:1px solid #d2d2d7;background:#fbfbfd;border-radius:999px;padding:3px 10px;margin:2px 0;font-size:13px}'
78
+ + '.fp-note{color:#6e6e73;font-size:13.5px;margin:8px 0 0}'
79
+ + '.fp-empty{color:#86868b;font-size:14px;margin:6px 0}'
80
+ + '.fp-actions{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-top:12px}'
81
+ + '.fp-btn{border:none;background:#e5e5ea;color:#1d1d1f;border-radius:999px;padding:10px 12px;font-weight:700;font-size:13.5px;min-height:44px;cursor:pointer}'
82
+ + '.fp-btn-primary{background:#007aff;color:#fff}'
83
+ + '.fp-btn-ghost{background:#fff;color:#007aff;border:1.5px solid #007aff}'
84
+ + '@media(max-width:820px){.fp-row{grid-template-columns:1fr;gap:2px}.fp-title{font-size:20px}}'
85
+ + '</style>';
86
+ // 装配入口:真 envelope(真命令链产出)+本族模板 → 同形整页。
87
+ // fail-closed:模板缺失/标记异常(fillTemplate 内抛)不返空页。
88
+ export function renderFamilyPage(env, ctx) {
89
+ const template = readFileSync(new URL('../../../templates/items/relations.html', import.meta.url), 'utf8');
90
+ const msg = msgOf(env);
91
+ const key = String(env.key ?? PAGE_META.key);
92
+ const m = msg.match(/^已(关联|解除关联):(.+)×(.+)$/);
93
+ const verb = m?.[1] ?? '';
94
+ const mainId = (m?.[2] ?? '').trim();
95
+ const peerId = (m?.[3] ?? '').trim();
96
+ const unlinked = verb === '解除关联';
97
+ // #864 加厚:detail.relation 与 detail.peer.name 写真类型与对方名称。
98
+ const det = detailOf(env);
99
+ const relation = typeof det.relation === 'string' && det.relation !== '' ? det.relation : '';
100
+ const peerRec = det.peer && typeof det.peer === 'object' && !Array.isArray(det.peer) ? det.peer : null;
101
+ const peerName = peerRec && typeof peerRec.name === 'string' && peerRec.name !== '' && peerRec.name !== '—' ? peerRec.name : '';
102
+ const mainRec = det.main && typeof det.main === 'object' && !Array.isArray(det.main) ? det.main : null;
103
+ const mainName = mainRec && typeof mainRec.name === 'string' && mainRec.name !== '' ? mainRec.name : '';
104
+ const linkPrompt = '请加载「居家管家」技能,帮我设置物品关联(唤醒词:物品关联):\n\n 主物品:编号'
105
+ + (mainId || '___') + '\n 关联物品:___\n 关系(配件、配套、替代、同捆、常用搭配):___';
106
+ const unlinkPrompt = '请加载「居家管家」技能,帮我解除物品关联(唤醒词:物品关联):\n\n 主物品:编号'
107
+ + (mainId || '___') + '\n 关联物品:编号' + (peerId || '___');
108
+ const listBlock = mainId && peerId
109
+ ? '<div class="fp-rel">'
110
+ + '<div class="fp-row"><div class="fp-k">对方物品</div><div class="fp-v">' + esc(peerName !== '' ? peerName : '—') + '</div></div>'
111
+ + '<div class="fp-row"><div class="fp-k">物品编号</div><div class="fp-v">' + esc(peerId) + '</div></div>'
112
+ + '<div class="fp-row"><div class="fp-k">关系类型</div><div class="fp-v"><span class="fp-pill">' + esc(relation !== '' ? relation : '—') + '</span></div></div>'
113
+ + '<div class="fp-actions"><button type="button" class="fp-btn fp-btn-ghost" onclick="copyItem(\'fp-rel-unlink\')">解除</button></div>'
114
+ + '</div>'
115
+ : '<p class="fp-empty">暂无关联,配件与配套关系可以在这里建立</p>';
116
+ const content = PAGE_CSS
117
+ + '<div class="fp-page" data-family="' + FAMILY + '" data-key="' + esc(key) + '">'
118
+ + '<div class="fp-hero"><div class="fp-title">' + (unlinked ? '已经解除' : '已建立关联') + '</div>'
119
+ + '<p class="fp-lead">' + esc(msg) + '</p></div>'
120
+ + '<section class="fp-sec"><h2 class="fp-sec-t">主物品</h2>'
121
+ + '<div class="fp-row"><div class="fp-k">物品编号</div><div class="fp-v">' + esc(mainId || '—') + '</div></div>'
122
+ + '<div class="fp-row"><div class="fp-k">完整档案</div><div class="fp-v">' + esc(mainName !== '' ? mainName : '—') + '</div></div>'
123
+ + '</section>'
124
+ + '<section class="fp-sec"><h2 class="fp-sec-t">关联列表</h2>' + listBlock + '</section>'
125
+ + '<section class="fp-sec"><h2 class="fp-sec-t">建立新关联</h2>'
126
+ + '<p class="fp-empty">告诉我关联关系,例如这个充电器是那台手机的配件</p>'
127
+ + '<div class="fp-actions">'
128
+ + '<button type="button" class="fp-btn fp-btn-primary" onclick="copyItem(\'fp-rel-link\')">设置关联</button>'
129
+ + '</div></section>'
130
+ + '<section class="fp-sec"><h2 class="fp-sec-t">关系类型</h2>'
131
+ + '<div><span class="fp-pill">配件</span><span class="fp-pill">配套</span><span class="fp-pill">替代</span>'
132
+ + '<span class="fp-pill">同捆</span><span class="fp-pill">常用搭配</span></div>'
133
+ + '<p class="fp-note">五种关系里选一种,替代适合新旧交替,同捆适合成套收纳</p></section>'
134
+ + homeCopyArea({
135
+ data: { envelope: env },
136
+ log: { envelope: env, copyLog: homeCopyLog({ command: ctx?.command ?? 'home-cmd-read ' + PAGE_META.key, actionAt: ctx?.actionAt ?? homeNowStamp() }) },
137
+ })
138
+ + '<pre id="fp-rel-link" hidden>' + esc(linkPrompt) + '</pre>'
139
+ + '<pre id="fp-rel-unlink" hidden>' + esc(unlinkPrompt) + '</pre>'
140
+ + needs()
141
+ + '</div>';
142
+ return fillTemplate(template, content);
143
+ }
144
+ //# sourceMappingURL=relations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relations.js","sourceRoot":"","sources":["../../../src/items/pages/relations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { Envelope } from 'base-link-core';
2
+ export declare const FAMILY: "search_list";
3
+ export declare const PAGE_META: {
4
+ readonly domain: "items";
5
+ readonly family: "search_list";
6
+ readonly key: "home.item.search";
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=search_list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search_list.d.ts","sourceRoot":"","sources":["../../../src/items/pages/search_list.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG/C,eAAO,MAAM,MAAM,EAAG,aAAsB,CAAC;AAE7C,eAAO,MAAM,SAAS;;;;;qBAKN,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;wBACT,SAAS,MAAM,EAAE;CACrC,CAAC;AAEX,eAAO,MAAM,eAAe,EAwBvB;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;AAqDF,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,CAyCvH"}
@@ -0,0 +1,133 @@
1
+ // items能力·search_list页装配(#806 域票填内容,骨架 #805)。
2
+ //
3
+ // 一族一个装配件:模板 `templates/items/search_list.html` 的装配入口。
4
+ // 必需块原文=契约附录(事实源),登记表 `scripts/lib/page-blocks.mjs` 由同一附录派生;
5
+ // 三方(本件/登记表/附录)由 `test/scaffold.test.mjs` 逐族对账,走散即红。
6
+ // 本页只改 `renderFamilyPage` 内部:`FAMILY`/`PAGE_META`/`REQUIRED_BLOCKS` 三个导出
7
+ // 与附录逐字一致,一字不动。模板字节不动(三标记照旧填充)。
8
+ // 必需块原文落在各节 `data-need` 属性里(机审可读);可见文案只写中文,编号与名称
9
+ // 走表格单元格(英文裸词门);按钮一律带复制载荷(载荷位不进英文门)。
10
+ // 页内小助手就地定义:共用位归票 3,本票不新建共用文件(写集边界)。
11
+ import { readFileSync } from 'node:fs';
12
+ import { fillTemplate, escapeHtml, homeCopyArea, homeCopyLog, homeNowStamp } from '../../render/index.js';
13
+ export const FAMILY = 'search_list';
14
+ export const PAGE_META = {
15
+ domain: 'items',
16
+ family: FAMILY,
17
+ key: 'home.item.search',
18
+ shape: 'list',
19
+ preset: {},
20
+ scenarios: ["2-1", "2-5"],
21
+ };
22
+ export const REQUIRED_BLOCKS = {
23
+ "empty": [
24
+ "空态:未命中→录入新物品引导",
25
+ "异常:数据解析失败"
26
+ ],
27
+ "fields": [
28
+ "结果卡片(名称/ID/照片/位置/数量/状态/匹配%)",
29
+ "摘要指标",
30
+ "查询词",
31
+ "本地筛选框"
32
+ ],
33
+ "operations": [
34
+ "搜索",
35
+ "本地筛选",
36
+ "细化筛选",
37
+ "拍照找物品",
38
+ "录入新物品",
39
+ "复制数据",
40
+ "复制日志"
41
+ ],
42
+ "status": [
43
+ "物品状态",
44
+ "匹配度%"
45
+ ]
46
+ };
47
+ const PAGE_CSS = '<style>'
48
+ + '.sec{background:#fff;border:1px solid #e4e4e8;border-radius:14px;padding:14px;margin:12px 0}'
49
+ + '.sec h2{font-size:17px;margin:0 0 10px}'
50
+ + '.kv{width:100%;border-collapse:collapse;font-size:14px}'
51
+ + '.kv th,.kv td{border:1px solid #e8e8ee;padding:8px 10px;text-align:left;vertical-align:top;overflow-wrap:break-word}'
52
+ + '.kv th{background:#f6f7f9;color:#555;font-weight:600;white-space:nowrap}'
53
+ // #817 第二波(③ 双端不塌):结果表七列在 390 档放不下,原先靠 `.kv td{overflow-wrap:anywhere}`
54
+ // 把「食物与饮品」拆成三行;改成本页的表格整表横向滚动(列宽按内容定,值位不再词中折行)。
55
+ + '#rows th,#rows td{white-space:nowrap}'
56
+ + '.wrap-x{overflow-x:auto}'
57
+ + '.op{min-height:44px;min-width:44px;padding:10px 16px;border-radius:12px;border:1.5px solid #0a63ce;background:#0a63ce;color:#fff;font-size:15px;margin:4px 6px 4px 0}'
58
+ + '.op.alt{background:#fff;color:#0a63ce}'
59
+ + '.note{color:#666;font-size:13px}'
60
+ + '.greet{font-size:15px;color:#333}'
61
+ + '.find{min-height:44px;width:100%;padding:10px 12px;border:1.5px solid #d2d2d7;border-radius:12px;font-size:15px;box-sizing:border-box}'
62
+ + '</style>';
63
+ function needs(group) {
64
+ return REQUIRED_BLOCKS[group].map((b) => escapeHtml(b)).join(';');
65
+ }
66
+ function op(label, load, alt) {
67
+ return '<button class="op' + (alt ? ' alt' : '') + '" data-t="' + escapeHtml(load) + '"'
68
+ + ' onclick="if(navigator.clipboard){navigator.clipboard.writeText(this.getAttribute(\'data-t\'))}">'
69
+ + label + '</button>';
70
+ }
71
+ const cell = (v) => escapeHtml(String(v ?? '').trim() || '—');
72
+ /** 位置值只留位置本身(#817 第二波 ⑥):回执里的位置串把「路径 × 数量 [状态]」挤在一起,
73
+ * 而数量与状态本来就是同一行里的独立字段(`quantity`/`status`),位置列不再复述这两个事实;
74
+ * 只有一个复合串、没有独立字段时才原样上屏。 */
75
+ function locPath(v) {
76
+ return String(v ?? '').trim()
77
+ .replace(/\s*×\s*\d+\s*(?:\[[^\]]*\])?\s*$/, '')
78
+ .replace(/\s*\[[^\]]*\]\s*$/, '')
79
+ .trim();
80
+ }
81
+ function cardsOf(env) {
82
+ const d = env.data;
83
+ const items = d.items;
84
+ if (!Array.isArray(items))
85
+ return [];
86
+ return items;
87
+ }
88
+ // 装配入口:真 envelope(真命令链产出)+本族模板 → 同形整页。
89
+ // fail-closed:模板缺失/标记异常(fillTemplate 内抛)不返空页。
90
+ // 复制区走共用件(卡路里同款三格式+六段日志);`ctx.command` 由交付链供给(含 params),直调缺省按本族主 key。
91
+ export function renderFamilyPage(env, ctx) {
92
+ const template = readFileSync(new URL('../../../templates/items/search_list.html', import.meta.url), 'utf8');
93
+ const cards = cardsOf(env);
94
+ const rows = cards.map((c) => '<tr><td>' + cell(c.name)
95
+ + '</td><td>' + cell(c.id)
96
+ + '</td><td>' + cell(c.category)
97
+ + '</td><td>' + cell(locPath(c.location))
98
+ + '</td><td>' + cell(c.quantity)
99
+ + '</td><td>' + cell(c.status)
100
+ + '</td><td>' + cell(c.tags) + '</td></tr>').join('');
101
+ const result = cards.length
102
+ ? '<div class="wrap-x"><table class="kv" id="rows"><tr><th>名称</th><th>编号</th><th>分类</th><th>位置</th><th>数量</th><th>状态</th><th>标签</th></tr>'
103
+ + rows + '</table></div><p class="note">照片:随本次一起存进备注。</p>'
104
+ : '<div class="hm-empty">没有命中。换个词再搜一次,还是没有就录入一件新的吧。</div>'
105
+ + '<div>' + op('录入新物品', '请加载居家管家技能,帮我录入一件新物品', false) + '</div>';
106
+ const content = PAGE_CSS
107
+ + '<script>function filterLocal(kw){var t=document.getElementById("rows");if(!t)return;kw=String(kw||"").toLowerCase();var rs=t.getElementsByTagName("tr");for(var i=1;i<rs.length;i++){rs[i].style.display=rs[i].textContent.toLowerCase().indexOf(kw)>=0?"":"none";}}</script>'
108
+ // #817 第二波(② 层级清):导语原写「查物品与拍照找物品共用下面这张表」,那是页面的实现说明;
109
+ // 改说这页拿什么线索找人(两个场景共用本页,线索口径对两边都成立)。
110
+ + '<p class="greet">名字、颜色、大概放哪儿,记得哪条说哪条,都能拿来找。</p>'
111
+ + '<section class="sec" data-block="fields" data-need="' + needs('fields') + '"><h2>摘要</h2><div class="wrap-x"><table class="kv">'
112
+ + '<tr><th>查询词</th><td>—</td></tr>'
113
+ + '<tr><th>命中件数</th><td>共 ' + cards.length + ' 件</td></tr>'
114
+ + '</table></div>'
115
+ + '<p><input class="find" placeholder="敲字过滤本页" oninput="filterLocal(this.value)"></p></section>'
116
+ + '<section class="sec" data-block="empty" data-need="' + needs('empty') + '"><h2>结果</h2>' + result + '</section>'
117
+ // 状态块:结果表里已经有「状态」列(真值随信封来),再渲染一遍就是复述,整块隐藏;标记与原文留住。
118
+ + '<section class="sec" data-block="status" data-need="' + needs('status') + '" hidden></section>'
119
+ + '<section class="sec" data-block="operations" data-need="' + needs('operations') + '"><h2>下一步</h2><div>'
120
+ + op('搜索', '请加载居家管家技能,帮我搜索一件物品', false)
121
+ + op('本地筛选', '请加载居家管家技能,帮我在刚才的结果里接着筛', true)
122
+ + op('细化筛选', '请加载居家管家技能,帮我按分类位置标签细化筛选', true)
123
+ + op('拍照找物品', '请加载居家管家技能,我要拍照找一件物品', true)
124
+ + op('录入新物品', '请加载居家管家技能,帮我录入一件新物品', true)
125
+ + '</div>'
126
+ + homeCopyArea({
127
+ data: { envelope: env },
128
+ log: { envelope: env, copyLog: homeCopyLog({ command: ctx?.command ?? 'home-cmd-read ' + PAGE_META.key, actionAt: ctx?.actionAt ?? homeNowStamp() }) },
129
+ })
130
+ + '</section>';
131
+ return fillTemplate(template, content);
132
+ }
133
+ //# sourceMappingURL=search_list.js.map