@liaozhi/dsh-post-gen 0.1.0

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 (704) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +50 -0
  3. package/assets/skills/poster-1960s-advertising/SKILL.md +20 -0
  4. package/assets/skills/poster-1960s-advertising/previews/1.jpg +0 -0
  5. package/assets/skills/poster-1960s-advertising/previews/2.jpg +0 -0
  6. package/assets/skills/poster-3d-cartoon-character/SKILL.md +20 -0
  7. package/assets/skills/poster-3d-cartoon-character/previews/1.jpg +0 -0
  8. package/assets/skills/poster-3d-cartoon-character/previews/2.jpg +0 -0
  9. package/assets/skills/poster-3d-cartoon-character/previews/3.jpg +0 -0
  10. package/assets/skills/poster-3d-cartoon-character/previews/4.jpg +0 -0
  11. package/assets/skills/poster-3d-fridge-magnets/SKILL.md +18 -0
  12. package/assets/skills/poster-3d-fridge-magnets/previews/1.jpg +0 -0
  13. package/assets/skills/poster-3d-fridge-magnets/previews/2.jpg +0 -0
  14. package/assets/skills/poster-3d-fridge-magnets/previews/3.jpg +0 -0
  15. package/assets/skills/poster-3d-fridge-magnets/previews/4.jpg +0 -0
  16. package/assets/skills/poster-3d-typographic-sculpture/SKILL.md +28 -0
  17. package/assets/skills/poster-3d-typographic-sculpture/previews/1.jpg +0 -0
  18. package/assets/skills/poster-3d-typographic-sculpture/previews/2.jpg +0 -0
  19. package/assets/skills/poster-3d-typographic-sculpture/previews/3.jpg +0 -0
  20. package/assets/skills/poster-3d-typographic-sculpture/previews/4.jpg +0 -0
  21. package/assets/skills/poster-aerial-minimal-solitude/SKILL.md +20 -0
  22. package/assets/skills/poster-aerial-minimal-solitude/previews/1.jpg +0 -0
  23. package/assets/skills/poster-aerial-minimal-solitude/previews/2.jpg +0 -0
  24. package/assets/skills/poster-anime-logo/SKILL.md +20 -0
  25. package/assets/skills/poster-anime-logo/previews/1.jpg +0 -0
  26. package/assets/skills/poster-anime-logo/previews/2.jpg +0 -0
  27. package/assets/skills/poster-ar-hologram-retail/SKILL.md +22 -0
  28. package/assets/skills/poster-ar-hologram-retail/previews/1.jpg +0 -0
  29. package/assets/skills/poster-ar-hologram-retail/previews/2.jpg +0 -0
  30. package/assets/skills/poster-ar-hologram-retail/previews/3.jpg +0 -0
  31. package/assets/skills/poster-ar-hologram-retail/previews/4.jpg +0 -0
  32. package/assets/skills/poster-beverage-splash/SKILL.md +20 -0
  33. package/assets/skills/poster-beverage-splash/previews/1.jpg +0 -0
  34. package/assets/skills/poster-beverage-splash/previews/2.jpg +0 -0
  35. package/assets/skills/poster-beverage-splash/previews/3.jpg +0 -0
  36. package/assets/skills/poster-beverage-splash/previews/4.jpg +0 -0
  37. package/assets/skills/poster-birdseye-hatch-print/SKILL.md +24 -0
  38. package/assets/skills/poster-birdseye-hatch-print/previews/1.jpg +0 -0
  39. package/assets/skills/poster-birdseye-hatch-print/previews/2.jpg +0 -0
  40. package/assets/skills/poster-blind-emboss-minimal/SKILL.md +22 -0
  41. package/assets/skills/poster-blind-emboss-minimal/previews/1.jpg +0 -0
  42. package/assets/skills/poster-blind-emboss-minimal/previews/2.jpg +0 -0
  43. package/assets/skills/poster-blueprint-diorama-workshop/SKILL.md +24 -0
  44. package/assets/skills/poster-blueprint-diorama-workshop/previews/1.jpg +0 -0
  45. package/assets/skills/poster-blueprint-diorama-workshop/previews/2.jpg +0 -0
  46. package/assets/skills/poster-blueprint-infographic/SKILL.md +20 -0
  47. package/assets/skills/poster-blueprint-infographic/previews/1.jpg +0 -0
  48. package/assets/skills/poster-blueprint-infographic/previews/2.jpg +0 -0
  49. package/assets/skills/poster-blueprint-infographic/previews/3.jpg +0 -0
  50. package/assets/skills/poster-boardingpass-portal/SKILL.md +22 -0
  51. package/assets/skills/poster-boardingpass-portal/previews/1.jpg +0 -0
  52. package/assets/skills/poster-boardingpass-portal/previews/2.jpg +0 -0
  53. package/assets/skills/poster-boardingpass-portal/previews/3.jpg +0 -0
  54. package/assets/skills/poster-boardingpass-portal/previews/4.jpg +0 -0
  55. package/assets/skills/poster-botanical-papercollage/SKILL.md +34 -0
  56. package/assets/skills/poster-botanical-papercollage/previews/1.jpg +0 -0
  57. package/assets/skills/poster-botanical-papercollage/previews/2.jpg +0 -0
  58. package/assets/skills/poster-botanical-papercollage/previews/3.jpg +0 -0
  59. package/assets/skills/poster-botanical-papercollage/previews/4.jpg +0 -0
  60. package/assets/skills/poster-brand-guideline-board/SKILL.md +38 -0
  61. package/assets/skills/poster-brand-guideline-board/previews/1.jpg +0 -0
  62. package/assets/skills/poster-brand-guideline-board/previews/2.jpg +0 -0
  63. package/assets/skills/poster-children-illustration/SKILL.md +20 -0
  64. package/assets/skills/poster-children-illustration/previews/1.jpg +0 -0
  65. package/assets/skills/poster-children-illustration/previews/2.jpg +0 -0
  66. package/assets/skills/poster-children-illustration/previews/3.jpg +0 -0
  67. package/assets/skills/poster-children-illustration/previews/4.jpg +0 -0
  68. package/assets/skills/poster-cinematic-letter-panels/SKILL.md +26 -0
  69. package/assets/skills/poster-cinematic-letter-panels/previews/1.jpg +0 -0
  70. package/assets/skills/poster-cinematic-letter-panels/previews/2.jpg +0 -0
  71. package/assets/skills/poster-cinematic-letter-panels/previews/3.jpg +0 -0
  72. package/assets/skills/poster-cinematic-letter-panels/previews/4.jpg +0 -0
  73. package/assets/skills/poster-cinematic-travel/SKILL.md +24 -0
  74. package/assets/skills/poster-cinematic-travel/previews/1.jpg +0 -0
  75. package/assets/skills/poster-cinematic-travel/previews/2.jpg +0 -0
  76. package/assets/skills/poster-cinematic-travel/previews/3.jpg +0 -0
  77. package/assets/skills/poster-cinematic-travel/previews/4.jpg +0 -0
  78. package/assets/skills/poster-city-aerial-night/SKILL.md +22 -0
  79. package/assets/skills/poster-city-aerial-night/previews/1.jpg +0 -0
  80. package/assets/skills/poster-city-aerial-night/previews/2.jpg +0 -0
  81. package/assets/skills/poster-city-aerial-night/previews/3.jpg +0 -0
  82. package/assets/skills/poster-city-aerial-night/previews/4.jpg +0 -0
  83. package/assets/skills/poster-city-discovery-infographic/SKILL.md +28 -0
  84. package/assets/skills/poster-city-discovery-infographic/previews/1.jpg +0 -0
  85. package/assets/skills/poster-city-discovery-infographic/previews/2.jpg +0 -0
  86. package/assets/skills/poster-city-discovery-infographic/previews/3.jpg +0 -0
  87. package/assets/skills/poster-city-discovery-infographic/previews/4.jpg +0 -0
  88. package/assets/skills/poster-city-infographic-editorial/SKILL.md +26 -0
  89. package/assets/skills/poster-city-infographic-editorial/previews/1.jpg +0 -0
  90. package/assets/skills/poster-city-infographic-editorial/previews/2.jpg +0 -0
  91. package/assets/skills/poster-city-infographic-editorial/previews/3.jpg +0 -0
  92. package/assets/skills/poster-city-infographic-editorial/previews/4.jpg +0 -0
  93. package/assets/skills/poster-city-window/SKILL.md +22 -0
  94. package/assets/skills/poster-city-window/previews/1.jpg +0 -0
  95. package/assets/skills/poster-city-window/previews/2.jpg +0 -0
  96. package/assets/skills/poster-city-window/previews/3.jpg +0 -0
  97. package/assets/skills/poster-city-window/previews/4.jpg +0 -0
  98. package/assets/skills/poster-collectible-toy/SKILL.md +20 -0
  99. package/assets/skills/poster-collectible-toy/previews/1.jpg +0 -0
  100. package/assets/skills/poster-collectible-toy/previews/2.jpg +0 -0
  101. package/assets/skills/poster-collectible-toy/previews/3.jpg +0 -0
  102. package/assets/skills/poster-collectible-toy/previews/4.jpg +0 -0
  103. package/assets/skills/poster-comic-portal/SKILL.md +20 -0
  104. package/assets/skills/poster-comic-portal/previews/1.jpg +0 -0
  105. package/assets/skills/poster-comic-portal/previews/2.jpg +0 -0
  106. package/assets/skills/poster-comic-portal/previews/3.jpg +0 -0
  107. package/assets/skills/poster-comic-portal/previews/4.jpg +0 -0
  108. package/assets/skills/poster-comic-style-page/SKILL.md +22 -0
  109. package/assets/skills/poster-comic-style-page/previews/1.jpg +0 -0
  110. package/assets/skills/poster-comic-style-page/previews/2.jpg +0 -0
  111. package/assets/skills/poster-commemorative-coin/SKILL.md +20 -0
  112. package/assets/skills/poster-commemorative-coin/previews/1.jpg +0 -0
  113. package/assets/skills/poster-corkboard-moodboard/SKILL.md +22 -0
  114. package/assets/skills/poster-corkboard-moodboard/previews/1.jpg +0 -0
  115. package/assets/skills/poster-corkboard-moodboard/previews/2.jpg +0 -0
  116. package/assets/skills/poster-country-cuisine/SKILL.md +22 -0
  117. package/assets/skills/poster-country-cuisine/previews/1.jpg +0 -0
  118. package/assets/skills/poster-country-cuisine/previews/2.jpg +0 -0
  119. package/assets/skills/poster-country-cuisine/previews/3.jpg +0 -0
  120. package/assets/skills/poster-country-cuisine/previews/4.jpg +0 -0
  121. package/assets/skills/poster-country-identity/SKILL.md +22 -0
  122. package/assets/skills/poster-country-identity/previews/1.jpg +0 -0
  123. package/assets/skills/poster-country-identity/previews/2.jpg +0 -0
  124. package/assets/skills/poster-country-identity/previews/3.jpg +0 -0
  125. package/assets/skills/poster-country-identity/previews/4.jpg +0 -0
  126. package/assets/skills/poster-crayon-kids/SKILL.md +22 -0
  127. package/assets/skills/poster-crayon-kids/previews/1.jpg +0 -0
  128. package/assets/skills/poster-crayon-kids/previews/2.jpg +0 -0
  129. package/assets/skills/poster-cup-surreal-world/SKILL.md +22 -0
  130. package/assets/skills/poster-cup-surreal-world/previews/1.jpg +0 -0
  131. package/assets/skills/poster-cup-surreal-world/previews/2.jpg +0 -0
  132. package/assets/skills/poster-cup-surreal-world/previews/3.jpg +0 -0
  133. package/assets/skills/poster-cup-surreal-world/previews/4.jpg +0 -0
  134. package/assets/skills/poster-dessert-food/SKILL.md +22 -0
  135. package/assets/skills/poster-dessert-food/previews/1.jpg +0 -0
  136. package/assets/skills/poster-dessert-food/previews/2.jpg +0 -0
  137. package/assets/skills/poster-dessert-food/previews/3.jpg +0 -0
  138. package/assets/skills/poster-diecut-sticker-collage/SKILL.md +24 -0
  139. package/assets/skills/poster-diecut-sticker-collage/previews/1.jpg +0 -0
  140. package/assets/skills/poster-diecut-sticker-collage/previews/2.jpg +0 -0
  141. package/assets/skills/poster-digicam-nostalgia/SKILL.md +20 -0
  142. package/assets/skills/poster-digicam-nostalgia/previews/1.jpg +0 -0
  143. package/assets/skills/poster-digicam-nostalgia/previews/2.jpg +0 -0
  144. package/assets/skills/poster-doodle-product-speech-bubble/SKILL.md +22 -0
  145. package/assets/skills/poster-doodle-product-speech-bubble/previews/1.jpg +0 -0
  146. package/assets/skills/poster-doodle-product-speech-bubble/previews/2.jpg +0 -0
  147. package/assets/skills/poster-doodle-product-speech-bubble/previews/3.jpg +0 -0
  148. package/assets/skills/poster-doodle-product-speech-bubble/previews/4.jpg +0 -0
  149. package/assets/skills/poster-doodle-product-world/SKILL.md +22 -0
  150. package/assets/skills/poster-doodle-product-world/previews/1.jpg +0 -0
  151. package/assets/skills/poster-doodle-product-world/previews/2.jpg +0 -0
  152. package/assets/skills/poster-doodle-product-world/previews/3.jpg +0 -0
  153. package/assets/skills/poster-doodle-product-world/previews/4.jpg +0 -0
  154. package/assets/skills/poster-doodle-reinterpretation/SKILL.md +22 -0
  155. package/assets/skills/poster-doodle-reinterpretation/previews/1.jpg +0 -0
  156. package/assets/skills/poster-double-exposure/SKILL.md +22 -0
  157. package/assets/skills/poster-double-exposure/previews/1.jpg +0 -0
  158. package/assets/skills/poster-double-exposure/previews/2.jpg +0 -0
  159. package/assets/skills/poster-dual-half-travel/SKILL.md +18 -0
  160. package/assets/skills/poster-dual-half-travel/previews/1.jpg +0 -0
  161. package/assets/skills/poster-dual-half-travel/previews/2.jpg +0 -0
  162. package/assets/skills/poster-dual-world-watercolor/SKILL.md +22 -0
  163. package/assets/skills/poster-dual-world-watercolor/previews/1.jpg +0 -0
  164. package/assets/skills/poster-dual-world-watercolor/previews/2.jpg +0 -0
  165. package/assets/skills/poster-editorial-travel-illustration/SKILL.md +20 -0
  166. package/assets/skills/poster-editorial-travel-illustration/previews/1.jpg +0 -0
  167. package/assets/skills/poster-editorial-travel-illustration/previews/2.jpg +0 -0
  168. package/assets/skills/poster-editorial-travel-illustration/previews/3.jpg +0 -0
  169. package/assets/skills/poster-enamel-magnet/SKILL.md +22 -0
  170. package/assets/skills/poster-enamel-magnet/previews/1.jpg +0 -0
  171. package/assets/skills/poster-enamel-magnet/previews/2.jpg +0 -0
  172. package/assets/skills/poster-engraved-contour-ink/SKILL.md +22 -0
  173. package/assets/skills/poster-engraved-contour-ink/previews/1.jpg +0 -0
  174. package/assets/skills/poster-engraved-contour-ink/previews/2.jpg +0 -0
  175. package/assets/skills/poster-fashion-tech-sheet/SKILL.md +22 -0
  176. package/assets/skills/poster-fashion-tech-sheet/previews/1.jpg +0 -0
  177. package/assets/skills/poster-felt-diorama/SKILL.md +26 -0
  178. package/assets/skills/poster-felt-diorama/previews/1.jpg +0 -0
  179. package/assets/skills/poster-felt-diorama/previews/2.jpg +0 -0
  180. package/assets/skills/poster-filmstrip-traveler/SKILL.md +24 -0
  181. package/assets/skills/poster-filmstrip-traveler/previews/1.jpg +0 -0
  182. package/assets/skills/poster-filmstrip-traveler/previews/2.jpg +0 -0
  183. package/assets/skills/poster-fireworks-typography/SKILL.md +22 -0
  184. package/assets/skills/poster-fireworks-typography/previews/1.jpg +0 -0
  185. package/assets/skills/poster-fireworks-typography/previews/2.jpg +0 -0
  186. package/assets/skills/poster-fireworks-typography/previews/3.jpg +0 -0
  187. package/assets/skills/poster-fireworks-typography/previews/4.jpg +0 -0
  188. package/assets/skills/poster-flat-minimal-travel/SKILL.md +20 -0
  189. package/assets/skills/poster-flat-minimal-travel/previews/1.jpg +0 -0
  190. package/assets/skills/poster-flat-minimal-travel/previews/2.jpg +0 -0
  191. package/assets/skills/poster-flat-minimal-travel/previews/3.jpg +0 -0
  192. package/assets/skills/poster-flat-minimal-travel/previews/4.jpg +0 -0
  193. package/assets/skills/poster-floating-island/SKILL.md +20 -0
  194. package/assets/skills/poster-floating-island/previews/1.jpg +0 -0
  195. package/assets/skills/poster-floating-island/previews/2.jpg +0 -0
  196. package/assets/skills/poster-floating-island/previews/3.jpg +0 -0
  197. package/assets/skills/poster-floating-island/previews/4.jpg +0 -0
  198. package/assets/skills/poster-folk-flat-illustration/SKILL.md +24 -0
  199. package/assets/skills/poster-folk-flat-illustration/previews/1.jpg +0 -0
  200. package/assets/skills/poster-folk-flat-illustration/previews/2.jpg +0 -0
  201. package/assets/skills/poster-folk-flat-illustration/previews/3.jpg +0 -0
  202. package/assets/skills/poster-folk-flat-illustration/previews/4.jpg +0 -0
  203. package/assets/skills/poster-food-flatlay-doodle/SKILL.md +20 -0
  204. package/assets/skills/poster-food-flatlay-doodle/previews/1.jpg +0 -0
  205. package/assets/skills/poster-food-flatlay-doodle/previews/2.jpg +0 -0
  206. package/assets/skills/poster-food-flatlay-doodle/previews/3.jpg +0 -0
  207. package/assets/skills/poster-food-flatlay-doodle/previews/4.jpg +0 -0
  208. package/assets/skills/poster-food-hero-splash/SKILL.md +24 -0
  209. package/assets/skills/poster-food-hero-splash/previews/1.jpg +0 -0
  210. package/assets/skills/poster-food-hero-splash/previews/2.jpg +0 -0
  211. package/assets/skills/poster-food-hero-splash/previews/3.jpg +0 -0
  212. package/assets/skills/poster-food-id-badge/SKILL.md +20 -0
  213. package/assets/skills/poster-food-id-badge/previews/1.jpg +0 -0
  214. package/assets/skills/poster-food-id-badge/previews/2.jpg +0 -0
  215. package/assets/skills/poster-food-id-badge/previews/3.jpg +0 -0
  216. package/assets/skills/poster-food-id-badge/previews/4.jpg +0 -0
  217. package/assets/skills/poster-food-infographic/SKILL.md +20 -0
  218. package/assets/skills/poster-food-infographic/previews/1.jpg +0 -0
  219. package/assets/skills/poster-food-infographic/previews/2.jpg +0 -0
  220. package/assets/skills/poster-food-infographic/previews/3.jpg +0 -0
  221. package/assets/skills/poster-food-infographic/previews/4.jpg +0 -0
  222. package/assets/skills/poster-food-papercollage/SKILL.md +26 -0
  223. package/assets/skills/poster-food-papercollage/previews/1.jpg +0 -0
  224. package/assets/skills/poster-food-papercollage/previews/2.jpg +0 -0
  225. package/assets/skills/poster-food-papercollage/previews/3.jpg +0 -0
  226. package/assets/skills/poster-food-papercollage/previews/4.jpg +0 -0
  227. package/assets/skills/poster-food-postcard-scene/SKILL.md +20 -0
  228. package/assets/skills/poster-food-postcard-scene/previews/1.jpg +0 -0
  229. package/assets/skills/poster-food-postcard-scene/previews/2.jpg +0 -0
  230. package/assets/skills/poster-food-postcard-scene/previews/3.jpg +0 -0
  231. package/assets/skills/poster-food-postcard-scene/previews/4.jpg +0 -0
  232. package/assets/skills/poster-forest-fantasy-product/SKILL.md +20 -0
  233. package/assets/skills/poster-forest-fantasy-product/previews/1.jpg +0 -0
  234. package/assets/skills/poster-forest-fantasy-product/previews/2.jpg +0 -0
  235. package/assets/skills/poster-fresh-beverage-ad/SKILL.md +18 -0
  236. package/assets/skills/poster-fresh-beverage-ad/previews/1.jpg +0 -0
  237. package/assets/skills/poster-fresh-beverage-ad/previews/2.jpg +0 -0
  238. package/assets/skills/poster-futuristic-luxury-brand/SKILL.md +24 -0
  239. package/assets/skills/poster-futuristic-luxury-brand/previews/1.jpg +0 -0
  240. package/assets/skills/poster-futuristic-luxury-brand/previews/2.jpg +0 -0
  241. package/assets/skills/poster-futuristic-luxury-brand/previews/3.jpg +0 -0
  242. package/assets/skills/poster-futuristic-luxury-brand/previews/4.jpg +0 -0
  243. package/assets/skills/poster-geometric-travel/SKILL.md +20 -0
  244. package/assets/skills/poster-geometric-travel/previews/1.jpg +0 -0
  245. package/assets/skills/poster-geometric-travel/previews/2.jpg +0 -0
  246. package/assets/skills/poster-giant-product-snow/SKILL.md +22 -0
  247. package/assets/skills/poster-giant-product-snow/previews/1.jpg +0 -0
  248. package/assets/skills/poster-giant-stamp-diorama/SKILL.md +20 -0
  249. package/assets/skills/poster-giant-stamp-diorama/previews/1.jpg +0 -0
  250. package/assets/skills/poster-giant-stamp-diorama/previews/2.jpg +0 -0
  251. package/assets/skills/poster-giant-stamp-diorama/previews/3.jpg +0 -0
  252. package/assets/skills/poster-giant-stamp-diorama/previews/4.jpg +0 -0
  253. package/assets/skills/poster-gouache-travel/SKILL.md +22 -0
  254. package/assets/skills/poster-gouache-travel/previews/1.jpg +0 -0
  255. package/assets/skills/poster-gouache-travel/previews/2.jpg +0 -0
  256. package/assets/skills/poster-gouache-travel/previews/3.jpg +0 -0
  257. package/assets/skills/poster-gouache-travel/previews/4.jpg +0 -0
  258. package/assets/skills/poster-handdrawn-doodle/SKILL.md +18 -0
  259. package/assets/skills/poster-handdrawn-doodle/previews/1.jpg +0 -0
  260. package/assets/skills/poster-handdrawn-doodle/previews/2.jpg +0 -0
  261. package/assets/skills/poster-handdrawn-doodle/previews/3.jpg +0 -0
  262. package/assets/skills/poster-handdrawn-doodle/previews/4.jpg +0 -0
  263. package/assets/skills/poster-hobby-activity-collage/SKILL.md +22 -0
  264. package/assets/skills/poster-hobby-activity-collage/previews/1.jpg +0 -0
  265. package/assets/skills/poster-ice-popsicle/SKILL.md +22 -0
  266. package/assets/skills/poster-ice-popsicle/previews/1.jpg +0 -0
  267. package/assets/skills/poster-ice-popsicle/previews/2.jpg +0 -0
  268. package/assets/skills/poster-ice-popsicle/previews/3.jpg +0 -0
  269. package/assets/skills/poster-ice-popsicle/previews/4.jpg +0 -0
  270. package/assets/skills/poster-impasto-painting/SKILL.md +26 -0
  271. package/assets/skills/poster-impasto-painting/previews/1.jpg +0 -0
  272. package/assets/skills/poster-impasto-painting/previews/62c9be8a-bcae-4ebf-8ff0-ce1c7809fe00.jpg +0 -0
  273. package/assets/skills/poster-ink-watercolor-sketch/SKILL.md +26 -0
  274. package/assets/skills/poster-ink-watercolor-sketch/previews/1.jpg +0 -0
  275. package/assets/skills/poster-ink-watercolor-sketch/previews/2.jpg +0 -0
  276. package/assets/skills/poster-instant-photo-collage/SKILL.md +20 -0
  277. package/assets/skills/poster-instant-photo-collage/previews/1.jpg +0 -0
  278. package/assets/skills/poster-instant-photo-collage/previews/2.jpg +0 -0
  279. package/assets/skills/poster-island-map-diorama/SKILL.md +20 -0
  280. package/assets/skills/poster-island-map-diorama/previews/1.jpg +0 -0
  281. package/assets/skills/poster-island-map-diorama/previews/2.jpg +0 -0
  282. package/assets/skills/poster-isometric-floating-world/SKILL.md +22 -0
  283. package/assets/skills/poster-isometric-floating-world/previews/1.jpg +0 -0
  284. package/assets/skills/poster-isometric-floating-world/previews/2.jpg +0 -0
  285. package/assets/skills/poster-isometric-floating-world/previews/3.jpg +0 -0
  286. package/assets/skills/poster-isometric-floating-world/previews/4.jpg +0 -0
  287. package/assets/skills/poster-isometric-teardown/SKILL.md +22 -0
  288. package/assets/skills/poster-isometric-teardown/previews/1.jpg +0 -0
  289. package/assets/skills/poster-isometric-teardown/previews/2.jpg +0 -0
  290. package/assets/skills/poster-kraft-sketch/SKILL.md +20 -0
  291. package/assets/skills/poster-kraft-sketch/previews/1.jpg +0 -0
  292. package/assets/skills/poster-kraft-sketch/previews/2.jpg +0 -0
  293. package/assets/skills/poster-kraft-sketch/previews/3.jpg +0 -0
  294. package/assets/skills/poster-kraft-sketch/previews/4.jpg +0 -0
  295. package/assets/skills/poster-landmark-collage/SKILL.md +24 -0
  296. package/assets/skills/poster-landmark-collage/previews/1.jpg +0 -0
  297. package/assets/skills/poster-landmark-collage/previews/2.jpg +0 -0
  298. package/assets/skills/poster-landmark-collage/previews/3.jpg +0 -0
  299. package/assets/skills/poster-layered-papercut-diorama/SKILL.md +27 -0
  300. package/assets/skills/poster-layered-papercut-diorama/previews/1.jpg +0 -0
  301. package/assets/skills/poster-layered-papercut-diorama/previews/2.jpg +0 -0
  302. package/assets/skills/poster-layered-papercut-diorama/previews/3.jpg +0 -0
  303. package/assets/skills/poster-layered-papercut-diorama/previews/4.jpg +0 -0
  304. package/assets/skills/poster-logo-glitch-digital/SKILL.md +24 -0
  305. package/assets/skills/poster-logo-glitch-digital/previews/1.jpg +0 -0
  306. package/assets/skills/poster-logo-glitch-digital/previews/2.jpg +0 -0
  307. package/assets/skills/poster-logo-in-sand/SKILL.md +20 -0
  308. package/assets/skills/poster-logo-in-sand/previews/1.jpg +0 -0
  309. package/assets/skills/poster-logo-in-sand/previews/2.jpg +0 -0
  310. package/assets/skills/poster-luxe-postage-stamp/SKILL.md +24 -0
  311. package/assets/skills/poster-luxe-postage-stamp/previews/1.jpg +0 -0
  312. package/assets/skills/poster-luxe-postage-stamp/previews/2.jpg +0 -0
  313. package/assets/skills/poster-luxury-editorial/SKILL.md +22 -0
  314. package/assets/skills/poster-luxury-editorial/previews/1.jpg +0 -0
  315. package/assets/skills/poster-luxury-grid-campaign/SKILL.md +22 -0
  316. package/assets/skills/poster-luxury-grid-campaign/previews/1.jpg +0 -0
  317. package/assets/skills/poster-luxury-packaging-reveal/SKILL.md +24 -0
  318. package/assets/skills/poster-luxury-packaging-reveal/previews/1.jpg +0 -0
  319. package/assets/skills/poster-luxury-packaging-reveal/previews/2.jpg +0 -0
  320. package/assets/skills/poster-luxury-silhouette-emblem/SKILL.md +20 -0
  321. package/assets/skills/poster-luxury-silhouette-emblem/previews/1.jpg +0 -0
  322. package/assets/skills/poster-luxury-silhouette-emblem/previews/2.jpg +0 -0
  323. package/assets/skills/poster-luxury-silhouette-emblem/previews/3.jpg +0 -0
  324. package/assets/skills/poster-luxury-silhouette-emblem/previews/4.jpg +0 -0
  325. package/assets/skills/poster-magazine-handwrite/SKILL.md +30 -0
  326. package/assets/skills/poster-magazine-handwrite/previews/1.jpg +0 -0
  327. package/assets/skills/poster-magazine-handwrite/previews/2.jpg +0 -0
  328. package/assets/skills/poster-magnetic-filings/SKILL.md +26 -0
  329. package/assets/skills/poster-magnetic-filings/previews/1.jpg +0 -0
  330. package/assets/skills/poster-magnetic-filings/previews/2.jpg +0 -0
  331. package/assets/skills/poster-marker-doodle/SKILL.md +20 -0
  332. package/assets/skills/poster-marker-doodle/previews/1.jpg +0 -0
  333. package/assets/skills/poster-marker-doodle/previews/2.jpg +0 -0
  334. package/assets/skills/poster-marker-sketch-chibi/SKILL.md +20 -0
  335. package/assets/skills/poster-marker-sketch-chibi/previews/1.jpg +0 -0
  336. package/assets/skills/poster-marker-sketch-chibi/previews/2.jpg +0 -0
  337. package/assets/skills/poster-marker-travel/SKILL.md +22 -0
  338. package/assets/skills/poster-marker-travel/previews/1.jpg +0 -0
  339. package/assets/skills/poster-marker-travel/previews/2.jpg +0 -0
  340. package/assets/skills/poster-marker-travel/previews/3.jpg +0 -0
  341. package/assets/skills/poster-marker-travel/previews/4.jpg +0 -0
  342. package/assets/skills/poster-merch-capsule-collection/SKILL.md +20 -0
  343. package/assets/skills/poster-merch-capsule-collection/previews/1.jpg +0 -0
  344. package/assets/skills/poster-merch-capsule-collection/previews/2.jpg +0 -0
  345. package/assets/skills/poster-merch-capsule-collection/previews/3.jpg +0 -0
  346. package/assets/skills/poster-midcentury-editorial/SKILL.md +24 -0
  347. package/assets/skills/poster-midcentury-editorial/previews/1.jpg +0 -0
  348. package/assets/skills/poster-midcentury-editorial/previews/2.jpg +0 -0
  349. package/assets/skills/poster-midcentury-editorial/previews/3.jpg +0 -0
  350. package/assets/skills/poster-midcentury-editorial/previews/4.jpg +0 -0
  351. package/assets/skills/poster-midcentury-minimal/SKILL.md +20 -0
  352. package/assets/skills/poster-midcentury-minimal/previews/1.jpg +0 -0
  353. package/assets/skills/poster-midcentury-minimal/previews/2.jpg +0 -0
  354. package/assets/skills/poster-midcentury-minimal/previews/3.jpg +0 -0
  355. package/assets/skills/poster-miniature-city/SKILL.md +20 -0
  356. package/assets/skills/poster-miniature-city/previews/1.jpg +0 -0
  357. package/assets/skills/poster-miniature-city/previews/2.jpg +0 -0
  358. package/assets/skills/poster-miniature-diorama/SKILL.md +24 -0
  359. package/assets/skills/poster-miniature-diorama/previews/1.jpg +0 -0
  360. package/assets/skills/poster-miniature-diorama/previews/2.jpg +0 -0
  361. package/assets/skills/poster-miniature-diorama/previews/73d1f002-877c-4796-8077-a728285a5a17.jpg +0 -0
  362. package/assets/skills/poster-miniature-palm-showroom/SKILL.md +20 -0
  363. package/assets/skills/poster-miniature-palm-showroom/previews/1.jpg +0 -0
  364. package/assets/skills/poster-miniature-palm-showroom/previews/2.jpg +0 -0
  365. package/assets/skills/poster-miniature-palm-showroom/previews/3.jpg +0 -0
  366. package/assets/skills/poster-miniature-palm-showroom/previews/4.jpg +0 -0
  367. package/assets/skills/poster-minimal-doodle/SKILL.md +20 -0
  368. package/assets/skills/poster-minimal-doodle/previews/1.jpg +0 -0
  369. package/assets/skills/poster-minimal-monument/SKILL.md +20 -0
  370. package/assets/skills/poster-minimal-monument/previews/1.jpg +0 -0
  371. package/assets/skills/poster-minimal-monument/previews/2.jpg +0 -0
  372. package/assets/skills/poster-minimal-monument/previews/3.jpg +0 -0
  373. package/assets/skills/poster-minimal-monument/previews/4.jpg +0 -0
  374. package/assets/skills/poster-minimal-wellness/SKILL.md +20 -0
  375. package/assets/skills/poster-minimal-wellness/previews/1.jpg +0 -0
  376. package/assets/skills/poster-minimal-wellness/previews/2.jpg +0 -0
  377. package/assets/skills/poster-minimal-wellness/previews/3.jpg +0 -0
  378. package/assets/skills/poster-monoline-travel/SKILL.md +22 -0
  379. package/assets/skills/poster-monoline-travel/previews/1.jpg +0 -0
  380. package/assets/skills/poster-monoline-travel/previews/2.jpg +0 -0
  381. package/assets/skills/poster-monoline-travel/previews/3.jpg +0 -0
  382. package/assets/skills/poster-monoline-travel/previews/4.jpg +0 -0
  383. package/assets/skills/poster-neon-ribbon-city/SKILL.md +24 -0
  384. package/assets/skills/poster-neon-ribbon-city/previews/1.jpg +0 -0
  385. package/assets/skills/poster-neon-ribbon-city/previews/2.jpg +0 -0
  386. package/assets/skills/poster-neon-ribbon-city/previews/3.jpg +0 -0
  387. package/assets/skills/poster-neon-ribbon-city/previews/4.jpg +0 -0
  388. package/assets/skills/poster-neon-sign/SKILL.md +22 -0
  389. package/assets/skills/poster-neon-sign/previews/1.jpg +0 -0
  390. package/assets/skills/poster-neon-sign/previews/2.jpg +0 -0
  391. package/assets/skills/poster-noir-black-gold/SKILL.md +20 -0
  392. package/assets/skills/poster-noir-black-gold/previews/1.jpg +0 -0
  393. package/assets/skills/poster-noir-black-gold/previews/2.jpg +0 -0
  394. package/assets/skills/poster-noir-black-gold/previews/3.jpg +0 -0
  395. package/assets/skills/poster-noir-black-gold/previews/4.jpg +0 -0
  396. package/assets/skills/poster-paintbrush-cityscape/SKILL.md +20 -0
  397. package/assets/skills/poster-paintbrush-cityscape/previews/1.jpg +0 -0
  398. package/assets/skills/poster-paintbrush-cityscape/previews/2.jpg +0 -0
  399. package/assets/skills/poster-paintbrush-cityscape/previews/3.jpg +0 -0
  400. package/assets/skills/poster-paintbrush-cityscape/previews/4.jpg +0 -0
  401. package/assets/skills/poster-paper-quilling-travel/SKILL.md +22 -0
  402. package/assets/skills/poster-paper-quilling-travel/previews/1.jpg +0 -0
  403. package/assets/skills/poster-paper-quilling-travel/previews/2.jpg +0 -0
  404. package/assets/skills/poster-paper-quilling-travel/previews/3.jpg +0 -0
  405. package/assets/skills/poster-paper-quilling-travel/previews/4.jpg +0 -0
  406. package/assets/skills/poster-papercraft-bookmark/SKILL.md +22 -0
  407. package/assets/skills/poster-papercraft-bookmark/previews/1.jpg +0 -0
  408. package/assets/skills/poster-papercraft-bookmark/previews/2.jpg +0 -0
  409. package/assets/skills/poster-papercraft-bookmark/previews/3.jpg +0 -0
  410. package/assets/skills/poster-papercraft-bookmark/previews/4.jpg +0 -0
  411. package/assets/skills/poster-papercraft-diorama-travel/SKILL.md +22 -0
  412. package/assets/skills/poster-papercraft-diorama-travel/previews/1.jpg +0 -0
  413. package/assets/skills/poster-papercraft-diorama-travel/previews/2.jpg +0 -0
  414. package/assets/skills/poster-papercraft-grid-diorama/SKILL.md +24 -0
  415. package/assets/skills/poster-papercraft-grid-diorama/previews/1.jpg +0 -0
  416. package/assets/skills/poster-papercraft-grid-diorama/previews/2.jpg +0 -0
  417. package/assets/skills/poster-papercraft-layered-papercut/SKILL.md +24 -0
  418. package/assets/skills/poster-papercraft-layered-papercut/previews/1.jpg +0 -0
  419. package/assets/skills/poster-papercraft-layered-papercut/previews/2.jpg +0 -0
  420. package/assets/skills/poster-papercraft-strip/SKILL.md +22 -0
  421. package/assets/skills/poster-papercraft-strip/previews/1.jpg +0 -0
  422. package/assets/skills/poster-papercraft-strip/previews/2.jpg +0 -0
  423. package/assets/skills/poster-papercraft-strip/previews/3.jpg +0 -0
  424. package/assets/skills/poster-papercraft-strip/previews/4.jpg +0 -0
  425. package/assets/skills/poster-papercraft-suitcase/SKILL.md +24 -0
  426. package/assets/skills/poster-papercraft-suitcase/previews/1.jpg +0 -0
  427. package/assets/skills/poster-papercraft-suitcase/previews/2.jpg +0 -0
  428. package/assets/skills/poster-papercraft-suitcase/previews/3.jpg +0 -0
  429. package/assets/skills/poster-papercut-collage/SKILL.md +22 -0
  430. package/assets/skills/poster-papercut-collage/previews/1.jpg +0 -0
  431. package/assets/skills/poster-papercut-collage/previews/2.jpg +0 -0
  432. package/assets/skills/poster-papercut-collage/previews/3.jpg +0 -0
  433. package/assets/skills/poster-papercut-collage/previews/4.jpg +0 -0
  434. package/assets/skills/poster-passport-diorama/SKILL.md +20 -0
  435. package/assets/skills/poster-passport-diorama/previews/1.jpg +0 -0
  436. package/assets/skills/poster-passport-diorama/previews/2.jpg +0 -0
  437. package/assets/skills/poster-passport-diorama/previews/3.jpg +0 -0
  438. package/assets/skills/poster-passport-diorama/previews/4.jpg +0 -0
  439. package/assets/skills/poster-passport-portal-city/SKILL.md +22 -0
  440. package/assets/skills/poster-passport-portal-city/previews/1.jpg +0 -0
  441. package/assets/skills/poster-passport-portal-city/previews/2.jpg +0 -0
  442. package/assets/skills/poster-passport-portal-city/previews/3.jpg +0 -0
  443. package/assets/skills/poster-passport-portal-city/previews/4.jpg +0 -0
  444. package/assets/skills/poster-pastel-gouache/SKILL.md +22 -0
  445. package/assets/skills/poster-pastel-gouache/previews/1.jpg +0 -0
  446. package/assets/skills/poster-pastel-gouache/previews/2.jpg +0 -0
  447. package/assets/skills/poster-pastel-gouache/previews/3.jpg +0 -0
  448. package/assets/skills/poster-pastel-papercollage-scene/SKILL.md +28 -0
  449. package/assets/skills/poster-pastel-papercollage-scene/previews/1.jpg +0 -0
  450. package/assets/skills/poster-pastel-papercollage-scene/previews/2.jpg +0 -0
  451. package/assets/skills/poster-pastel-papercollage-scene/previews/3.jpg +0 -0
  452. package/assets/skills/poster-pastel-papercollage-scene/previews/4.jpg +0 -0
  453. package/assets/skills/poster-patchwork-amigurumi/SKILL.md +24 -0
  454. package/assets/skills/poster-patchwork-amigurumi/previews/1.jpg +0 -0
  455. package/assets/skills/poster-patchwork-amigurumi/previews/2.jpg +0 -0
  456. package/assets/skills/poster-playful-doodle-respond/SKILL.md +22 -0
  457. package/assets/skills/poster-playful-doodle-respond/previews/1.jpg +0 -0
  458. package/assets/skills/poster-playful-doodle-respond/previews/2.jpg +0 -0
  459. package/assets/skills/poster-pocketwatch-city/SKILL.md +20 -0
  460. package/assets/skills/poster-pocketwatch-city/previews/1.jpg +0 -0
  461. package/assets/skills/poster-pocketwatch-city/previews/2.jpg +0 -0
  462. package/assets/skills/poster-pocketwatch-city/previews/3.jpg +0 -0
  463. package/assets/skills/poster-pocketwatch-city/previews/4.jpg +0 -0
  464. package/assets/skills/poster-pop-art-vehicle/SKILL.md +20 -0
  465. package/assets/skills/poster-pop-art-vehicle/previews/1.jpg +0 -0
  466. package/assets/skills/poster-pop-art-vehicle/previews/2.jpg +0 -0
  467. package/assets/skills/poster-pop-art-vehicle/previews/3.jpg +0 -0
  468. package/assets/skills/poster-pop-art-vehicle/previews/4.jpg +0 -0
  469. package/assets/skills/poster-popup-storybook/SKILL.md +22 -0
  470. package/assets/skills/poster-popup-storybook/previews/1.jpg +0 -0
  471. package/assets/skills/poster-popup-storybook/previews/2.jpg +0 -0
  472. package/assets/skills/poster-popup-storybook/previews/3.jpg +0 -0
  473. package/assets/skills/poster-popup-storybook/previews/4.jpg +0 -0
  474. package/assets/skills/poster-postcard-diorama/SKILL.md +20 -0
  475. package/assets/skills/poster-postcard-diorama/previews/1.jpg +0 -0
  476. package/assets/skills/poster-postcard-diorama/previews/2.jpg +0 -0
  477. package/assets/skills/poster-premium-food-advert/SKILL.md +24 -0
  478. package/assets/skills/poster-premium-food-advert/previews/1.jpg +0 -0
  479. package/assets/skills/poster-premium-food-advert/previews/2.jpg +0 -0
  480. package/assets/skills/poster-pressed-flower-logo/SKILL.md +22 -0
  481. package/assets/skills/poster-pressed-flower-logo/previews/1.jpg +0 -0
  482. package/assets/skills/poster-pressed-flower-logo/previews/2.jpg +0 -0
  483. package/assets/skills/poster-product-doodle-mixed/SKILL.md +20 -0
  484. package/assets/skills/poster-product-doodle-mixed/previews/1.jpg +0 -0
  485. package/assets/skills/poster-product-doodle-mixed/previews/2.jpg +0 -0
  486. package/assets/skills/poster-product-explode-splash/SKILL.md +24 -0
  487. package/assets/skills/poster-product-explode-splash/previews/1.jpg +0 -0
  488. package/assets/skills/poster-product-explode-splash/previews/2.jpg +0 -0
  489. package/assets/skills/poster-product-explode-splash/previews/3.jpg +0 -0
  490. package/assets/skills/poster-product-explode-splash/previews/4.jpg +0 -0
  491. package/assets/skills/poster-product-exploded-view/SKILL.md +24 -0
  492. package/assets/skills/poster-product-exploded-view/previews/1.jpg +0 -0
  493. package/assets/skills/poster-product-exploded-view/previews/2.jpg +0 -0
  494. package/assets/skills/poster-product-grid-campaign/SKILL.md +22 -0
  495. package/assets/skills/poster-product-grid-campaign/previews/1.jpg +0 -0
  496. package/assets/skills/poster-product-grid-campaign/previews/2.jpg +0 -0
  497. package/assets/skills/poster-recipe-infographic/SKILL.md +24 -0
  498. package/assets/skills/poster-recipe-infographic/previews/1.jpg +0 -0
  499. package/assets/skills/poster-recipe-infographic/previews/2.jpg +0 -0
  500. package/assets/skills/poster-retro-album-art/SKILL.md +22 -0
  501. package/assets/skills/poster-retro-album-art/previews/1.jpg +0 -0
  502. package/assets/skills/poster-retro-album-art/previews/2.jpg +0 -0
  503. package/assets/skills/poster-risograph-print/SKILL.md +24 -0
  504. package/assets/skills/poster-risograph-print/previews/1.jpg +0 -0
  505. package/assets/skills/poster-risograph-print/previews/2.jpg +0 -0
  506. package/assets/skills/poster-risograph-print/previews/3.jpg +0 -0
  507. package/assets/skills/poster-risograph-print/previews/4.jpg +0 -0
  508. package/assets/skills/poster-risography-travel/SKILL.md +22 -0
  509. package/assets/skills/poster-risography-travel/previews/1.jpg +0 -0
  510. package/assets/skills/poster-risography-travel/previews/2.jpg +0 -0
  511. package/assets/skills/poster-risography-travel/previews/3.jpg +0 -0
  512. package/assets/skills/poster-risography-travel/previews/4.jpg +0 -0
  513. package/assets/skills/poster-route-map-infographic/SKILL.md +28 -0
  514. package/assets/skills/poster-route-map-infographic/previews/1.jpg +0 -0
  515. package/assets/skills/poster-route-map-infographic/previews/2.jpg +0 -0
  516. package/assets/skills/poster-scandi-monoline/SKILL.md +26 -0
  517. package/assets/skills/poster-scandi-monoline/previews/1.jpg +0 -0
  518. package/assets/skills/poster-scandi-monoline/previews/2.jpg +0 -0
  519. package/assets/skills/poster-scandi-monoline/previews/3.jpg +0 -0
  520. package/assets/skills/poster-scrapbook-travel/SKILL.md +24 -0
  521. package/assets/skills/poster-scrapbook-travel/previews/1.jpg +0 -0
  522. package/assets/skills/poster-scrapbook-travel/previews/2.jpg +0 -0
  523. package/assets/skills/poster-scrapbook-travel/previews/3.jpg +0 -0
  524. package/assets/skills/poster-scrapbook-travel/previews/4.jpg +0 -0
  525. package/assets/skills/poster-screenprint-linocut/SKILL.md +22 -0
  526. package/assets/skills/poster-screenprint-linocut/previews/1.jpg +0 -0
  527. package/assets/skills/poster-screenprint-linocut/previews/2.jpg +0 -0
  528. package/assets/skills/poster-screenprint-linocut/previews/3.jpg +0 -0
  529. package/assets/skills/poster-screenprint-linocut/previews/4.jpg +0 -0
  530. package/assets/skills/poster-shrinkwrapped-logo/SKILL.md +20 -0
  531. package/assets/skills/poster-shrinkwrapped-logo/previews/1.jpg +0 -0
  532. package/assets/skills/poster-shrinkwrapped-logo/previews/2.jpg +0 -0
  533. package/assets/skills/poster-silhouette-miniature/SKILL.md +26 -0
  534. package/assets/skills/poster-silhouette-miniature/previews/1.jpg +0 -0
  535. package/assets/skills/poster-silhouette-miniature/previews/2.jpg +0 -0
  536. package/assets/skills/poster-silhouette-miniature/previews/3b8bea15-43b1-4d7b-aad7-b2f5d986cde5.png +0 -0
  537. package/assets/skills/poster-silk-ribbon-city/SKILL.md +22 -0
  538. package/assets/skills/poster-silk-ribbon-city/previews/1.jpg +0 -0
  539. package/assets/skills/poster-silk-ribbon-city/previews/2.jpg +0 -0
  540. package/assets/skills/poster-silk-ribbon-city/previews/3.jpg +0 -0
  541. package/assets/skills/poster-silk-ribbon-city/previews/4.jpg +0 -0
  542. package/assets/skills/poster-sleek-product-hero/SKILL.md +24 -0
  543. package/assets/skills/poster-sleek-product-hero/previews/1.jpg +0 -0
  544. package/assets/skills/poster-sleek-product-hero/previews/2.jpg +0 -0
  545. package/assets/skills/poster-soft-beauty-doodle/SKILL.md +22 -0
  546. package/assets/skills/poster-soft-beauty-doodle/previews/1.jpg +0 -0
  547. package/assets/skills/poster-soft-beauty-doodle/previews/2.jpg +0 -0
  548. package/assets/skills/poster-souvenir-badge/SKILL.md +22 -0
  549. package/assets/skills/poster-souvenir-badge/previews/1.jpg +0 -0
  550. package/assets/skills/poster-souvenir-badge/previews/2.jpg +0 -0
  551. package/assets/skills/poster-souvenir-magnet-poster/SKILL.md +20 -0
  552. package/assets/skills/poster-souvenir-magnet-poster/previews/1.jpg +0 -0
  553. package/assets/skills/poster-souvenir-magnet-poster/previews/2.jpg +0 -0
  554. package/assets/skills/poster-sports-champion-3d/SKILL.md +26 -0
  555. package/assets/skills/poster-sports-champion-3d/previews/1.jpg +0 -0
  556. package/assets/skills/poster-sports-maximalist/SKILL.md +20 -0
  557. package/assets/skills/poster-sports-maximalist/previews/1.jpg +0 -0
  558. package/assets/skills/poster-sports-maximalist/previews/2.jpg +0 -0
  559. package/assets/skills/poster-sports-passport-diorama/SKILL.md +22 -0
  560. package/assets/skills/poster-sports-passport-diorama/previews/1.jpg +0 -0
  561. package/assets/skills/poster-sports-passport-diorama/previews/2.jpg +0 -0
  562. package/assets/skills/poster-stone-water-product/SKILL.md +20 -0
  563. package/assets/skills/poster-stone-water-product/previews/1.jpg +0 -0
  564. package/assets/skills/poster-storyboard-character/SKILL.md +22 -0
  565. package/assets/skills/poster-storyboard-character/previews/1.jpg +0 -0
  566. package/assets/skills/poster-storybook-paper-collage-travel/SKILL.md +26 -0
  567. package/assets/skills/poster-storybook-paper-collage-travel/previews/1.jpg +0 -0
  568. package/assets/skills/poster-storybook-paper-collage-travel/previews/2.jpg +0 -0
  569. package/assets/skills/poster-storybook-vintage/SKILL.md +22 -0
  570. package/assets/skills/poster-storybook-vintage/previews/1.jpg +0 -0
  571. package/assets/skills/poster-storybook-vintage/previews/2.jpg +0 -0
  572. package/assets/skills/poster-storybook-vintage/previews/3.jpg +0 -0
  573. package/assets/skills/poster-street-art-mural/SKILL.md +22 -0
  574. package/assets/skills/poster-street-art-mural/previews/1.jpg +0 -0
  575. package/assets/skills/poster-surreal-postcard/SKILL.md +24 -0
  576. package/assets/skills/poster-surreal-postcard/previews/1.jpg +0 -0
  577. package/assets/skills/poster-surreal-postcard/previews/2.jpg +0 -0
  578. package/assets/skills/poster-surreal-postcard/previews/3.jpg +0 -0
  579. package/assets/skills/poster-surreal-postcard/previews/4.jpg +0 -0
  580. package/assets/skills/poster-swiss-letter-editorial/SKILL.md +24 -0
  581. package/assets/skills/poster-swiss-letter-editorial/previews/1.jpg +0 -0
  582. package/assets/skills/poster-swiss-letter-editorial/previews/2.jpg +0 -0
  583. package/assets/skills/poster-swiss-letter-editorial/previews/3.jpg +0 -0
  584. package/assets/skills/poster-tablet-papercraft-diorama/SKILL.md +24 -0
  585. package/assets/skills/poster-tablet-papercraft-diorama/previews/1.jpg +0 -0
  586. package/assets/skills/poster-tablet-papercraft-diorama/previews/2.jpg +0 -0
  587. package/assets/skills/poster-tablet-papercraft-diorama/previews/3.jpg +0 -0
  588. package/assets/skills/poster-tablet-papercraft-diorama/previews/4.jpg +0 -0
  589. package/assets/skills/poster-tabletop-miniature-diorama/SKILL.md +20 -0
  590. package/assets/skills/poster-tabletop-miniature-diorama/previews/1.jpg +0 -0
  591. package/assets/skills/poster-tabletop-miniature-diorama/previews/2.jpg +0 -0
  592. package/assets/skills/poster-tabletop-miniature-diorama/previews/3.jpg +0 -0
  593. package/assets/skills/poster-tabletop-miniature-diorama/previews/4.jpg +0 -0
  594. package/assets/skills/poster-tabletop-travel-planning/SKILL.md +22 -0
  595. package/assets/skills/poster-tabletop-travel-planning/previews/1.jpg +0 -0
  596. package/assets/skills/poster-tabletop-travel-planning/previews/2.jpg +0 -0
  597. package/assets/skills/poster-ticket-portal-city/SKILL.md +26 -0
  598. package/assets/skills/poster-ticket-portal-city/previews/1.jpg +0 -0
  599. package/assets/skills/poster-ticket-portal-city/previews/2.jpg +0 -0
  600. package/assets/skills/poster-time-travel-split/SKILL.md +22 -0
  601. package/assets/skills/poster-time-travel-split/previews/1.jpg +0 -0
  602. package/assets/skills/poster-tiny-planet-city/SKILL.md +24 -0
  603. package/assets/skills/poster-tiny-planet-city/previews/1.jpg +0 -0
  604. package/assets/skills/poster-tiny-planet-city/previews/2.jpg +0 -0
  605. package/assets/skills/poster-transparent-product/SKILL.md +20 -0
  606. package/assets/skills/poster-transparent-product/previews/1.jpg +0 -0
  607. package/assets/skills/poster-transparent-product/previews/2.jpg +0 -0
  608. package/assets/skills/poster-travel-collage/SKILL.md +22 -0
  609. package/assets/skills/poster-travel-collage/previews/1.jpg +0 -0
  610. package/assets/skills/poster-travel-collage/previews/2.jpg +0 -0
  611. package/assets/skills/poster-travel-food-spiral/SKILL.md +22 -0
  612. package/assets/skills/poster-travel-food-spiral/previews/1.jpg +0 -0
  613. package/assets/skills/poster-travel-food-spiral/previews/2.jpg +0 -0
  614. package/assets/skills/poster-travel-guide-comic/SKILL.md +24 -0
  615. package/assets/skills/poster-travel-guide-comic/previews/1.jpg +0 -0
  616. package/assets/skills/poster-travel-guide-comic/previews/2.jpg +0 -0
  617. package/assets/skills/poster-travel-infographic/SKILL.md +22 -0
  618. package/assets/skills/poster-travel-infographic/previews/1.jpg +0 -0
  619. package/assets/skills/poster-travel-infographic/previews/2.jpg +0 -0
  620. package/assets/skills/poster-typographic-city-fashion/SKILL.md +22 -0
  621. package/assets/skills/poster-typographic-city-fashion/previews/1.jpg +0 -0
  622. package/assets/skills/poster-typographic-city-fashion/previews/2.jpg +0 -0
  623. package/assets/skills/poster-typographic-city-fashion/previews/3.jpg +0 -0
  624. package/assets/skills/poster-typographic-letters-travel/SKILL.md +22 -0
  625. package/assets/skills/poster-typographic-letters-travel/previews/1.jpg +0 -0
  626. package/assets/skills/poster-typographic-letters-travel/previews/2.jpg +0 -0
  627. package/assets/skills/poster-typographic-letters-travel/previews/3.jpg +0 -0
  628. package/assets/skills/poster-vibrant-papercut-collage/SKILL.md +26 -0
  629. package/assets/skills/poster-vibrant-papercut-collage/previews/1.jpg +0 -0
  630. package/assets/skills/poster-vibrant-papercut-collage/previews/2.jpg +0 -0
  631. package/assets/skills/poster-vibrant-papercut-collage/previews/3.jpg +0 -0
  632. package/assets/skills/poster-vibrant-papercut-collage/previews/4.jpg +0 -0
  633. package/assets/skills/poster-vintage-airmail-stamp/SKILL.md +28 -0
  634. package/assets/skills/poster-vintage-airmail-stamp/previews/1.jpg +0 -0
  635. package/assets/skills/poster-vintage-airmail-stamp/previews/2.jpg +0 -0
  636. package/assets/skills/poster-vintage-encyclopedia/SKILL.md +26 -0
  637. package/assets/skills/poster-vintage-encyclopedia/previews/1.jpg +0 -0
  638. package/assets/skills/poster-vintage-encyclopedia/previews/2.jpg +0 -0
  639. package/assets/skills/poster-vintage-handpainted-ad/SKILL.md +26 -0
  640. package/assets/skills/poster-vintage-handpainted-ad/previews/1.jpg +0 -0
  641. package/assets/skills/poster-vintage-handpainted-ad/previews/2.jpg +0 -0
  642. package/assets/skills/poster-vintage-handpainted-ad/previews/3.jpg +0 -0
  643. package/assets/skills/poster-vintage-handpainted-ad/previews/4.jpg +0 -0
  644. package/assets/skills/poster-vintage-newspaper/SKILL.md +22 -0
  645. package/assets/skills/poster-vintage-newspaper/previews/1.jpg +0 -0
  646. package/assets/skills/poster-vintage-newspaper/previews/2.jpg +0 -0
  647. package/assets/skills/poster-vintage-newspaper/previews/3.jpg +0 -0
  648. package/assets/skills/poster-vintage-newspaper/previews/4.jpg +0 -0
  649. package/assets/skills/poster-vintage-romantic-typography/SKILL.md +24 -0
  650. package/assets/skills/poster-vintage-romantic-typography/previews/1.jpg +0 -0
  651. package/assets/skills/poster-vintage-romantic-typography/previews/2.jpg +0 -0
  652. package/assets/skills/poster-vintage-romantic-typography/previews/3.jpg +0 -0
  653. package/assets/skills/poster-vintage-romantic-typography/previews/4.jpg +0 -0
  654. package/assets/skills/poster-vintage-travel-journal/SKILL.md +22 -0
  655. package/assets/skills/poster-vintage-travel-journal/previews/1.jpg +0 -0
  656. package/assets/skills/poster-vintage-travel-journal/previews/2.jpg +0 -0
  657. package/assets/skills/poster-vintage-travel-magazine/SKILL.md +24 -0
  658. package/assets/skills/poster-vintage-travel-magazine/previews/1.jpg +0 -0
  659. package/assets/skills/poster-vintage-travel-magazine/previews/2.jpg +0 -0
  660. package/assets/skills/poster-watercolor-arch-travel/SKILL.md +20 -0
  661. package/assets/skills/poster-watercolor-arch-travel/previews/1.jpg +0 -0
  662. package/assets/skills/poster-watercolor-arch-travel/previews/2.jpg +0 -0
  663. package/assets/skills/poster-watercolor-arch-travel/previews/3.jpg +0 -0
  664. package/assets/skills/poster-watercolor-arch-travel/previews/4.jpg +0 -0
  665. package/assets/skills/poster-watercolor-travel/SKILL.md +26 -0
  666. package/assets/skills/poster-watercolor-travel/previews/1.jpg +0 -0
  667. package/assets/skills/poster-watercolor-travel/previews/2.jpg +0 -0
  668. package/assets/skills/poster-watercolor-travel-journal/SKILL.md +22 -0
  669. package/assets/skills/poster-watercolor-travel-journal/previews/1.jpg +0 -0
  670. package/assets/skills/poster-watercolor-travel-journal/previews/2.jpg +0 -0
  671. package/assets/skills/poster-window-frame-travel/SKILL.md +22 -0
  672. package/assets/skills/poster-window-frame-travel/previews/1.jpg +0 -0
  673. package/assets/skills/poster-window-frame-travel/previews/2.jpg +0 -0
  674. package/assets/skills/poster-window-frame-travel/previews/3.jpg +0 -0
  675. package/assets/skills/poster-window-frame-travel/previews/4.jpg +0 -0
  676. package/assets/skills/poster-winter-storybook/SKILL.md +20 -0
  677. package/assets/skills/poster-winter-storybook/previews/1.jpg +0 -0
  678. package/assets/skills/poster-winter-storybook/previews/2.jpg +0 -0
  679. package/assets/skills/poster-winter-storybook/previews/3.jpg +0 -0
  680. package/assets/skills/poster-woodcut-propaganda/SKILL.md +22 -0
  681. package/assets/skills/poster-woodcut-propaganda/previews/1.jpg +0 -0
  682. package/assets/skills/poster-woodcut-propaganda/previews/2.jpg +0 -0
  683. package/assets/skills/poster-woodcut-propaganda/previews/3.jpg +0 -0
  684. package/assets/skills/poster-woodcut-propaganda/previews/4.jpg +0 -0
  685. package/cordis.patch.yml +8 -0
  686. package/lib/client.js +1538 -0
  687. package/lib/client.js.map +1 -0
  688. package/lib/gate.js +115 -0
  689. package/lib/index.js +133 -0
  690. package/lib/invariant.js +18 -0
  691. package/lib/poster-service.js +128 -0
  692. package/lib/previews-route.js +72 -0
  693. package/lib/shared/disabled-flag.js +14 -0
  694. package/lib/shared/poster-contract.js +26 -0
  695. package/lib/shared/poster-trace.js +109 -0
  696. package/lib/shared/skill-format.js +69 -0
  697. package/lib/skills/store.js +456 -0
  698. package/lib/spec.js +16 -0
  699. package/lib/tools/get-all-skills.js +84 -0
  700. package/lib/tools/pick-skill.js +154 -0
  701. package/lib/trace-hub.js +63 -0
  702. package/lib/typert.js +18 -0
  703. package/lib/version-gate.js +149 -0
  704. package/package.json +104 -0
package/lib/client.js ADDED
@@ -0,0 +1,1538 @@
1
+ window.__ModuleLoader__.load({
2
+ id: "@liaozhi/dsh-post-gen",
3
+ factory: (require) => {
4
+ var module = { exports: {} };
5
+ var exports = module.exports;
6
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
7
+ let react = require("react");
8
+ let _deepseek_ai_dsh_client_ui_primitives = require("@deepseek-ai/dsh-client-ui-primitives");
9
+ let react_jsx_runtime = require("react/jsx-runtime");
10
+ //#region src/client/locales.ts
11
+ /**
12
+ * 海报设计设置面板的文案词典。
13
+ * 命名空间 `settings.poster` 合并进 LocaleNamespaceMap,
14
+ * 注册后组件通过框架注入的 `t` seat 取文案。
15
+ */
16
+ const en = {
17
+ /** Settings nav label. */
18
+ nav: "Poster Design",
19
+ /** Section heading. */
20
+ title: "Poster Design",
21
+ disabledTitle: "This plugin has been disabled automatically.",
22
+ disabledFallback: "The host half did not start: the installed harness version is not supported.",
23
+ disabledWindow: "Supported harness versions: {min} ~ {max} (inclusive).",
24
+ disabledInstallLabel: "Install a supported harness version:",
25
+ disabledCopy: "Copy",
26
+ disabledCopied: "Copied!",
27
+ disabledHint: "Bring the harness into the supported window (upgrade or downgrade as noted above), or wait for a compatible plugin release, then restart. See the dsh startup log for details.",
28
+ enableLabel: "Enable poster design",
29
+ enabledOn: "Enabled: the poster flow is available in conversations (depends on dsh-qw-tool for image tools).",
30
+ enabledOff: "Disabled: the poster flow stays out of conversations and adds no prompt overhead.",
31
+ enabledButIncomplete: "The switch is on, but the flow is inactive until these are resolved:",
32
+ gateIncomplete: "Complete the following before enabling:",
33
+ missingSkills: "install at least one poster skill",
34
+ loading: "Loading saved configuration…",
35
+ skillsTitle: "Installed skills",
36
+ uploadButton: "Install from zip…",
37
+ uploadBusy: "Installing {fileName}…",
38
+ uploadDoneOk: "{message}",
39
+ uploadFailed: "Installation failed: {message}",
40
+ skillEmpty: "No skills installed yet. Install one from a zip to enable poster design.",
41
+ skillBundled: "built-in",
42
+ skillBundledLocked: "Built-in skills cannot be removed",
43
+ skillRemove: "Remove",
44
+ skillPreviewAlt: "Preview of {title}",
45
+ invalidTitle: "Folders that failed validation",
46
+ invalidHint: "These folders do not match the poster skill format; remove them or fix their contents.",
47
+ invalidRemove: "Delete folder",
48
+ close: "Close",
49
+ carouselPrev: "Previous preview",
50
+ carouselNext: "Next preview",
51
+ skillWhenToUseLabel: "When to use",
52
+ posterLoading: "Loading image…",
53
+ posterLoadFailed: "Failed to load the image: {message}",
54
+ nodeSkillsTitle: "Poster skill library",
55
+ nodePickTitle: "Style pick",
56
+ nodeRunning: "running…",
57
+ nodeDone: "done",
58
+ nodeFailed: "failed",
59
+ nodeAborted: "Cancelled / interrupted",
60
+ stepScan: "① Skill library scan",
61
+ stepParams: "① Received parameters",
62
+ stepOptions: "② Candidates — pick one",
63
+ stepAnswer: "③ Final selection",
64
+ paramCandidates: "Candidates",
65
+ paramQuestion: "Question",
66
+ skillsScanned: "Scanned {count} skills in {duration}",
67
+ skillsInvalid: "{count} folder(s) failed validation",
68
+ pickHint: "Pick a style for this poster.",
69
+ chooseThis: "Pick this one",
70
+ chosenBadge: "Selected",
71
+ customPlaceholder: "Optional additions (e.g. copy, palette)…",
72
+ waitingChoice: "Waiting for your pick…",
73
+ answerExpired: "This pick has expired (the call already finished or was interrupted).",
74
+ finalSkill: "Chosen skill",
75
+ finalCustom: "Your additions",
76
+ inspect: "Inspect",
77
+ nodeCollapse: "Collapse",
78
+ nodeExpand: "Expand",
79
+ stepPending: "…"
80
+ };
81
+ /** Chinese strings (same keys as {@link en}). */
82
+ const zh = {
83
+ nav: "海报设计",
84
+ title: "海报设计",
85
+ disabledTitle: "本插件已被自动停用。",
86
+ disabledFallback: "host 半未启动:当前安装的 harness 版本不受支持。",
87
+ disabledWindow: "支持的 harness 版本窗口:{min} ~ {max}(含)。",
88
+ disabledInstallLabel: "安装受支持的 harness 版本:",
89
+ disabledCopy: "复制",
90
+ disabledCopied: "已复制!",
91
+ disabledHint: "请将 harness 调整到受支持的版本窗口(按上方原因升级或降级),或等待兼容的插件版本后重启。详见 dsh 启动日志。",
92
+ enableLabel: "启用海报设计",
93
+ enabledOn: "已启用:对话中可使用海报工作流(图像工具依赖 dsh-qw-tool)。",
94
+ enabledOff: "未启用:海报功能不进入对话,也不占用上下文。",
95
+ enabledButIncomplete: "开关已打开,但以下事项未解决,海报功能未激活:",
96
+ gateIncomplete: "完成以下事项后才能启用:",
97
+ missingSkills: "安装至少一个海报 skill",
98
+ loading: "正在读取已保存的配置…",
99
+ skillsTitle: "已安装的 skill",
100
+ uploadButton: "从压缩包安装…",
101
+ uploadBusy: "正在安装 {fileName}…",
102
+ uploadDoneOk: "{message}",
103
+ uploadFailed: "安装失败:{message}",
104
+ skillEmpty: "还没有安装任何 skill。从压缩包安装一个之后才能启用海报设计。",
105
+ skillBundled: "内置",
106
+ skillBundledLocked: "内置 skill 不可删除",
107
+ skillRemove: "删除",
108
+ skillPreviewAlt: "「{title}」的预览图",
109
+ invalidTitle: "校验失败的文件夹",
110
+ invalidHint: "这些文件夹不符合海报 skill 格式,可以删除或修正内容后重试。",
111
+ invalidRemove: "删除文件夹",
112
+ close: "关闭",
113
+ carouselPrev: "上一张预览图",
114
+ carouselNext: "下一张预览图",
115
+ skillWhenToUseLabel: "适用场景",
116
+ posterLoading: "图片加载中…",
117
+ posterLoadFailed: "图片加载失败:{message}",
118
+ nodeSkillsTitle: "海报风格库",
119
+ nodePickTitle: "风格点选",
120
+ nodeRunning: "进行中…",
121
+ nodeDone: "已完成",
122
+ nodeFailed: "失败",
123
+ nodeAborted: "已取消/中断",
124
+ stepScan: "① 风格库扫描",
125
+ stepParams: "① 接收参数",
126
+ stepOptions: "② 候选风格(请选择一个)",
127
+ stepAnswer: "③ 最终选择",
128
+ paramCandidates: "候选",
129
+ paramQuestion: "提问",
130
+ skillsScanned: "扫描到 {count} 个风格,耗时 {duration}",
131
+ skillsInvalid: "{count} 个文件夹校验失败",
132
+ pickHint: "请为本次海报选择一个风格。",
133
+ chooseThis: "选这个",
134
+ chosenBadge: "已选择",
135
+ customPlaceholder: "补充要求(可选,如文案、色调)…",
136
+ waitingChoice: "等待选择…",
137
+ answerExpired: "该选择已过期(调用已结束或中断)。",
138
+ finalSkill: "选中 skill",
139
+ finalCustom: "用户补充",
140
+ inspect: "Inspect",
141
+ nodeCollapse: "收起",
142
+ nodeExpand: "展开",
143
+ stepPending: "…"
144
+ };
145
+ /** Locale namespace owned by this plugin. */
146
+ const POSTER_NS = "settings.poster";
147
+ //#endregion
148
+ //#region src/shared/disabled-flag.ts
149
+ /**
150
+ * host 半版本门禁软禁用时的跨进程标记(host → client)。
151
+ *
152
+ * host 半(index.ts)软禁用时不注册任何业务能力,只经
153
+ * `webserver/index-inject` 向 index.html 注入一个全局变量(harness 渲染时
154
+ * `<` 已转义,值纯 JSON);client 半(client/index.ts)加载时读取该变量,
155
+ * 存在即改挂"已停用"说明面板,不存在则走正常注册路径。
156
+ *
157
+ * 版本判断逻辑只在 host 半(version-gate.ts)有一份,client 不复制——
158
+ * 此文件只是两侧共享的常量与载荷形状,不得引入任何 Node 依赖(client
159
+ * bundle 会内联本文件)。
160
+ */
161
+ /** 注入 index.html 的全局标记名(`globalThis[DISABLED_GLOBAL]`)。 */
162
+ const DISABLED_GLOBAL = "__DSH_POST_GEN_DISABLED__";
163
+ //#endregion
164
+ //#region src/shared/poster-contract.ts
165
+ /**
166
+ * host 与 client 共享的海报业务 RPC 契约。
167
+ * 浏览器端经 `ctx.connection.rpc.call('/api', <endpoint>, { args })` 调用
168
+ * host 半的 `poster` 服务(见 src/index.ts)。
169
+ * 本模块两端共用:只允许类型与不依赖平台的常量/纯函数。
170
+ *
171
+ * 自 v0.2 起仅保留海报工作流自身的端点(风格库 + 配置 + trace/点选);
172
+ * 千问 API 调用端点已移交 dsh-qw-tool 插件(其服务 wire namespace 为 qwen)。
173
+ */
174
+ /** RPC 端点(`<namespace>/<method>`)。 */
175
+ const POSTER_ENDPOINT = {
176
+ /** 读取服务端保存的海报设计配置(启用开关)。 */
177
+ getConfig: "poster/getConfig",
178
+ /** 保存海报设计配置(补丁式部分字段)。 */
179
+ saveConfig: "poster/saveConfig",
180
+ /** 列出 skill 库(已安装 skill + 校验失败的文件夹)。 */
181
+ listSkills: "poster/listSkills",
182
+ /** 上传 zip 安装/更新一个海报 skill。 */
183
+ installSkill: "poster/installSkill",
184
+ /** 卸载(删除)一个海报 skill 文件夹。 */
185
+ uninstallSkill: "poster/uninstallSkill",
186
+ /** 读某次工具调用的实时步骤 trace(运行中加速器;settle 后用 meta)。 */
187
+ getCallTrace: "poster/getCallTrace",
188
+ /** 提交 poster_gen_pick_poster_skill 候选卡片上的用户选择。 */
189
+ answerSkill: "poster/answerSkill"
190
+ };
191
+ //#endregion
192
+ //#region src/client/api.ts
193
+ /** 调用 host 半的 poster 服务端点,统一把通道错误折叠进 OpResult。 */
194
+ async function callPoster(rpc, endpoint, args) {
195
+ let envelope;
196
+ try {
197
+ envelope = await rpc.call("/api", endpoint, { args });
198
+ } catch (error) {
199
+ return {
200
+ ok: false,
201
+ kind: "network",
202
+ detail: error instanceof Error ? error.message : String(error)
203
+ };
204
+ }
205
+ if (!envelope || typeof envelope !== "object") return {
206
+ ok: false,
207
+ kind: "http",
208
+ detail: "bad envelope"
209
+ };
210
+ if (!envelope.ok) return {
211
+ ok: false,
212
+ kind: "http",
213
+ detail: envelope.error?.message ?? "rpc failed"
214
+ };
215
+ return {
216
+ ok: true,
217
+ value: envelope.value
218
+ };
219
+ }
220
+ /** 读取 host 端保存的配置(启用开关)。 */
221
+ async function getConfigViaHost(rpc) {
222
+ const result = await callPoster(rpc, POSTER_ENDPOINT.getConfig, {});
223
+ if (!result.ok) return result;
224
+ if (!result.value || typeof result.value !== "object" || typeof result.value.config !== "object") return {
225
+ ok: false,
226
+ kind: "http",
227
+ detail: "bad result"
228
+ };
229
+ return {
230
+ ok: true,
231
+ value: { config: result.value.config }
232
+ };
233
+ }
234
+ /** 保存配置到 host 端(补丁式部分字段)。 */
235
+ async function saveConfigViaHost(rpc, patch) {
236
+ const result = await callPoster(rpc, POSTER_ENDPOINT.saveConfig, { request: patch });
237
+ if (!result.ok) return result;
238
+ const body = result.value;
239
+ if (!body || typeof body !== "object") return {
240
+ ok: false,
241
+ kind: "http",
242
+ detail: "bad result"
243
+ };
244
+ return {
245
+ ok: true,
246
+ value: null
247
+ };
248
+ }
249
+ /** 列出 skill 库(已安装 + 校验失败的文件夹)。 */
250
+ async function listSkillsViaHost(rpc) {
251
+ const result = await callPoster(rpc, POSTER_ENDPOINT.listSkills, {});
252
+ if (!result.ok) return result;
253
+ const body = result.value;
254
+ if (!body || typeof body !== "object") return {
255
+ ok: false,
256
+ kind: "http",
257
+ detail: "bad result"
258
+ };
259
+ if (!body.ok) return {
260
+ ok: false,
261
+ kind: "business",
262
+ detail: body.error?.message ?? body.error?.code
263
+ };
264
+ return {
265
+ ok: true,
266
+ value: {
267
+ skills: body.skills,
268
+ invalid: body.invalid
269
+ }
270
+ };
271
+ }
272
+ /** 上传 zip 安装/更新一个 skill;dataBase64 为 zip 字节的 base64。 */
273
+ async function installSkillViaHost(rpc, request) {
274
+ const result = await callPoster(rpc, POSTER_ENDPOINT.installSkill, { request });
275
+ if (!result.ok) return result;
276
+ const body = result.value;
277
+ if (!body || typeof body !== "object") return {
278
+ ok: false,
279
+ kind: "http",
280
+ detail: "bad result"
281
+ };
282
+ if (!body.ok) return {
283
+ ok: false,
284
+ kind: "business",
285
+ detail: body.error.message
286
+ };
287
+ return {
288
+ ok: true,
289
+ value: {
290
+ skill: body.skill,
291
+ updated: body.updated
292
+ }
293
+ };
294
+ }
295
+ /** 卸载(删除)一个 skill 文件夹(校验失败的文件夹名也可传)。 */
296
+ async function uninstallSkillViaHost(rpc, name) {
297
+ const result = await callPoster(rpc, POSTER_ENDPOINT.uninstallSkill, { request: { name } });
298
+ if (!result.ok) return result;
299
+ const body = result.value;
300
+ if (!body || typeof body !== "object") return {
301
+ ok: false,
302
+ kind: "http",
303
+ detail: "bad result"
304
+ };
305
+ if (!body.ok) return {
306
+ ok: false,
307
+ kind: "business",
308
+ detail: body.error?.message ?? body.error?.code
309
+ };
310
+ return {
311
+ ok: true,
312
+ value: null
313
+ };
314
+ }
315
+ /** 读某次工具调用的实时步骤 trace(渲染节点运行中轮询;未知 callId → value null)。 */
316
+ async function getCallTraceViaHost(rpc, callId) {
317
+ const result = await callPoster(rpc, POSTER_ENDPOINT.getCallTrace, { request: { callId } });
318
+ if (!result.ok) return result;
319
+ const body = result.value;
320
+ if (!body || typeof body !== "object") return {
321
+ ok: false,
322
+ kind: "http",
323
+ detail: "bad result"
324
+ };
325
+ return {
326
+ ok: true,
327
+ value: body.trace ?? null
328
+ };
329
+ }
330
+ /** 提交候选卡片上的用户选择;not-found 时返回值的 code 为 'not-found'。 */
331
+ async function answerSkillViaHost(rpc, request) {
332
+ const result = await callPoster(rpc, POSTER_ENDPOINT.answerSkill, { request });
333
+ if (!result.ok) return result;
334
+ const body = result.value;
335
+ if (!body || typeof body !== "object") return {
336
+ ok: false,
337
+ kind: "http",
338
+ detail: "bad result"
339
+ };
340
+ if (!body.ok) return {
341
+ ok: false,
342
+ kind: "business",
343
+ detail: body.error?.message ?? body.error?.code,
344
+ code: body.error?.code
345
+ };
346
+ return {
347
+ ok: true,
348
+ value: null
349
+ };
350
+ }
351
+ /** File → base64(分块避免参数栈溢出)。 */
352
+ async function fileToBase64(file) {
353
+ const buffer = await file.arrayBuffer();
354
+ const bytes = new Uint8Array(buffer);
355
+ let binary = "";
356
+ const CHUNK = 32768;
357
+ for (let index = 0; index < bytes.length; index += CHUNK) binary += String.fromCharCode(...bytes.subarray(index, index + CHUNK));
358
+ return btoa(binary);
359
+ }
360
+ //#endregion
361
+ //#region src/client/usePosterPanel.ts
362
+ /**
363
+ * 海报设计面板的数据流 hook:状态机 + 全部动作。
364
+ *
365
+ * 流程(配置持久化在 host 端 settings 文档):
366
+ * 1. 打开面板先经 host 拿配置 + skill 库列表;
367
+ * 2. Skill 库 tab:上传 zip 安装、按卡片浏览(带预览图)、卸载;
368
+ * 3. 顶部总开关(enabled):库内 ≥1 个合法 skill 才允许打开;打开后 host 半
369
+ * 才把海报工具/提示词注册进会话(门控见 host 半 src/gate.ts)。
370
+ *
371
+ * 千问 API Key 的配置由 dsh-qw-tool 插件负责,本插件不问。
372
+ */
373
+ /** 海报设计面板的数据流。 */
374
+ function usePosterPanel(api) {
375
+ const [status, setStatus] = (0, react.useState)({ kind: "loading" });
376
+ /** 海报业务总开关(持久化在 settings.enabled)。 */
377
+ const [enabled, setEnabled] = (0, react.useState)(false);
378
+ /** skill 库内容。 */
379
+ const [skills, setSkills] = (0, react.useState)([]);
380
+ const [invalidSkills, setInvalidSkills] = (0, react.useState)([]);
381
+ const [upload, setUpload] = (0, react.useState)({ kind: "idle" });
382
+ /** 正在卸载的 skill 名(按钮防重复点击)。 */
383
+ const [removing, setRemoving] = (0, react.useState)(void 0);
384
+ /** 经 host 刷新 skill 库列表。 */
385
+ const refreshSkills = (0, react.useCallback)(async () => {
386
+ const result = await api.listSkills();
387
+ if (result.ok) {
388
+ setSkills(result.value.skills);
389
+ setInvalidSkills(result.value.invalid);
390
+ }
391
+ return result;
392
+ }, [api]);
393
+ /** 打开面板:拿配置 + skill 库。 */
394
+ (0, react.useEffect)(() => {
395
+ let alive = true;
396
+ (async () => {
397
+ const [config, skillList] = await Promise.all([api.getConfig(), api.listSkills()]);
398
+ if (!alive) return;
399
+ if (config.ok) setEnabled(config.value.config.enabled);
400
+ setStatus({ kind: "idle" });
401
+ if (skillList.ok) {
402
+ setSkills(skillList.value.skills);
403
+ setInvalidSkills(skillList.value.invalid);
404
+ }
405
+ })();
406
+ return () => {
407
+ alive = false;
408
+ };
409
+ }, [api]);
410
+ /** 门控缺失项(开关可打开的前置条件)。 */
411
+ const missing = (0, react.useMemo)(() => {
412
+ const list = [];
413
+ if (skills.length === 0) list.push("skills");
414
+ return list;
415
+ }, [skills]);
416
+ return {
417
+ status,
418
+ enabled,
419
+ toggleEnabled: (0, react.useCallback)(() => {
420
+ if (!enabled && missing.length > 0) return;
421
+ const next = !enabled;
422
+ setEnabled(next);
423
+ api.saveConfig({ enabled: next });
424
+ }, [
425
+ api,
426
+ enabled,
427
+ missing
428
+ ]),
429
+ missing,
430
+ skills,
431
+ invalidSkills,
432
+ upload,
433
+ setUpload,
434
+ uploadSkill: (0, react.useCallback)(async (file, dataBase64) => {
435
+ setUpload({
436
+ kind: "busy",
437
+ fileName: file.name
438
+ });
439
+ const result = await api.installSkill({
440
+ fileName: file.name,
441
+ dataBase64
442
+ });
443
+ if (result.ok) {
444
+ setUpload({
445
+ kind: "done",
446
+ message: result.value.updated ? `已更新「${result.value.skill.title}」` : `已安装「${result.value.skill.title}」`
447
+ });
448
+ await refreshSkills();
449
+ } else setUpload({
450
+ kind: "error",
451
+ message: result.detail ?? "安装失败"
452
+ });
453
+ }, [api, refreshSkills]),
454
+ removeSkill: (0, react.useCallback)(async (name) => {
455
+ setRemoving(name);
456
+ const result = await api.uninstallSkill(name);
457
+ if (!result.ok) setUpload({
458
+ kind: "error",
459
+ message: result.detail ?? `删除 ${name} 失败`
460
+ });
461
+ await refreshSkills();
462
+ setRemoving(void 0);
463
+ }, [api, refreshSkills]),
464
+ removing,
465
+ refreshSkills
466
+ };
467
+ }
468
+ const cssText$1 = ".Hr0pPW_section{flex-direction:column;height:100%;min-height:0;display:flex}.Hr0pPW_header{flex:none;padding:16px 16px 0}.Hr0pPW_title{color:var(--dsw-alias-label-primary);margin:0;font-size:18px;font-weight:600}.Hr0pPW_scroll{flex-direction:column;flex:1;gap:16px;min-height:0;padding:16px;display:flex;overflow-y:auto}.Hr0pPW_footer{border-top:1px solid var(--dsw-alias-border-l2);flex:none;align-items:center;gap:12px;padding:12px 16px;display:flex}.Hr0pPW_footerToggle{flex-direction:column;flex:1;gap:4px;min-width:0;display:flex}.Hr0pPW_field{flex-direction:column;gap:6px;display:flex}.Hr0pPW_disabledSection{flex-direction:column;gap:12px;padding:16px;display:flex}.Hr0pPW_intro{color:var(--dsw-alias-label-secondary);margin:0;font-size:13px;line-height:1.6}.Hr0pPW_row{align-items:center;gap:8px;display:flex}.Hr0pPW_button{color:var(--dsw-alias-label-primary);border:1px solid var(--dsw-alias-border-l2);cursor:pointer;white-space:nowrap;background:0 0;border-radius:8px;padding:6px 14px;font-size:13px}.Hr0pPW_button:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}.Hr0pPW_button:disabled{opacity:.5;cursor:default}.Hr0pPW_command{color:var(--dsw-alias-label-primary);background:var(--dsw-alias-interactive-bg-hover);border:1px solid var(--dsw-alias-border-l2);user-select:all;border-radius:6px;padding:4px 8px;font-size:12px}.Hr0pPW_label{color:var(--dsw-alias-label-primary);font-size:13px;font-weight:500}.Hr0pPW_help{color:var(--dsw-alias-label-tertiary);font-size:12px}.Hr0pPW_link{color:inherit}.Hr0pPW_keyRow{align-items:center;gap:8px;width:100%;display:flex}.Hr0pPW_keyInput{flex:1;min-width:0;display:flex}.Hr0pPW_keyInput input{width:100%}.Hr0pPW_status{color:var(--dsw-alias-label-primary);align-items:center;gap:8px;font-size:13px;display:flex}.Hr0pPW_note{color:var(--dsw-alias-label-tertiary);margin:0;font-size:12px}.Hr0pPW_switch{cursor:pointer;align-items:center;gap:8px;display:flex}.Hr0pPW_switch input{width:16px;height:16px;accent-color:var(--dsw-alias-label-primary);cursor:pointer}.Hr0pPW_switch input:disabled{cursor:not-allowed;opacity:.5}.Hr0pPW_skillText{flex-direction:column;flex:1;gap:2px;min-width:0;display:flex}.Hr0pPW_tabs{border-bottom:1px solid var(--dsw-alias-border-l2);gap:4px;margin-top:12px;display:flex}.Hr0pPW_tab,.Hr0pPW_tabActive{appearance:none;cursor:pointer;color:var(--dsw-alias-label-secondary);background:0 0;border:none;border-bottom:2px solid #0000;margin-bottom:-1px;padding:8px 12px;font-size:13px}.Hr0pPW_tab:hover{color:var(--dsw-alias-label-primary)}.Hr0pPW_tabActive{color:var(--dsw-alias-label-primary);border-bottom-color:var(--dsw-alias-label-primary);font-weight:600}.Hr0pPW_comboCard{border:1px solid var(--dsw-alias-border-l2);border-radius:10px;flex-direction:column;gap:10px;padding:10px 12px;display:flex}.Hr0pPW_comboLabel{color:var(--dsw-alias-label-primary);font-size:13px;font-weight:600}.Hr0pPW_comboParams{border-top:1px solid var(--dsw-alias-border-l2);flex-direction:column;gap:8px;padding-top:10px;display:flex}.Hr0pPW_paramRow{cursor:pointer;align-items:flex-start;gap:10px;display:flex}.Hr0pPW_paramRow input{width:16px;height:16px;accent-color:var(--dsw-alias-label-primary);cursor:pointer;margin-top:1px}.Hr0pPW_paramRowDisabled{opacity:.5;cursor:not-allowed;}.Hr0pPW_paramRowDisabled input{cursor:not-allowed}.Hr0pPW_skillsHeadRow{justify-content:space-between;align-items:center;gap:8px;display:flex}.Hr0pPW_uploadRow{align-items:center;gap:8px;display:flex}.Hr0pPW_uploadOk{color:var(--dsw-alias-label-secondary);font-size:12px}.Hr0pPW_uploadError{color:var(--dsw-alias-label-error,#d03030);font-size:12px}.Hr0pPW_skillGrid{grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;display:grid}.Hr0pPW_skillCard{appearance:none;border:1px solid var(--dsw-alias-border-l2);font:inherit;color:inherit;text-align:left;cursor:pointer;background:0 0;border-radius:10px;flex-direction:column;padding:0;display:flex;overflow:hidden}.Hr0pPW_skillCard:hover{border-color:var(--dsw-alias-label-tertiary)}.Hr0pPW_skillPreview{aspect-ratio:4/3;object-fit:cover;background:var(--dsw-alias-bg-elevated,#7f7f7f14);width:100%}.Hr0pPW_skillPreviewPlaceholder{aspect-ratio:4/3;width:100%;color:var(--dsw-alias-label-tertiary);background:var(--dsw-alias-bg-elevated,#7f7f7f14);justify-content:center;align-items:center;font-size:20px;display:flex}.Hr0pPW_skillCardTitleRow{align-items:center;gap:6px;padding:8px 10px;display:flex}.Hr0pPW_bundledTag{color:var(--dsw-alias-label-tertiary);border:1px solid var(--dsw-alias-border-l2);border-radius:999px;padding:1px 6px;font-size:11px}.Hr0pPW_skillName{color:var(--dsw-alias-label-tertiary);font-family:monospace;font-size:11px}.Hr0pPW_invalidRow{border:1px dashed var(--dsw-alias-border-l2);border-radius:10px;align-items:center;gap:10px;padding:10px 12px;display:flex}.Hr0pPW_carousel{background:var(--dsw-alias-bg-elevated,#7f7f7f14);border-radius:8px;height:320px;position:relative;overflow:hidden}.Hr0pPW_carouselImage{object-fit:contain;width:100%;height:100%;display:block}.Hr0pPW_carouselImageSingle{object-fit:contain;background:var(--dsw-alias-bg-elevated,#7f7f7f14);border-radius:8px;width:100%;height:320px;display:block}.Hr0pPW_carouselArrow,.Hr0pPW_carouselArrowRight{appearance:none;cursor:pointer;width:28px;height:28px;color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-elevated,#7f7f7f8c);border:none;border-radius:999px;justify-content:center;align-items:center;font-size:18px;line-height:1;display:flex;position:absolute;top:50%;transform:translateY(-50%)}.Hr0pPW_carouselArrow{left:8px}.Hr0pPW_carouselArrowRight{right:8px}.Hr0pPW_carouselArrow:disabled,.Hr0pPW_carouselArrowRight:disabled{opacity:.4;cursor:not-allowed}.Hr0pPW_carouselDots{justify-content:center;gap:6px;display:flex;position:absolute;bottom:8px;left:0;right:0}.Hr0pPW_carouselDot,.Hr0pPW_carouselDotActive{appearance:none;cursor:pointer;background:var(--dsw-alias-label-tertiary);opacity:.5;border:none;border-radius:999px;width:8px;height:8px;padding:0}.Hr0pPW_carouselDotActive{opacity:1;background:var(--dsw-alias-label-primary)}.Hr0pPW_modalPreviewPlaceholder{height:160px;color:var(--dsw-alias-label-tertiary);background:var(--dsw-alias-bg-elevated,#7f7f7f14);border-radius:8px;justify-content:center;align-items:center;font-size:20px;display:flex}.Hr0pPW_modalMeta{flex-direction:column;gap:6px;margin-top:12px;display:flex}.Hr0pPW_modalMetaRow{color:var(--dsw-alias-label-secondary);align-items:baseline;gap:8px;min-width:0;font-size:12px;display:flex}.Hr0pPW_modalMetaLabel{color:var(--dsw-alias-label-tertiary);flex:none}";
469
+ var PosterSection_module_css_default = {
470
+ "bundledTag": "Hr0pPW_bundledTag",
471
+ "button": "Hr0pPW_button",
472
+ "carousel": "Hr0pPW_carousel",
473
+ "carouselArrow": "Hr0pPW_carouselArrow",
474
+ "carouselArrowRight": "Hr0pPW_carouselArrowRight",
475
+ "carouselDot": "Hr0pPW_carouselDot",
476
+ "carouselDotActive": "Hr0pPW_carouselDotActive",
477
+ "carouselDots": "Hr0pPW_carouselDots",
478
+ "carouselImage": "Hr0pPW_carouselImage",
479
+ "carouselImageSingle": "Hr0pPW_carouselImageSingle",
480
+ "comboCard": "Hr0pPW_comboCard",
481
+ "comboLabel": "Hr0pPW_comboLabel",
482
+ "comboParams": "Hr0pPW_comboParams",
483
+ "command": "Hr0pPW_command",
484
+ "disabledSection": "Hr0pPW_disabledSection",
485
+ "field": "Hr0pPW_field",
486
+ "footer": "Hr0pPW_footer",
487
+ "footerToggle": "Hr0pPW_footerToggle",
488
+ "header": "Hr0pPW_header",
489
+ "help": "Hr0pPW_help",
490
+ "intro": "Hr0pPW_intro",
491
+ "invalidRow": "Hr0pPW_invalidRow",
492
+ "keyInput": "Hr0pPW_keyInput",
493
+ "keyRow": "Hr0pPW_keyRow",
494
+ "label": "Hr0pPW_label",
495
+ "link": "Hr0pPW_link",
496
+ "modalMeta": "Hr0pPW_modalMeta",
497
+ "modalMetaLabel": "Hr0pPW_modalMetaLabel",
498
+ "modalMetaRow": "Hr0pPW_modalMetaRow",
499
+ "modalPreviewPlaceholder": "Hr0pPW_modalPreviewPlaceholder",
500
+ "note": "Hr0pPW_note",
501
+ "paramRow": "Hr0pPW_paramRow",
502
+ "paramRowDisabled": "Hr0pPW_paramRowDisabled",
503
+ "row": "Hr0pPW_row",
504
+ "scroll": "Hr0pPW_scroll",
505
+ "section": "Hr0pPW_section",
506
+ "skillCard": "Hr0pPW_skillCard",
507
+ "skillCardTitleRow": "Hr0pPW_skillCardTitleRow",
508
+ "skillGrid": "Hr0pPW_skillGrid",
509
+ "skillName": "Hr0pPW_skillName",
510
+ "skillPreview": "Hr0pPW_skillPreview",
511
+ "skillPreviewPlaceholder": "Hr0pPW_skillPreviewPlaceholder",
512
+ "skillText": "Hr0pPW_skillText",
513
+ "skillsHeadRow": "Hr0pPW_skillsHeadRow",
514
+ "status": "Hr0pPW_status",
515
+ "switch": "Hr0pPW_switch",
516
+ "tab": "Hr0pPW_tab",
517
+ "tabActive": "Hr0pPW_tabActive",
518
+ "tabs": "Hr0pPW_tabs",
519
+ "title": "Hr0pPW_title",
520
+ "uploadError": "Hr0pPW_uploadError",
521
+ "uploadOk": "Hr0pPW_uploadOk",
522
+ "uploadRow": "Hr0pPW_uploadRow"
523
+ };
524
+ //#endregion
525
+ //#region src/client/PosterSection.tsx
526
+ /**
527
+ * 海报设计设置面板(settings.section 条目):纯渲染层。
528
+ * 数据流(状态机/动作)在 ./usePosterPanel.ts,样式在 ./PosterSection.module.css
529
+ * (CSS Modules:构建期哈希类名,文本经入口 effect 注入),数据访问在 ./api.ts。
530
+ *
531
+ * 布局:标题 + Skill 库 tab 固定顶部;总开关固定在 root footer(下方展示
532
+ * 启用条件缺失提示);滚动区为 Skill 库:zip 上传安装 + 两列 skill 卡片网格
533
+ * (点击卡片弹详情 modal:全部预览图/说明/元信息/删除操作)。
534
+ * 千问 API Key 的配置由 dsh-qw-tool 插件负责,本面板不问。
535
+ */
536
+ /** 门控缺失项的词典 key。 */
537
+ const MISSING_LABEL_KEY = { skills: "missingSkills" };
538
+ /** 海报设计设置页。 */
539
+ function PosterSection(props) {
540
+ const { t, api } = props;
541
+ const { status, enabled, toggleEnabled, missing, skills, invalidSkills, upload, setUpload, uploadSkill, removeSkill, removing } = usePosterPanel(api);
542
+ /** skill 详情 modal 里当前展示的 skill。 */
543
+ const [selectedSkill, setSelectedSkill] = (0, react.useState)(void 0);
544
+ const fileInputRef = (0, react.useRef)(null);
545
+ status.kind;
546
+ const gateReady = missing.length === 0;
547
+ const missingText = missing.map((key) => t(MISSING_LABEL_KEY[key])).join("; ");
548
+ const toggleHint = enabled ? gateReady ? t("enabledOn") : `${t("enabledButIncomplete")} ${missingText}` : gateReady ? t("enabledOff") : `${t("gateIncomplete")} ${missingText}`;
549
+ /** 选择 zip 文件 → base64 → 经 host 安装。 */
550
+ const onFilePicked = async (file) => {
551
+ if (!file) return;
552
+ try {
553
+ const dataBase64 = await fileToBase64(file);
554
+ await uploadSkill(file, dataBase64);
555
+ } catch (error) {
556
+ setUpload({
557
+ kind: "error",
558
+ message: error instanceof Error ? error.message : String(error)
559
+ });
560
+ }
561
+ };
562
+ /** 从详情 modal 删除 skill(内置的不可删,按钮不出现)。 */
563
+ const onRemoveFromModal = (name) => {
564
+ setSelectedSkill(void 0);
565
+ removeSkill(name);
566
+ };
567
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
568
+ className: PosterSection_module_css_default.section,
569
+ children: [
570
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
571
+ className: PosterSection_module_css_default.header,
572
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("h2", {
573
+ className: PosterSection_module_css_default.title,
574
+ children: t("title")
575
+ })
576
+ }),
577
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
578
+ className: PosterSection_module_css_default.scroll,
579
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
580
+ className: PosterSection_module_css_default.field,
581
+ children: [
582
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
583
+ className: PosterSection_module_css_default.skillsHeadRow,
584
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
585
+ className: PosterSection_module_css_default.label,
586
+ children: t("skillsTitle")
587
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
588
+ className: PosterSection_module_css_default.uploadRow,
589
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
590
+ variant: "primary",
591
+ size: "sm",
592
+ disabled: upload.kind === "busy",
593
+ onClick: () => fileInputRef.current?.click(),
594
+ children: upload.kind === "busy" ? t("uploadBusy", { fileName: upload.fileName }) : t("uploadButton")
595
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
596
+ ref: fileInputRef,
597
+ type: "file",
598
+ accept: ".zip,application/zip",
599
+ hidden: true,
600
+ onChange: (event) => {
601
+ const file = event.currentTarget.files?.[0];
602
+ event.currentTarget.value = "";
603
+ onFilePicked(file);
604
+ }
605
+ })]
606
+ })]
607
+ }),
608
+ upload.kind === "done" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
609
+ className: PosterSection_module_css_default.uploadOk,
610
+ children: t("uploadDoneOk", { message: upload.message })
611
+ }),
612
+ upload.kind === "error" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
613
+ className: PosterSection_module_css_default.uploadError,
614
+ children: t("uploadFailed", { message: upload.message })
615
+ }),
616
+ skills.length === 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
617
+ className: PosterSection_module_css_default.note,
618
+ children: t("skillEmpty")
619
+ }),
620
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
621
+ className: PosterSection_module_css_default.skillGrid,
622
+ children: skills.map((skill) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
623
+ type: "button",
624
+ className: PosterSection_module_css_default.skillCard,
625
+ onClick: () => setSelectedSkill(skill),
626
+ children: [skill.previews.length > 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("img", {
627
+ className: PosterSection_module_css_default.skillPreview,
628
+ src: skill.previews[0],
629
+ alt: t("skillPreviewAlt", { title: skill.title }),
630
+ loading: "lazy",
631
+ decoding: "async"
632
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
633
+ className: PosterSection_module_css_default.skillPreviewPlaceholder,
634
+ children: "?"
635
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
636
+ className: PosterSection_module_css_default.skillCardTitleRow,
637
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
638
+ className: PosterSection_module_css_default.label,
639
+ children: skill.title
640
+ }), skill.bundled && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
641
+ className: PosterSection_module_css_default.bundledTag,
642
+ children: t("skillBundled")
643
+ })]
644
+ })]
645
+ }, skill.name))
646
+ })
647
+ ]
648
+ }), invalidSkills.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
649
+ className: PosterSection_module_css_default.field,
650
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
651
+ className: PosterSection_module_css_default.label,
652
+ children: t("invalidTitle")
653
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
654
+ className: PosterSection_module_css_default.help,
655
+ children: t("invalidHint")
656
+ })]
657
+ }), invalidSkills.map((entry) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
658
+ className: PosterSection_module_css_default.invalidRow,
659
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
660
+ className: PosterSection_module_css_default.skillText,
661
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
662
+ className: PosterSection_module_css_default.label,
663
+ children: entry.folder
664
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
665
+ className: PosterSection_module_css_default.help,
666
+ children: entry.reason
667
+ })]
668
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
669
+ variant: "ghost",
670
+ size: "sm",
671
+ disabled: removing === entry.folder,
672
+ onClick: () => void removeSkill(entry.folder),
673
+ children: t("invalidRemove")
674
+ })]
675
+ }, entry.folder))] })]
676
+ }),
677
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
678
+ className: PosterSection_module_css_default.footer,
679
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
680
+ className: PosterSection_module_css_default.footerToggle,
681
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
682
+ className: PosterSection_module_css_default.switch,
683
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
684
+ type: "checkbox",
685
+ checked: enabled,
686
+ disabled: !enabled && !gateReady,
687
+ onChange: () => toggleEnabled()
688
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
689
+ className: PosterSection_module_css_default.label,
690
+ children: t("enableLabel")
691
+ })]
692
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
693
+ className: PosterSection_module_css_default.help,
694
+ children: toggleHint
695
+ })]
696
+ })
697
+ }),
698
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Modal, {
699
+ open: selectedSkill !== void 0,
700
+ onClose: () => setSelectedSkill(void 0),
701
+ title: selectedSkill?.title ?? "",
702
+ closeLabel: t("close"),
703
+ description: selectedSkill?.description,
704
+ footer: selectedSkill === void 0 ? void 0 : selectedSkill.bundled ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
705
+ className: PosterSection_module_css_default.help,
706
+ children: t("skillBundledLocked")
707
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
708
+ variant: "ghost",
709
+ size: "sm",
710
+ disabled: removing === selectedSkill.name,
711
+ onClick: () => onRemoveFromModal(selectedSkill.name),
712
+ children: t("skillRemove")
713
+ }),
714
+ children: selectedSkill !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(PreviewCarousel, {
715
+ urls: selectedSkill.previews,
716
+ alt: t("skillPreviewAlt", { title: selectedSkill.title }),
717
+ prevLabel: t("carouselPrev"),
718
+ nextLabel: t("carouselNext")
719
+ }), selectedSkill.whenToUse !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
720
+ className: PosterSection_module_css_default.modalMeta,
721
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
722
+ className: PosterSection_module_css_default.modalMetaRow,
723
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
724
+ className: PosterSection_module_css_default.modalMetaLabel,
725
+ children: t("skillWhenToUseLabel")
726
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: selectedSkill.whenToUse })]
727
+ })
728
+ })] })
729
+ })
730
+ ]
731
+ });
732
+ }
733
+ /**
734
+ * skill 预览图轮播:单图直出;多图时左右箭头切换 + 底部圆点指示。
735
+ */
736
+ function PreviewCarousel(props) {
737
+ const { urls, alt, prevLabel, nextLabel } = props;
738
+ const [index, setIndex] = (0, react.useState)(0);
739
+ if (urls.length === 0) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
740
+ className: PosterSection_module_css_default.modalPreviewPlaceholder,
741
+ children: "?"
742
+ });
743
+ if (urls.length === 1) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("img", {
744
+ className: PosterSection_module_css_default.carouselImageSingle,
745
+ src: urls[0],
746
+ alt
747
+ });
748
+ const current = urls[Math.min(index, urls.length - 1)];
749
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
750
+ className: PosterSection_module_css_default.carousel,
751
+ children: [
752
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("img", {
753
+ className: PosterSection_module_css_default.carouselImage,
754
+ src: current,
755
+ alt
756
+ }, current),
757
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
758
+ type: "button",
759
+ className: PosterSection_module_css_default.carouselArrow,
760
+ "aria-label": prevLabel,
761
+ disabled: index === 0,
762
+ onClick: () => setIndex((value) => value - 1),
763
+ children: "‹"
764
+ }),
765
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
766
+ type: "button",
767
+ className: PosterSection_module_css_default.carouselArrowRight,
768
+ "aria-label": nextLabel,
769
+ disabled: index >= urls.length - 1,
770
+ onClick: () => setIndex((value) => value + 1),
771
+ children: "›"
772
+ }),
773
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
774
+ className: PosterSection_module_css_default.carouselDots,
775
+ children: urls.map((url, dotIndex) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
776
+ type: "button",
777
+ className: dotIndex === index ? PosterSection_module_css_default.carouselDotActive : PosterSection_module_css_default.carouselDot,
778
+ "aria-label": `${dotIndex + 1}`,
779
+ onClick: () => setIndex(dotIndex)
780
+ }, url))
781
+ })
782
+ ]
783
+ });
784
+ }
785
+ //#endregion
786
+ //#region src/client/PosterDisabledSection.tsx
787
+ /**
788
+ * 版本不兼容时的设置面板(settings.section 条目):host 半版本门禁软禁用后,
789
+ * 业务能力全部不可用,本面板代替正常面板向用户说明原因与处置(装回受支持
790
+ * 版本的 harness,或等待兼容版本)。原因文本与推荐安装版本由 host 半经
791
+ * index 注入的全局标记带来(../shared/disabled-flag.ts),经 inject props
792
+ * 传入,不在浏览器侧重复版本判断。
793
+ */
794
+ /** 复制成功反馈的显示时长(ms)。 */
795
+ const COPIED_FEEDBACK_MS = 2e3;
796
+ /** 版本不兼容说明页(含安装命令与复制按钮)。 */
797
+ function PosterDisabledSection(props) {
798
+ const { t, reason, min, max, installVersion } = props;
799
+ const [copied, setCopied] = (0, react.useState)(false);
800
+ const installCommand = `npm install -g @deepseek-ai/dsh@${installVersion}`;
801
+ const copyCommand = async () => {
802
+ try {
803
+ await navigator.clipboard.writeText(installCommand);
804
+ setCopied(true);
805
+ setTimeout(() => setCopied(false), COPIED_FEEDBACK_MS);
806
+ } catch (error) {
807
+ console.warn("[dsh-post-gen] copy install command failed:", error);
808
+ }
809
+ };
810
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
811
+ className: PosterSection_module_css_default.disabledSection,
812
+ children: [
813
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("h2", {
814
+ className: PosterSection_module_css_default.title,
815
+ children: t("title")
816
+ }),
817
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
818
+ className: PosterSection_module_css_default.intro,
819
+ children: t("disabledTitle")
820
+ }),
821
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
822
+ className: PosterSection_module_css_default.intro,
823
+ children: reason !== "" ? reason : t("disabledFallback")
824
+ }),
825
+ min !== "" && max !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
826
+ className: PosterSection_module_css_default.intro,
827
+ children: t("disabledWindow", {
828
+ min,
829
+ max
830
+ })
831
+ }),
832
+ installVersion !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("p", {
833
+ className: PosterSection_module_css_default.intro,
834
+ children: [t("disabledInstallLabel"), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
835
+ className: PosterSection_module_css_default.row,
836
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("code", {
837
+ className: PosterSection_module_css_default.command,
838
+ children: installCommand
839
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
840
+ type: "button",
841
+ className: PosterSection_module_css_default.button,
842
+ onClick: () => void copyCommand(),
843
+ children: copied ? t("disabledCopied") : t("disabledCopy")
844
+ })]
845
+ })]
846
+ }),
847
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
848
+ className: PosterSection_module_css_default.intro,
849
+ children: t("disabledHint")
850
+ })
851
+ ]
852
+ });
853
+ }
854
+ //#endregion
855
+ //#region src/shared/poster-trace.ts
856
+ function str(value) {
857
+ return typeof value === "string" && value !== "" ? value : void 0;
858
+ }
859
+ function num(value) {
860
+ return typeof value === "number" && Number.isFinite(value) ? value : void 0;
861
+ }
862
+ /** 宽容解析 skill 库扫描 trace。 */
863
+ function parseSkillsTrace(meta) {
864
+ if (!meta || typeof meta !== "object") return void 0;
865
+ const t = meta;
866
+ if (t.kind !== "poster-skills") return void 0;
867
+ const trace = { kind: "poster-skills" };
868
+ if (t.scanned && typeof t.scanned === "object") {
869
+ const s = t.scanned;
870
+ const count = num(s.count);
871
+ if (count !== void 0) trace.scanned = {
872
+ count,
873
+ invalid: num(s.invalid) ?? 0,
874
+ ...num(s.durationMs) !== void 0 ? { durationMs: num(s.durationMs) } : {}
875
+ };
876
+ }
877
+ if (Array.isArray(t.catalog)) trace.catalog = t.catalog.map((entry) => {
878
+ if (!entry || typeof entry !== "object") return void 0;
879
+ const e = entry;
880
+ const name = str(e.name);
881
+ if (name === void 0) return void 0;
882
+ return {
883
+ name,
884
+ title: str(e.title) ?? name,
885
+ styleTags: Array.isArray(e.styleTags) ? e.styleTags.filter((tag) => typeof tag === "string") : []
886
+ };
887
+ }).filter((entry) => entry !== void 0);
888
+ return trace;
889
+ }
890
+ /** 宽容解析候选点选 trace。 */
891
+ function parsePickTrace(meta) {
892
+ if (!meta || typeof meta !== "object") return void 0;
893
+ const t = meta;
894
+ if (t.kind !== "poster-pick") return void 0;
895
+ const params = t.params ?? {};
896
+ const trace = {
897
+ kind: "poster-pick",
898
+ params: {
899
+ candidates: Array.isArray(params.candidates) ? params.candidates.map((entry) => {
900
+ if (!entry || typeof entry !== "object") return void 0;
901
+ const e = entry;
902
+ const name = str(e.name);
903
+ if (name === void 0) return void 0;
904
+ return {
905
+ name,
906
+ reason: str(e.reason) ?? "",
907
+ ...str(e.title) !== void 0 ? { title: str(e.title) } : {}
908
+ };
909
+ }).filter((entry) => entry !== void 0) : [],
910
+ ...str(params.question) !== void 0 ? { question: str(params.question) } : {}
911
+ }
912
+ };
913
+ if (Array.isArray(t.options)) trace.options = t.options.map((entry) => {
914
+ if (!entry || typeof entry !== "object") return void 0;
915
+ const e = entry;
916
+ const name = str(e.name);
917
+ const title = str(e.title);
918
+ if (name === void 0 || title === void 0) return void 0;
919
+ return {
920
+ name,
921
+ title,
922
+ reason: str(e.reason) ?? "",
923
+ previews: Array.isArray(e.previews) ? e.previews.filter((p) => typeof p === "string") : [],
924
+ ...str(e.prompt) !== void 0 ? { prompt: str(e.prompt) } : {}
925
+ };
926
+ }).filter((entry) => entry !== void 0);
927
+ if (t.answer && typeof t.answer === "object") {
928
+ const a = t.answer;
929
+ const chosenSkill = str(a.chosenSkill);
930
+ const chosenTitle = str(a.chosenTitle);
931
+ if (chosenSkill !== void 0 && chosenTitle !== void 0) trace.answer = {
932
+ chosenSkill,
933
+ chosenTitle,
934
+ ...str(a.custom) !== void 0 ? { custom: str(a.custom) } : {}
935
+ };
936
+ }
937
+ return trace;
938
+ }
939
+ //#endregion
940
+ //#region src/client/usePosterTrace.ts
941
+ /**
942
+ * 渲染节点的共享 hook 与小工具(design §5.4 数据源优先级):
943
+ * - settled('kind' in block)→ 一律从 block.meta 里的 trace 渲染
944
+ * (刷新/重开/压缩后一致);
945
+ * - running → 以 props 里的 callId 轮询 poster/getCallTrace(~1s)增量
946
+ * 补齐后续步骤;trace RPC 只是加速器,不作为回放数据源。
947
+ */
948
+ /**
949
+ * 取当前调用的 trace:settled 从 meta 解析(durable),running 轮询 RPC。
950
+ * @param parse - 宽容解析器(结构不符返回 undefined,该字段对应步骤不渲染)。
951
+ */
952
+ function usePosterTrace(block, callId, api, parse) {
953
+ const settled = "kind" in block && block.kind === "tool-result";
954
+ const metaTrace = "kind" in block ? parse(block.meta) : void 0;
955
+ const [live, setLive] = (0, react.useState)(void 0);
956
+ (0, react.useEffect)(() => {
957
+ if (settled) return;
958
+ let alive = true;
959
+ const tick = async () => {
960
+ const result = await api.getCallTrace(callId);
961
+ if (!alive || !result.ok || result.value === null) return;
962
+ const parsed = parse(result.value);
963
+ if (parsed !== void 0) setLive(parsed);
964
+ };
965
+ tick();
966
+ const timer = setInterval(() => void tick(), 1e3);
967
+ return () => {
968
+ alive = false;
969
+ clearInterval(timer);
970
+ };
971
+ }, [
972
+ settled,
973
+ callId,
974
+ api,
975
+ parse
976
+ ]);
977
+ return metaTrace ?? live;
978
+ }
979
+ /** 从 running call / settled result 里取工具参数(tool/call arguments)。 */
980
+ function argsOf(block) {
981
+ const raw = "kind" in block ? block.call?.argsRaw : block.argsRaw;
982
+ if (typeof raw !== "string" || raw === "") return {};
983
+ try {
984
+ const parsed = JSON.parse(raw);
985
+ return parsed !== null && typeof parsed === "object" && !Array.isArray(parsed) ? parsed : {};
986
+ } catch {
987
+ return {};
988
+ }
989
+ }
990
+ /** 工具结果的纯文本(错误态展示用)。 */
991
+ function resultTextOf(content) {
992
+ return content.filter((block) => !!block && typeof block === "object" && block.type === "text").map((block) => block.text).join("");
993
+ }
994
+ /** 毫秒 → "12.3s" 展示。 */
995
+ function formatDuration(ms) {
996
+ return `${(ms / 1e3).toFixed(1)}s`;
997
+ }
998
+ const cssText = ".qqGY4a_node{border:1px solid var(--dsw-alias-border-l2);border-radius:12px;flex-direction:column;gap:10px;padding:12px;display:flex}.qqGY4a_head{justify-content:space-between;align-items:baseline;gap:8px;display:flex}.qqGY4a_title{color:var(--dsw-alias-label-primary);font-size:13px;font-weight:600}.qqGY4a_status{color:var(--dsw-alias-label-tertiary);border:1px solid var(--dsw-alias-border-l2);white-space:nowrap;border-radius:999px;padding:1px 8px;font-size:11px}.qqGY4a_statusFailed{color:var(--dsw-alias-label-primary);border-color:var(--dsw-alias-border-l1)}.qqGY4a_headActions{align-items:center;gap:6px;display:flex}.qqGY4a_collapseButton,.qqGY4a_inspectButton{border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-secondary);cursor:pointer;white-space:nowrap;background:0 0;border-radius:999px;padding:1px 8px;font-size:11px}.qqGY4a_inspectButton:hover{color:var(--dsw-alias-label-primary);border-color:var(--dsw-alias-label-primary)}.qqGY4a_step{flex-direction:column;gap:6px;display:flex}.qqGY4a_stepTitle{color:var(--dsw-alias-label-secondary);font-size:12px;font-weight:600}.qqGY4a_kv{align-items:baseline;gap:8px;font-size:12px;display:flex}.qqGY4a_catalogList{flex-wrap:wrap;gap:4px 6px;max-height:240px;display:flex;overflow-y:auto}.qqGY4a_catalogList .qqGY4a_chip{margin-right:0}.qqGY4a_promptBox{min-width:0;max-height:100px;color:var(--dsw-alias-label-primary);white-space:pre-wrap;word-break:break-word;flex:1;font-size:12px;line-height:1.5;overflow-y:auto}.qqGY4a_promptNeg{margin-top:6px}.qqGY4a_kvKey{color:var(--dsw-alias-label-tertiary);white-space:nowrap;flex-shrink:0}.qqGY4a_kvValue{color:var(--dsw-alias-label-primary);word-break:break-word;white-space:pre-wrap}.qqGY4a_chip{color:var(--dsw-alias-label-secondary);border:1px solid var(--dsw-alias-border-l2);border-radius:6px;margin-right:4px;padding:0 6px;font-size:11px;display:inline-block}.qqGY4a_note{color:var(--dsw-alias-label-secondary);white-space:pre-wrap;word-break:break-word;font-size:12px}.qqGY4a_error{color:var(--dsw-alias-label-primary);white-space:pre-wrap;word-break:break-word;font-size:13px}.qqGY4a_detail{border:1px solid var(--dsw-alias-border-l2);border-radius:8px;padding:6px 8px}.qqGY4a_detail>summary{color:var(--dsw-alias-label-secondary);cursor:pointer;user-select:none;font-size:12px}.qqGY4a_pre{color:var(--dsw-alias-label-secondary);white-space:pre-wrap;word-break:break-word;background:var(--dsw-alias-background-secondary,#7f7f7f14);border-radius:6px;max-height:220px;margin:6px 0 0;padding:6px;font-size:11px;line-height:1.5;overflow:auto}.qqGY4a_imageGrid{flex-wrap:wrap;gap:8px;display:flex}.qqGY4a_imageFrame{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-background-secondary,#7f7f7f14);cursor:zoom-in;border-radius:8px;justify-content:center;align-items:center;width:120px;height:120px;padding:0;display:flex;overflow:hidden}.qqGY4a_imageFrameResult{width:100%;height:360px}.qqGY4a_imageFramePlain{cursor:zoom-in;background:0 0;border:none;border-radius:0;justify-content:center;align-items:center;width:100%;height:150px;padding:0;display:flex;overflow:hidden}.qqGY4a_optionCarousel{position:relative}.qqGY4a_optionCarouselArrow,.qqGY4a_optionCarouselArrowRight{appearance:none;cursor:pointer;width:24px;height:24px;color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-elevated,#7f7f7f73);border:none;border-radius:999px;justify-content:center;align-items:center;font-size:16px;line-height:1;display:flex;position:absolute;top:50%;transform:translateY(-50%)}.qqGY4a_optionCarouselArrow{left:4px}.qqGY4a_optionCarouselArrowRight{right:4px}.qqGY4a_optionCarouselArrow:disabled,.qqGY4a_optionCarouselArrowRight:disabled{opacity:.4;cursor:not-allowed}.qqGY4a_optionCarouselDots{justify-content:center;gap:5px;display:flex;position:absolute;bottom:6px;left:0;right:0}.qqGY4a_optionCarouselDot,.qqGY4a_optionCarouselDotActive{appearance:none;cursor:pointer;background:var(--dsw-alias-label-tertiary);opacity:.5;border:none;border-radius:999px;width:7px;height:7px;padding:0}.qqGY4a_optionCarouselDotActive{opacity:1;background:var(--dsw-alias-label-primary)}.qqGY4a_imageFrame img{object-fit:contain;width:100%;height:100%;display:block}.qqGY4a_imageState{color:var(--dsw-alias-label-tertiary);text-align:center;padding:4px;font-size:11px}.qqGY4a_lightboxDialog{width:auto;max-width:92vw;max-height:92vh;box-shadow:none;background:0 0;border:none;border-radius:0;gap:0;padding:0;overflow:visible}.qqGY4a_lightboxContent{justify-content:center;align-items:center;display:flex}.qqGY4a_lightboxImage{object-fit:contain;border-radius:8px;max-width:92vw;max-height:92vh;display:block}.qqGY4a_lightboxClose{color:#fff;cursor:pointer;background:#0000008c;border:none;border-radius:999px;justify-content:center;align-items:center;width:28px;height:28px;display:flex;position:fixed;top:16px;right:16px}.qqGY4a_optionGrid{grid-template-columns:repeat(auto-fill,minmax(160px,1fr));gap:8px;display:grid}.qqGY4a_optionCard{border:1px solid var(--dsw-alias-border-l2);border-radius:10px;flex-direction:column;gap:6px;padding:8px;display:flex}.qqGY4a_optionCardChosen{border-color:var(--dsw-alias-label-primary)}.qqGY4a_optionCardDimmed{opacity:.55}.qqGY4a_optionTitle{color:var(--dsw-alias-label-primary);white-space:nowrap;text-overflow:ellipsis;font-size:13px;font-weight:600;overflow:hidden}.qqGY4a_optionReason{min-height:2.8em;color:var(--dsw-alias-label-tertiary);word-break:break-word;-webkit-line-clamp:2;-webkit-box-orient:vertical;font-size:12px;line-height:1.4;display:-webkit-box;overflow:hidden}.qqGY4a_optionPrompt{color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-bg-elevated,#7f7f7f14);white-space:pre-wrap;word-break:break-word;border-radius:6px;height:140px;padding:6px 8px;font-size:11px;line-height:1.5;overflow-y:auto}.qqGY4a_optionButton{border:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-primary);cursor:pointer;text-align:center;background:0 0;border-radius:999px;align-self:stretch;margin-top:auto;padding:5px 14px;font-size:12px;font-weight:500;transition:background-color .15s,border-color .15s,transform 50ms}.qqGY4a_optionButton:hover:not(:disabled){background:var(--dsw-alias-background-secondary,#7f7f7f14);border-color:var(--dsw-alias-label-primary)}.qqGY4a_optionButton:active:not(:disabled){transform:scale(.97)}.qqGY4a_optionButton:disabled{cursor:default;opacity:.6}.qqGY4a_optionButtonChosen{text-align:center;border-color:var(--dsw-alias-label-primary);color:var(--dsw-alias-label-primary);background:var(--dsw-alias-background-secondary,#7f7f7f14);cursor:default;align-self:stretch;margin-top:auto;display:block}.qqGY4a_customInput{border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-primary);box-sizing:border-box;background:0 0;border-radius:6px;width:100%;padding:5px 8px;font-size:12px}";
999
+ var PosterNodes_module_css_default = {
1000
+ "catalogList": "qqGY4a_catalogList",
1001
+ "chip": "qqGY4a_chip",
1002
+ "collapseButton": "qqGY4a_collapseButton",
1003
+ "customInput": "qqGY4a_customInput",
1004
+ "detail": "qqGY4a_detail",
1005
+ "error": "qqGY4a_error",
1006
+ "head": "qqGY4a_head",
1007
+ "headActions": "qqGY4a_headActions",
1008
+ "imageFrame": "qqGY4a_imageFrame",
1009
+ "imageFramePlain": "qqGY4a_imageFramePlain",
1010
+ "imageFrameResult": "qqGY4a_imageFrameResult",
1011
+ "imageGrid": "qqGY4a_imageGrid",
1012
+ "imageState": "qqGY4a_imageState",
1013
+ "inspectButton": "qqGY4a_inspectButton",
1014
+ "kv": "qqGY4a_kv",
1015
+ "kvKey": "qqGY4a_kvKey",
1016
+ "kvValue": "qqGY4a_kvValue",
1017
+ "lightboxClose": "qqGY4a_lightboxClose",
1018
+ "lightboxContent": "qqGY4a_lightboxContent",
1019
+ "lightboxDialog": "qqGY4a_lightboxDialog",
1020
+ "lightboxImage": "qqGY4a_lightboxImage",
1021
+ "node": "qqGY4a_node",
1022
+ "note": "qqGY4a_note",
1023
+ "optionButton": "qqGY4a_optionButton",
1024
+ "optionButtonChosen": "qqGY4a_optionButtonChosen",
1025
+ "optionCard": "qqGY4a_optionCard",
1026
+ "optionCardChosen": "qqGY4a_optionCardChosen",
1027
+ "optionCardDimmed": "qqGY4a_optionCardDimmed",
1028
+ "optionCarousel": "qqGY4a_optionCarousel",
1029
+ "optionCarouselArrow": "qqGY4a_optionCarouselArrow",
1030
+ "optionCarouselArrowRight": "qqGY4a_optionCarouselArrowRight",
1031
+ "optionCarouselDot": "qqGY4a_optionCarouselDot",
1032
+ "optionCarouselDotActive": "qqGY4a_optionCarouselDotActive",
1033
+ "optionCarouselDots": "qqGY4a_optionCarouselDots",
1034
+ "optionGrid": "qqGY4a_optionGrid",
1035
+ "optionPrompt": "qqGY4a_optionPrompt",
1036
+ "optionReason": "qqGY4a_optionReason",
1037
+ "optionTitle": "qqGY4a_optionTitle",
1038
+ "pre": "qqGY4a_pre",
1039
+ "promptBox": "qqGY4a_promptBox",
1040
+ "promptNeg": "qqGY4a_promptNeg",
1041
+ "status": "qqGY4a_status",
1042
+ "statusFailed": "qqGY4a_statusFailed",
1043
+ "step": "qqGY4a_step",
1044
+ "stepTitle": "qqGY4a_stepTitle",
1045
+ "title": "qqGY4a_title"
1046
+ };
1047
+ //#endregion
1048
+ //#region src/client/PosterInspectButton.tsx
1049
+ /**
1050
+ * 自定义渲染节点头部操作区的 Inspect 按钮。语义与内置 ToolRow 的
1051
+ * Inspect pill 一致:跳到 trajectory 视图中该 tool 调用的原始记录。
1052
+ * 回调由 ToolCallTree 经 owner 注入(ui-tool contract/slots.ts 的
1053
+ * ToolCallOwnerProps.inspect),自定义节点默认不消费它,这里补挂上;
1054
+ * 未注入(undefined,如无 trajectory 视图)时不渲染。
1055
+ */
1056
+ function PosterInspectButton({ onClick, label }) {
1057
+ if (onClick === void 0) return null;
1058
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
1059
+ type: "button",
1060
+ className: PosterNodes_module_css_default.inspectButton,
1061
+ onClick,
1062
+ children: label
1063
+ });
1064
+ }
1065
+ //#endregion
1066
+ //#region src/client/PosterSkillsNode.tsx
1067
+ /**
1068
+ * poster_gen_get_all_poster_skills 的渲染节点(keyed `tool.call.toolview`,
1069
+ * design 四期 §4.7)。展示扫描状态 + 轻量目录列表(title 用 tag 方框 UI 流式排布)。
1070
+ * 目录只有 frontmatter 元数据:SKILL.md 正文(生图提示词模板)全文不进这里,
1071
+ * 点选原语选中后才返回;meta 只放目录摘要。
1072
+ */
1073
+ function PosterSkillsNode(props) {
1074
+ const { block, callId, api, t, inspect } = props;
1075
+ const settled = "kind" in block && block.kind === "tool-result";
1076
+ const failed = settled && block.isError;
1077
+ const trace = usePosterTrace(block, callId, api, parseSkillsTrace);
1078
+ const [collapsed, setCollapsed] = (0, react.useState)(false);
1079
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
1080
+ className: PosterNodes_module_css_default.node,
1081
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
1082
+ className: PosterNodes_module_css_default.head,
1083
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1084
+ className: PosterNodes_module_css_default.title,
1085
+ children: t("nodeSkillsTitle")
1086
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
1087
+ className: PosterNodes_module_css_default.headActions,
1088
+ children: [
1089
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1090
+ className: `${PosterNodes_module_css_default.status} ${failed ? PosterNodes_module_css_default.statusFailed : ""}`,
1091
+ children: settled ? failed ? t("nodeFailed") : t("nodeDone") : t("nodeRunning")
1092
+ }),
1093
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(PosterInspectButton, {
1094
+ onClick: inspect,
1095
+ label: t("inspect")
1096
+ }),
1097
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
1098
+ type: "button",
1099
+ className: PosterNodes_module_css_default.collapseButton,
1100
+ onClick: () => setCollapsed((v) => !v),
1101
+ children: collapsed ? t("nodeExpand") : t("nodeCollapse")
1102
+ })
1103
+ ]
1104
+ })]
1105
+ }), !collapsed && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
1106
+ trace?.scanned !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
1107
+ className: PosterNodes_module_css_default.step,
1108
+ children: [
1109
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1110
+ className: PosterNodes_module_css_default.stepTitle,
1111
+ children: t("stepScan")
1112
+ }),
1113
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
1114
+ className: PosterNodes_module_css_default.kv,
1115
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1116
+ className: PosterNodes_module_css_default.kvValue,
1117
+ children: t("skillsScanned", {
1118
+ count: String(trace.scanned.count),
1119
+ duration: formatDuration(trace.scanned.durationMs ?? 0)
1120
+ })
1121
+ })
1122
+ }),
1123
+ trace.scanned.invalid > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1124
+ className: PosterNodes_module_css_default.note,
1125
+ children: t("skillsInvalid", { count: String(trace.scanned.invalid) })
1126
+ })
1127
+ ]
1128
+ }),
1129
+ trace?.catalog !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
1130
+ className: PosterNodes_module_css_default.step,
1131
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1132
+ className: PosterNodes_module_css_default.stepTitle,
1133
+ children: t("paramCandidates")
1134
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
1135
+ className: PosterNodes_module_css_default.catalogList,
1136
+ children: trace.catalog.map((entry) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1137
+ className: PosterNodes_module_css_default.chip,
1138
+ children: entry.title
1139
+ }, entry.name))
1140
+ })]
1141
+ }),
1142
+ !settled && trace?.scanned === void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
1143
+ className: PosterNodes_module_css_default.note,
1144
+ children: t("stepPending")
1145
+ }),
1146
+ failed && "kind" in block && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
1147
+ className: PosterNodes_module_css_default.error,
1148
+ children: resultTextOf(block.content)
1149
+ })
1150
+ ] })]
1151
+ });
1152
+ }
1153
+ //#endregion
1154
+ //#region src/client/PosterImage.tsx
1155
+ /**
1156
+ * PosterImage:海报相关 UI 的图片组件(design §5.1 图片约定)——
1157
+ * 固定尺寸容器 + `object-fit: contain` 渲染;点击图片弹出放大预览。
1158
+ *
1159
+ * 自 v0.2 起只用于"直接可引用的 URL"(skill 预览图走 host 预览路由);
1160
+ * 附件模式(readImage RPC 拉字节)已随生图工具移交 dsh-qw-tool,不再需要。
1161
+ *
1162
+ * 放大预览基于 ui-primitives 的 **Modal(headless 模式)** 自建:共享的对话
1163
+ * 遮罩 + body portal + ESC/点遮罩关闭。
1164
+ */
1165
+ function PosterImage(props) {
1166
+ const { alt, variant = "thumb", loadingLabel, failedLabel } = props;
1167
+ const url = props.src;
1168
+ const [zoom, setZoom] = (0, react.useState)(false);
1169
+ const frameClass = variant === "result" ? `${PosterNodes_module_css_default.imageFrame} ${PosterNodes_module_css_default.imageFrameResult}` : variant === "plain" ? `${PosterNodes_module_css_default.imageFrame} ${PosterNodes_module_css_default.imageFramePlain}` : PosterNodes_module_css_default.imageFrame;
1170
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
1171
+ type: "button",
1172
+ className: frameClass,
1173
+ onClick: () => {
1174
+ if (url !== void 0) setZoom(true);
1175
+ },
1176
+ title: alt,
1177
+ children: url !== void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("img", {
1178
+ src: url,
1179
+ alt
1180
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1181
+ className: PosterNodes_module_css_default.imageState,
1182
+ children: failedLabel("")
1183
+ })
1184
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Modal, {
1185
+ open: zoom && url !== void 0,
1186
+ onClose: () => setZoom(false),
1187
+ title: alt,
1188
+ headless: true,
1189
+ className: PosterNodes_module_css_default.lightboxDialog,
1190
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
1191
+ className: PosterNodes_module_css_default.lightboxContent,
1192
+ children: [url !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("img", {
1193
+ className: PosterNodes_module_css_default.lightboxImage,
1194
+ src: url,
1195
+ alt
1196
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
1197
+ type: "button",
1198
+ className: PosterNodes_module_css_default.lightboxClose,
1199
+ "aria-label": alt,
1200
+ onClick: () => setZoom(false),
1201
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconCloseOutline16, { size: 16 })
1202
+ })]
1203
+ })
1204
+ })] });
1205
+ }
1206
+ //#endregion
1207
+ //#region src/client/PosterPickNode.tsx
1208
+ /**
1209
+ * poster_gen_pick_poster_skill 的渲染节点(keyed `tool.call.toolview`,
1210
+ * design 四期 §4.5/§4.7)。
1211
+ *
1212
+ * 候选由模型经 tool/call arguments 传入(name + 推荐理由;自定义候选另带
1213
+ * title + prompt,卡片无预览图、展示提示词节选);host 补全库内候选的
1214
+ * title/previews 后经 trace.options 提供卡片数据。三态:waiting(可点选 →
1215
+ * answerSkill → 乐观置"已选")/ answered(选中卡高亮)/ aborted(result
1216
+ * isError 且无 answer → "已取消/中断",如 harness 重启打断等待)。
1217
+ */
1218
+ function PosterPickNode(props) {
1219
+ const { block, callId, api, t, inspect } = props;
1220
+ const settled = "kind" in block && block.kind === "tool-result";
1221
+ const failed = settled && block.isError;
1222
+ const trace = usePosterTrace(block, callId, api, parsePickTrace);
1223
+ const args = argsOf(block);
1224
+ const [pick, setPick] = (0, react.useState)({ kind: "idle" });
1225
+ const [custom, setCustom] = (0, react.useState)("");
1226
+ const [collapsed, setCollapsed] = (0, react.useState)(false);
1227
+ const answer = trace?.answer;
1228
+ const chosenSkill = answer?.chosenSkill ?? (pick.kind === "picked" ? pick.skill : void 0);
1229
+ const expired = pick.kind === "expired";
1230
+ const options = trace?.options;
1231
+ const waiting = !settled && options !== void 0 && chosenSkill === void 0 && !expired;
1232
+ const aborted = failed && answer === void 0;
1233
+ const choose = (skill) => {
1234
+ if (!waiting) return;
1235
+ const trimmed = custom.trim();
1236
+ setPick({
1237
+ kind: "picked",
1238
+ skill
1239
+ });
1240
+ api.answerSkill({
1241
+ callId,
1242
+ skill,
1243
+ ...trimmed !== "" ? { custom: trimmed } : {}
1244
+ }).then((result) => {
1245
+ if (!result.ok) setPick({ kind: "expired" });
1246
+ });
1247
+ };
1248
+ const question = trace?.params.question ?? (typeof args.question === "string" ? args.question : void 0);
1249
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
1250
+ className: PosterNodes_module_css_default.node,
1251
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
1252
+ className: PosterNodes_module_css_default.head,
1253
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1254
+ className: PosterNodes_module_css_default.title,
1255
+ children: t("nodePickTitle")
1256
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
1257
+ className: PosterNodes_module_css_default.headActions,
1258
+ children: [
1259
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1260
+ className: `${PosterNodes_module_css_default.status} ${failed ? PosterNodes_module_css_default.statusFailed : ""}`,
1261
+ children: settled ? failed ? t("nodeFailed") : t("nodeDone") : t("nodeRunning")
1262
+ }),
1263
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(PosterInspectButton, {
1264
+ onClick: inspect,
1265
+ label: t("inspect")
1266
+ }),
1267
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
1268
+ type: "button",
1269
+ className: PosterNodes_module_css_default.collapseButton,
1270
+ onClick: () => setCollapsed((v) => !v),
1271
+ children: collapsed ? t("nodeExpand") : t("nodeCollapse")
1272
+ })
1273
+ ]
1274
+ })]
1275
+ }), !collapsed && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
1276
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
1277
+ className: PosterNodes_module_css_default.step,
1278
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1279
+ className: PosterNodes_module_css_default.stepTitle,
1280
+ children: t("stepParams")
1281
+ }), question !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
1282
+ className: PosterNodes_module_css_default.kv,
1283
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1284
+ className: PosterNodes_module_css_default.kvKey,
1285
+ children: t("paramQuestion")
1286
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1287
+ className: PosterNodes_module_css_default.kvValue,
1288
+ children: question
1289
+ })]
1290
+ })]
1291
+ }),
1292
+ options !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
1293
+ className: PosterNodes_module_css_default.step,
1294
+ children: [
1295
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1296
+ className: PosterNodes_module_css_default.stepTitle,
1297
+ children: t("stepOptions")
1298
+ }),
1299
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1300
+ className: PosterNodes_module_css_default.note,
1301
+ children: t("pickHint")
1302
+ }),
1303
+ waiting && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
1304
+ className: PosterNodes_module_css_default.customInput,
1305
+ value: custom,
1306
+ placeholder: t("customPlaceholder"),
1307
+ onChange: (event) => setCustom(event.target.value)
1308
+ }),
1309
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
1310
+ className: PosterNodes_module_css_default.optionGrid,
1311
+ children: options.map((option) => {
1312
+ const isChosen = option.name === chosenSkill;
1313
+ const dimmed = chosenSkill !== void 0 && !isChosen;
1314
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
1315
+ className: `${PosterNodes_module_css_default.optionCard} ${isChosen ? PosterNodes_module_css_default.optionCardChosen : ""} ${dimmed ? PosterNodes_module_css_default.optionCardDimmed : ""}`,
1316
+ children: [
1317
+ option.previews.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(OptionPreviewCarousel, {
1318
+ urls: option.previews,
1319
+ alt: t("skillPreviewAlt", { title: option.title }),
1320
+ prevLabel: t("carouselPrev"),
1321
+ nextLabel: t("carouselNext"),
1322
+ loadingLabel: t("posterLoading"),
1323
+ failedLabel: (message) => t("posterLoadFailed", { message })
1324
+ }),
1325
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1326
+ className: PosterNodes_module_css_default.optionTitle,
1327
+ children: option.title
1328
+ }),
1329
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1330
+ className: PosterNodes_module_css_default.optionReason,
1331
+ children: option.reason !== "" ? option.reason : ""
1332
+ }),
1333
+ option.prompt !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1334
+ className: PosterNodes_module_css_default.optionPrompt,
1335
+ children: option.prompt
1336
+ }),
1337
+ isChosen ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1338
+ className: `${PosterNodes_module_css_default.optionButton} ${PosterNodes_module_css_default.optionButtonChosen}`,
1339
+ children: t("chosenBadge")
1340
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
1341
+ type: "button",
1342
+ className: PosterNodes_module_css_default.optionButton,
1343
+ disabled: !waiting,
1344
+ onClick: () => choose(option.name),
1345
+ children: t("chooseThis")
1346
+ })
1347
+ ]
1348
+ }, option.name);
1349
+ })
1350
+ }),
1351
+ waiting && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1352
+ className: PosterNodes_module_css_default.note,
1353
+ children: t("waitingChoice")
1354
+ }),
1355
+ expired && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1356
+ className: PosterNodes_module_css_default.note,
1357
+ children: t("answerExpired")
1358
+ }),
1359
+ aborted && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1360
+ className: PosterNodes_module_css_default.note,
1361
+ children: t("nodeAborted")
1362
+ })
1363
+ ]
1364
+ }),
1365
+ answer !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
1366
+ className: PosterNodes_module_css_default.step,
1367
+ children: [
1368
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1369
+ className: PosterNodes_module_css_default.stepTitle,
1370
+ children: t("stepAnswer")
1371
+ }),
1372
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
1373
+ className: PosterNodes_module_css_default.kv,
1374
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1375
+ className: PosterNodes_module_css_default.kvKey,
1376
+ children: t("finalSkill")
1377
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1378
+ className: PosterNodes_module_css_default.kvValue,
1379
+ children: answer.chosenTitle
1380
+ })]
1381
+ }),
1382
+ answer.custom !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
1383
+ className: PosterNodes_module_css_default.kv,
1384
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1385
+ className: PosterNodes_module_css_default.kvKey,
1386
+ children: t("finalCustom")
1387
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1388
+ className: PosterNodes_module_css_default.kvValue,
1389
+ children: answer.custom
1390
+ })]
1391
+ })
1392
+ ]
1393
+ }),
1394
+ failed && "kind" in block && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
1395
+ className: PosterNodes_module_css_default.error,
1396
+ children: resultTextOf(block.content)
1397
+ })
1398
+ ] })]
1399
+ });
1400
+ }
1401
+ /**
1402
+ * 候选卡的 skill 预览轮播(单图直出;多图左右箭头 + 圆点)。图用
1403
+ * PosterImage variant="plain" 的固定容器 + contain 居中(多卡同一维度),
1404
+ * 点击仍可放大预览。
1405
+ */
1406
+ function OptionPreviewCarousel(props) {
1407
+ const { urls, alt, prevLabel, nextLabel, loadingLabel, failedLabel } = props;
1408
+ const [index, setIndex] = (0, react.useState)(0);
1409
+ if (urls.length === 1) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(PosterImage, {
1410
+ src: urls[0],
1411
+ alt,
1412
+ variant: "plain",
1413
+ loadingLabel,
1414
+ failedLabel
1415
+ });
1416
+ const current = urls[Math.min(index, urls.length - 1)];
1417
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
1418
+ className: PosterNodes_module_css_default.optionCarousel,
1419
+ children: [
1420
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(PosterImage, {
1421
+ src: current,
1422
+ alt,
1423
+ variant: "plain",
1424
+ loadingLabel,
1425
+ failedLabel
1426
+ }, current),
1427
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
1428
+ type: "button",
1429
+ className: PosterNodes_module_css_default.optionCarouselArrow,
1430
+ "aria-label": prevLabel,
1431
+ disabled: index === 0,
1432
+ onClick: () => setIndex((value) => value - 1),
1433
+ children: "‹"
1434
+ }),
1435
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
1436
+ type: "button",
1437
+ className: PosterNodes_module_css_default.optionCarouselArrowRight,
1438
+ "aria-label": nextLabel,
1439
+ disabled: index >= urls.length - 1,
1440
+ onClick: () => setIndex((value) => value + 1),
1441
+ children: "›"
1442
+ }),
1443
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
1444
+ className: PosterNodes_module_css_default.optionCarouselDots,
1445
+ children: urls.map((url, dotIndex) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
1446
+ type: "button",
1447
+ className: dotIndex === index ? PosterNodes_module_css_default.optionCarouselDotActive : PosterNodes_module_css_default.optionCarouselDot,
1448
+ "aria-label": `${dotIndex + 1}`,
1449
+ onClick: () => setIndex(dotIndex)
1450
+ }, url))
1451
+ })
1452
+ ]
1453
+ });
1454
+ }
1455
+ //#endregion
1456
+ //#region src/client/index.ts
1457
+ const name = "dsh-post-gen";
1458
+ const inject = [
1459
+ "slots",
1460
+ "locale",
1461
+ "connection"
1462
+ ];
1463
+ function apply(ctx) {
1464
+ console.log("[dsh-post-gen] client half loaded (poster-design settings + skill library)");
1465
+ ctx.effect(() => ctx.locale.register(POSTER_NS, {
1466
+ zh,
1467
+ en
1468
+ }), "dsh-post-gen: poster copy dictionaries");
1469
+ ctx.effect(() => {
1470
+ const tag = document.createElement("style");
1471
+ tag.dataset.plugin = name;
1472
+ tag.textContent = `${cssText$1}\n${cssText}`;
1473
+ document.head.appendChild(tag);
1474
+ return () => tag.remove();
1475
+ }, "dsh-post-gen: panel styles");
1476
+ const t = ctx.locale.bind(POSTER_NS);
1477
+ const disabledFlag = window[DISABLED_GLOBAL];
1478
+ if (disabledFlag !== void 0) {
1479
+ const reason = typeof disabledFlag.reason === "string" ? disabledFlag.reason : "";
1480
+ const min = typeof disabledFlag.min === "string" ? disabledFlag.min : "";
1481
+ const max = typeof disabledFlag.max === "string" ? disabledFlag.max : "";
1482
+ const installVersion = typeof disabledFlag.installVersion === "string" ? disabledFlag.installVersion : "";
1483
+ console.warn(`[dsh-post-gen] host half disabled: ${reason}`);
1484
+ ctx.slots.inject("settings.section", () => ctx.slots.register({
1485
+ name: "settings.section",
1486
+ id: "poster-design",
1487
+ order: 100,
1488
+ label: () => t("nav"),
1489
+ locale: POSTER_NS,
1490
+ inject: () => ({
1491
+ reason,
1492
+ min,
1493
+ max,
1494
+ installVersion
1495
+ })
1496
+ }, PosterDisabledSection));
1497
+ return;
1498
+ }
1499
+ const connection = ctx.get("connection");
1500
+ ctx.slots.inject("settings.section", () => ctx.slots.register({
1501
+ name: "settings.section",
1502
+ id: "poster-design",
1503
+ order: 100,
1504
+ label: () => t("nav"),
1505
+ locale: POSTER_NS,
1506
+ inject: () => ({ api: {
1507
+ getConfig: () => getConfigViaHost(connection.rpc),
1508
+ saveConfig: (patch) => saveConfigViaHost(connection.rpc, patch),
1509
+ listSkills: () => listSkillsViaHost(connection.rpc),
1510
+ installSkill: (request) => installSkillViaHost(connection.rpc, request),
1511
+ uninstallSkill: (name) => uninstallSkillViaHost(connection.rpc, name)
1512
+ } })
1513
+ }, PosterSection));
1514
+ ctx.slots.inject("tool.call.toolview", () => ctx.slots.register({
1515
+ name: "tool.call.toolview",
1516
+ key: "poster_gen_get_all_poster_skills",
1517
+ locale: POSTER_NS,
1518
+ inject: () => ({ api: { getCallTrace: (callId) => getCallTraceViaHost(connection.rpc, callId) } })
1519
+ }, PosterSkillsNode));
1520
+ ctx.slots.inject("tool.call.toolview", () => ctx.slots.register({
1521
+ name: "tool.call.toolview",
1522
+ key: "poster_gen_pick_poster_skill",
1523
+ locale: POSTER_NS,
1524
+ inject: () => ({ api: {
1525
+ getCallTrace: (callId) => getCallTraceViaHost(connection.rpc, callId),
1526
+ answerSkill: (request) => answerSkillViaHost(connection.rpc, request)
1527
+ } })
1528
+ }, PosterPickNode));
1529
+ }
1530
+ //#endregion
1531
+ exports.apply = apply;
1532
+ exports.inject = inject;
1533
+ exports.name = name;
1534
+ return module.exports;
1535
+ }
1536
+ });
1537
+
1538
+ //# sourceMappingURL=client.js.map