@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.
- package/LICENSE +21 -0
- package/README.md +50 -0
- package/assets/skills/poster-1960s-advertising/SKILL.md +20 -0
- package/assets/skills/poster-1960s-advertising/previews/1.jpg +0 -0
- package/assets/skills/poster-1960s-advertising/previews/2.jpg +0 -0
- package/assets/skills/poster-3d-cartoon-character/SKILL.md +20 -0
- package/assets/skills/poster-3d-cartoon-character/previews/1.jpg +0 -0
- package/assets/skills/poster-3d-cartoon-character/previews/2.jpg +0 -0
- package/assets/skills/poster-3d-cartoon-character/previews/3.jpg +0 -0
- package/assets/skills/poster-3d-cartoon-character/previews/4.jpg +0 -0
- package/assets/skills/poster-3d-fridge-magnets/SKILL.md +18 -0
- package/assets/skills/poster-3d-fridge-magnets/previews/1.jpg +0 -0
- package/assets/skills/poster-3d-fridge-magnets/previews/2.jpg +0 -0
- package/assets/skills/poster-3d-fridge-magnets/previews/3.jpg +0 -0
- package/assets/skills/poster-3d-fridge-magnets/previews/4.jpg +0 -0
- package/assets/skills/poster-3d-typographic-sculpture/SKILL.md +28 -0
- package/assets/skills/poster-3d-typographic-sculpture/previews/1.jpg +0 -0
- package/assets/skills/poster-3d-typographic-sculpture/previews/2.jpg +0 -0
- package/assets/skills/poster-3d-typographic-sculpture/previews/3.jpg +0 -0
- package/assets/skills/poster-3d-typographic-sculpture/previews/4.jpg +0 -0
- package/assets/skills/poster-aerial-minimal-solitude/SKILL.md +20 -0
- package/assets/skills/poster-aerial-minimal-solitude/previews/1.jpg +0 -0
- package/assets/skills/poster-aerial-minimal-solitude/previews/2.jpg +0 -0
- package/assets/skills/poster-anime-logo/SKILL.md +20 -0
- package/assets/skills/poster-anime-logo/previews/1.jpg +0 -0
- package/assets/skills/poster-anime-logo/previews/2.jpg +0 -0
- package/assets/skills/poster-ar-hologram-retail/SKILL.md +22 -0
- package/assets/skills/poster-ar-hologram-retail/previews/1.jpg +0 -0
- package/assets/skills/poster-ar-hologram-retail/previews/2.jpg +0 -0
- package/assets/skills/poster-ar-hologram-retail/previews/3.jpg +0 -0
- package/assets/skills/poster-ar-hologram-retail/previews/4.jpg +0 -0
- package/assets/skills/poster-beverage-splash/SKILL.md +20 -0
- package/assets/skills/poster-beverage-splash/previews/1.jpg +0 -0
- package/assets/skills/poster-beverage-splash/previews/2.jpg +0 -0
- package/assets/skills/poster-beverage-splash/previews/3.jpg +0 -0
- package/assets/skills/poster-beverage-splash/previews/4.jpg +0 -0
- package/assets/skills/poster-birdseye-hatch-print/SKILL.md +24 -0
- package/assets/skills/poster-birdseye-hatch-print/previews/1.jpg +0 -0
- package/assets/skills/poster-birdseye-hatch-print/previews/2.jpg +0 -0
- package/assets/skills/poster-blind-emboss-minimal/SKILL.md +22 -0
- package/assets/skills/poster-blind-emboss-minimal/previews/1.jpg +0 -0
- package/assets/skills/poster-blind-emboss-minimal/previews/2.jpg +0 -0
- package/assets/skills/poster-blueprint-diorama-workshop/SKILL.md +24 -0
- package/assets/skills/poster-blueprint-diorama-workshop/previews/1.jpg +0 -0
- package/assets/skills/poster-blueprint-diorama-workshop/previews/2.jpg +0 -0
- package/assets/skills/poster-blueprint-infographic/SKILL.md +20 -0
- package/assets/skills/poster-blueprint-infographic/previews/1.jpg +0 -0
- package/assets/skills/poster-blueprint-infographic/previews/2.jpg +0 -0
- package/assets/skills/poster-blueprint-infographic/previews/3.jpg +0 -0
- package/assets/skills/poster-boardingpass-portal/SKILL.md +22 -0
- package/assets/skills/poster-boardingpass-portal/previews/1.jpg +0 -0
- package/assets/skills/poster-boardingpass-portal/previews/2.jpg +0 -0
- package/assets/skills/poster-boardingpass-portal/previews/3.jpg +0 -0
- package/assets/skills/poster-boardingpass-portal/previews/4.jpg +0 -0
- package/assets/skills/poster-botanical-papercollage/SKILL.md +34 -0
- package/assets/skills/poster-botanical-papercollage/previews/1.jpg +0 -0
- package/assets/skills/poster-botanical-papercollage/previews/2.jpg +0 -0
- package/assets/skills/poster-botanical-papercollage/previews/3.jpg +0 -0
- package/assets/skills/poster-botanical-papercollage/previews/4.jpg +0 -0
- package/assets/skills/poster-brand-guideline-board/SKILL.md +38 -0
- package/assets/skills/poster-brand-guideline-board/previews/1.jpg +0 -0
- package/assets/skills/poster-brand-guideline-board/previews/2.jpg +0 -0
- package/assets/skills/poster-children-illustration/SKILL.md +20 -0
- package/assets/skills/poster-children-illustration/previews/1.jpg +0 -0
- package/assets/skills/poster-children-illustration/previews/2.jpg +0 -0
- package/assets/skills/poster-children-illustration/previews/3.jpg +0 -0
- package/assets/skills/poster-children-illustration/previews/4.jpg +0 -0
- package/assets/skills/poster-cinematic-letter-panels/SKILL.md +26 -0
- package/assets/skills/poster-cinematic-letter-panels/previews/1.jpg +0 -0
- package/assets/skills/poster-cinematic-letter-panels/previews/2.jpg +0 -0
- package/assets/skills/poster-cinematic-letter-panels/previews/3.jpg +0 -0
- package/assets/skills/poster-cinematic-letter-panels/previews/4.jpg +0 -0
- package/assets/skills/poster-cinematic-travel/SKILL.md +24 -0
- package/assets/skills/poster-cinematic-travel/previews/1.jpg +0 -0
- package/assets/skills/poster-cinematic-travel/previews/2.jpg +0 -0
- package/assets/skills/poster-cinematic-travel/previews/3.jpg +0 -0
- package/assets/skills/poster-cinematic-travel/previews/4.jpg +0 -0
- package/assets/skills/poster-city-aerial-night/SKILL.md +22 -0
- package/assets/skills/poster-city-aerial-night/previews/1.jpg +0 -0
- package/assets/skills/poster-city-aerial-night/previews/2.jpg +0 -0
- package/assets/skills/poster-city-aerial-night/previews/3.jpg +0 -0
- package/assets/skills/poster-city-aerial-night/previews/4.jpg +0 -0
- package/assets/skills/poster-city-discovery-infographic/SKILL.md +28 -0
- package/assets/skills/poster-city-discovery-infographic/previews/1.jpg +0 -0
- package/assets/skills/poster-city-discovery-infographic/previews/2.jpg +0 -0
- package/assets/skills/poster-city-discovery-infographic/previews/3.jpg +0 -0
- package/assets/skills/poster-city-discovery-infographic/previews/4.jpg +0 -0
- package/assets/skills/poster-city-infographic-editorial/SKILL.md +26 -0
- package/assets/skills/poster-city-infographic-editorial/previews/1.jpg +0 -0
- package/assets/skills/poster-city-infographic-editorial/previews/2.jpg +0 -0
- package/assets/skills/poster-city-infographic-editorial/previews/3.jpg +0 -0
- package/assets/skills/poster-city-infographic-editorial/previews/4.jpg +0 -0
- package/assets/skills/poster-city-window/SKILL.md +22 -0
- package/assets/skills/poster-city-window/previews/1.jpg +0 -0
- package/assets/skills/poster-city-window/previews/2.jpg +0 -0
- package/assets/skills/poster-city-window/previews/3.jpg +0 -0
- package/assets/skills/poster-city-window/previews/4.jpg +0 -0
- package/assets/skills/poster-collectible-toy/SKILL.md +20 -0
- package/assets/skills/poster-collectible-toy/previews/1.jpg +0 -0
- package/assets/skills/poster-collectible-toy/previews/2.jpg +0 -0
- package/assets/skills/poster-collectible-toy/previews/3.jpg +0 -0
- package/assets/skills/poster-collectible-toy/previews/4.jpg +0 -0
- package/assets/skills/poster-comic-portal/SKILL.md +20 -0
- package/assets/skills/poster-comic-portal/previews/1.jpg +0 -0
- package/assets/skills/poster-comic-portal/previews/2.jpg +0 -0
- package/assets/skills/poster-comic-portal/previews/3.jpg +0 -0
- package/assets/skills/poster-comic-portal/previews/4.jpg +0 -0
- package/assets/skills/poster-comic-style-page/SKILL.md +22 -0
- package/assets/skills/poster-comic-style-page/previews/1.jpg +0 -0
- package/assets/skills/poster-comic-style-page/previews/2.jpg +0 -0
- package/assets/skills/poster-commemorative-coin/SKILL.md +20 -0
- package/assets/skills/poster-commemorative-coin/previews/1.jpg +0 -0
- package/assets/skills/poster-corkboard-moodboard/SKILL.md +22 -0
- package/assets/skills/poster-corkboard-moodboard/previews/1.jpg +0 -0
- package/assets/skills/poster-corkboard-moodboard/previews/2.jpg +0 -0
- package/assets/skills/poster-country-cuisine/SKILL.md +22 -0
- package/assets/skills/poster-country-cuisine/previews/1.jpg +0 -0
- package/assets/skills/poster-country-cuisine/previews/2.jpg +0 -0
- package/assets/skills/poster-country-cuisine/previews/3.jpg +0 -0
- package/assets/skills/poster-country-cuisine/previews/4.jpg +0 -0
- package/assets/skills/poster-country-identity/SKILL.md +22 -0
- package/assets/skills/poster-country-identity/previews/1.jpg +0 -0
- package/assets/skills/poster-country-identity/previews/2.jpg +0 -0
- package/assets/skills/poster-country-identity/previews/3.jpg +0 -0
- package/assets/skills/poster-country-identity/previews/4.jpg +0 -0
- package/assets/skills/poster-crayon-kids/SKILL.md +22 -0
- package/assets/skills/poster-crayon-kids/previews/1.jpg +0 -0
- package/assets/skills/poster-crayon-kids/previews/2.jpg +0 -0
- package/assets/skills/poster-cup-surreal-world/SKILL.md +22 -0
- package/assets/skills/poster-cup-surreal-world/previews/1.jpg +0 -0
- package/assets/skills/poster-cup-surreal-world/previews/2.jpg +0 -0
- package/assets/skills/poster-cup-surreal-world/previews/3.jpg +0 -0
- package/assets/skills/poster-cup-surreal-world/previews/4.jpg +0 -0
- package/assets/skills/poster-dessert-food/SKILL.md +22 -0
- package/assets/skills/poster-dessert-food/previews/1.jpg +0 -0
- package/assets/skills/poster-dessert-food/previews/2.jpg +0 -0
- package/assets/skills/poster-dessert-food/previews/3.jpg +0 -0
- package/assets/skills/poster-diecut-sticker-collage/SKILL.md +24 -0
- package/assets/skills/poster-diecut-sticker-collage/previews/1.jpg +0 -0
- package/assets/skills/poster-diecut-sticker-collage/previews/2.jpg +0 -0
- package/assets/skills/poster-digicam-nostalgia/SKILL.md +20 -0
- package/assets/skills/poster-digicam-nostalgia/previews/1.jpg +0 -0
- package/assets/skills/poster-digicam-nostalgia/previews/2.jpg +0 -0
- package/assets/skills/poster-doodle-product-speech-bubble/SKILL.md +22 -0
- package/assets/skills/poster-doodle-product-speech-bubble/previews/1.jpg +0 -0
- package/assets/skills/poster-doodle-product-speech-bubble/previews/2.jpg +0 -0
- package/assets/skills/poster-doodle-product-speech-bubble/previews/3.jpg +0 -0
- package/assets/skills/poster-doodle-product-speech-bubble/previews/4.jpg +0 -0
- package/assets/skills/poster-doodle-product-world/SKILL.md +22 -0
- package/assets/skills/poster-doodle-product-world/previews/1.jpg +0 -0
- package/assets/skills/poster-doodle-product-world/previews/2.jpg +0 -0
- package/assets/skills/poster-doodle-product-world/previews/3.jpg +0 -0
- package/assets/skills/poster-doodle-product-world/previews/4.jpg +0 -0
- package/assets/skills/poster-doodle-reinterpretation/SKILL.md +22 -0
- package/assets/skills/poster-doodle-reinterpretation/previews/1.jpg +0 -0
- package/assets/skills/poster-double-exposure/SKILL.md +22 -0
- package/assets/skills/poster-double-exposure/previews/1.jpg +0 -0
- package/assets/skills/poster-double-exposure/previews/2.jpg +0 -0
- package/assets/skills/poster-dual-half-travel/SKILL.md +18 -0
- package/assets/skills/poster-dual-half-travel/previews/1.jpg +0 -0
- package/assets/skills/poster-dual-half-travel/previews/2.jpg +0 -0
- package/assets/skills/poster-dual-world-watercolor/SKILL.md +22 -0
- package/assets/skills/poster-dual-world-watercolor/previews/1.jpg +0 -0
- package/assets/skills/poster-dual-world-watercolor/previews/2.jpg +0 -0
- package/assets/skills/poster-editorial-travel-illustration/SKILL.md +20 -0
- package/assets/skills/poster-editorial-travel-illustration/previews/1.jpg +0 -0
- package/assets/skills/poster-editorial-travel-illustration/previews/2.jpg +0 -0
- package/assets/skills/poster-editorial-travel-illustration/previews/3.jpg +0 -0
- package/assets/skills/poster-enamel-magnet/SKILL.md +22 -0
- package/assets/skills/poster-enamel-magnet/previews/1.jpg +0 -0
- package/assets/skills/poster-enamel-magnet/previews/2.jpg +0 -0
- package/assets/skills/poster-engraved-contour-ink/SKILL.md +22 -0
- package/assets/skills/poster-engraved-contour-ink/previews/1.jpg +0 -0
- package/assets/skills/poster-engraved-contour-ink/previews/2.jpg +0 -0
- package/assets/skills/poster-fashion-tech-sheet/SKILL.md +22 -0
- package/assets/skills/poster-fashion-tech-sheet/previews/1.jpg +0 -0
- package/assets/skills/poster-felt-diorama/SKILL.md +26 -0
- package/assets/skills/poster-felt-diorama/previews/1.jpg +0 -0
- package/assets/skills/poster-felt-diorama/previews/2.jpg +0 -0
- package/assets/skills/poster-filmstrip-traveler/SKILL.md +24 -0
- package/assets/skills/poster-filmstrip-traveler/previews/1.jpg +0 -0
- package/assets/skills/poster-filmstrip-traveler/previews/2.jpg +0 -0
- package/assets/skills/poster-fireworks-typography/SKILL.md +22 -0
- package/assets/skills/poster-fireworks-typography/previews/1.jpg +0 -0
- package/assets/skills/poster-fireworks-typography/previews/2.jpg +0 -0
- package/assets/skills/poster-fireworks-typography/previews/3.jpg +0 -0
- package/assets/skills/poster-fireworks-typography/previews/4.jpg +0 -0
- package/assets/skills/poster-flat-minimal-travel/SKILL.md +20 -0
- package/assets/skills/poster-flat-minimal-travel/previews/1.jpg +0 -0
- package/assets/skills/poster-flat-minimal-travel/previews/2.jpg +0 -0
- package/assets/skills/poster-flat-minimal-travel/previews/3.jpg +0 -0
- package/assets/skills/poster-flat-minimal-travel/previews/4.jpg +0 -0
- package/assets/skills/poster-floating-island/SKILL.md +20 -0
- package/assets/skills/poster-floating-island/previews/1.jpg +0 -0
- package/assets/skills/poster-floating-island/previews/2.jpg +0 -0
- package/assets/skills/poster-floating-island/previews/3.jpg +0 -0
- package/assets/skills/poster-floating-island/previews/4.jpg +0 -0
- package/assets/skills/poster-folk-flat-illustration/SKILL.md +24 -0
- package/assets/skills/poster-folk-flat-illustration/previews/1.jpg +0 -0
- package/assets/skills/poster-folk-flat-illustration/previews/2.jpg +0 -0
- package/assets/skills/poster-folk-flat-illustration/previews/3.jpg +0 -0
- package/assets/skills/poster-folk-flat-illustration/previews/4.jpg +0 -0
- package/assets/skills/poster-food-flatlay-doodle/SKILL.md +20 -0
- package/assets/skills/poster-food-flatlay-doodle/previews/1.jpg +0 -0
- package/assets/skills/poster-food-flatlay-doodle/previews/2.jpg +0 -0
- package/assets/skills/poster-food-flatlay-doodle/previews/3.jpg +0 -0
- package/assets/skills/poster-food-flatlay-doodle/previews/4.jpg +0 -0
- package/assets/skills/poster-food-hero-splash/SKILL.md +24 -0
- package/assets/skills/poster-food-hero-splash/previews/1.jpg +0 -0
- package/assets/skills/poster-food-hero-splash/previews/2.jpg +0 -0
- package/assets/skills/poster-food-hero-splash/previews/3.jpg +0 -0
- package/assets/skills/poster-food-id-badge/SKILL.md +20 -0
- package/assets/skills/poster-food-id-badge/previews/1.jpg +0 -0
- package/assets/skills/poster-food-id-badge/previews/2.jpg +0 -0
- package/assets/skills/poster-food-id-badge/previews/3.jpg +0 -0
- package/assets/skills/poster-food-id-badge/previews/4.jpg +0 -0
- package/assets/skills/poster-food-infographic/SKILL.md +20 -0
- package/assets/skills/poster-food-infographic/previews/1.jpg +0 -0
- package/assets/skills/poster-food-infographic/previews/2.jpg +0 -0
- package/assets/skills/poster-food-infographic/previews/3.jpg +0 -0
- package/assets/skills/poster-food-infographic/previews/4.jpg +0 -0
- package/assets/skills/poster-food-papercollage/SKILL.md +26 -0
- package/assets/skills/poster-food-papercollage/previews/1.jpg +0 -0
- package/assets/skills/poster-food-papercollage/previews/2.jpg +0 -0
- package/assets/skills/poster-food-papercollage/previews/3.jpg +0 -0
- package/assets/skills/poster-food-papercollage/previews/4.jpg +0 -0
- package/assets/skills/poster-food-postcard-scene/SKILL.md +20 -0
- package/assets/skills/poster-food-postcard-scene/previews/1.jpg +0 -0
- package/assets/skills/poster-food-postcard-scene/previews/2.jpg +0 -0
- package/assets/skills/poster-food-postcard-scene/previews/3.jpg +0 -0
- package/assets/skills/poster-food-postcard-scene/previews/4.jpg +0 -0
- package/assets/skills/poster-forest-fantasy-product/SKILL.md +20 -0
- package/assets/skills/poster-forest-fantasy-product/previews/1.jpg +0 -0
- package/assets/skills/poster-forest-fantasy-product/previews/2.jpg +0 -0
- package/assets/skills/poster-fresh-beverage-ad/SKILL.md +18 -0
- package/assets/skills/poster-fresh-beverage-ad/previews/1.jpg +0 -0
- package/assets/skills/poster-fresh-beverage-ad/previews/2.jpg +0 -0
- package/assets/skills/poster-futuristic-luxury-brand/SKILL.md +24 -0
- package/assets/skills/poster-futuristic-luxury-brand/previews/1.jpg +0 -0
- package/assets/skills/poster-futuristic-luxury-brand/previews/2.jpg +0 -0
- package/assets/skills/poster-futuristic-luxury-brand/previews/3.jpg +0 -0
- package/assets/skills/poster-futuristic-luxury-brand/previews/4.jpg +0 -0
- package/assets/skills/poster-geometric-travel/SKILL.md +20 -0
- package/assets/skills/poster-geometric-travel/previews/1.jpg +0 -0
- package/assets/skills/poster-geometric-travel/previews/2.jpg +0 -0
- package/assets/skills/poster-giant-product-snow/SKILL.md +22 -0
- package/assets/skills/poster-giant-product-snow/previews/1.jpg +0 -0
- package/assets/skills/poster-giant-stamp-diorama/SKILL.md +20 -0
- package/assets/skills/poster-giant-stamp-diorama/previews/1.jpg +0 -0
- package/assets/skills/poster-giant-stamp-diorama/previews/2.jpg +0 -0
- package/assets/skills/poster-giant-stamp-diorama/previews/3.jpg +0 -0
- package/assets/skills/poster-giant-stamp-diorama/previews/4.jpg +0 -0
- package/assets/skills/poster-gouache-travel/SKILL.md +22 -0
- package/assets/skills/poster-gouache-travel/previews/1.jpg +0 -0
- package/assets/skills/poster-gouache-travel/previews/2.jpg +0 -0
- package/assets/skills/poster-gouache-travel/previews/3.jpg +0 -0
- package/assets/skills/poster-gouache-travel/previews/4.jpg +0 -0
- package/assets/skills/poster-handdrawn-doodle/SKILL.md +18 -0
- package/assets/skills/poster-handdrawn-doodle/previews/1.jpg +0 -0
- package/assets/skills/poster-handdrawn-doodle/previews/2.jpg +0 -0
- package/assets/skills/poster-handdrawn-doodle/previews/3.jpg +0 -0
- package/assets/skills/poster-handdrawn-doodle/previews/4.jpg +0 -0
- package/assets/skills/poster-hobby-activity-collage/SKILL.md +22 -0
- package/assets/skills/poster-hobby-activity-collage/previews/1.jpg +0 -0
- package/assets/skills/poster-ice-popsicle/SKILL.md +22 -0
- package/assets/skills/poster-ice-popsicle/previews/1.jpg +0 -0
- package/assets/skills/poster-ice-popsicle/previews/2.jpg +0 -0
- package/assets/skills/poster-ice-popsicle/previews/3.jpg +0 -0
- package/assets/skills/poster-ice-popsicle/previews/4.jpg +0 -0
- package/assets/skills/poster-impasto-painting/SKILL.md +26 -0
- package/assets/skills/poster-impasto-painting/previews/1.jpg +0 -0
- package/assets/skills/poster-impasto-painting/previews/62c9be8a-bcae-4ebf-8ff0-ce1c7809fe00.jpg +0 -0
- package/assets/skills/poster-ink-watercolor-sketch/SKILL.md +26 -0
- package/assets/skills/poster-ink-watercolor-sketch/previews/1.jpg +0 -0
- package/assets/skills/poster-ink-watercolor-sketch/previews/2.jpg +0 -0
- package/assets/skills/poster-instant-photo-collage/SKILL.md +20 -0
- package/assets/skills/poster-instant-photo-collage/previews/1.jpg +0 -0
- package/assets/skills/poster-instant-photo-collage/previews/2.jpg +0 -0
- package/assets/skills/poster-island-map-diorama/SKILL.md +20 -0
- package/assets/skills/poster-island-map-diorama/previews/1.jpg +0 -0
- package/assets/skills/poster-island-map-diorama/previews/2.jpg +0 -0
- package/assets/skills/poster-isometric-floating-world/SKILL.md +22 -0
- package/assets/skills/poster-isometric-floating-world/previews/1.jpg +0 -0
- package/assets/skills/poster-isometric-floating-world/previews/2.jpg +0 -0
- package/assets/skills/poster-isometric-floating-world/previews/3.jpg +0 -0
- package/assets/skills/poster-isometric-floating-world/previews/4.jpg +0 -0
- package/assets/skills/poster-isometric-teardown/SKILL.md +22 -0
- package/assets/skills/poster-isometric-teardown/previews/1.jpg +0 -0
- package/assets/skills/poster-isometric-teardown/previews/2.jpg +0 -0
- package/assets/skills/poster-kraft-sketch/SKILL.md +20 -0
- package/assets/skills/poster-kraft-sketch/previews/1.jpg +0 -0
- package/assets/skills/poster-kraft-sketch/previews/2.jpg +0 -0
- package/assets/skills/poster-kraft-sketch/previews/3.jpg +0 -0
- package/assets/skills/poster-kraft-sketch/previews/4.jpg +0 -0
- package/assets/skills/poster-landmark-collage/SKILL.md +24 -0
- package/assets/skills/poster-landmark-collage/previews/1.jpg +0 -0
- package/assets/skills/poster-landmark-collage/previews/2.jpg +0 -0
- package/assets/skills/poster-landmark-collage/previews/3.jpg +0 -0
- package/assets/skills/poster-layered-papercut-diorama/SKILL.md +27 -0
- package/assets/skills/poster-layered-papercut-diorama/previews/1.jpg +0 -0
- package/assets/skills/poster-layered-papercut-diorama/previews/2.jpg +0 -0
- package/assets/skills/poster-layered-papercut-diorama/previews/3.jpg +0 -0
- package/assets/skills/poster-layered-papercut-diorama/previews/4.jpg +0 -0
- package/assets/skills/poster-logo-glitch-digital/SKILL.md +24 -0
- package/assets/skills/poster-logo-glitch-digital/previews/1.jpg +0 -0
- package/assets/skills/poster-logo-glitch-digital/previews/2.jpg +0 -0
- package/assets/skills/poster-logo-in-sand/SKILL.md +20 -0
- package/assets/skills/poster-logo-in-sand/previews/1.jpg +0 -0
- package/assets/skills/poster-logo-in-sand/previews/2.jpg +0 -0
- package/assets/skills/poster-luxe-postage-stamp/SKILL.md +24 -0
- package/assets/skills/poster-luxe-postage-stamp/previews/1.jpg +0 -0
- package/assets/skills/poster-luxe-postage-stamp/previews/2.jpg +0 -0
- package/assets/skills/poster-luxury-editorial/SKILL.md +22 -0
- package/assets/skills/poster-luxury-editorial/previews/1.jpg +0 -0
- package/assets/skills/poster-luxury-grid-campaign/SKILL.md +22 -0
- package/assets/skills/poster-luxury-grid-campaign/previews/1.jpg +0 -0
- package/assets/skills/poster-luxury-packaging-reveal/SKILL.md +24 -0
- package/assets/skills/poster-luxury-packaging-reveal/previews/1.jpg +0 -0
- package/assets/skills/poster-luxury-packaging-reveal/previews/2.jpg +0 -0
- package/assets/skills/poster-luxury-silhouette-emblem/SKILL.md +20 -0
- package/assets/skills/poster-luxury-silhouette-emblem/previews/1.jpg +0 -0
- package/assets/skills/poster-luxury-silhouette-emblem/previews/2.jpg +0 -0
- package/assets/skills/poster-luxury-silhouette-emblem/previews/3.jpg +0 -0
- package/assets/skills/poster-luxury-silhouette-emblem/previews/4.jpg +0 -0
- package/assets/skills/poster-magazine-handwrite/SKILL.md +30 -0
- package/assets/skills/poster-magazine-handwrite/previews/1.jpg +0 -0
- package/assets/skills/poster-magazine-handwrite/previews/2.jpg +0 -0
- package/assets/skills/poster-magnetic-filings/SKILL.md +26 -0
- package/assets/skills/poster-magnetic-filings/previews/1.jpg +0 -0
- package/assets/skills/poster-magnetic-filings/previews/2.jpg +0 -0
- package/assets/skills/poster-marker-doodle/SKILL.md +20 -0
- package/assets/skills/poster-marker-doodle/previews/1.jpg +0 -0
- package/assets/skills/poster-marker-doodle/previews/2.jpg +0 -0
- package/assets/skills/poster-marker-sketch-chibi/SKILL.md +20 -0
- package/assets/skills/poster-marker-sketch-chibi/previews/1.jpg +0 -0
- package/assets/skills/poster-marker-sketch-chibi/previews/2.jpg +0 -0
- package/assets/skills/poster-marker-travel/SKILL.md +22 -0
- package/assets/skills/poster-marker-travel/previews/1.jpg +0 -0
- package/assets/skills/poster-marker-travel/previews/2.jpg +0 -0
- package/assets/skills/poster-marker-travel/previews/3.jpg +0 -0
- package/assets/skills/poster-marker-travel/previews/4.jpg +0 -0
- package/assets/skills/poster-merch-capsule-collection/SKILL.md +20 -0
- package/assets/skills/poster-merch-capsule-collection/previews/1.jpg +0 -0
- package/assets/skills/poster-merch-capsule-collection/previews/2.jpg +0 -0
- package/assets/skills/poster-merch-capsule-collection/previews/3.jpg +0 -0
- package/assets/skills/poster-midcentury-editorial/SKILL.md +24 -0
- package/assets/skills/poster-midcentury-editorial/previews/1.jpg +0 -0
- package/assets/skills/poster-midcentury-editorial/previews/2.jpg +0 -0
- package/assets/skills/poster-midcentury-editorial/previews/3.jpg +0 -0
- package/assets/skills/poster-midcentury-editorial/previews/4.jpg +0 -0
- package/assets/skills/poster-midcentury-minimal/SKILL.md +20 -0
- package/assets/skills/poster-midcentury-minimal/previews/1.jpg +0 -0
- package/assets/skills/poster-midcentury-minimal/previews/2.jpg +0 -0
- package/assets/skills/poster-midcentury-minimal/previews/3.jpg +0 -0
- package/assets/skills/poster-miniature-city/SKILL.md +20 -0
- package/assets/skills/poster-miniature-city/previews/1.jpg +0 -0
- package/assets/skills/poster-miniature-city/previews/2.jpg +0 -0
- package/assets/skills/poster-miniature-diorama/SKILL.md +24 -0
- package/assets/skills/poster-miniature-diorama/previews/1.jpg +0 -0
- package/assets/skills/poster-miniature-diorama/previews/2.jpg +0 -0
- package/assets/skills/poster-miniature-diorama/previews/73d1f002-877c-4796-8077-a728285a5a17.jpg +0 -0
- package/assets/skills/poster-miniature-palm-showroom/SKILL.md +20 -0
- package/assets/skills/poster-miniature-palm-showroom/previews/1.jpg +0 -0
- package/assets/skills/poster-miniature-palm-showroom/previews/2.jpg +0 -0
- package/assets/skills/poster-miniature-palm-showroom/previews/3.jpg +0 -0
- package/assets/skills/poster-miniature-palm-showroom/previews/4.jpg +0 -0
- package/assets/skills/poster-minimal-doodle/SKILL.md +20 -0
- package/assets/skills/poster-minimal-doodle/previews/1.jpg +0 -0
- package/assets/skills/poster-minimal-monument/SKILL.md +20 -0
- package/assets/skills/poster-minimal-monument/previews/1.jpg +0 -0
- package/assets/skills/poster-minimal-monument/previews/2.jpg +0 -0
- package/assets/skills/poster-minimal-monument/previews/3.jpg +0 -0
- package/assets/skills/poster-minimal-monument/previews/4.jpg +0 -0
- package/assets/skills/poster-minimal-wellness/SKILL.md +20 -0
- package/assets/skills/poster-minimal-wellness/previews/1.jpg +0 -0
- package/assets/skills/poster-minimal-wellness/previews/2.jpg +0 -0
- package/assets/skills/poster-minimal-wellness/previews/3.jpg +0 -0
- package/assets/skills/poster-monoline-travel/SKILL.md +22 -0
- package/assets/skills/poster-monoline-travel/previews/1.jpg +0 -0
- package/assets/skills/poster-monoline-travel/previews/2.jpg +0 -0
- package/assets/skills/poster-monoline-travel/previews/3.jpg +0 -0
- package/assets/skills/poster-monoline-travel/previews/4.jpg +0 -0
- package/assets/skills/poster-neon-ribbon-city/SKILL.md +24 -0
- package/assets/skills/poster-neon-ribbon-city/previews/1.jpg +0 -0
- package/assets/skills/poster-neon-ribbon-city/previews/2.jpg +0 -0
- package/assets/skills/poster-neon-ribbon-city/previews/3.jpg +0 -0
- package/assets/skills/poster-neon-ribbon-city/previews/4.jpg +0 -0
- package/assets/skills/poster-neon-sign/SKILL.md +22 -0
- package/assets/skills/poster-neon-sign/previews/1.jpg +0 -0
- package/assets/skills/poster-neon-sign/previews/2.jpg +0 -0
- package/assets/skills/poster-noir-black-gold/SKILL.md +20 -0
- package/assets/skills/poster-noir-black-gold/previews/1.jpg +0 -0
- package/assets/skills/poster-noir-black-gold/previews/2.jpg +0 -0
- package/assets/skills/poster-noir-black-gold/previews/3.jpg +0 -0
- package/assets/skills/poster-noir-black-gold/previews/4.jpg +0 -0
- package/assets/skills/poster-paintbrush-cityscape/SKILL.md +20 -0
- package/assets/skills/poster-paintbrush-cityscape/previews/1.jpg +0 -0
- package/assets/skills/poster-paintbrush-cityscape/previews/2.jpg +0 -0
- package/assets/skills/poster-paintbrush-cityscape/previews/3.jpg +0 -0
- package/assets/skills/poster-paintbrush-cityscape/previews/4.jpg +0 -0
- package/assets/skills/poster-paper-quilling-travel/SKILL.md +22 -0
- package/assets/skills/poster-paper-quilling-travel/previews/1.jpg +0 -0
- package/assets/skills/poster-paper-quilling-travel/previews/2.jpg +0 -0
- package/assets/skills/poster-paper-quilling-travel/previews/3.jpg +0 -0
- package/assets/skills/poster-paper-quilling-travel/previews/4.jpg +0 -0
- package/assets/skills/poster-papercraft-bookmark/SKILL.md +22 -0
- package/assets/skills/poster-papercraft-bookmark/previews/1.jpg +0 -0
- package/assets/skills/poster-papercraft-bookmark/previews/2.jpg +0 -0
- package/assets/skills/poster-papercraft-bookmark/previews/3.jpg +0 -0
- package/assets/skills/poster-papercraft-bookmark/previews/4.jpg +0 -0
- package/assets/skills/poster-papercraft-diorama-travel/SKILL.md +22 -0
- package/assets/skills/poster-papercraft-diorama-travel/previews/1.jpg +0 -0
- package/assets/skills/poster-papercraft-diorama-travel/previews/2.jpg +0 -0
- package/assets/skills/poster-papercraft-grid-diorama/SKILL.md +24 -0
- package/assets/skills/poster-papercraft-grid-diorama/previews/1.jpg +0 -0
- package/assets/skills/poster-papercraft-grid-diorama/previews/2.jpg +0 -0
- package/assets/skills/poster-papercraft-layered-papercut/SKILL.md +24 -0
- package/assets/skills/poster-papercraft-layered-papercut/previews/1.jpg +0 -0
- package/assets/skills/poster-papercraft-layered-papercut/previews/2.jpg +0 -0
- package/assets/skills/poster-papercraft-strip/SKILL.md +22 -0
- package/assets/skills/poster-papercraft-strip/previews/1.jpg +0 -0
- package/assets/skills/poster-papercraft-strip/previews/2.jpg +0 -0
- package/assets/skills/poster-papercraft-strip/previews/3.jpg +0 -0
- package/assets/skills/poster-papercraft-strip/previews/4.jpg +0 -0
- package/assets/skills/poster-papercraft-suitcase/SKILL.md +24 -0
- package/assets/skills/poster-papercraft-suitcase/previews/1.jpg +0 -0
- package/assets/skills/poster-papercraft-suitcase/previews/2.jpg +0 -0
- package/assets/skills/poster-papercraft-suitcase/previews/3.jpg +0 -0
- package/assets/skills/poster-papercut-collage/SKILL.md +22 -0
- package/assets/skills/poster-papercut-collage/previews/1.jpg +0 -0
- package/assets/skills/poster-papercut-collage/previews/2.jpg +0 -0
- package/assets/skills/poster-papercut-collage/previews/3.jpg +0 -0
- package/assets/skills/poster-papercut-collage/previews/4.jpg +0 -0
- package/assets/skills/poster-passport-diorama/SKILL.md +20 -0
- package/assets/skills/poster-passport-diorama/previews/1.jpg +0 -0
- package/assets/skills/poster-passport-diorama/previews/2.jpg +0 -0
- package/assets/skills/poster-passport-diorama/previews/3.jpg +0 -0
- package/assets/skills/poster-passport-diorama/previews/4.jpg +0 -0
- package/assets/skills/poster-passport-portal-city/SKILL.md +22 -0
- package/assets/skills/poster-passport-portal-city/previews/1.jpg +0 -0
- package/assets/skills/poster-passport-portal-city/previews/2.jpg +0 -0
- package/assets/skills/poster-passport-portal-city/previews/3.jpg +0 -0
- package/assets/skills/poster-passport-portal-city/previews/4.jpg +0 -0
- package/assets/skills/poster-pastel-gouache/SKILL.md +22 -0
- package/assets/skills/poster-pastel-gouache/previews/1.jpg +0 -0
- package/assets/skills/poster-pastel-gouache/previews/2.jpg +0 -0
- package/assets/skills/poster-pastel-gouache/previews/3.jpg +0 -0
- package/assets/skills/poster-pastel-papercollage-scene/SKILL.md +28 -0
- package/assets/skills/poster-pastel-papercollage-scene/previews/1.jpg +0 -0
- package/assets/skills/poster-pastel-papercollage-scene/previews/2.jpg +0 -0
- package/assets/skills/poster-pastel-papercollage-scene/previews/3.jpg +0 -0
- package/assets/skills/poster-pastel-papercollage-scene/previews/4.jpg +0 -0
- package/assets/skills/poster-patchwork-amigurumi/SKILL.md +24 -0
- package/assets/skills/poster-patchwork-amigurumi/previews/1.jpg +0 -0
- package/assets/skills/poster-patchwork-amigurumi/previews/2.jpg +0 -0
- package/assets/skills/poster-playful-doodle-respond/SKILL.md +22 -0
- package/assets/skills/poster-playful-doodle-respond/previews/1.jpg +0 -0
- package/assets/skills/poster-playful-doodle-respond/previews/2.jpg +0 -0
- package/assets/skills/poster-pocketwatch-city/SKILL.md +20 -0
- package/assets/skills/poster-pocketwatch-city/previews/1.jpg +0 -0
- package/assets/skills/poster-pocketwatch-city/previews/2.jpg +0 -0
- package/assets/skills/poster-pocketwatch-city/previews/3.jpg +0 -0
- package/assets/skills/poster-pocketwatch-city/previews/4.jpg +0 -0
- package/assets/skills/poster-pop-art-vehicle/SKILL.md +20 -0
- package/assets/skills/poster-pop-art-vehicle/previews/1.jpg +0 -0
- package/assets/skills/poster-pop-art-vehicle/previews/2.jpg +0 -0
- package/assets/skills/poster-pop-art-vehicle/previews/3.jpg +0 -0
- package/assets/skills/poster-pop-art-vehicle/previews/4.jpg +0 -0
- package/assets/skills/poster-popup-storybook/SKILL.md +22 -0
- package/assets/skills/poster-popup-storybook/previews/1.jpg +0 -0
- package/assets/skills/poster-popup-storybook/previews/2.jpg +0 -0
- package/assets/skills/poster-popup-storybook/previews/3.jpg +0 -0
- package/assets/skills/poster-popup-storybook/previews/4.jpg +0 -0
- package/assets/skills/poster-postcard-diorama/SKILL.md +20 -0
- package/assets/skills/poster-postcard-diorama/previews/1.jpg +0 -0
- package/assets/skills/poster-postcard-diorama/previews/2.jpg +0 -0
- package/assets/skills/poster-premium-food-advert/SKILL.md +24 -0
- package/assets/skills/poster-premium-food-advert/previews/1.jpg +0 -0
- package/assets/skills/poster-premium-food-advert/previews/2.jpg +0 -0
- package/assets/skills/poster-pressed-flower-logo/SKILL.md +22 -0
- package/assets/skills/poster-pressed-flower-logo/previews/1.jpg +0 -0
- package/assets/skills/poster-pressed-flower-logo/previews/2.jpg +0 -0
- package/assets/skills/poster-product-doodle-mixed/SKILL.md +20 -0
- package/assets/skills/poster-product-doodle-mixed/previews/1.jpg +0 -0
- package/assets/skills/poster-product-doodle-mixed/previews/2.jpg +0 -0
- package/assets/skills/poster-product-explode-splash/SKILL.md +24 -0
- package/assets/skills/poster-product-explode-splash/previews/1.jpg +0 -0
- package/assets/skills/poster-product-explode-splash/previews/2.jpg +0 -0
- package/assets/skills/poster-product-explode-splash/previews/3.jpg +0 -0
- package/assets/skills/poster-product-explode-splash/previews/4.jpg +0 -0
- package/assets/skills/poster-product-exploded-view/SKILL.md +24 -0
- package/assets/skills/poster-product-exploded-view/previews/1.jpg +0 -0
- package/assets/skills/poster-product-exploded-view/previews/2.jpg +0 -0
- package/assets/skills/poster-product-grid-campaign/SKILL.md +22 -0
- package/assets/skills/poster-product-grid-campaign/previews/1.jpg +0 -0
- package/assets/skills/poster-product-grid-campaign/previews/2.jpg +0 -0
- package/assets/skills/poster-recipe-infographic/SKILL.md +24 -0
- package/assets/skills/poster-recipe-infographic/previews/1.jpg +0 -0
- package/assets/skills/poster-recipe-infographic/previews/2.jpg +0 -0
- package/assets/skills/poster-retro-album-art/SKILL.md +22 -0
- package/assets/skills/poster-retro-album-art/previews/1.jpg +0 -0
- package/assets/skills/poster-retro-album-art/previews/2.jpg +0 -0
- package/assets/skills/poster-risograph-print/SKILL.md +24 -0
- package/assets/skills/poster-risograph-print/previews/1.jpg +0 -0
- package/assets/skills/poster-risograph-print/previews/2.jpg +0 -0
- package/assets/skills/poster-risograph-print/previews/3.jpg +0 -0
- package/assets/skills/poster-risograph-print/previews/4.jpg +0 -0
- package/assets/skills/poster-risography-travel/SKILL.md +22 -0
- package/assets/skills/poster-risography-travel/previews/1.jpg +0 -0
- package/assets/skills/poster-risography-travel/previews/2.jpg +0 -0
- package/assets/skills/poster-risography-travel/previews/3.jpg +0 -0
- package/assets/skills/poster-risography-travel/previews/4.jpg +0 -0
- package/assets/skills/poster-route-map-infographic/SKILL.md +28 -0
- package/assets/skills/poster-route-map-infographic/previews/1.jpg +0 -0
- package/assets/skills/poster-route-map-infographic/previews/2.jpg +0 -0
- package/assets/skills/poster-scandi-monoline/SKILL.md +26 -0
- package/assets/skills/poster-scandi-monoline/previews/1.jpg +0 -0
- package/assets/skills/poster-scandi-monoline/previews/2.jpg +0 -0
- package/assets/skills/poster-scandi-monoline/previews/3.jpg +0 -0
- package/assets/skills/poster-scrapbook-travel/SKILL.md +24 -0
- package/assets/skills/poster-scrapbook-travel/previews/1.jpg +0 -0
- package/assets/skills/poster-scrapbook-travel/previews/2.jpg +0 -0
- package/assets/skills/poster-scrapbook-travel/previews/3.jpg +0 -0
- package/assets/skills/poster-scrapbook-travel/previews/4.jpg +0 -0
- package/assets/skills/poster-screenprint-linocut/SKILL.md +22 -0
- package/assets/skills/poster-screenprint-linocut/previews/1.jpg +0 -0
- package/assets/skills/poster-screenprint-linocut/previews/2.jpg +0 -0
- package/assets/skills/poster-screenprint-linocut/previews/3.jpg +0 -0
- package/assets/skills/poster-screenprint-linocut/previews/4.jpg +0 -0
- package/assets/skills/poster-shrinkwrapped-logo/SKILL.md +20 -0
- package/assets/skills/poster-shrinkwrapped-logo/previews/1.jpg +0 -0
- package/assets/skills/poster-shrinkwrapped-logo/previews/2.jpg +0 -0
- package/assets/skills/poster-silhouette-miniature/SKILL.md +26 -0
- package/assets/skills/poster-silhouette-miniature/previews/1.jpg +0 -0
- package/assets/skills/poster-silhouette-miniature/previews/2.jpg +0 -0
- package/assets/skills/poster-silhouette-miniature/previews/3b8bea15-43b1-4d7b-aad7-b2f5d986cde5.png +0 -0
- package/assets/skills/poster-silk-ribbon-city/SKILL.md +22 -0
- package/assets/skills/poster-silk-ribbon-city/previews/1.jpg +0 -0
- package/assets/skills/poster-silk-ribbon-city/previews/2.jpg +0 -0
- package/assets/skills/poster-silk-ribbon-city/previews/3.jpg +0 -0
- package/assets/skills/poster-silk-ribbon-city/previews/4.jpg +0 -0
- package/assets/skills/poster-sleek-product-hero/SKILL.md +24 -0
- package/assets/skills/poster-sleek-product-hero/previews/1.jpg +0 -0
- package/assets/skills/poster-sleek-product-hero/previews/2.jpg +0 -0
- package/assets/skills/poster-soft-beauty-doodle/SKILL.md +22 -0
- package/assets/skills/poster-soft-beauty-doodle/previews/1.jpg +0 -0
- package/assets/skills/poster-soft-beauty-doodle/previews/2.jpg +0 -0
- package/assets/skills/poster-souvenir-badge/SKILL.md +22 -0
- package/assets/skills/poster-souvenir-badge/previews/1.jpg +0 -0
- package/assets/skills/poster-souvenir-badge/previews/2.jpg +0 -0
- package/assets/skills/poster-souvenir-magnet-poster/SKILL.md +20 -0
- package/assets/skills/poster-souvenir-magnet-poster/previews/1.jpg +0 -0
- package/assets/skills/poster-souvenir-magnet-poster/previews/2.jpg +0 -0
- package/assets/skills/poster-sports-champion-3d/SKILL.md +26 -0
- package/assets/skills/poster-sports-champion-3d/previews/1.jpg +0 -0
- package/assets/skills/poster-sports-maximalist/SKILL.md +20 -0
- package/assets/skills/poster-sports-maximalist/previews/1.jpg +0 -0
- package/assets/skills/poster-sports-maximalist/previews/2.jpg +0 -0
- package/assets/skills/poster-sports-passport-diorama/SKILL.md +22 -0
- package/assets/skills/poster-sports-passport-diorama/previews/1.jpg +0 -0
- package/assets/skills/poster-sports-passport-diorama/previews/2.jpg +0 -0
- package/assets/skills/poster-stone-water-product/SKILL.md +20 -0
- package/assets/skills/poster-stone-water-product/previews/1.jpg +0 -0
- package/assets/skills/poster-storyboard-character/SKILL.md +22 -0
- package/assets/skills/poster-storyboard-character/previews/1.jpg +0 -0
- package/assets/skills/poster-storybook-paper-collage-travel/SKILL.md +26 -0
- package/assets/skills/poster-storybook-paper-collage-travel/previews/1.jpg +0 -0
- package/assets/skills/poster-storybook-paper-collage-travel/previews/2.jpg +0 -0
- package/assets/skills/poster-storybook-vintage/SKILL.md +22 -0
- package/assets/skills/poster-storybook-vintage/previews/1.jpg +0 -0
- package/assets/skills/poster-storybook-vintage/previews/2.jpg +0 -0
- package/assets/skills/poster-storybook-vintage/previews/3.jpg +0 -0
- package/assets/skills/poster-street-art-mural/SKILL.md +22 -0
- package/assets/skills/poster-street-art-mural/previews/1.jpg +0 -0
- package/assets/skills/poster-surreal-postcard/SKILL.md +24 -0
- package/assets/skills/poster-surreal-postcard/previews/1.jpg +0 -0
- package/assets/skills/poster-surreal-postcard/previews/2.jpg +0 -0
- package/assets/skills/poster-surreal-postcard/previews/3.jpg +0 -0
- package/assets/skills/poster-surreal-postcard/previews/4.jpg +0 -0
- package/assets/skills/poster-swiss-letter-editorial/SKILL.md +24 -0
- package/assets/skills/poster-swiss-letter-editorial/previews/1.jpg +0 -0
- package/assets/skills/poster-swiss-letter-editorial/previews/2.jpg +0 -0
- package/assets/skills/poster-swiss-letter-editorial/previews/3.jpg +0 -0
- package/assets/skills/poster-tablet-papercraft-diorama/SKILL.md +24 -0
- package/assets/skills/poster-tablet-papercraft-diorama/previews/1.jpg +0 -0
- package/assets/skills/poster-tablet-papercraft-diorama/previews/2.jpg +0 -0
- package/assets/skills/poster-tablet-papercraft-diorama/previews/3.jpg +0 -0
- package/assets/skills/poster-tablet-papercraft-diorama/previews/4.jpg +0 -0
- package/assets/skills/poster-tabletop-miniature-diorama/SKILL.md +20 -0
- package/assets/skills/poster-tabletop-miniature-diorama/previews/1.jpg +0 -0
- package/assets/skills/poster-tabletop-miniature-diorama/previews/2.jpg +0 -0
- package/assets/skills/poster-tabletop-miniature-diorama/previews/3.jpg +0 -0
- package/assets/skills/poster-tabletop-miniature-diorama/previews/4.jpg +0 -0
- package/assets/skills/poster-tabletop-travel-planning/SKILL.md +22 -0
- package/assets/skills/poster-tabletop-travel-planning/previews/1.jpg +0 -0
- package/assets/skills/poster-tabletop-travel-planning/previews/2.jpg +0 -0
- package/assets/skills/poster-ticket-portal-city/SKILL.md +26 -0
- package/assets/skills/poster-ticket-portal-city/previews/1.jpg +0 -0
- package/assets/skills/poster-ticket-portal-city/previews/2.jpg +0 -0
- package/assets/skills/poster-time-travel-split/SKILL.md +22 -0
- package/assets/skills/poster-time-travel-split/previews/1.jpg +0 -0
- package/assets/skills/poster-tiny-planet-city/SKILL.md +24 -0
- package/assets/skills/poster-tiny-planet-city/previews/1.jpg +0 -0
- package/assets/skills/poster-tiny-planet-city/previews/2.jpg +0 -0
- package/assets/skills/poster-transparent-product/SKILL.md +20 -0
- package/assets/skills/poster-transparent-product/previews/1.jpg +0 -0
- package/assets/skills/poster-transparent-product/previews/2.jpg +0 -0
- package/assets/skills/poster-travel-collage/SKILL.md +22 -0
- package/assets/skills/poster-travel-collage/previews/1.jpg +0 -0
- package/assets/skills/poster-travel-collage/previews/2.jpg +0 -0
- package/assets/skills/poster-travel-food-spiral/SKILL.md +22 -0
- package/assets/skills/poster-travel-food-spiral/previews/1.jpg +0 -0
- package/assets/skills/poster-travel-food-spiral/previews/2.jpg +0 -0
- package/assets/skills/poster-travel-guide-comic/SKILL.md +24 -0
- package/assets/skills/poster-travel-guide-comic/previews/1.jpg +0 -0
- package/assets/skills/poster-travel-guide-comic/previews/2.jpg +0 -0
- package/assets/skills/poster-travel-infographic/SKILL.md +22 -0
- package/assets/skills/poster-travel-infographic/previews/1.jpg +0 -0
- package/assets/skills/poster-travel-infographic/previews/2.jpg +0 -0
- package/assets/skills/poster-typographic-city-fashion/SKILL.md +22 -0
- package/assets/skills/poster-typographic-city-fashion/previews/1.jpg +0 -0
- package/assets/skills/poster-typographic-city-fashion/previews/2.jpg +0 -0
- package/assets/skills/poster-typographic-city-fashion/previews/3.jpg +0 -0
- package/assets/skills/poster-typographic-letters-travel/SKILL.md +22 -0
- package/assets/skills/poster-typographic-letters-travel/previews/1.jpg +0 -0
- package/assets/skills/poster-typographic-letters-travel/previews/2.jpg +0 -0
- package/assets/skills/poster-typographic-letters-travel/previews/3.jpg +0 -0
- package/assets/skills/poster-vibrant-papercut-collage/SKILL.md +26 -0
- package/assets/skills/poster-vibrant-papercut-collage/previews/1.jpg +0 -0
- package/assets/skills/poster-vibrant-papercut-collage/previews/2.jpg +0 -0
- package/assets/skills/poster-vibrant-papercut-collage/previews/3.jpg +0 -0
- package/assets/skills/poster-vibrant-papercut-collage/previews/4.jpg +0 -0
- package/assets/skills/poster-vintage-airmail-stamp/SKILL.md +28 -0
- package/assets/skills/poster-vintage-airmail-stamp/previews/1.jpg +0 -0
- package/assets/skills/poster-vintage-airmail-stamp/previews/2.jpg +0 -0
- package/assets/skills/poster-vintage-encyclopedia/SKILL.md +26 -0
- package/assets/skills/poster-vintage-encyclopedia/previews/1.jpg +0 -0
- package/assets/skills/poster-vintage-encyclopedia/previews/2.jpg +0 -0
- package/assets/skills/poster-vintage-handpainted-ad/SKILL.md +26 -0
- package/assets/skills/poster-vintage-handpainted-ad/previews/1.jpg +0 -0
- package/assets/skills/poster-vintage-handpainted-ad/previews/2.jpg +0 -0
- package/assets/skills/poster-vintage-handpainted-ad/previews/3.jpg +0 -0
- package/assets/skills/poster-vintage-handpainted-ad/previews/4.jpg +0 -0
- package/assets/skills/poster-vintage-newspaper/SKILL.md +22 -0
- package/assets/skills/poster-vintage-newspaper/previews/1.jpg +0 -0
- package/assets/skills/poster-vintage-newspaper/previews/2.jpg +0 -0
- package/assets/skills/poster-vintage-newspaper/previews/3.jpg +0 -0
- package/assets/skills/poster-vintage-newspaper/previews/4.jpg +0 -0
- package/assets/skills/poster-vintage-romantic-typography/SKILL.md +24 -0
- package/assets/skills/poster-vintage-romantic-typography/previews/1.jpg +0 -0
- package/assets/skills/poster-vintage-romantic-typography/previews/2.jpg +0 -0
- package/assets/skills/poster-vintage-romantic-typography/previews/3.jpg +0 -0
- package/assets/skills/poster-vintage-romantic-typography/previews/4.jpg +0 -0
- package/assets/skills/poster-vintage-travel-journal/SKILL.md +22 -0
- package/assets/skills/poster-vintage-travel-journal/previews/1.jpg +0 -0
- package/assets/skills/poster-vintage-travel-journal/previews/2.jpg +0 -0
- package/assets/skills/poster-vintage-travel-magazine/SKILL.md +24 -0
- package/assets/skills/poster-vintage-travel-magazine/previews/1.jpg +0 -0
- package/assets/skills/poster-vintage-travel-magazine/previews/2.jpg +0 -0
- package/assets/skills/poster-watercolor-arch-travel/SKILL.md +20 -0
- package/assets/skills/poster-watercolor-arch-travel/previews/1.jpg +0 -0
- package/assets/skills/poster-watercolor-arch-travel/previews/2.jpg +0 -0
- package/assets/skills/poster-watercolor-arch-travel/previews/3.jpg +0 -0
- package/assets/skills/poster-watercolor-arch-travel/previews/4.jpg +0 -0
- package/assets/skills/poster-watercolor-travel/SKILL.md +26 -0
- package/assets/skills/poster-watercolor-travel/previews/1.jpg +0 -0
- package/assets/skills/poster-watercolor-travel/previews/2.jpg +0 -0
- package/assets/skills/poster-watercolor-travel-journal/SKILL.md +22 -0
- package/assets/skills/poster-watercolor-travel-journal/previews/1.jpg +0 -0
- package/assets/skills/poster-watercolor-travel-journal/previews/2.jpg +0 -0
- package/assets/skills/poster-window-frame-travel/SKILL.md +22 -0
- package/assets/skills/poster-window-frame-travel/previews/1.jpg +0 -0
- package/assets/skills/poster-window-frame-travel/previews/2.jpg +0 -0
- package/assets/skills/poster-window-frame-travel/previews/3.jpg +0 -0
- package/assets/skills/poster-window-frame-travel/previews/4.jpg +0 -0
- package/assets/skills/poster-winter-storybook/SKILL.md +20 -0
- package/assets/skills/poster-winter-storybook/previews/1.jpg +0 -0
- package/assets/skills/poster-winter-storybook/previews/2.jpg +0 -0
- package/assets/skills/poster-winter-storybook/previews/3.jpg +0 -0
- package/assets/skills/poster-woodcut-propaganda/SKILL.md +22 -0
- package/assets/skills/poster-woodcut-propaganda/previews/1.jpg +0 -0
- package/assets/skills/poster-woodcut-propaganda/previews/2.jpg +0 -0
- package/assets/skills/poster-woodcut-propaganda/previews/3.jpg +0 -0
- package/assets/skills/poster-woodcut-propaganda/previews/4.jpg +0 -0
- package/cordis.patch.yml +8 -0
- package/lib/client.js +1538 -0
- package/lib/client.js.map +1 -0
- package/lib/gate.js +115 -0
- package/lib/index.js +133 -0
- package/lib/invariant.js +18 -0
- package/lib/poster-service.js +128 -0
- package/lib/previews-route.js +72 -0
- package/lib/shared/disabled-flag.js +14 -0
- package/lib/shared/poster-contract.js +26 -0
- package/lib/shared/poster-trace.js +109 -0
- package/lib/shared/skill-format.js +69 -0
- package/lib/skills/store.js +456 -0
- package/lib/spec.js +16 -0
- package/lib/tools/get-all-skills.js +84 -0
- package/lib/tools/pick-skill.js +154 -0
- package/lib/trace-hub.js +63 -0
- package/lib/typert.js +18 -0
- package/lib/version-gate.js +149 -0
- package/package.json +104 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","names":["useState","useCallback","useMemo","useState","useRef","classes","Button","Modal","useState","classes","useState","classes","useState","classes","useState","classes","Modal","IconCloseOutline16","useState","classes","posterCss","posterNodesCss"],"sources":["../src/client/locales.ts","../src/shared/disabled-flag.ts","../src/shared/poster-contract.ts","../src/client/api.ts","../src/client/usePosterPanel.ts","../src/client/PosterSection.tsx","../src/client/PosterDisabledSection.tsx","../src/shared/poster-trace.ts","../src/client/usePosterTrace.ts","../src/client/PosterInspectButton.tsx","../src/client/PosterSkillsNode.tsx","../src/client/PosterImage.tsx","../src/client/PosterPickNode.tsx","../src/client/index.ts"],"sourcesContent":["/**\n * 海报设计设置面板的文案词典。\n * 命名空间 `settings.poster` 合并进 LocaleNamespaceMap,\n * 注册后组件通过框架注入的 `t` seat 取文案。\n */\nexport const en = {\n /** Settings nav label. */\n nav: 'Poster Design',\n /** Section heading. */\n title: 'Poster Design',\n // --- 版本不兼容停用面板 ---\n disabledTitle: 'This plugin has been disabled automatically.',\n disabledFallback: 'The host half did not start: the installed harness version is not supported.',\n disabledWindow: 'Supported harness versions: {min} ~ {max} (inclusive).',\n disabledInstallLabel: 'Install a supported harness version:',\n disabledCopy: 'Copy',\n disabledCopied: 'Copied!',\n 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.',\n // --- 总开关(root footer) ---\n enableLabel: 'Enable poster design',\n enabledOn: 'Enabled: the poster flow is available in conversations (depends on dsh-qw-tool for image tools).',\n enabledOff: 'Disabled: the poster flow stays out of conversations and adds no prompt overhead.',\n enabledButIncomplete: 'The switch is on, but the flow is inactive until these are resolved:',\n gateIncomplete: 'Complete the following before enabling:',\n missingSkills: 'install at least one poster skill',\n loading: 'Loading saved configuration…',\n // --- Skill Library tab ---\n skillsTitle: 'Installed skills',\n uploadButton: 'Install from zip…',\n uploadBusy: 'Installing {fileName}…',\n uploadDoneOk: '{message}',\n uploadFailed: 'Installation failed: {message}',\n skillEmpty: 'No skills installed yet. Install one from a zip to enable poster design.',\n skillBundled: 'built-in',\n skillBundledLocked: 'Built-in skills cannot be removed',\n skillRemove: 'Remove',\n skillPreviewAlt: 'Preview of {title}',\n invalidTitle: 'Folders that failed validation',\n invalidHint: 'These folders do not match the poster skill format; remove them or fix their contents.',\n invalidRemove: 'Delete folder',\n // --- skill 详情弹窗 ---\n close: 'Close',\n carouselPrev: 'Previous preview',\n carouselNext: 'Next preview',\n skillWhenToUseLabel: 'When to use',\n // --- 渲染节点 ---\n posterLoading: 'Loading image…',\n posterLoadFailed: 'Failed to load the image: {message}',\n nodeSkillsTitle: 'Poster skill library',\n nodePickTitle: 'Style pick',\n nodeRunning: 'running…',\n nodeDone: 'done',\n nodeFailed: 'failed',\n nodeAborted: 'Cancelled / interrupted',\n stepScan: '① Skill library scan',\n stepParams: '① Received parameters',\n stepOptions: '② Candidates — pick one',\n stepAnswer: '③ Final selection',\n paramCandidates: 'Candidates',\n paramQuestion: 'Question',\n skillsScanned: 'Scanned {count} skills in {duration}',\n skillsInvalid: '{count} folder(s) failed validation',\n pickHint: 'Pick a style for this poster.',\n chooseThis: 'Pick this one',\n chosenBadge: 'Selected',\n customPlaceholder: 'Optional additions (e.g. copy, palette)…',\n waitingChoice: 'Waiting for your pick…',\n answerExpired: 'This pick has expired (the call already finished or was interrupted).',\n finalSkill: 'Chosen skill',\n finalCustom: 'Your additions',\n inspect: 'Inspect',\n nodeCollapse: 'Collapse',\n nodeExpand: 'Expand',\n stepPending: '…',\n} as const\n\n/** The settings.poster namespace key union. */\nexport type PosterKey = keyof typeof en\n\n/** Chinese strings (same keys as {@link en}). */\nexport const zh: Record<PosterKey, string> = {\n nav: '海报设计',\n title: '海报设计',\n disabledTitle: '本插件已被自动停用。',\n disabledFallback: 'host 半未启动:当前安装的 harness 版本不受支持。',\n disabledWindow: '支持的 harness 版本窗口:{min} ~ {max}(含)。',\n disabledInstallLabel: '安装受支持的 harness 版本:',\n disabledCopy: '复制',\n disabledCopied: '已复制!',\n disabledHint: '请将 harness 调整到受支持的版本窗口(按上方原因升级或降级),或等待兼容的插件版本后重启。详见 dsh 启动日志。',\n enableLabel: '启用海报设计',\n enabledOn: '已启用:对话中可使用海报工作流(图像工具依赖 dsh-qw-tool)。',\n enabledOff: '未启用:海报功能不进入对话,也不占用上下文。',\n enabledButIncomplete: '开关已打开,但以下事项未解决,海报功能未激活:',\n gateIncomplete: '完成以下事项后才能启用:',\n missingSkills: '安装至少一个海报 skill',\n loading: '正在读取已保存的配置…',\n skillsTitle: '已安装的 skill',\n uploadButton: '从压缩包安装…',\n uploadBusy: '正在安装 {fileName}…',\n uploadDoneOk: '{message}',\n uploadFailed: '安装失败:{message}',\n skillEmpty: '还没有安装任何 skill。从压缩包安装一个之后才能启用海报设计。',\n skillBundled: '内置',\n skillBundledLocked: '内置 skill 不可删除',\n skillRemove: '删除',\n skillPreviewAlt: '「{title}」的预览图',\n invalidTitle: '校验失败的文件夹',\n invalidHint: '这些文件夹不符合海报 skill 格式,可以删除或修正内容后重试。',\n invalidRemove: '删除文件夹',\n close: '关闭',\n carouselPrev: '上一张预览图',\n carouselNext: '下一张预览图',\n skillWhenToUseLabel: '适用场景',\n posterLoading: '图片加载中…',\n posterLoadFailed: '图片加载失败:{message}',\n nodeSkillsTitle: '海报风格库',\n nodePickTitle: '风格点选',\n nodeRunning: '进行中…',\n nodeDone: '已完成',\n nodeFailed: '失败',\n nodeAborted: '已取消/中断',\n stepScan: '① 风格库扫描',\n stepParams: '① 接收参数',\n stepOptions: '② 候选风格(请选择一个)',\n stepAnswer: '③ 最终选择',\n paramCandidates: '候选',\n paramQuestion: '提问',\n skillsScanned: '扫描到 {count} 个风格,耗时 {duration}',\n skillsInvalid: '{count} 个文件夹校验失败',\n pickHint: '请为本次海报选择一个风格。',\n chooseThis: '选这个',\n chosenBadge: '已选择',\n customPlaceholder: '补充要求(可选,如文案、色调)…',\n waitingChoice: '等待选择…',\n answerExpired: '该选择已过期(调用已结束或中断)。',\n finalSkill: '选中 skill',\n finalCustom: '用户补充',\n inspect: 'Inspect',\n nodeCollapse: '收起',\n nodeExpand: '展开',\n stepPending: '…',\n}\n\n/** Locale namespace owned by this plugin. */\nexport const POSTER_NS = 'settings.poster'\n","/**\n * host 半版本门禁软禁用时的跨进程标记(host → client)。\n *\n * host 半(index.ts)软禁用时不注册任何业务能力,只经\n * `webserver/index-inject` 向 index.html 注入一个全局变量(harness 渲染时\n * `<` 已转义,值纯 JSON);client 半(client/index.ts)加载时读取该变量,\n * 存在即改挂\"已停用\"说明面板,不存在则走正常注册路径。\n *\n * 版本判断逻辑只在 host 半(version-gate.ts)有一份,client 不复制——\n * 此文件只是两侧共享的常量与载荷形状,不得引入任何 Node 依赖(client\n * bundle 会内联本文件)。\n */\n\n/** 注入 index.html 的全局标记名(`globalThis[DISABLED_GLOBAL]`)。 */\nexport const DISABLED_GLOBAL = '__DSH_POST_GEN_DISABLED__'\n\n/** 标记载荷:host 半给出的停用原因(含 harness 版本指引)与支持窗口。 */\nexport interface DisabledFlag {\n reason: string\n /** 支持下限(含),与 version-gate.ts 的 MIN_HARNESS_VERSION 一致。 */\n min: string\n /** 支持上限(含),与 version-gate.ts 的 MAX_HARNESS_VERSION 一致。 */\n max: string\n /**\n * 推荐安装目标版本:固定取支持上限 MAX(窗口内最新版,升级/降级都装它),\n * 由 host 半软禁用分支给出;client 直接渲染\n * `npm install -g @deepseek-ai/dsh@<installVersion>`,不自行推导。\n */\n installVersion: string\n}\n","/**\n * host 与 client 共享的海报业务 RPC 契约。\n * 浏览器端经 `ctx.connection.rpc.call('/api', <endpoint>, { args })` 调用\n * host 半的 `poster` 服务(见 src/index.ts)。\n * 本模块两端共用:只允许类型与不依赖平台的常量/纯函数。\n *\n * 自 v0.2 起仅保留海报工作流自身的端点(风格库 + 配置 + trace/点选);\n * 千问 API 调用端点已移交 dsh-qw-tool 插件(其服务 wire namespace 为 qwen)。\n */\n\n/** RPC 端点(`<namespace>/<method>`)。 */\nexport const POSTER_ENDPOINT = {\n /** 读取服务端保存的海报设计配置(启用开关)。 */\n getConfig: 'poster/getConfig',\n /** 保存海报设计配置(补丁式部分字段)。 */\n saveConfig: 'poster/saveConfig',\n /** 列出 skill 库(已安装 skill + 校验失败的文件夹)。 */\n listSkills: 'poster/listSkills',\n /** 上传 zip 安装/更新一个海报 skill。 */\n installSkill: 'poster/installSkill',\n /** 卸载(删除)一个海报 skill 文件夹。 */\n uninstallSkill: 'poster/uninstallSkill',\n /** 读某次工具调用的实时步骤 trace(运行中加速器;settle 后用 meta)。 */\n getCallTrace: 'poster/getCallTrace',\n /** 提交 poster_gen_pick_poster_skill 候选卡片上的用户选择。 */\n answerSkill: 'poster/answerSkill',\n} as const\n\n/** 服务端持久化的海报设计配置(与 src/spec.ts 的 PosterSettings 对齐)。 */\nexport interface PosterConfig {\n /** 海报业务总开关:开启且库内 ≥1 个合法 skill 后才向会话注册工具/提示词。 */\n enabled: boolean\n}\n\n/** getConfig 结果。 */\nexport type PosterGetConfigResult = { ok: true; config: PosterConfig }\n\n/** saveConfig 请求:补丁式部分字段。 */\nexport interface PosterSaveConfigRequest {\n enabled?: boolean\n}\n\n/** saveConfig 结果。 */\nexport type PosterSaveConfigResult = { ok: true }\n\n// ---------------------------------------------------------------------------\n// skill 库:list / install / uninstall。\n// ---------------------------------------------------------------------------\n\n/** skill 库面板展示用的已安装 skill 摘要。 */\nexport interface PosterSkillSummary {\n name: string\n title: string\n description: string\n whenToUse?: string\n styleTags: string[]\n /** 预览图 URL(host 预览路由;可能为空数组)。 */\n previews: string[]\n /** 是否为插件自带(首启播种)的 skill。 */\n bundled: boolean\n}\n\n/** 校验失败的 skill 文件夹。 */\nexport interface PosterSkillInvalid {\n folder: string\n reason: string\n}\n\n/** listSkills 结果。 */\nexport type PosterListSkillsResult =\n | { ok: true; skills: PosterSkillSummary[]; invalid: PosterSkillInvalid[] }\n | { ok: false; error: { code: 'store-unavailable'; message?: string } }\n\n/** installSkill 请求(zip 内容 base64)。 */\nexport interface PosterInstallSkillRequest {\n /** 上传文件名(仅展示/日志用)。 */\n fileName?: string\n /** zip 字节的 base64。 */\n dataBase64: string\n}\n\n/** installSkill 结果;installed=false + updated=true 表示同名覆盖更新。 */\nexport type PosterInstallSkillResult =\n | { ok: true; skill: PosterSkillSummary; updated: boolean }\n | { ok: false; error: { code: 'bad-zip' | 'invalid-skill' | 'too-large' | 'io-failed'; message: string } }\n\n/** uninstallSkill 请求(skill 名或校验失败的文件夹名)。 */\nexport interface PosterUninstallSkillRequest {\n name: string\n}\n\n/** uninstallSkill 结果。 */\nexport type PosterUninstallSkillResult =\n | { ok: true }\n | { ok: false; error: { code: 'bad-name' | 'not-found' | 'bundled' | 'io-failed'; message?: string } }\n\n// ---------------------------------------------------------------------------\n// 渲染节点:运行中 trace 轮询 + 候选选择应答。\n// trace 类型见 shared/poster-trace.ts(这里 type-only 引入避免循环依赖)。\n// ---------------------------------------------------------------------------\n\nimport type { PosterTrace } from './poster-trace.js'\n\n/** getCallTrace 请求。 */\nexport interface PosterGetCallTraceRequest {\n /** 工具调用 ID(toolview props 的 callId)。 */\n callId: string\n}\n\n/** getCallTrace 结果:callId 未知/已清理时 trace 为 null(不算失败)。 */\nexport type PosterGetCallTraceResult = { ok: true; trace: PosterTrace | null }\n\n/** answerSkill 请求:用户在候选卡片上的选择。 */\nexport interface PosterAnswerSkillRequest {\n /** 工具调用 ID。 */\n callId: string\n /** 选中的 skill 名。 */\n skill: string\n /** 可选的补充要求(并入 styleBrief)。 */\n custom?: string\n}\n\n/** answerSkill 结果;not-found = 调用已结束/中断(页面重开后按钮失效)。 */\nexport type PosterAnswerSkillResult =\n | { ok: true }\n | { ok: false; error: { code: 'bad-request' | 'not-found'; message?: string } }\n","/**\n * 海报业务的浏览器端数据访问。\n *\n * 数据流:\n * - 配置读写、skill 库管理、trace/点选:经 host 半代理\n * (`ctx.connection.rpc.call('/api', 'poster/...')`)——配置由 host 端\n * 持久化(settings.yaml),skill 库在 host 磁盘上(<dshHome>/dsh-post-gen/skills/)。\n * - 千问 API Key 的配置与校验已移交 dsh-qw-tool 插件,此处不再涉及。\n */\nimport type { ClientConnectionRpc } from '@deepseek-ai/dsh-client-connection/client'\nimport {\n POSTER_ENDPOINT,\n type PosterAnswerSkillResult,\n type PosterConfig,\n type PosterGetCallTraceResult,\n type PosterGetConfigResult,\n type PosterInstallSkillResult,\n type PosterListSkillsResult,\n type PosterSaveConfigRequest,\n type PosterSaveConfigResult,\n type PosterSkillSummary,\n type PosterSkillInvalid,\n type PosterUninstallSkillResult,\n} from '../shared/poster-contract'\nimport type { PosterTrace } from '../shared/poster-trace'\n\nexport type {\n PosterConfig,\n PosterSkillSummary,\n PosterSkillInvalid,\n} from '../shared/poster-contract'\nexport type {\n PosterPickTrace,\n PosterSkillsTrace,\n PosterTrace,\n} from '../shared/poster-trace'\n\n/** 一次远端操作的 UI 侧统一结果。 */\nexport type OpResult<T> =\n | { ok: true; value: T }\n | { ok: false; kind: 'invalid-key' | 'network' | 'http' | 'business'; detail?: string; code?: string }\n\n/** RPC 通道返回的最小包络(与 Typert Gateway 的 invokeRpc 一致)。 */\ninterface RpcEnvelope {\n ok: boolean\n value?: unknown\n error?: { code?: string; message?: string }\n}\n\n/** 调用 host 半的 poster 服务端点,统一把通道错误折叠进 OpResult。 */\nasync function callPoster<T>(rpc: ClientConnectionRpc, endpoint: string, args: Record<string, unknown>): Promise<OpResult<T>> {\n let envelope: RpcEnvelope\n try {\n envelope = (await rpc.call('/api', endpoint, { args })) as RpcEnvelope\n } catch (error) {\n return { ok: false, kind: 'network', detail: error instanceof Error ? error.message : String(error) }\n }\n if (!envelope || typeof envelope !== 'object') return { ok: false, kind: 'http', detail: 'bad envelope' }\n if (!envelope.ok) return { ok: false, kind: 'http', detail: envelope.error?.message ?? 'rpc failed' }\n return { ok: true, value: envelope.value as T }\n}\n\n/** 读取 host 端保存的配置(启用开关)。 */\nexport async function getConfigViaHost(rpc: ClientConnectionRpc): Promise<OpResult<{ config: PosterConfig }>> {\n const result = await callPoster<PosterGetConfigResult>(rpc, POSTER_ENDPOINT.getConfig, {})\n if (!result.ok) return result\n if (!result.value || typeof result.value !== 'object' || typeof result.value.config !== 'object') {\n return { ok: false, kind: 'http', detail: 'bad result' }\n }\n return { ok: true, value: { config: result.value.config } }\n}\n\n/** 保存配置到 host 端(补丁式部分字段)。 */\nexport async function saveConfigViaHost(rpc: ClientConnectionRpc, patch: PosterSaveConfigRequest): Promise<OpResult<null>> {\n const result = await callPoster<PosterSaveConfigResult>(rpc, POSTER_ENDPOINT.saveConfig, { request: patch })\n if (!result.ok) return result\n const body = result.value\n if (!body || typeof body !== 'object') return { ok: false, kind: 'http', detail: 'bad result' }\n return { ok: true, value: null }\n}\n\n/** 列出 skill 库(已安装 + 校验失败的文件夹)。 */\nexport async function listSkillsViaHost(\n rpc: ClientConnectionRpc,\n): Promise<OpResult<{ skills: PosterSkillSummary[]; invalid: PosterSkillInvalid[] }>> {\n const result = await callPoster<PosterListSkillsResult>(rpc, POSTER_ENDPOINT.listSkills, {})\n if (!result.ok) return result\n const body = result.value\n if (!body || typeof body !== 'object') return { ok: false, kind: 'http', detail: 'bad result' }\n if (!body.ok) return { ok: false, kind: 'business', detail: body.error?.message ?? body.error?.code }\n return { ok: true, value: { skills: body.skills, invalid: body.invalid } }\n}\n\n/** 上传 zip 安装/更新一个 skill;dataBase64 为 zip 字节的 base64。 */\nexport async function installSkillViaHost(\n rpc: ClientConnectionRpc,\n request: { fileName: string; dataBase64: string },\n): Promise<OpResult<{ skill: PosterSkillSummary; updated: boolean }>> {\n const result = await callPoster<PosterInstallSkillResult>(rpc, POSTER_ENDPOINT.installSkill, { request })\n if (!result.ok) return result\n const body = result.value\n if (!body || typeof body !== 'object') return { ok: false, kind: 'http', detail: 'bad result' }\n if (!body.ok) return { ok: false, kind: 'business', detail: body.error.message }\n return { ok: true, value: { skill: body.skill, updated: body.updated } }\n}\n\n/** 卸载(删除)一个 skill 文件夹(校验失败的文件夹名也可传)。 */\nexport async function uninstallSkillViaHost(rpc: ClientConnectionRpc, name: string): Promise<OpResult<null>> {\n const result = await callPoster<PosterUninstallSkillResult>(rpc, POSTER_ENDPOINT.uninstallSkill, { request: { name } })\n if (!result.ok) return result\n const body = result.value\n if (!body || typeof body !== 'object') return { ok: false, kind: 'http', detail: 'bad result' }\n if (!body.ok) return { ok: false, kind: 'business', detail: body.error?.message ?? body.error?.code }\n return { ok: true, value: null }\n}\n\n/** 读某次工具调用的实时步骤 trace(渲染节点运行中轮询;未知 callId → value null)。 */\nexport async function getCallTraceViaHost(rpc: ClientConnectionRpc, callId: string): Promise<OpResult<PosterTrace | null>> {\n const result = await callPoster<PosterGetCallTraceResult>(rpc, POSTER_ENDPOINT.getCallTrace, { request: { callId } })\n if (!result.ok) return result\n const body = result.value\n if (!body || typeof body !== 'object') return { ok: false, kind: 'http', detail: 'bad result' }\n return { ok: true, value: body.trace ?? null }\n}\n\n/** 提交候选卡片上的用户选择;not-found 时返回值的 code 为 'not-found'。 */\nexport async function answerSkillViaHost(\n rpc: ClientConnectionRpc,\n request: { callId: string; skill: string; custom?: string },\n): Promise<OpResult<null>> {\n const result = await callPoster<PosterAnswerSkillResult>(rpc, POSTER_ENDPOINT.answerSkill, { request })\n if (!result.ok) return result\n const body = result.value\n if (!body || typeof body !== 'object') return { ok: false, kind: 'http', detail: 'bad result' }\n if (!body.ok) {\n return { ok: false, kind: 'business', detail: body.error?.message ?? body.error?.code, code: body.error?.code }\n }\n return { ok: true, value: null }\n}\n\n/** File → base64(分块避免参数栈溢出)。 */\nexport async function fileToBase64(file: File): Promise<string> {\n const buffer = await file.arrayBuffer()\n const bytes = new Uint8Array(buffer)\n let binary = ''\n const CHUNK = 0x8000\n for (let index = 0; index < bytes.length; index += CHUNK) {\n binary += String.fromCharCode(...bytes.subarray(index, index + CHUNK))\n }\n return btoa(binary)\n}","/**\n * 海报设计面板的数据流 hook:状态机 + 全部动作。\n *\n * 流程(配置持久化在 host 端 settings 文档):\n * 1. 打开面板先经 host 拿配置 + skill 库列表;\n * 2. Skill 库 tab:上传 zip 安装、按卡片浏览(带预览图)、卸载;\n * 3. 顶部总开关(enabled):库内 ≥1 个合法 skill 才允许打开;打开后 host 半\n * 才把海报工具/提示词注册进会话(门控见 host 半 src/gate.ts)。\n *\n * 千问 API Key 的配置由 dsh-qw-tool 插件负责,本插件不问。\n */\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport type {\n OpResult,\n PosterConfig,\n PosterSkillInvalid,\n PosterSkillSummary,\n} from './api'\n\n/** 面板的 API 面(由入口把 host 代理组装进来)。 */\nexport interface PosterApi {\n /** 读取 host 端保存的配置(启用开关)。 */\n getConfig: () => Promise<OpResult<{ config: PosterConfig }>>\n /** 保存配置到 host 端(补丁式)。 */\n saveConfig: (patch: { enabled?: boolean }) => Promise<OpResult<null>>\n /** 列出 skill 库。 */\n listSkills: () => Promise<OpResult<{ skills: PosterSkillSummary[]; invalid: PosterSkillInvalid[] }>>\n /** 上传 zip 安装/更新一个 skill。 */\n installSkill: (request: { fileName: string; dataBase64: string }) => Promise<OpResult<{ skill: PosterSkillSummary; updated: boolean }>>\n /** 卸载一个 skill(或校验失败的文件夹)。 */\n uninstallSkill: (name: string) => Promise<OpResult<null>>\n}\n\n/** 面板状态机(加载/就绪)。 */\nexport type PanelStatus = { kind: 'loading' } | { kind: 'idle' }\n\n/** 启用门控的缺失项 key(与 host 半 src/gate.ts 的判定语义一致)。 */\nexport type GateMissing = 'skills'\n\n/** zip 上传的状态。 */\nexport type UploadState =\n | { kind: 'idle' }\n | { kind: 'busy'; fileName: string }\n | { kind: 'done'; message: string }\n | { kind: 'error'; message: string }\n\n/** 把一个操作结果折叠进状态机。 */\nfunction statusOfFailure(result: { kind: string; detail?: string }): PanelStatus {\n void result\n return { kind: 'idle' }\n}\n\n/** 海报设计面板的数据流。 */\nexport function usePosterPanel(api: PosterApi) {\n const [status, setStatus] = useState<PanelStatus>({ kind: 'loading' })\n /** 海报业务总开关(持久化在 settings.enabled)。 */\n const [enabled, setEnabled] = useState(false)\n /** skill 库内容。 */\n const [skills, setSkills] = useState<PosterSkillSummary[]>([])\n const [invalidSkills, setInvalidSkills] = useState<PosterSkillInvalid[]>([])\n const [upload, setUpload] = useState<UploadState>({ kind: 'idle' })\n /** 正在卸载的 skill 名(按钮防重复点击)。 */\n const [removing, setRemoving] = useState<string | undefined>(undefined)\n\n /** 经 host 刷新 skill 库列表。 */\n const refreshSkills = useCallback(async () => {\n const result = await api.listSkills()\n if (result.ok) {\n setSkills(result.value.skills)\n setInvalidSkills(result.value.invalid)\n }\n return result\n }, [api])\n\n /** 打开面板:拿配置 + skill 库。 */\n useEffect(() => {\n let alive = true\n void (async () => {\n const [config, skillList] = await Promise.all([api.getConfig(), api.listSkills()])\n if (!alive) return\n if (config.ok) setEnabled(config.value.config.enabled)\n setStatus({ kind: 'idle' })\n if (skillList.ok) {\n setSkills(skillList.value.skills)\n setInvalidSkills(skillList.value.invalid)\n }\n })()\n return () => {\n alive = false\n }\n }, [api])\n\n /** 门控缺失项(开关可打开的前置条件)。 */\n const missing = useMemo<GateMissing[]>(() => {\n const list: GateMissing[] = []\n if (skills.length === 0) list.push('skills')\n return list\n }, [skills])\n\n /** 切换总开关:配不齐时不允许打开(打开后再缺配置时 host 门控自动关闭业务)。 */\n const toggleEnabled = useCallback(() => {\n if (!enabled && missing.length > 0) return\n const next = !enabled\n setEnabled(next)\n void api.saveConfig({ enabled: next })\n }, [api, enabled, missing])\n\n /** 上传 zip 安装 skill。 */\n const uploadSkill = useCallback(\n async (file: File, dataBase64: string) => {\n setUpload({ kind: 'busy', fileName: file.name })\n const result = await api.installSkill({ fileName: file.name, dataBase64 })\n if (result.ok) {\n setUpload({\n kind: 'done',\n message: result.value.updated ? `已更新「${result.value.skill.title}」` : `已安装「${result.value.skill.title}」`,\n })\n await refreshSkills()\n } else {\n setUpload({ kind: 'error', message: result.detail ?? '安装失败' })\n }\n },\n [api, refreshSkills],\n )\n\n /** 卸载一个 skill / 删除一个校验失败的文件夹。 */\n const removeSkill = useCallback(\n async (name: string) => {\n setRemoving(name)\n const result = await api.uninstallSkill(name)\n if (!result.ok) {\n setUpload({ kind: 'error', message: result.detail ?? `删除 ${name} 失败` })\n }\n await refreshSkills()\n setRemoving(undefined)\n },\n [api, refreshSkills],\n )\n\n return {\n status,\n enabled,\n toggleEnabled,\n missing,\n skills,\n invalidSkills,\n upload,\n setUpload,\n uploadSkill,\n removeSkill,\n removing,\n refreshSkills,\n }\n}\n","/**\n * 海报设计设置面板(settings.section 条目):纯渲染层。\n * 数据流(状态机/动作)在 ./usePosterPanel.ts,样式在 ./PosterSection.module.css\n * (CSS Modules:构建期哈希类名,文本经入口 effect 注入),数据访问在 ./api.ts。\n *\n * 布局:标题 + Skill 库 tab 固定顶部;总开关固定在 root footer(下方展示\n * 启用条件缺失提示);滚动区为 Skill 库:zip 上传安装 + 两列 skill 卡片网格\n * (点击卡片弹详情 modal:全部预览图/说明/元信息/删除操作)。\n * 千问 API Key 的配置由 dsh-qw-tool 插件负责,本面板不问。\n */\nimport { useRef, useState } from 'react'\nimport { Button, Modal } from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'\nimport { usePosterPanel, type GateMissing, type PosterApi } from './usePosterPanel'\nimport { fileToBase64, type PosterSkillSummary } from './api'\nimport classes from './PosterSection.module.css'\nimport type { PosterKey } from './locales'\n\n/** 组件的 inject face:host 代理的数据面。 */\nexport interface PosterSectionInjected {\n api: PosterApi\n}\n\nexport type PosterSectionProps = PropsRuntime<'settings.section'> & PropsLocale<'settings.poster'> & PosterSectionInjected\n\n/** 门控缺失项的词典 key。 */\nconst MISSING_LABEL_KEY: Record<GateMissing, PosterKey> = {\n skills: 'missingSkills',\n}\n\n/** 海报设计设置页。 */\nexport function PosterSection(props: PosterSectionProps) {\n const { t, api } = props\n const panel = usePosterPanel(api)\n const {\n status,\n enabled,\n toggleEnabled,\n missing,\n skills,\n invalidSkills,\n upload,\n setUpload,\n uploadSkill,\n removeSkill,\n removing,\n } = panel\n /** skill 详情 modal 里当前展示的 skill。 */\n const [selectedSkill, setSelectedSkill] = useState<PosterSkillSummary | undefined>(undefined)\n const fileInputRef = useRef<HTMLInputElement>(null)\n\n const busy = status.kind === 'loading'\n // 门控:配齐才允许打开开关;打开后缺配置时提示未激活项。\n const gateReady = missing.length === 0\n const missingText = missing.map((key) => t(MISSING_LABEL_KEY[key])).join('; ')\n const toggleHint = enabled\n ? gateReady\n ? t('enabledOn')\n : `${t('enabledButIncomplete')} ${missingText}`\n : gateReady\n ? t('enabledOff')\n : `${t('gateIncomplete')} ${missingText}`\n\n /** 选择 zip 文件 → base64 → 经 host 安装。 */\n const onFilePicked = async (file: File | undefined): Promise<void> => {\n if (!file) return\n try {\n const dataBase64 = await fileToBase64(file)\n await uploadSkill(file, dataBase64)\n } catch (error) {\n setUpload({ kind: 'error', message: error instanceof Error ? error.message : String(error) })\n }\n }\n\n /** 从详情 modal 删除 skill(内置的不可删,按钮不出现)。 */\n const onRemoveFromModal = (name: string): void => {\n setSelectedSkill(undefined)\n void removeSkill(name)\n }\n\n return (\n <div className={classes.section}>\n <div className={classes.header}>\n <h2 className={classes.title}>{t('title')}</h2>\n </div>\n\n <div className={classes.scroll}>\n <div className={classes.field}>\n <div className={classes.skillsHeadRow}>\n <span className={classes.label}>{t('skillsTitle')}</span>\n <div className={classes.uploadRow}>\n <Button\n variant=\"primary\"\n size=\"sm\"\n disabled={upload.kind === 'busy'}\n onClick={() => fileInputRef.current?.click()}\n >\n {upload.kind === 'busy' ? t('uploadBusy', { fileName: upload.fileName }) : t('uploadButton')}\n </Button>\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\".zip,application/zip\"\n hidden\n onChange={(event) => {\n const file = event.currentTarget.files?.[0]\n event.currentTarget.value = ''\n void onFilePicked(file)\n }}\n />\n </div>\n </div>\n {upload.kind === 'done' && <span className={classes.uploadOk}>{t('uploadDoneOk', { message: upload.message })}</span>}\n {upload.kind === 'error' && <span className={classes.uploadError}>{t('uploadFailed', { message: upload.message })}</span>}\n {skills.length === 0 && <p className={classes.note}>{t('skillEmpty')}</p>}\n\n <div className={classes.skillGrid}>\n {skills.map((skill) => (\n <button\n key={skill.name}\n type=\"button\"\n className={classes.skillCard}\n onClick={() => setSelectedSkill(skill)}\n >\n {skill.previews.length > 0 ? (\n <img\n className={classes.skillPreview}\n src={skill.previews[0]}\n alt={t('skillPreviewAlt', { title: skill.title })}\n loading=\"lazy\"\n decoding=\"async\"\n />\n ) : (\n <div className={classes.skillPreviewPlaceholder}>?</div>\n )}\n <span className={classes.skillCardTitleRow}>\n <span className={classes.label}>{skill.title}</span>\n {skill.bundled && <span className={classes.bundledTag}>{t('skillBundled')}</span>}\n </span>\n </button>\n ))}\n </div>\n </div>\n\n {invalidSkills.length > 0 && (\n <>\n <div className={classes.field}>\n <span className={classes.label}>{t('invalidTitle')}</span>\n <span className={classes.help}>{t('invalidHint')}</span>\n </div>\n {invalidSkills.map((entry) => (\n <div key={entry.folder} className={classes.invalidRow}>\n <div className={classes.skillText}>\n <span className={classes.label}>{entry.folder}</span>\n <span className={classes.help}>{entry.reason}</span>\n </div>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n disabled={removing === entry.folder}\n onClick={() => void removeSkill(entry.folder)}\n >\n {t('invalidRemove')}\n </Button>\n </div>\n ))}\n </>\n )}\n </div>\n\n {/* root footer:总开关常驻,下方提示启用条件缺失项。 */}\n <div className={classes.footer}>\n <div className={classes.footerToggle}>\n <label className={classes.switch}>\n <input\n type=\"checkbox\"\n checked={enabled}\n disabled={!enabled && !gateReady}\n onChange={() => toggleEnabled()}\n />\n <span className={classes.label}>{t('enableLabel')}</span>\n </label>\n <span className={classes.help}>{toggleHint}</span>\n </div>\n </div>\n\n {/* skill 详情 modal:全部预览图 + 说明/元信息 + 操作。 */}\n <Modal\n open={selectedSkill !== undefined}\n onClose={() => setSelectedSkill(undefined)}\n title={selectedSkill?.title ?? ''}\n closeLabel={t('close')}\n description={selectedSkill?.description}\n footer={\n selectedSkill === undefined ? undefined : selectedSkill.bundled ? (\n <span className={classes.help}>{t('skillBundledLocked')}</span>\n ) : (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n disabled={removing === selectedSkill.name}\n onClick={() => onRemoveFromModal(selectedSkill.name)}\n >\n {t('skillRemove')}\n </Button>\n )\n }\n >\n {selectedSkill !== undefined && (\n <div>\n <PreviewCarousel\n urls={selectedSkill.previews}\n alt={t('skillPreviewAlt', { title: selectedSkill.title })}\n prevLabel={t('carouselPrev')}\n nextLabel={t('carouselNext')}\n />\n {selectedSkill.whenToUse !== undefined && (\n <div className={classes.modalMeta}>\n <div className={classes.modalMetaRow}>\n <span className={classes.modalMetaLabel}>{t('skillWhenToUseLabel')}</span>\n <span>{selectedSkill.whenToUse}</span>\n </div>\n </div>\n )}\n </div>\n )}\n </Modal>\n </div>\n )\n}\n\n/**\n * skill 预览图轮播:单图直出;多图时左右箭头切换 + 底部圆点指示。\n */\nfunction PreviewCarousel(props: { urls: string[]; alt: string; prevLabel: string; nextLabel: string }) {\n const { urls, alt, prevLabel, nextLabel } = props\n const [index, setIndex] = useState(0)\n if (urls.length === 0) return <div className={classes.modalPreviewPlaceholder}>?</div>\n if (urls.length === 1) return <img className={classes.carouselImageSingle} src={urls[0]!} alt={alt} />\n const current = urls[Math.min(index, urls.length - 1)]!\n return (\n <div className={classes.carousel}>\n <img key={current} className={classes.carouselImage} src={current} alt={alt} />\n <button\n type=\"button\"\n className={classes.carouselArrow}\n aria-label={prevLabel}\n disabled={index === 0}\n onClick={() => setIndex((value) => value - 1)}\n >\n ‹\n </button>\n <button\n type=\"button\"\n className={classes.carouselArrowRight}\n aria-label={nextLabel}\n disabled={index >= urls.length - 1}\n onClick={() => setIndex((value) => value + 1)}\n >\n ›\n </button>\n <div className={classes.carouselDots}>\n {urls.map((url, dotIndex) => (\n <button\n key={url}\n type=\"button\"\n className={dotIndex === index ? classes.carouselDotActive : classes.carouselDot}\n aria-label={`${dotIndex + 1}`}\n onClick={() => setIndex(dotIndex)}\n />\n ))}\n </div>\n </div>\n )\n}\n","/**\n * 版本不兼容时的设置面板(settings.section 条目):host 半版本门禁软禁用后,\n * 业务能力全部不可用,本面板代替正常面板向用户说明原因与处置(装回受支持\n * 版本的 harness,或等待兼容版本)。原因文本与推荐安装版本由 host 半经\n * index 注入的全局标记带来(../shared/disabled-flag.ts),经 inject props\n * 传入,不在浏览器侧重复版本判断。\n */\nimport { useState } from 'react'\nimport type { PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'\nimport classes from './PosterSection.module.css'\n\n/** 组件的 inject face:host 半给出的停用原因、支持版本窗口与推荐安装版本。 */\nexport interface PosterDisabledSectionInjected {\n reason: string\n min: string\n max: string\n /** 推荐安装目标版本(host 半给定,固定为支持上限 MAX)。 */\n installVersion: string\n}\n\nexport type PosterDisabledSectionProps =\n PropsRuntime<'settings.section'>\n & PropsLocale<'settings.poster'>\n & PosterDisabledSectionInjected\n\n/** 复制成功反馈的显示时长(ms)。 */\nconst COPIED_FEEDBACK_MS = 2000\n\n/** 版本不兼容说明页(含安装命令与复制按钮)。 */\nexport function PosterDisabledSection(props: PosterDisabledSectionProps) {\n const { t, reason, min, max, installVersion } = props\n const [copied, setCopied] = useState(false)\n const installCommand = `npm install -g @deepseek-ai/dsh@${installVersion}`\n\n const copyCommand = async (): Promise<void> => {\n try {\n await navigator.clipboard.writeText(installCommand)\n setCopied(true)\n setTimeout(() => setCopied(false), COPIED_FEEDBACK_MS)\n } catch (error) {\n console.warn('[dsh-post-gen] copy install command failed:', error)\n }\n }\n\n return (\n <div className={classes.disabledSection}>\n <h2 className={classes.title}>{t('title')}</h2>\n <p className={classes.intro}>{t('disabledTitle')}</p>\n <p className={classes.intro}>{reason !== '' ? reason : t('disabledFallback')}</p>\n {min !== '' && max !== '' && <p className={classes.intro}>{t('disabledWindow', { min, max })}</p>}\n {installVersion !== '' && (\n <p className={classes.intro}>\n {t('disabledInstallLabel')}\n <span className={classes.row}>\n <code className={classes.command}>{installCommand}</code>\n <button type=\"button\" className={classes.button} onClick={() => void copyCommand()}>\n {copied ? t('disabledCopied') : t('disabledCopy')}\n </button>\n </span>\n </p>\n )}\n <p className={classes.intro}>{t('disabledHint')}</p>\n </div>\n )\n}\n","/**\n * 海报原语工具的步骤 trace 类型(host 与 client 共用的纯数据模块)。\n *\n * 数据通道:\n * - durable:工具完成时 trace 整体写入 presentationMeta → tool/result meta;\n * - 运行中:同一份对象在 host 内存 trace 表(PosterTraceHub)里被逐步填充,\n * client 经 poster/getCallTrace 轮询拿快照做实时渲染。\n *\n * 自 v0.2 起仅保留风格库相关 trace(get_all_skills / pick);生图/多模态 trace\n * 已随 Qwen 调用移除——那部分工具由 dsh-qw-tool 插件提供。\n */\nexport interface PosterSkillsTrace {\n kind: 'poster-skills'\n /** 扫描结果摘要(渲染节点\"已扫描 N 个 skill\"实时状态)。 */\n scanned?: { count: number; invalid: number; durationMs?: number }\n /** 轻量目录(name/title/标签),供渲染节点列表展示。 */\n catalog?: { name: string; title: string; styleTags: string[] }[]\n}\n\nexport interface PosterPickTrace {\n kind: 'poster-pick'\n /** ① 接收参数(候选由模型传入;自定义候选带 title)。 */\n params: { candidates: { name: string; title?: string; reason: string }[]; question?: string }\n /** ② host 补全 title/previews 后的候选卡片数据(自定义候选带 prompt、无预览图)。 */\n options?: { name: string; title: string; reason: string; previews: string[]; prompt?: string }[]\n /** ③ 用户选择。 */\n answer?: { chosenSkill: string; chosenTitle: string; custom?: string }\n}\n\nexport type PosterTrace = PosterSkillsTrace | PosterPickTrace\n\n// ---------------------------------------------------------------------------\n// 宽容解析(client 渲染 meta / RPC 快照用;结构不符降级为 undefined)。\n// ---------------------------------------------------------------------------\n\nfunction str(value: unknown): string | undefined {\n return typeof value === 'string' && value !== '' ? value : undefined\n}\n\nfunction num(value: unknown): number | undefined {\n return typeof value === 'number' && Number.isFinite(value) ? value : undefined\n}\n\n/** 宽容解析 skill 库扫描 trace。 */\nexport function parseSkillsTrace(meta: unknown): PosterSkillsTrace | undefined {\n if (!meta || typeof meta !== 'object') return undefined\n const t = meta as Record<string, unknown>\n if (t.kind !== 'poster-skills') return undefined\n const trace: PosterSkillsTrace = { kind: 'poster-skills' }\n if (t.scanned && typeof t.scanned === 'object') {\n const s = t.scanned as Record<string, unknown>\n const count = num(s.count)\n if (count !== undefined) {\n trace.scanned = {\n count,\n invalid: num(s.invalid) ?? 0,\n ...(num(s.durationMs) !== undefined ? { durationMs: num(s.durationMs)! } : {}),\n }\n }\n }\n if (Array.isArray(t.catalog)) {\n trace.catalog = t.catalog\n .map((entry): { name: string; title: string; styleTags: string[] } | undefined => {\n if (!entry || typeof entry !== 'object') return undefined\n const e = entry as Record<string, unknown>\n const name = str(e.name)\n if (name === undefined) return undefined\n return {\n name,\n title: str(e.title) ?? name,\n styleTags: Array.isArray(e.styleTags) ? e.styleTags.filter((tag): tag is string => typeof tag === 'string') : [],\n }\n })\n .filter((entry): entry is { name: string; title: string; styleTags: string[] } => entry !== undefined)\n }\n return trace\n}\n\n/** 宽容解析候选点选 trace。 */\nexport function parsePickTrace(meta: unknown): PosterPickTrace | undefined {\n if (!meta || typeof meta !== 'object') return undefined\n const t = meta as Record<string, unknown>\n if (t.kind !== 'poster-pick') return undefined\n const params = (t.params ?? {}) as Record<string, unknown>\n const candidates = Array.isArray(params.candidates)\n ? params.candidates\n .map((entry): { name: string; title?: string; reason: string } | undefined => {\n if (!entry || typeof entry !== 'object') return undefined\n const e = entry as Record<string, unknown>\n const name = str(e.name)\n if (name === undefined) return undefined\n return { name, reason: str(e.reason) ?? '', ...(str(e.title) !== undefined ? { title: str(e.title)! } : {}) }\n })\n .filter((entry): entry is { name: string; title?: string; reason: string } => entry !== undefined)\n : []\n const trace: PosterPickTrace = {\n kind: 'poster-pick',\n params: {\n candidates,\n ...(str(params.question) !== undefined ? { question: str(params.question)! } : {}),\n },\n }\n if (Array.isArray(t.options)) {\n trace.options = t.options\n .map((entry): { name: string; title: string; reason: string; previews: string[]; prompt?: string } | undefined => {\n if (!entry || typeof entry !== 'object') return undefined\n const e = entry as Record<string, unknown>\n const name = str(e.name)\n const title = str(e.title)\n if (name === undefined || title === undefined) return undefined\n return {\n name,\n title,\n reason: str(e.reason) ?? '',\n previews: Array.isArray(e.previews) ? e.previews.filter((p): p is string => typeof p === 'string') : [],\n ...(str(e.prompt) !== undefined ? { prompt: str(e.prompt)! } : {}),\n }\n })\n .filter((entry): entry is { name: string; title: string; reason: string; previews: string[]; prompt?: string } => entry !== undefined)\n }\n if (t.answer && typeof t.answer === 'object') {\n const a = t.answer as Record<string, unknown>\n const chosenSkill = str(a.chosenSkill)\n const chosenTitle = str(a.chosenTitle)\n if (chosenSkill !== undefined && chosenTitle !== undefined) {\n trace.answer = {\n chosenSkill,\n chosenTitle,\n ...(str(a.custom) !== undefined ? { custom: str(a.custom)! } : {}),\n }\n }\n }\n return trace\n}\n","/**\n * 渲染节点的共享 hook 与小工具(design §5.4 数据源优先级):\n * - settled('kind' in block)→ 一律从 block.meta 里的 trace 渲染\n * (刷新/重开/压缩后一致);\n * - running → 以 props 里的 callId 轮询 poster/getCallTrace(~1s)增量\n * 补齐后续步骤;trace RPC 只是加速器,不作为回放数据源。\n */\nimport { useEffect, useState } from 'react'\nimport type { ToolCallBlock } from '@deepseek-ai/dsh-client-runtime/client'\nimport type { OpResult, PosterTrace } from './api'\n\nexport interface TraceSource {\n getCallTrace: (callId: string) => Promise<OpResult<PosterTrace | null>>\n}\n\n/**\n * 取当前调用的 trace:settled 从 meta 解析(durable),running 轮询 RPC。\n * @param parse - 宽容解析器(结构不符返回 undefined,该字段对应步骤不渲染)。\n */\nexport function usePosterTrace<T extends PosterTrace>(\n block: ToolCallBlock,\n callId: string,\n api: TraceSource,\n parse: (meta: unknown) => T | undefined,\n): T | undefined {\n const settled = 'kind' in block && block.kind === 'tool-result'\n const metaTrace = 'kind' in block ? parse(block.meta) : undefined\n const [live, setLive] = useState<T | undefined>(undefined)\n\n useEffect(() => {\n if (settled) return\n let alive = true\n const tick = async (): Promise<void> => {\n const result = await api.getCallTrace(callId)\n if (!alive || !result.ok || result.value === null) return\n const parsed = parse(result.value)\n if (parsed !== undefined) setLive(parsed)\n }\n void tick()\n const timer = setInterval(() => void tick(), 1000)\n return () => {\n alive = false\n clearInterval(timer)\n }\n }, [settled, callId, api, parse])\n\n return metaTrace ?? live\n}\n\n/** 从 running call / settled result 里取工具参数(tool/call arguments)。 */\nexport function argsOf(block: ToolCallBlock): Record<string, unknown> {\n const raw = 'kind' in block ? block.call?.argsRaw : block.argsRaw\n if (typeof raw !== 'string' || raw === '') return {}\n try {\n const parsed: unknown = JSON.parse(raw)\n return parsed !== null && typeof parsed === 'object' && !Array.isArray(parsed)\n ? (parsed as Record<string, unknown>)\n : {}\n } catch {\n return {}\n }\n}\n\n/** 工具结果的纯文本(错误态展示用)。 */\nexport function resultTextOf(content: readonly unknown[]): string {\n return content\n .filter((block): block is { type: 'text'; text: string } =>\n !!block && typeof block === 'object' && (block as { type?: unknown }).type === 'text')\n .map((block) => block.text)\n .join('')\n}\n\n/** 毫秒 → \"12.3s\" 展示。 */\nexport function formatDuration(ms: number): string {\n return `${(ms / 1000).toFixed(1)}s`\n}\n","/**\n * 自定义渲染节点头部操作区的 Inspect 按钮。语义与内置 ToolRow 的\n * Inspect pill 一致:跳到 trajectory 视图中该 tool 调用的原始记录。\n * 回调由 ToolCallTree 经 owner 注入(ui-tool contract/slots.ts 的\n * ToolCallOwnerProps.inspect),自定义节点默认不消费它,这里补挂上;\n * 未注入(undefined,如无 trajectory 视图)时不渲染。\n */\nimport classes from './PosterNodes.module.css'\n\nexport function PosterInspectButton({\n onClick,\n label,\n}: {\n onClick?: (() => void) | undefined\n label: string\n}) {\n if (onClick === undefined) return null\n return (\n <button type=\"button\" className={classes.inspectButton} onClick={onClick}>\n {label}\n </button>\n )\n}\n","/**\n * poster_gen_get_all_poster_skills 的渲染节点(keyed `tool.call.toolview`,\n * design 四期 §4.7)。展示扫描状态 + 轻量目录列表(title 用 tag 方框 UI 流式排布)。\n * 目录只有 frontmatter 元数据:SKILL.md 正文(生图提示词模板)全文不进这里,\n * 点选原语选中后才返回;meta 只放目录摘要。\n */\nimport { useState } from 'react'\nimport type { PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'\n// Type-only:'tool.call.toolview' 的 SlotMap 合并声明。\nimport type {} from '@deepseek-ai/dsh-client-ui-tool/client'\nimport { parseSkillsTrace } from '../shared/poster-trace'\nimport type { OpResult, PosterTrace } from './api'\nimport { formatDuration, resultTextOf, usePosterTrace } from './usePosterTrace'\nimport { PosterInspectButton } from './PosterInspectButton'\nimport classes from './PosterNodes.module.css'\n\nexport interface SkillsNodeInjected {\n api: {\n getCallTrace: (callId: string) => Promise<OpResult<PosterTrace | null>>\n }\n}\n\nexport type PosterSkillsNodeProps = PropsRuntime<'tool.call.toolview'> &\n PropsLocale<'settings.poster'> &\n SkillsNodeInjected\n\nexport function PosterSkillsNode(props: PosterSkillsNodeProps) {\n const { block, callId, api, t, inspect } = props\n const settled = 'kind' in block && block.kind === 'tool-result'\n const failed = settled && block.isError\n const trace = usePosterTrace(block, callId, api, parseSkillsTrace)\n const [collapsed, setCollapsed] = useState(false)\n\n return (\n <div className={classes.node}>\n <div className={classes.head}>\n <span className={classes.title}>{t('nodeSkillsTitle')}</span>\n <span className={classes.headActions}>\n <span className={`${classes.status} ${failed ? classes.statusFailed : ''}`}>\n {settled ? (failed ? t('nodeFailed') : t('nodeDone')) : t('nodeRunning')}\n </span>\n <PosterInspectButton onClick={inspect} label={t('inspect')} />\n <button type=\"button\" className={classes.collapseButton} onClick={() => setCollapsed((v) => !v)}>\n {collapsed ? t('nodeExpand') : t('nodeCollapse')}\n </button>\n </span>\n </div>\n\n {!collapsed && (\n <>\n {/* ① 扫描状态 */}\n {trace?.scanned !== undefined && (\n <div className={classes.step}>\n <span className={classes.stepTitle}>{t('stepScan')}</span>\n <div className={classes.kv}>\n <span className={classes.kvValue}>\n {t('skillsScanned', {\n count: String(trace.scanned.count),\n duration: formatDuration(trace.scanned.durationMs ?? 0),\n })}\n </span>\n </div>\n {trace.scanned.invalid > 0 && (\n <span className={classes.note}>{t('skillsInvalid', { count: String(trace.scanned.invalid) })}</span>\n )}\n </div>\n )}\n\n {/* ② 目录列表(title 作 tag 方框,流式排布) */}\n {trace?.catalog !== undefined && (\n <div className={classes.step}>\n <span className={classes.stepTitle}>{t('paramCandidates')}</span>\n <div className={classes.catalogList}>\n {trace.catalog.map((entry) => (\n <span key={entry.name} className={classes.chip}>{entry.title}</span>\n ))}\n </div>\n </div>\n )}\n {!settled && trace?.scanned === undefined && <div className={classes.note}>{t('stepPending')}</div>}\n\n {failed && 'kind' in block && <div className={classes.error}>{resultTextOf(block.content)}</div>}\n </>\n )}\n </div>\n )\n}\n","/**\n * PosterImage:海报相关 UI 的图片组件(design §5.1 图片约定)——\n * 固定尺寸容器 + `object-fit: contain` 渲染;点击图片弹出放大预览。\n *\n * 自 v0.2 起只用于\"直接可引用的 URL\"(skill 预览图走 host 预览路由);\n * 附件模式(readImage RPC 拉字节)已随生图工具移交 dsh-qw-tool,不再需要。\n *\n * 放大预览基于 ui-primitives 的 **Modal(headless 模式)** 自建:共享的对话\n * 遮罩 + body portal + ESC/点遮罩关闭。\n */\nimport { useState } from 'react'\nimport { IconCloseOutline16, Modal } from '@deepseek-ai/dsh-client-ui-primitives'\nimport classes from './PosterNodes.module.css'\n\ninterface PosterImageBase {\n alt: string\n /** thumb = 列表/参考图小框;result = 结果海报大框;plain = 无边框固定容器。 */\n variant?: 'thumb' | 'result' | 'plain'\n /** 加载中文案(调用方给已本地化的字符串)。 */\n loadingLabel: string\n /** 加载失败文案。 */\n failedLabel: (message: string) => string\n}\n\nexport type PosterImageProps = PosterImageBase & { src: string }\n\nexport function PosterImage(props: PosterImageProps) {\n const { alt, variant = 'thumb', loadingLabel, failedLabel } = props\n const url = props.src\n const [zoom, setZoom] = useState(false)\n\n void loadingLabel\n void failedLabel\n\n const frameClass =\n variant === 'result'\n ? `${classes.imageFrame} ${classes.imageFrameResult}`\n : variant === 'plain'\n ? `${classes.imageFrame} ${classes.imageFramePlain}`\n : classes.imageFrame\n return (\n <>\n <button\n type=\"button\"\n className={frameClass}\n onClick={() => {\n if (url !== undefined) setZoom(true)\n }}\n title={alt}\n >\n {url !== undefined ? (\n <img src={url} alt={alt} />\n ) : (\n <span className={classes.imageState}>{failedLabel('')}</span>\n )}\n </button>\n <Modal open={zoom && url !== undefined} onClose={() => setZoom(false)} title={alt} headless className={classes.lightboxDialog}>\n <div className={classes.lightboxContent}>\n {url !== undefined && <img className={classes.lightboxImage} src={url} alt={alt} />}\n <button type=\"button\" className={classes.lightboxClose} aria-label={alt} onClick={() => setZoom(false)}>\n <IconCloseOutline16 size={16} />\n </button>\n </div>\n </Modal>\n </>\n )\n}\n","/**\n * poster_gen_pick_poster_skill 的渲染节点(keyed `tool.call.toolview`,\n * design 四期 §4.5/§4.7)。\n *\n * 候选由模型经 tool/call arguments 传入(name + 推荐理由;自定义候选另带\n * title + prompt,卡片无预览图、展示提示词节选);host 补全库内候选的\n * title/previews 后经 trace.options 提供卡片数据。三态:waiting(可点选 →\n * answerSkill → 乐观置\"已选\")/ answered(选中卡高亮)/ aborted(result\n * isError 且无 answer → \"已取消/中断\",如 harness 重启打断等待)。\n */\nimport { useState } from 'react'\nimport type { PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'\n// Type-only:'tool.call.toolview' 的 SlotMap 合并声明。\nimport type {} from '@deepseek-ai/dsh-client-ui-tool/client'\nimport { parsePickTrace } from '../shared/poster-trace'\nimport type { OpResult, PosterTrace } from './api'\nimport { PosterImage } from './PosterImage'\nimport { argsOf, resultTextOf, usePosterTrace } from './usePosterTrace'\nimport { PosterInspectButton } from './PosterInspectButton'\nimport classes from './PosterNodes.module.css'\n\n/** 组件的 inject 面:trace 轮询 / 选择应答。 */\nexport interface PickNodeInjected {\n api: {\n getCallTrace: (callId: string) => Promise<OpResult<PosterTrace | null>>\n answerSkill: (request: { callId: string; skill: string; custom?: string }) => Promise<OpResult<null>>\n }\n}\n\nexport type PosterPickNodeProps = PropsRuntime<'tool.call.toolview'> &\n PropsLocale<'settings.poster'> &\n PickNodeInjected\n\n/** 本地点选状态(乐观 UI;host 确认前先行高亮)。 */\ntype PickState = { kind: 'idle' } | { kind: 'picked'; skill: string } | { kind: 'expired' }\n\nexport function PosterPickNode(props: PosterPickNodeProps) {\n const { block, callId, api, t, inspect } = props\n const settled = 'kind' in block && block.kind === 'tool-result'\n const failed = settled && block.isError\n const trace = usePosterTrace(block, callId, api, parsePickTrace)\n const args = argsOf(block)\n\n const [pick, setPick] = useState<PickState>({ kind: 'idle' })\n const [custom, setCustom] = useState('')\n const [collapsed, setCollapsed] = useState(false)\n\n const answer = trace?.answer\n const chosenSkill = answer?.chosenSkill ?? (pick.kind === 'picked' ? pick.skill : undefined)\n const expired = pick.kind === 'expired'\n const options = trace?.options\n const waiting = !settled && options !== undefined && chosenSkill === undefined && !expired\n const aborted = failed && answer === undefined\n\n const choose = (skill: string): void => {\n if (!waiting) return\n const trimmed = custom.trim()\n setPick({ kind: 'picked', skill })\n void api\n .answerSkill({ callId, skill, ...(trimmed !== '' ? { custom: trimmed } : {}) })\n .then((result) => {\n if (!result.ok) setPick({ kind: 'expired' })\n })\n }\n\n const question = trace?.params.question ?? (typeof args.question === 'string' ? args.question : undefined)\n\n return (\n <div className={classes.node}>\n <div className={classes.head}>\n <span className={classes.title}>{t('nodePickTitle')}</span>\n <span className={classes.headActions}>\n <span className={`${classes.status} ${failed ? classes.statusFailed : ''}`}>\n {settled ? (failed ? t('nodeFailed') : t('nodeDone')) : t('nodeRunning')}\n </span>\n <PosterInspectButton onClick={inspect} label={t('inspect')} />\n <button type=\"button\" className={classes.collapseButton} onClick={() => setCollapsed((v) => !v)}>\n {collapsed ? t('nodeExpand') : t('nodeCollapse')}\n </button>\n </span>\n </div>\n\n {!collapsed && (\n <>\n {/* ① 接收参数(提问 + 模型传入的候选) */}\n <div className={classes.step}>\n <span className={classes.stepTitle}>{t('stepParams')}</span>\n {question !== undefined && (\n <div className={classes.kv}>\n <span className={classes.kvKey}>{t('paramQuestion')}</span>\n <span className={classes.kvValue}>{question}</span>\n </div>\n )}\n\n </div>\n\n {/* ② 候选卡片(三态:waiting / answered / aborted) */}\n {options !== undefined && (\n <div className={classes.step}>\n <span className={classes.stepTitle}>{t('stepOptions')}</span>\n <span className={classes.note}>{t('pickHint')}</span>\n {waiting && (\n <input\n className={classes.customInput}\n value={custom}\n placeholder={t('customPlaceholder')}\n onChange={(event) => setCustom(event.target.value)}\n />\n )}\n <div className={classes.optionGrid}>\n {options.map((option) => {\n const isChosen = option.name === chosenSkill\n const dimmed = chosenSkill !== undefined && !isChosen\n return (\n <div\n key={option.name}\n className={`${classes.optionCard} ${isChosen ? classes.optionCardChosen : ''} ${dimmed ? classes.optionCardDimmed : ''}`}\n >\n {option.previews.length > 0 && (\n <OptionPreviewCarousel\n urls={option.previews}\n alt={t('skillPreviewAlt', { title: option.title })}\n prevLabel={t('carouselPrev')}\n nextLabel={t('carouselNext')}\n loadingLabel={t('posterLoading')}\n failedLabel={(message) => t('posterLoadFailed', { message })}\n />\n )}\n <span className={classes.optionTitle}>{option.title}</span>\n <span className={classes.optionReason}>{option.reason !== '' ? option.reason : ''}</span>\n {option.prompt !== undefined && (\n <span className={classes.optionPrompt}>{option.prompt}</span>\n )}\n {isChosen ? (\n <span className={`${classes.optionButton} ${classes.optionButtonChosen}`}>{t('chosenBadge')}</span>\n ) : (\n <button\n type=\"button\"\n className={classes.optionButton}\n disabled={!waiting}\n onClick={() => choose(option.name)}\n >\n {t('chooseThis')}\n </button>\n )}\n </div>\n )\n })}\n </div>\n {waiting && <span className={classes.note}>{t('waitingChoice')}</span>}\n {expired && <span className={classes.note}>{t('answerExpired')}</span>}\n {aborted && <span className={classes.note}>{t('nodeAborted')}</span>}\n </div>\n )}\n\n {/* ③ 最终选择 */}\n {answer !== undefined && (\n <div className={classes.step}>\n <span className={classes.stepTitle}>{t('stepAnswer')}</span>\n <div className={classes.kv}>\n <span className={classes.kvKey}>{t('finalSkill')}</span>\n <span className={classes.kvValue}>{answer.chosenTitle}</span>\n </div>\n {answer.custom !== undefined && (\n <div className={classes.kv}>\n <span className={classes.kvKey}>{t('finalCustom')}</span>\n <span className={classes.kvValue}>{answer.custom}</span>\n </div>\n )}\n </div>\n )}\n\n {failed && 'kind' in block && <div className={classes.error}>{resultTextOf(block.content)}</div>}\n </>\n )}\n </div>\n )\n}\n\n/**\n * 候选卡的 skill 预览轮播(单图直出;多图左右箭头 + 圆点)。图用\n * PosterImage variant=\"plain\" 的固定容器 + contain 居中(多卡同一维度),\n * 点击仍可放大预览。\n */\nfunction OptionPreviewCarousel(props: {\n urls: string[]\n alt: string\n prevLabel: string\n nextLabel: string\n loadingLabel: string\n failedLabel: (message: string) => string\n}) {\n const { urls, alt, prevLabel, nextLabel, loadingLabel, failedLabel } = props\n const [index, setIndex] = useState(0)\n if (urls.length === 1) {\n return (\n <PosterImage src={urls[0]!} alt={alt} variant=\"plain\" loadingLabel={loadingLabel} failedLabel={failedLabel} />\n )\n }\n const current = urls[Math.min(index, urls.length - 1)]!\n return (\n <div className={classes.optionCarousel}>\n <PosterImage\n key={current}\n src={current}\n alt={alt}\n variant=\"plain\"\n loadingLabel={loadingLabel}\n failedLabel={failedLabel}\n />\n <button\n type=\"button\"\n className={classes.optionCarouselArrow}\n aria-label={prevLabel}\n disabled={index === 0}\n onClick={() => setIndex((value) => value - 1)}\n >\n ‹\n </button>\n <button\n type=\"button\"\n className={classes.optionCarouselArrowRight}\n aria-label={nextLabel}\n disabled={index >= urls.length - 1}\n onClick={() => setIndex((value) => value + 1)}\n >\n ›\n </button>\n <div className={classes.optionCarouselDots}>\n {urls.map((url, dotIndex) => (\n <button\n key={url}\n type=\"button\"\n className={dotIndex === index ? classes.optionCarouselDotActive : classes.optionCarouselDot}\n aria-label={`${dotIndex + 1}`}\n onClick={() => setIndex(dotIndex)}\n />\n ))}\n </div>\n </div>\n )\n}\n","/**\n * dsh-post-gen, browser half: registers the 海报设计 (Poster Design) settings\n * section — Skill 库 tab + 启用开关 — and the two poster-workflow primitive\n * render nodes (poster_gen_get_all_poster_skills / poster_gen_pick_poster_skill).\n * 数据经 host 半代理(poster/*)读写;千问 API Key 的配置由 dsh-qw-tool 插件\n * 负责,本入口不再提供。\n * HMR chain: edit sources → `tsdown --watch` rewrites lib/client.js → the\n * host's client-hmr stat poll broadcasts the rebuild over SSE → the browser\n * swaps this plugin's fiber in place without a page reload.\n * host 半版本门禁软禁用时(index.html 注入了 DISABLED_GLOBAL 标记),本入口\n * 只挂\"已停用\"说明面板,不注册任何业务能力。\n */\n// Type-only: client 侧 Context(直接用 cordis Context,按官方插件惯例)。\nimport type { Context as ClientContext } from '@deepseek-ai/cordis'\n// Type-only: ctx.slots 服务增强(0.1.1 线 SlotRegistry 归属 dsh-client-runtime)。\nimport type {} from '@deepseek-ai/dsh-client-runtime/client'\nimport type { ConnectionHandle } from '@deepseek-ai/dsh-client-connection/client'\n// Type-only: ctx.locale service augmentation (LocaleRuntime) + common namespace merge.\nimport type {} from '@deepseek-ai/dsh-client-locale/client'\n// Type-only: pulls the settings shell's SlotMap merge (the 'settings.section' entry).\nimport type {} from '@deepseek-ai/dsh-client-ui-settings/client'\n// Type-only: 'tool.call.toolview' 的 SlotMap 合并声明(原语渲染节点)。\nimport type {} from '@deepseek-ai/dsh-client-ui-tool/client'\nimport { POSTER_NS, en, zh, type PosterKey } from './locales'\nimport { DISABLED_GLOBAL, type DisabledFlag } from '../shared/disabled-flag'\nimport {\n answerSkillViaHost,\n getCallTraceViaHost,\n getConfigViaHost,\n installSkillViaHost,\n listSkillsViaHost,\n saveConfigViaHost,\n uninstallSkillViaHost,\n} from './api'\nimport { PosterSection, type PosterSectionInjected } from './PosterSection'\nimport { PosterDisabledSection, type PosterDisabledSectionInjected } from './PosterDisabledSection'\nimport { PosterSkillsNode, type SkillsNodeInjected } from './PosterSkillsNode'\nimport { PosterPickNode, type PickNodeInjected } from './PosterPickNode'\nimport { cssText as posterCss } from './PosterSection.module.css'\nimport { cssText as posterNodesCss } from './PosterNodes.module.css'\n\nexport const name = 'dsh-post-gen'\nexport const inject = ['slots', 'locale', 'connection']\n\ndeclare module '@deepseek-ai/dsh-client-ui-slots' {\n interface LocaleNamespaceMap {\n /** 海报设计设置页文案。 */\n 'settings.poster': PosterKey\n }\n}\n\nexport function apply(ctx: ClientContext): void {\n console.log('[dsh-post-gen] client half loaded (poster-design settings + skill library)')\n\n // 注册本插件的双语词典(zh/en 键集一致,注册即完成校验);\n // ctx.effect 让词典随插件 HMR 卸载自动撤下。\n ctx.effect(() => ctx.locale.register(POSTER_NS, { zh, en }), 'dsh-post-gen: poster copy dictionaries')\n\n // 面板样式:构建期 css-modules-inline 插件把 PosterSection.module.css 编译成\n // 文本内联进 bundle;这里注入 <style> 并把生命周期挂到本 fiber(HMR 卸载\n // 即移除,重载以新 CSS 重新注入,不残留旧样式)。\n ctx.effect(() => {\n const tag = document.createElement('style')\n tag.dataset.plugin = name\n tag.textContent = `${posterCss}\\n${posterNodesCss}`\n document.head.appendChild(tag)\n return () => tag.remove()\n }, 'dsh-post-gen: panel styles')\n\n // 列表 label 支持 thunk:locale 切换时重读,无需重注册。\n const t = ctx.locale.bind(POSTER_NS)\n\n // host 半版本门禁软禁用时注入的全局标记(shared/disabled-flag.ts):\n // 存在 → 只挂\"已停用\"说明面板,不注册任何业务能力;不存在 → 正常加载。\n const disabledFlag = (window as unknown as Record<string, unknown>)[DISABLED_GLOBAL] as DisabledFlag | undefined\n if (disabledFlag !== undefined) {\n const reason = typeof disabledFlag.reason === 'string' ? disabledFlag.reason : ''\n const min = typeof disabledFlag.min === 'string' ? disabledFlag.min : ''\n const max = typeof disabledFlag.max === 'string' ? disabledFlag.max : ''\n const installVersion = typeof disabledFlag.installVersion === 'string' ? disabledFlag.installVersion : ''\n console.warn(`[dsh-post-gen] host half disabled: ${reason}`)\n ctx.slots.inject('settings.section', () =>\n ctx.slots.register(\n {\n name: 'settings.section',\n id: 'poster-design',\n order: 100,\n label: () => t('nav'),\n locale: POSTER_NS,\n inject: (): PosterDisabledSectionInjected => ({ reason, min, max, installVersion }),\n },\n PosterDisabledSection,\n ),\n )\n return\n }\n\n // 通用 RPC 通道(连接层提供):浏览器 → host 的 poster/* 代理。\n const connection = ctx.get('connection') as ConnectionHandle\n\n // settings.section 由设置域在运行时声明;slots.inject 等声明出现后注册。\n ctx.slots.inject('settings.section', () =>\n ctx.slots.register(\n {\n name: 'settings.section',\n id: 'poster-design',\n order: 100,\n label: () => t('nav'),\n locale: POSTER_NS,\n inject: (): PosterSectionInjected => ({\n api: {\n getConfig: () => getConfigViaHost(connection.rpc),\n saveConfig: (patch) => saveConfigViaHost(connection.rpc, patch),\n listSkills: () => listSkillsViaHost(connection.rpc),\n installSkill: (request) => installSkillViaHost(connection.rpc, request),\n uninstallSkill: (name) => uninstallSkillViaHost(connection.rpc, name),\n },\n }),\n },\n PosterSection,\n ),\n )\n\n // 风格库原语工具的细粒度渲染节点。settled 从 tool/result meta 的 trace 渲染;\n // running 轮询 poster/getCallTrace;pick 的候选卡片经 poster/answerSkill 提交选择。\n ctx.slots.inject('tool.call.toolview', () =>\n ctx.slots.register(\n {\n name: 'tool.call.toolview',\n key: 'poster_gen_get_all_poster_skills',\n locale: POSTER_NS,\n inject: (): SkillsNodeInjected => ({\n api: {\n getCallTrace: (callId) => getCallTraceViaHost(connection.rpc, callId),\n },\n }),\n },\n PosterSkillsNode,\n ),\n )\n ctx.slots.inject('tool.call.toolview', () =>\n ctx.slots.register(\n {\n name: 'tool.call.toolview',\n key: 'poster_gen_pick_poster_skill',\n locale: POSTER_NS,\n inject: (): PickNodeInjected => ({\n api: {\n getCallTrace: (callId) => getCallTraceViaHost(connection.rpc, callId),\n answerSkill: (request) => answerSkillViaHost(connection.rpc, request),\n },\n }),\n },\n PosterPickNode,\n ),\n )\n}\n"],"mappings":"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"}
|
package/lib/gate.js
ADDED
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { defineGetAllSkillsTool } from './tools/get-all-skills.js';
|
|
2
|
+
import { definePickSkillTool } from './tools/pick-skill.js';
|
|
3
|
+
/** 计算设置里还缺哪些必需项(与 enabled 开关无关)。 */
|
|
4
|
+
export function gateMissing(settings, skillCount) {
|
|
5
|
+
const missing = [];
|
|
6
|
+
if (skillCount === 0)
|
|
7
|
+
missing.push('skills');
|
|
8
|
+
return missing;
|
|
9
|
+
}
|
|
10
|
+
/** 门控是否打开(host 半的权威判定:开关 + 完整性)。 */
|
|
11
|
+
export function gateOpen(settings, skillCount) {
|
|
12
|
+
return settings.enabled && gateMissing(settings, skillCount).length === 0;
|
|
13
|
+
}
|
|
14
|
+
/** 门控关闭时工具 execute 的兜底报错(模型可读,会转述给用户)。 */
|
|
15
|
+
export const GATE_CLOSED_MESSAGE = '海报设计功能未启用或设置未配齐。请在设置面板「海报设计」中安装至少一个海报 skill,并打开「启用海报设计」开关。';
|
|
16
|
+
/** 海报业务注册需要的宿主服务清单(缺一即保持关闭并告警)。 */
|
|
17
|
+
const REQUIRED_SERVICES = ['tools', 'systemPrompt'];
|
|
18
|
+
/** 模型可见的使用引导段落(order 120:工作流剧本,design 四期 §5)。 */
|
|
19
|
+
const POSTER_GUIDANCE = [
|
|
20
|
+
'## 海报设计工作流(dsh-post-gen)',
|
|
21
|
+
'',
|
|
22
|
+
'本插件(dsh-post-gen)提供海报风格库与工作流剧本;**实际生图 / 编辑 / 多模态分析依赖 dsh-qw-tool 插件**。两个插件都要安装并正确配置:dsh-qw-tool 的设置在「千问图像工具」里配好千问 API Key 并打开「启用」开关。',
|
|
23
|
+
'本插件的工具:poster_gen_get_all_poster_skills(查风格库)、poster_gen_pick_poster_skill(候选点选)。',
|
|
24
|
+
'依赖的工具(由 dsh-qw-tool 注册):qw_gen_image(纯文生图)、qw_edit_image(参考图编辑)、qw_multimodal_chat(看图分析)。不要向用户编造或推荐不存在的工具。',
|
|
25
|
+
'附件 ID 纪律(最高优先级):工具结果里的附件 ID(sha256:…)仅供工具调用内部引用(如把生成的图片传给 qw_edit_image 的 baseImages)。永远不要在给用户的消息里写出或复述任何附件 ID;生成/编辑的结果图片会在对话里直接展示给用户,向用户指代图片时只用自然语言(如"刚生成的图片")。',
|
|
26
|
+
'模板纪律(最高优先级):当 poster_gen_pick_poster_skill 返回 fromLibrary=true 的库内生图提示词模板时,模板只允许做占位符替换——把 { {styleBrief} } 与 { {requirements} } 两个占位符换成相应内容,模板其余部分一字不改。所有与具体产品外观、配色、文案、场景相关的约束一律写进 styleBrief/requirements 里,严禁改写、增删或润色模板正文。fromLibrary=false 时返回的是你自己写的完整提示词,不受此条限制。',
|
|
27
|
+
'',
|
|
28
|
+
'### 工作流 A:生成一张新海报',
|
|
29
|
+
'1. 调用 poster_gen_get_all_poster_skills 获取风格库轻量目录(name/标题/说明/适用场景/风格标签)。',
|
|
30
|
+
'2. 结合用户的产品图与需求,从目录里挑选匹配的候选风格(附一句推荐理由);库内风格不够 3 个或没有完全匹配时,不足的候选由你自己写完整生图提示词补齐(自定义候选:name 简短标识 + title 展示名 + 推荐理由 + prompt 完整提示词)。库内候选与自定义候选可以任意混合,候选总数 1~3 个。',
|
|
31
|
+
' - 如果你能直接看到用户上传的图片(你具备视觉能力),自己看图判断,不要调用 qw_multimodal_chat;',
|
|
32
|
+
' - 如果你看不到图片内容,调用 qw_multimodal_chat 让多模态模型代为分析产品图。',
|
|
33
|
+
'3. 调用 poster_gen_pick_poster_skill,把候选传给它(库内候选传 name + 推荐理由;自定义候选传 name 标识 + title + 推荐理由 + prompt),用户会在卡片上点选一个;返回 chosenSkill/chosenTitle/fromLibrary(可能附带用户补充要求 custom),并附带选中项的提示词——fromLibrary=true 时是 skill 的生图提示词模板(走模板纪律),fromLibrary=false 时是你自己写的完整提示词(可直接使用,结合用户补充要求微调)。',
|
|
34
|
+
'4. 调用 qw_gen_image 生成海报(模板替换占位符后作为完整提示词);需要严格参照产品图构图时用 qw_edit_image(baseImages 省略即自动取用户刚上传的产品图)。',
|
|
35
|
+
'5. 结果图会自动展示在对话里。向用户说明本次使用的 skill 与提示词要点,方便后续修改。',
|
|
36
|
+
'',
|
|
37
|
+
'### 工作流 B:修缮已生成的海报(局部修改:改文案/调色/换元素)',
|
|
38
|
+
'调用 qw_edit_image:baseImages 填要修改的那张海报的附件 ID(在之前的工具结果里);prompt = 该海报当时使用的完整提示词 + 「在保持整体风格与构图不变的前提下,仅按以下要求修改:<用户要求>」。',
|
|
39
|
+
'',
|
|
40
|
+
'### 工作流 C:激进改版(换风格/换文案体系/换尺寸)',
|
|
41
|
+
'1. 需要换风格时调用 poster_gen_pick_poster_skill 选中新风格(候选 name 不确定就先调 poster_gen_get_all_poster_skills 查目录),拿到新模板;',
|
|
42
|
+
'2. 选中库内风格(fromLibrary=true)时用新模板重新组装提示词(同样只替换 { {styleBrief} }/{ {requirements} } 占位符,模板其余部分一字不改);选中自定义提示词(fromLibrary=false)时直接改写该提示词。然后调用 qw_edit_image(baseImages 填原海报附件 ID,锚定产品主体与构图)。',
|
|
43
|
+
'',
|
|
44
|
+
'### 工作流 D:看图分析(你自身看不到图片内容时)',
|
|
45
|
+
'调用 qw_multimodal_chat:images 填目标图的附件 ID(省略 = 用户最近上传的图片),prompt 写清要分析什么。',
|
|
46
|
+
].join('\n');
|
|
47
|
+
/**
|
|
48
|
+
* 创建海报业务门控:立即按当前状态评估一次,随后随设置变更与 skill 库
|
|
49
|
+
* 变更重估。注册的清理(watch 注销 + 关闭残留注册)挂在调用方 fiber 上。
|
|
50
|
+
*/
|
|
51
|
+
export function createPosterGate(ctx, scope, backend, store, hub) {
|
|
52
|
+
let disposers = [];
|
|
53
|
+
/** 评估序号:异步评估晚返回时若已被更新的评估取代,立即放弃/回滚。 */
|
|
54
|
+
let generation = 0;
|
|
55
|
+
const close = () => {
|
|
56
|
+
for (const dispose of disposers.splice(0).reverse()) {
|
|
57
|
+
try {
|
|
58
|
+
dispose();
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
console.warn('[dsh-post-gen] poster gate: dispose failed:', error);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
/** 打开:注册引导段落 + 风格库原语工具(skill 目录不注册进 ctx.skills——
|
|
66
|
+
* 模型经 poster_gen_get_all_poster_skills 查库,单一事实通道)。 */
|
|
67
|
+
const open = (gen, skills) => {
|
|
68
|
+
const missingServices = REQUIRED_SERVICES.filter((name) => ctx.get(name) === undefined);
|
|
69
|
+
if (missingServices.length > 0) {
|
|
70
|
+
console.warn(`[dsh-post-gen] poster flow NOT enabled: host services missing (${missingServices.join(', ')})`);
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
disposers.push(ctx.systemPrompt.section({
|
|
74
|
+
name: 'poster:guidance',
|
|
75
|
+
order: 110, // 0.1.1 约定:tool guidance 段为 100–199
|
|
76
|
+
text: POSTER_GUIDANCE,
|
|
77
|
+
}));
|
|
78
|
+
const deps = { ctx, scope, backend, store, hub };
|
|
79
|
+
disposers.push(ctx.tools.register(defineGetAllSkillsTool(deps)));
|
|
80
|
+
disposers.push(ctx.tools.register(definePickSkillTool(deps)));
|
|
81
|
+
console.log(`[dsh-post-gen] poster flow ENABLED (${skills.length} skills, tools: poster_gen_get_all_poster_skills, poster_gen_pick_poster_skill; 依赖 dsh-qw-tool 的 qw_gen_image/qw_edit_image/qw_multimodal_chat)`);
|
|
82
|
+
};
|
|
83
|
+
const evaluate = () => {
|
|
84
|
+
const gen = ++generation;
|
|
85
|
+
void (async () => {
|
|
86
|
+
const { skills } = await store.scan();
|
|
87
|
+
if (gen !== generation)
|
|
88
|
+
return; // 期间已有更新的评估:本次作废
|
|
89
|
+
const shouldOpen = gateOpen(scope.get(), skills.length);
|
|
90
|
+
close();
|
|
91
|
+
if (!shouldOpen)
|
|
92
|
+
return;
|
|
93
|
+
try {
|
|
94
|
+
open(gen, skills);
|
|
95
|
+
if (gen !== generation)
|
|
96
|
+
close(); // 注册期间状态已变:回滚
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
close();
|
|
100
|
+
console.warn('[dsh-post-gen] poster flow failed to enable:', error);
|
|
101
|
+
}
|
|
102
|
+
})();
|
|
103
|
+
};
|
|
104
|
+
ctx.effect(() => {
|
|
105
|
+
evaluate();
|
|
106
|
+
const unwatchSettings = scope.watch(() => evaluate());
|
|
107
|
+
const unwatchStore = store.onDidChange(() => evaluate());
|
|
108
|
+
return () => {
|
|
109
|
+
generation += 1;
|
|
110
|
+
unwatchSettings();
|
|
111
|
+
unwatchStore();
|
|
112
|
+
close();
|
|
113
|
+
};
|
|
114
|
+
}, 'dsh-post-gen: poster gate');
|
|
115
|
+
}
|
package/lib/index.js
ADDED
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* dsh-post-gen, host half 入口:只做组装。
|
|
3
|
+
*
|
|
4
|
+
* - settings:注册 `dsh-post-gen` 命名空间的持久化设置(settings.yaml),
|
|
5
|
+
* schema 见 ./spec.ts(enabled / seededBundled / seededHashes);
|
|
6
|
+
* - skill 库:磁盘文件夹存储(<dshHome>/dsh-post-gen/skills/),实现见
|
|
7
|
+
* ./skills/store.ts;包内 assets/skills/ 的内置 skill 首启播种进库;
|
|
8
|
+
* - 后端服务:PosterBackend(配置读写 + skill 库 RPC + 渲染节点 trace/点选;
|
|
9
|
+
* 不含千问API调用——生图/编辑/多模态由 dsh-qw-tool 插件提供),实现见
|
|
10
|
+
* ./poster-service.ts,端点声明见 ./typert.ts;
|
|
11
|
+
* - 预览图路由:常驻的静态路由,serve skill 库里的预览图(见
|
|
12
|
+
* ./previews-route.ts);
|
|
13
|
+
* - 门控:仅当 `enabled` 开关打开且设置配齐时,才把海报原语工具与
|
|
14
|
+
* system prompt 工作流剧本注册进会话(见 ./gate.ts,设计文档 §3);
|
|
15
|
+
* skill 不注册进 ctx.skills——模型经 poster_gen_get_all_poster_skills
|
|
16
|
+
* 查库(单一事实通道)。
|
|
17
|
+
*
|
|
18
|
+
* 浏览器经 `ctx.connection.rpc.call('/api', 'poster/<method>')` 调用,
|
|
19
|
+
* 由 Typert Gateway 按描述符分发到服务实例。
|
|
20
|
+
*
|
|
21
|
+
* 注:官方服务包是"服务类 default 导出"形态(端点靠 TypertRemoteService +
|
|
22
|
+
* \@Remote 的模块级标记发现)。linked 插件与 harness 各有一份该模块实例时
|
|
23
|
+
* 标记失联,故本插件用函数型入口手动注册描述符——"服务类 default 导出 +
|
|
24
|
+
* 函数型 apply"混用会让 Loader 丢弃插件命名空间,两形态只能择一。
|
|
25
|
+
*
|
|
26
|
+
* 所有注册(settings/provide/typert.register/门控内的工具与 skill)都是
|
|
27
|
+
* fiber-bound effect:插件 HMR 重载时自动撤销并重建。
|
|
28
|
+
*/
|
|
29
|
+
import { dirname, join } from 'node:path';
|
|
30
|
+
import { homedir } from 'node:os';
|
|
31
|
+
import { fileURLToPath } from 'node:url';
|
|
32
|
+
import { createPosterGate } from './gate.js';
|
|
33
|
+
import { PosterBackend } from './poster-service.js';
|
|
34
|
+
import { registerPreviewRoute } from './previews-route.js';
|
|
35
|
+
import { PosterSkillStore } from './skills/store.js';
|
|
36
|
+
import { DISABLED_GLOBAL } from './shared/disabled-flag.js';
|
|
37
|
+
import { PosterSettingsSchema, SETTINGS_NS } from './spec.js';
|
|
38
|
+
import { PosterTraceHub } from './trace-hub.js';
|
|
39
|
+
import { DESCRIPTORS } from './typert.js';
|
|
40
|
+
import { assertHarnessSupported, MAX_HARNESS_VERSION, MIN_HARNESS_VERSION } from './version-gate.js';
|
|
41
|
+
export const name = 'dsh-post-gen';
|
|
42
|
+
// cordis 对未声明 inject 的服务连属性探测(含 ctx.get)都直接抛错,故全部硬声明。
|
|
43
|
+
// 缺服务的部署(如无 webServer 的非 web 环境)下插件保持 pending 不 crash;门控决定业务是否真正注册。
|
|
44
|
+
// 'qwen' 是 dsh-qw-tool 提供的服务键(ctx.provide('qwen', ...)),用它表达本插件依赖
|
|
45
|
+
// dsh-qw-tool 已加载(cordis 先加载 dsh-qw-tool,缺失则本插件 pending)。
|
|
46
|
+
// ⚠️ 不能写 'dsh-qw-tool':inject 只识别 service key,不是插件名。
|
|
47
|
+
export const inject = ['typert', 'settings', 'webServer', 'tools', 'systemPrompt'];
|
|
48
|
+
/** 包内置 skill 目录(lib/index.js → ../assets/skills/)。 */
|
|
49
|
+
const BUNDLED_SKILLS_DIR = fileURLToPath(new URL('../assets/skills/', import.meta.url));
|
|
50
|
+
/**
|
|
51
|
+
* skill 库根目录:优先随 settings 文档定位(<settings 所在目录> 即
|
|
52
|
+
* dshHome → dsh-post-gen/skills);拿不到文档路径(非文件 provider)时
|
|
53
|
+
* 回落到 ~/.dsh 约定。
|
|
54
|
+
*/
|
|
55
|
+
function resolveSkillStoreRoot(ctx) {
|
|
56
|
+
const documentPath = ctx.settings.documentPath;
|
|
57
|
+
const home = typeof documentPath === 'string' && documentPath !== '' ? dirname(documentPath) : join(homedir(), '.dsh');
|
|
58
|
+
return join(home, 'dsh-post-gen', 'skills');
|
|
59
|
+
}
|
|
60
|
+
export function apply(ctx) {
|
|
61
|
+
// 版本门禁:超出上限默认软禁用——醒目错误日志 + 插件整体 no-op,
|
|
62
|
+
// 不影响 dsh web 启动与其他插件(Loader/app-boot 对插件抛错零容忍,
|
|
63
|
+
// 抛错 = 整个 harness exit(1),见 version-gate.ts 注释)。
|
|
64
|
+
// DSH_POST_GEN_STRICT=1 恢复抛错 fail-loud(CI / 排查场景)。
|
|
65
|
+
try {
|
|
66
|
+
assertHarnessSupported();
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
if (process.env.DSH_POST_GEN_STRICT)
|
|
70
|
+
throw error;
|
|
71
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
72
|
+
console.error(`[dsh-post-gen] ${reason}`);
|
|
73
|
+
console.error('[dsh-post-gen] 版本不兼容,插件已停用(不影响 DSH 启动与其他插件)。');
|
|
74
|
+
// 推荐安装目标版本直接用支持上限 MAX(窗口内最新版,升级/降级都装它);
|
|
75
|
+
// 版本判断只在本进程有一份,client 面板直接照此渲染安装命令,不自行推导。
|
|
76
|
+
const installVersion = MAX_HARNESS_VERSION;
|
|
77
|
+
// 告知 client 半:经 webserver/index-inject 向 index.html 注入全局标记,
|
|
78
|
+
// 浏览器端据此刻出"已停用"说明面板(client/index.ts)。这是软禁用路径
|
|
79
|
+
// 唯一注册的东西;ctx.on 是 fiber-bound effect——插件卸载/HMR 重载即
|
|
80
|
+
// 撤销监听,注入表每次 index 请求现收现渲(webserver
|
|
81
|
+
// collectIndexInjections),无持久状态、无残留。
|
|
82
|
+
ctx.on('webserver/index-inject', (table) => {
|
|
83
|
+
table.push({ kind: 'global', name: DISABLED_GLOBAL, value: { reason, min: MIN_HARNESS_VERSION, max: MAX_HARNESS_VERSION, installVersion } });
|
|
84
|
+
});
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
// settings 注册是调用方 fiber 上的 effect:插件卸载自动撤下。
|
|
88
|
+
const scope = ctx.settings.register(SETTINGS_NS, PosterSettingsSchema);
|
|
89
|
+
// skill 库 + 首启播种内置 skill(用户删过的不复活,见 settings.seededBundled);
|
|
90
|
+
// 插件升级时对"用户未改动"的内置 skill 自动刷新为包内新版本(seededHashes 记账)。
|
|
91
|
+
const store = new PosterSkillStore(resolveSkillStoreRoot(ctx), BUNDLED_SKILLS_DIR);
|
|
92
|
+
void (async () => {
|
|
93
|
+
try {
|
|
94
|
+
const migration = await store.seedBundled(scope.get().seededBundled, scope.get().seededHashes);
|
|
95
|
+
if (migration.seeded.length > 0) {
|
|
96
|
+
console.log(`[dsh-post-gen] seeded bundled skills: ${migration.seeded.join(', ')}`);
|
|
97
|
+
}
|
|
98
|
+
if (migration.refreshed.length > 0) {
|
|
99
|
+
console.log(`[dsh-post-gen] refreshed bundled skills (upstream update): ${migration.refreshed.join(', ')}`);
|
|
100
|
+
}
|
|
101
|
+
const mergedHashes = { ...scope.get().seededHashes, ...migration.hashes };
|
|
102
|
+
const seededChanged = migration.seeded.length > 0
|
|
103
|
+
|| migration.refreshed.length > 0
|
|
104
|
+
|| JSON.stringify(mergedHashes) !== JSON.stringify(scope.get().seededHashes);
|
|
105
|
+
if (seededChanged) {
|
|
106
|
+
await scope.update({
|
|
107
|
+
seededBundled: [...new Set([...scope.get().seededBundled, ...migration.seeded])],
|
|
108
|
+
seededHashes: mergedHashes,
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
console.warn('[dsh-post-gen] bundled skill seeding failed:', error);
|
|
114
|
+
}
|
|
115
|
+
})();
|
|
116
|
+
// 服务实例提供给根上下文,并向 Typert registry 注册端点描述符。
|
|
117
|
+
// PosterTraceHub:工具运行中的实时 trace + 候选选择等待(design §5.3)。
|
|
118
|
+
const hub = new PosterTraceHub();
|
|
119
|
+
const backend = new PosterBackend(scope, store, hub);
|
|
120
|
+
ctx.provide('poster', backend);
|
|
121
|
+
ctx.typert.register({
|
|
122
|
+
package: 'dsh-post-gen',
|
|
123
|
+
face: 'host',
|
|
124
|
+
schemas: [],
|
|
125
|
+
model: { services: [], events: [], objects: [] },
|
|
126
|
+
invocations: DESCRIPTORS,
|
|
127
|
+
});
|
|
128
|
+
// 预览图静态路由:常驻(静态文件不进模型上下文)。
|
|
129
|
+
registerPreviewRoute(ctx, store.rootDir);
|
|
130
|
+
// 海报业务门控:enabled + 设置配齐 + 库非空时才注册工具/skill/prompt 段落。
|
|
131
|
+
createPosterGate(ctx, scope, backend, store, hub);
|
|
132
|
+
console.log('[dsh-post-gen] host half loaded (poster backend + skill store + poster gate)');
|
|
133
|
+
}
|
package/lib/invariant.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
const PACKAGE_NAME = 'dsh-post-gen';
|
|
2
|
+
/** Cordis companion plugin name. */
|
|
3
|
+
export const name = 'dsh-post-gen-invariant';
|
|
4
|
+
/** Service required before the companion can reserve package ownership. */
|
|
5
|
+
export const inject = ['invariants'];
|
|
6
|
+
/**
|
|
7
|
+
* No runtime invariant: the Typert endpoint registration, the settings
|
|
8
|
+
* namespace, and the browser slot contribution are effects owned and observed
|
|
9
|
+
* by their respective registries; the poster backend's failure modes are
|
|
10
|
+
* returned as business results over the wire protocol.
|
|
11
|
+
*/
|
|
12
|
+
const install = () => { };
|
|
13
|
+
/**
|
|
14
|
+
* Register this package's invariant companion.
|
|
15
|
+
* @param ctx - Cordis context carrying the invariant service.
|
|
16
|
+
* @returns The installed registration's disposer after setup succeeds.
|
|
17
|
+
*/
|
|
18
|
+
export const apply = (ctx) => Promise.resolve(ctx.invariants.register(PACKAGE_NAME, install));
|