@oh-story/dsh 0.1.8 → 0.1.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (360) hide show
  1. package/README.md +14 -14
  2. package/lib/client.js +237 -84
  3. package/lib/client.js.map +3 -3
  4. package/lib/drama/manifest.json +183 -77
  5. package/lib/drama/skills/short-drama/SKILL.md +5 -1
  6. package/lib/drama/skills/short-drama/scripts/creator_markdown_check.py +140 -9
  7. package/lib/drama/skills/short-drama/scripts/project_tool.py +11 -0
  8. package/lib/drama/skills/short-drama-assets/references/character-and-look.md +28 -0
  9. package/lib/drama/skills/short-drama-assets/references/continuity-lock.md +8 -2
  10. package/lib/drama/skills/short-drama-assets/references/voice-direction.md +28 -0
  11. package/lib/drama/skills/short-drama-edit/SKILL.md +146 -0
  12. package/lib/drama/skills/short-drama-edit/agents/openai.yaml +4 -0
  13. package/lib/drama/skills/short-drama-edit/assets/remotion/README.md +60 -0
  14. package/lib/drama/skills/short-drama-edit/assets/remotion/package.json +15 -0
  15. package/lib/drama/skills/short-drama-edit/assets/remotion/remotion.config.ts +6 -0
  16. package/lib/drama/skills/short-drama-edit/assets/remotion/src/Root.tsx +26 -0
  17. package/lib/drama/skills/short-drama-edit/assets/remotion/src/Subtitles.tsx +88 -0
  18. package/lib/drama/skills/short-drama-edit/assets/remotion/src/font.ts +46 -0
  19. package/lib/drama/skills/short-drama-edit/assets/remotion/src/index.ts +4 -0
  20. package/lib/drama/skills/short-drama-edit/assets/remotion/src/schema.ts +32 -0
  21. package/lib/drama/skills/short-drama-edit/assets/remotion/tsconfig.json +13 -0
  22. package/lib/drama/skills/short-drama-edit/assets//345/211/252/350/276/221/345/215/225.md +43 -0
  23. package/lib/drama/skills/short-drama-edit/references/cut-craft.md +38 -0
  24. package/lib/drama/skills/short-drama-edit/references/delivery-verify.md +29 -0
  25. package/lib/drama/skills/short-drama-edit/references/generated-footage.md +54 -0
  26. package/lib/drama/skills/short-drama-edit/references/sound-and-subtitles.md +60 -0
  27. package/lib/drama/skills/short-drama-edit/references/stage-contract.md +51 -0
  28. package/lib/drama/skills/short-drama-edit/scripts/edit_tool.py +1156 -0
  29. package/lib/drama/skills/short-drama-edit/scripts/selftest.py +520 -0
  30. package/lib/drama/skills/short-drama-image-prompts/SKILL.md +2 -0
  31. package/lib/drama/skills/short-drama-image-prompts/assets/image-prompts.md +5 -0
  32. package/lib/drama/skills/short-drama-image-prompts/assets/lookdev-prompts.md +3 -0
  33. package/lib/drama/skills/short-drama-image-prompts/references/common-recipe.md +11 -0
  34. package/lib/drama/skills/short-drama-novel-analyze/references/aggregation-and-entities.md +2 -2
  35. package/lib/drama/skills/short-drama-novel-analyze/references/chapter-extraction.md +4 -1
  36. package/lib/drama/skills/short-drama-produce/SKILL.md +29 -4
  37. package/lib/drama/skills/short-drama-produce/references/adapter-contract.md +22 -0
  38. package/lib/drama/skills/short-drama-produce/references/providers/minimax-h3-video.md +13 -12
  39. package/lib/drama/skills/short-drama-produce/references/providers/minimax-speech.md +41 -0
  40. package/lib/drama/skills/short-drama-produce/references/providers/seedance.md +7 -0
  41. package/lib/drama/skills/short-drama-produce/scripts/fixture_adapter.py +18 -1
  42. package/lib/drama/skills/short-drama-produce/scripts/production_tool.py +181 -2
  43. package/lib/drama/skills/short-drama-produce/scripts/provider_adapters.py +199 -3
  44. package/lib/drama/skills/short-drama-review/SKILL.md +2 -0
  45. package/lib/drama/skills/short-drama-review/references/production-quality-gates.md +7 -0
  46. package/lib/drama/skills/short-drama-review/references/rubric-visual-motion.md +10 -0
  47. package/lib/drama/skills/short-drama-storyboard/SKILL.md +12 -1
  48. package/lib/drama/skills/short-drama-storyboard/assets/keyframe-prompts.md +4 -0
  49. package/lib/drama/skills/short-drama-storyboard/references/lighting-craft.md +39 -0
  50. package/lib/drama/skills/short-drama-storyboard/references/shot-craft.md +78 -2
  51. package/lib/drama/skills/short-drama-storyboard/references/stage-contract.md +2 -0
  52. package/lib/drama/skills/short-drama-video-prompts/SKILL.md +12 -5
  53. package/lib/drama/skills/short-drama-video-prompts/references/camera-audio-continuity.md +17 -0
  54. package/lib/drama/skills/short-drama-video-prompts/references/minimax-h3.md +76 -7
  55. package/lib/drama/skills/short-drama-video-prompts/references/motion-recipe.md +5 -2
  56. package/lib/drama/skills/short-drama-video-prompts/references/performance-action-timing.md +21 -0
  57. package/lib/drama/skills/short-drama-video-prompts/references/production-prompt-grammar.md +6 -17
  58. package/lib/drama/skills/short-drama-video-prompts/references/seedance-2.0.md +12 -3
  59. package/lib/drama/skills/short-drama-video-prompts/references/seedance-2.5.md +61 -5
  60. package/lib/drama/skills/short-drama-video-prompts/references/stage-contract.md +3 -3
  61. package/lib/drama/skills/short-drama-write/SKILL.md +11 -2
  62. package/lib/drama/skills/short-drama-write/references/screenplay-format.md +6 -0
  63. package/lib/drama/skills/short-drama-write/references/stage-contract.md +1 -0
  64. package/lib/index.js +290 -90
  65. package/lib/index.js.map +4 -4
  66. package/lib/novel-to-game/README.md +299 -59
  67. package/lib/novel-to-game/README_ZH.md +299 -56
  68. package/lib/novel-to-game/VERSION +1 -1
  69. package/lib/novel-to-game/examples/jin-ping-mei/build/BUILD_BRIEF.md +3 -1
  70. package/lib/novel-to-game/examples/jin-ping-mei/build/app/RUN.md +11 -3
  71. package/lib/novel-to-game/examples/jin-ping-mei/build/app/css/new-guofeng.css +397 -8
  72. package/lib/novel-to-game/examples/jin-ping-mei/build/app/css/style.css +0 -31
  73. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/data.js +71 -73
  74. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/engine.js +78 -89
  75. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/main.js +37 -14
  76. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/text.js +5 -5
  77. package/lib/novel-to-game/examples/jin-ping-mei/build/app/package.json +2 -1
  78. package/lib/novel-to-game/examples/jin-ping-mei/qa/README.md +11 -16
  79. package/lib/novel-to-game/examples/jin-ping-mei/qa/verification.json +11 -11
  80. package/lib/novel-to-game/examples/jin-ping-mei/qa/verify_playable_model.mjs +23 -0
  81. package/lib/novel-to-game/manifest.json +77 -87
  82. package/lib/novel-to-game/skills/game-art-direction/SKILL.md +9 -35
  83. package/lib/novel-to-game/skills/game-art-direction/references/art-direction-method.md +27 -106
  84. package/lib/novel-to-game/skills/game-build/SKILL.md +17 -35
  85. package/lib/novel-to-game/skills/game-build/references/blender-asset-workflow.md +24 -0
  86. package/lib/novel-to-game/skills/game-build/references/build-brief-contract.md +45 -82
  87. package/lib/novel-to-game/skills/game-build/references/generative-media-pipeline.md +14 -45
  88. package/lib/novel-to-game/skills/game-build/references/playable-model-contract.md +30 -65
  89. package/lib/novel-to-game/skills/game-build/references/tts-production-contract.md +13 -27
  90. package/lib/novel-to-game/skills/game-concept/SKILL.md +16 -34
  91. package/lib/novel-to-game/skills/game-concept/references/concept-method.md +28 -75
  92. package/lib/novel-to-game/skills/game-qa/SKILL.md +9 -20
  93. package/lib/novel-to-game/skills/game-qa/references/test-design-method.md +10 -6
  94. package/lib/novel-to-game/skills/game-world-design/SKILL.md +19 -32
  95. package/lib/novel-to-game/skills/game-world-design/references/narrative-design-method.md +23 -72
  96. package/lib/novel-to-game/skills/game-world-design/references/numeric-design-method.md +14 -48
  97. package/lib/novel-to-game/skills/game-world-design/references/world-design-method.md +36 -103
  98. package/lib/novel-to-game/skills/novel-game-analyze/SKILL.md +9 -18
  99. package/lib/novel-to-game/skills/novel-game-analyze/references/gameability-protocol.md +4 -4
  100. package/lib/novel-to-game/skills/novel-to-game/SKILL.md +10 -27
  101. package/lib/novel-to-game/skills/novel-to-game/references/intake-method.md +5 -6
  102. package/lib/novel-to-game/skills/novel-to-game/references/pipeline-contract.md +6 -11
  103. package/lib/oh-story/manifest.json +419 -254
  104. package/lib/oh-story/roles/chapter-extractor.md +177 -237
  105. package/lib/oh-story/roles/character-designer.md +1 -1
  106. package/lib/oh-story/roles/consistency-checker.md +4 -4
  107. package/lib/oh-story/roles/narrative-writer.md +56 -243
  108. package/lib/oh-story/roles/story-architect.md +6 -6
  109. package/lib/oh-story/roles/story-explorer.md +11 -11
  110. package/lib/oh-story/skills/story/SKILL.md +13 -7
  111. package/lib/oh-story/skills/story/VERSION +1 -1
  112. package/lib/oh-story/skills/story/references/author-memory.md +61 -29
  113. package/lib/oh-story/skills/story/scripts/author_memory_commit.py +934 -170
  114. package/lib/oh-story/skills/story-cover/SKILL.md +10 -1
  115. package/lib/oh-story/skills/story-deslop/SKILL.md +54 -229
  116. package/lib/oh-story/skills/story-deslop/references/anti-ai-writing.md +29 -56
  117. package/lib/oh-story/skills/story-deslop/references/author-memory.md +61 -29
  118. package/lib/oh-story/skills/story-deslop/references/banned-words.md +3 -1
  119. package/lib/oh-story/skills/story-deslop/references/deslop-gates.md +154 -0
  120. package/lib/oh-story/skills/story-deslop/references/style-resolution.md +27 -0
  121. package/lib/oh-story/skills/story-deslop/scripts/author_memory_commit.py +934 -170
  122. package/lib/oh-story/skills/story-deslop/scripts/check-ai-patterns.js +6 -1
  123. package/lib/oh-story/skills/story-deslop/scripts/check-degeneration.js +39 -20
  124. package/lib/oh-story/skills/story-deslop/scripts/normalize-punctuation.js +10 -5
  125. package/lib/oh-story/skills/story-deslop/scripts/style-whitelist.js +39 -0
  126. package/lib/oh-story/skills/story-import/SKILL.md +78 -82
  127. package/lib/oh-story/skills/story-import/references/character-state-reverse.md +1 -1
  128. package/lib/oh-story/skills/story-import/references/format-and-structure.md +2 -2
  129. package/lib/oh-story/skills/story-import/references/state-tracking.md +4 -69
  130. package/lib/oh-story/skills/story-import/references/structure-mapping-long.md +10 -8
  131. package/lib/oh-story/skills/story-import/references/tracking-initialization.md +31 -0
  132. package/lib/oh-story/skills/story-import/references/tracking-transaction.md +9 -34
  133. package/lib/oh-story/skills/story-import/scripts/check-outline-contract.js +197 -15
  134. package/lib/oh-story/skills/story-import/scripts/tracking_commit.py +210 -2
  135. package/lib/oh-story/skills/story-import/scripts/wordcount_core.py +3 -0
  136. package/lib/oh-story/skills/story-long-analyze/SKILL.md +91 -258
  137. package/lib/oh-story/skills/story-long-analyze/references/author-facing.md +245 -0
  138. package/lib/oh-story/skills/story-long-analyze/references/deconstruction-notes.md +2 -2
  139. package/lib/oh-story/skills/story-long-analyze/references/inspiration-library.md +105 -0
  140. package/lib/oh-story/skills/story-long-analyze/references/material-decomposition.md +113 -105
  141. package/lib/oh-story/skills/story-long-analyze/references/output-templates.md +169 -125
  142. package/lib/oh-story/skills/story-long-analyze/references/pipeline-ops.md +172 -64
  143. package/lib/oh-story/skills/story-long-analyze/references/semantic-acceptance-fixtures.md +84 -0
  144. package/lib/oh-story/skills/story-long-analyze/references/style-profile-generator.md +42 -132
  145. package/lib/oh-story/skills/story-long-analyze/references/style-profile-protocol.md +5 -5
  146. package/lib/oh-story/skills/story-long-analyze/scripts/build_chapter_index.py +466 -0
  147. package/lib/oh-story/skills/story-long-analyze/scripts/inspect_existing_assets.py +702 -0
  148. package/lib/oh-story/skills/story-long-analyze/scripts/inspiration_index.py +864 -0
  149. package/lib/oh-story/skills/story-long-analyze/scripts/manage_analysis_run.py +1106 -0
  150. package/lib/oh-story/skills/story-long-analyze/scripts/render_relation_chart.py +425 -0
  151. package/lib/oh-story/skills/story-long-scan/SKILL.md +4 -1
  152. package/lib/oh-story/skills/story-long-write/SKILL.md +52 -216
  153. package/lib/oh-story/skills/story-long-write/references/anti-ai-writing.md +29 -56
  154. package/lib/oh-story/skills/story-long-write/references/artifact-protocols.md +72 -12
  155. package/lib/oh-story/skills/story-long-write/references/author-memory.md +61 -29
  156. package/lib/oh-story/skills/story-long-write/references/banned-words.md +3 -1
  157. package/lib/oh-story/skills/story-long-write/references/benchmark-recall.md +20 -0
  158. package/lib/oh-story/skills/story-long-write/references/cross-book-recall.md +26 -0
  159. package/lib/oh-story/skills/story-long-write/references/dialogue-mastery.md +10 -4
  160. package/lib/oh-story/skills/story-long-write/references/emotional-methods.md +2 -2
  161. package/lib/oh-story/skills/story-long-write/references/long-chapter-quality.md +6 -15
  162. package/lib/oh-story/skills/story-long-write/references/long-format.md +2 -0
  163. package/lib/oh-story/skills/story-long-write/references/outline-structure-theory.md +2 -0
  164. package/lib/oh-story/skills/story-long-write/references/project-files.md +110 -0
  165. package/lib/oh-story/skills/story-long-write/references/reader-contract-and-progression.md +12 -4
  166. package/lib/oh-story/skills/story-long-write/references/reference-index.md +86 -0
  167. package/lib/oh-story/skills/story-long-write/references/style-combat-face.md +1 -1
  168. package/lib/oh-story/skills/story-long-write/references/style-craft.md +9 -29
  169. package/lib/oh-story/skills/story-long-write/references/style-genre-modules.md +1 -1
  170. package/lib/oh-story/skills/story-long-write/references/style-resolution.md +27 -0
  171. package/lib/oh-story/skills/story-long-write/references/tracking-initialization.md +31 -0
  172. package/lib/oh-story/skills/story-long-write/references/tracking-transaction.md +9 -34
  173. package/lib/oh-story/skills/story-long-write/references/workflow-chapter.md +88 -118
  174. package/lib/oh-story/skills/story-long-write/references/workflow-daily.md +55 -119
  175. package/lib/oh-story/skills/story-long-write/references/workflow-revision.md +15 -11
  176. package/lib/oh-story/skills/story-long-write/references/workflow-setup.md +73 -54
  177. package/lib/oh-story/skills/story-long-write/references/writer-prompt-fallback.md +22 -0
  178. package/lib/oh-story/skills/story-long-write/references/writing-craft.md +63 -4
  179. package/lib/oh-story/skills/story-long-write/scripts/author_memory_commit.py +934 -170
  180. package/lib/oh-story/skills/story-long-write/scripts/build_writer_prompt.py +531 -0
  181. package/lib/oh-story/skills/story-long-write/scripts/check-ai-patterns.js +6 -1
  182. package/lib/oh-story/skills/story-long-write/scripts/check-degeneration.js +39 -20
  183. package/lib/oh-story/skills/story-long-write/scripts/check-outline-contract.js +197 -15
  184. package/lib/oh-story/skills/story-long-write/scripts/check-outline-copy.js +90 -23
  185. package/lib/oh-story/skills/story-long-write/scripts/normalize-punctuation.js +10 -5
  186. package/lib/oh-story/skills/story-long-write/scripts/outline_view.py +285 -0
  187. package/lib/oh-story/skills/story-long-write/scripts/storyctl.py +58 -0
  188. package/lib/oh-story/skills/story-long-write/scripts/style-whitelist.js +39 -0
  189. package/lib/oh-story/skills/story-long-write/scripts/tracking_commit.py +210 -2
  190. package/lib/oh-story/skills/story-long-write/scripts/wordcount_core.py +3 -0
  191. package/lib/oh-story/skills/story-review/SKILL.md +80 -87
  192. package/lib/oh-story/skills/story-review/references/anti-ai-writing.md +29 -56
  193. package/lib/oh-story/skills/story-review/references/author-memory.md +61 -29
  194. package/lib/oh-story/skills/story-review/references/banned-words.md +3 -1
  195. package/lib/oh-story/skills/story-review/references/dialogue-mastery.md +10 -4
  196. package/lib/oh-story/skills/story-review/references/review-quality.md +6 -12
  197. package/lib/oh-story/skills/story-review/references/style-resolution.md +27 -0
  198. package/lib/oh-story/skills/story-review/references/tracking-initialization.md +31 -0
  199. package/lib/oh-story/skills/story-review/references/tracking-transaction.md +9 -34
  200. package/lib/oh-story/skills/story-review/scripts/author_memory_commit.py +934 -170
  201. package/lib/oh-story/skills/story-review/scripts/check-ai-patterns.js +6 -1
  202. package/lib/oh-story/skills/story-review/scripts/check-degeneration.js +39 -20
  203. package/lib/oh-story/skills/story-review/scripts/normalize-punctuation.js +10 -5
  204. package/lib/oh-story/skills/story-review/scripts/style-whitelist.js +39 -0
  205. package/lib/oh-story/skills/story-review/scripts/tracking_commit.py +210 -2
  206. package/lib/oh-story/skills/story-review/scripts/wordcount_core.py +3 -0
  207. package/lib/oh-story/skills/story-setup/SKILL.md +58 -43
  208. package/lib/oh-story/skills/story-setup/references/agent-references/anti-ai-writing.md +29 -56
  209. package/lib/oh-story/skills/story-setup/references/agent-references/banned-words.md +3 -1
  210. package/lib/oh-story/skills/story-setup/references/agent-references/deslop-gates.md +154 -0
  211. package/lib/oh-story/skills/story-setup/references/agent-references/dialogue-mastery.md +10 -4
  212. package/lib/oh-story/skills/story-setup/references/agent-references/format-and-structure.md +2 -2
  213. package/lib/oh-story/skills/story-setup/references/agent-references/long-emotional-methods.md +2 -2
  214. package/lib/oh-story/skills/story-setup/references/agent-references/long-quality.md +1 -1
  215. package/lib/oh-story/skills/story-setup/references/agent-references/short-genre-formulas.md +1 -1
  216. package/lib/oh-story/skills/story-setup/references/agent-references/style-combat-face.md +1 -1
  217. package/lib/oh-story/skills/story-setup/references/agent-references/style-genre-modules.md +1 -1
  218. package/lib/oh-story/skills/story-setup/references/agent-references/style-resolution.md +27 -0
  219. package/lib/oh-story/skills/story-setup/references/agent-references/writing-craft.md +63 -4
  220. package/lib/oh-story/skills/story-setup/references/diagnostics.md +38 -0
  221. package/lib/oh-story/skills/story-short-analyze/SKILL.md +22 -3
  222. package/lib/oh-story/skills/story-short-analyze/references/analysis-writing-techniques.md +1 -1
  223. package/lib/oh-story/skills/story-short-analyze/references/material-decomposition.md +5 -1
  224. package/lib/oh-story/skills/story-short-analyze/references/source-story-quality.md +2 -2
  225. package/lib/oh-story/skills/story-short-scan/SKILL.md +5 -1
  226. package/lib/oh-story/skills/story-short-write/SKILL.md +15 -324
  227. package/lib/oh-story/skills/story-short-write/references/author-memory.md +61 -29
  228. package/lib/oh-story/skills/story-short-write/references/banned-words.md +3 -1
  229. package/lib/oh-story/skills/story-short-write/references/benchmark-recall.md +60 -0
  230. package/lib/oh-story/skills/story-short-write/references/dialogue-mastery.md +10 -4
  231. package/lib/oh-story/skills/story-short-write/references/genre-styles//344/270/226/346/203/205/346/211/223/350/204/270.md +2 -2
  232. package/lib/oh-story/skills/story-short-write/references/genre-styles//345/217/214/347/224/267/344/270/273.md +1 -1
  233. package/lib/oh-story/skills/story-short-write/references/genre-styles//345/244/215/344/273/207/346/211/223/350/204/270.md +3 -3
  234. package/lib/oh-story/skills/story-short-write/references/genre-styles//345/256/205/346/226/227/345/256/253/346/226/227.md +3 -3
  235. package/lib/oh-story/skills/story-short-write/references/genre-styles//346/200/273/350/243/201/350/261/252/351/227/250.md +3 -3
  236. package/lib/oh-story/skills/story-short-write/references/genre-styles//346/202/254/347/226/221.md +5 -5
  237. package/lib/oh-story/skills/story-short-write/references/genre-styles//346/260/221/344/277/227/346/200/252/350/260/210.md +4 -4
  238. package/lib/oh-story/skills/story-short-write/references/genre-styles//347/224/234/345/256/240.md +5 -5
  239. package/lib/oh-story/skills/story-short-write/references/genre-styles//350/277/275/345/246/273/347/201/253/350/221/254/345/234/272.md +3 -3
  240. package/lib/oh-story/skills/story-short-write/references/genre-writing-formulas.md +1 -1
  241. package/lib/oh-story/skills/story-short-write/references/genre-writing-techniques.md +1 -1
  242. package/lib/oh-story/skills/story-short-write/references/reference-index.md +55 -0
  243. package/lib/oh-story/skills/story-short-write/references/short-craft.md +12 -14
  244. package/lib/oh-story/skills/story-short-write/references/short-deslop.md +10 -10
  245. package/lib/oh-story/skills/story-short-write/references/short-format.md +3 -1
  246. package/lib/oh-story/skills/story-short-write/references/short-prose-quality.md +2 -2
  247. package/lib/oh-story/skills/story-short-write/references/style-resolution.md +27 -0
  248. package/lib/oh-story/skills/story-short-write/references/workflow-design.md +78 -0
  249. package/lib/oh-story/skills/story-short-write/references/workflow-draft.md +126 -0
  250. package/lib/oh-story/skills/story-short-write/references/workflow-revision.md +32 -0
  251. package/lib/oh-story/skills/story-short-write/references/writing-workflow.md +5 -5
  252. package/lib/oh-story/skills/story-short-write/scripts/author_memory_commit.py +934 -170
  253. package/lib/oh-story/skills/story-short-write/scripts/check-ai-patterns.js +6 -1
  254. package/lib/oh-story/skills/story-short-write/scripts/check-degeneration.js +39 -20
  255. package/lib/oh-story/skills/story-short-write/scripts/check-delivery-contract.js +34 -5
  256. package/lib/oh-story/skills/story-short-write/scripts/check-outline-copy.js +90 -23
  257. package/lib/oh-story/skills/story-short-write/scripts/normalize-punctuation.js +10 -5
  258. package/lib/oh-story/skills/story-short-write/scripts/style-whitelist.js +39 -0
  259. package/lib/types/client/drama-production-view.d.ts.map +1 -1
  260. package/lib/types/client/file-activity.d.ts +19 -1
  261. package/lib/types/client/file-activity.d.ts.map +1 -1
  262. package/lib/types/client/index.d.ts.map +1 -1
  263. package/lib/types/client/production-prompts.d.ts +7 -0
  264. package/lib/types/client/production-prompts.d.ts.map +1 -1
  265. package/lib/types/client/production-runtime.d.ts +33 -0
  266. package/lib/types/client/production-runtime.d.ts.map +1 -1
  267. package/lib/types/drama-adapters.d.ts +5 -3
  268. package/lib/types/drama-adapters.d.ts.map +1 -1
  269. package/lib/types/native-hooks.d.ts +52 -0
  270. package/lib/types/native-hooks.d.ts.map +1 -1
  271. package/lib/types/role-identity.d.ts +17 -0
  272. package/lib/types/role-identity.d.ts.map +1 -0
  273. package/lib/types/role-tool.d.ts.map +1 -1
  274. package/lib/types/skill-provider.d.ts.map +1 -1
  275. package/lib/video-recap/CHANGELOG.md +31 -1
  276. package/lib/video-recap/manifest.json +162 -162
  277. package/lib/video-recap/skills/video-assemble/scripts/artifacts.py +4 -9
  278. package/lib/video-recap/skills/video-assemble/scripts/assemble.py +47 -60
  279. package/lib/video-recap/skills/video-assemble/scripts/assembly_contract.py +77 -115
  280. package/lib/video-recap/skills/video-assemble/scripts/assembly_settings.py +41 -40
  281. package/lib/video-recap/skills/video-assemble/scripts/audio_automation.py +22 -32
  282. package/lib/video-recap/skills/video-assemble/scripts/audio_mix.py +102 -192
  283. package/lib/video-recap/skills/video-assemble/scripts/jianying_builders.py +14 -35
  284. package/lib/video-recap/skills/video-assemble/scripts/jianying_model.py +14 -12
  285. package/lib/video-recap/skills/video-assemble/scripts/jianying_optional.py +8 -9
  286. package/lib/video-recap/skills/video-assemble/scripts/jianying_schema.py +3 -14
  287. package/lib/video-recap/skills/video-assemble/scripts/jianying_timeline_contract.py +23 -12
  288. package/lib/video-recap/skills/video-assemble/scripts/jianying_tracks.py +1 -4
  289. package/lib/video-recap/skills/video-assemble/scripts/jianying_writer.py +24 -25
  290. package/lib/video-recap/skills/video-assemble/scripts/lib.py +31 -85
  291. package/lib/video-recap/skills/video-assemble/scripts/media.py +100 -144
  292. package/lib/video-recap/skills/video-assemble/scripts/narration_audio.py +101 -195
  293. package/lib/video-recap/skills/video-assemble/scripts/render_preflight.py +10 -21
  294. package/lib/video-recap/skills/video-assemble/scripts/source_subtitles.py +90 -169
  295. package/lib/video-recap/skills/video-assemble/scripts/subtitle_core.py +69 -122
  296. package/lib/video-recap/skills/video-assemble/scripts/subtitle_render.py +10 -17
  297. package/lib/video-recap/skills/video-assemble/scripts/timeline.py +33 -48
  298. package/lib/video-recap/skills/video-assemble/scripts/timeline_emit.py +14 -20
  299. package/lib/video-recap/skills/video-assemble/scripts/visual_render.py +135 -213
  300. package/lib/video-recap/skills/video-cut/scripts/cut_cli.py +49 -57
  301. package/lib/video-recap/skills/video-cut/scripts/cut_contract.py +38 -74
  302. package/lib/video-recap/skills/video-cut/scripts/cut_render.py +46 -95
  303. package/lib/video-recap/skills/video-cut/scripts/lib.py +23 -25
  304. package/lib/video-recap/skills/video-cut/scripts/media_geometry.py +70 -173
  305. package/lib/video-recap/skills/video-cut/scripts/narration_mapping.py +28 -53
  306. package/lib/video-recap/skills/video-cut/scripts/sentence_boundaries.py +162 -322
  307. package/lib/video-recap/skills/video-recap/references/timeline-and-jianying.md +6 -7
  308. package/lib/video-recap/skills/video-recap/scripts/doctor.py +104 -124
  309. package/lib/video-recap/skills/video-recap/scripts/final_qc.py +255 -412
  310. package/lib/video-recap/skills/video-recap/scripts/lib.py +30 -52
  311. package/lib/video-recap/skills/video-recap/scripts/materials.py +97 -120
  312. package/lib/video-recap/skills/video-recap/scripts/mimo_qc_client.py +7 -12
  313. package/lib/video-recap/skills/video-recap/scripts/mimo_qc_evidence.py +46 -97
  314. package/lib/video-recap/skills/video-recap/scripts/mimo_qc_observations.py +18 -36
  315. package/lib/video-recap/skills/video-recap/scripts/mimo_qc_payload.py +29 -47
  316. package/lib/video-recap/skills/video-recap/scripts/mimo_qc_report.py +43 -76
  317. package/lib/video-recap/skills/video-recap/scripts/mimo_qc_runner.py +2 -1
  318. package/lib/video-recap/skills/video-recap/scripts/qc_contract.py +2 -1
  319. package/lib/video-recap/skills/video-recap/scripts/recap_cli.py +2 -2
  320. package/lib/video-recap/skills/video-recap/scripts/recap_inspect.py +129 -145
  321. package/lib/video-recap/skills/video-recap/scripts/recap_review.py +27 -20
  322. package/lib/video-recap/skills/video-recap/scripts/recap_runner.py +20 -31
  323. package/lib/video-recap/skills/video-recap/scripts/recap_runtime.py +31 -106
  324. package/lib/video-recap/skills/video-recap/scripts/recap_stage_qc.py +43 -113
  325. package/lib/video-recap/skills/video-recap/scripts/recap_timeline.py +196 -377
  326. package/lib/video-recap/skills/video-script/scripts/agent_brief.py +1 -1
  327. package/lib/video-recap/skills/video-script/scripts/agent_text.py +63 -172
  328. package/lib/video-recap/skills/video-script/scripts/brief_context.py +80 -135
  329. package/lib/video-recap/skills/video-script/scripts/brief_inputs.py +125 -167
  330. package/lib/video-recap/skills/video-script/scripts/brief_timeline.py +93 -208
  331. package/lib/video-recap/skills/video-script/scripts/deslop_qc.py +20 -46
  332. package/lib/video-recap/skills/video-script/scripts/lib.py +30 -26
  333. package/lib/video-recap/skills/video-script/scripts/narration_lint.py +145 -140
  334. package/lib/video-recap/skills/video-script/scripts/review_response.py +12 -42
  335. package/lib/video-recap/skills/video-script/scripts/review_runner.py +0 -6
  336. package/lib/video-recap/skills/video-script/scripts/speech_ownership.py +39 -100
  337. package/lib/video-recap/skills/video-script/scripts/timeline_fusion.py +33 -124
  338. package/lib/video-recap/skills/video-understanding/scripts/agent_brief.py +1 -1
  339. package/lib/video-recap/skills/video-understanding/scripts/agent_text.py +63 -172
  340. package/lib/video-recap/skills/video-understanding/scripts/asr.py +1 -2
  341. package/lib/video-recap/skills/video-understanding/scripts/brief_context.py +80 -135
  342. package/lib/video-recap/skills/video-understanding/scripts/brief_inputs.py +125 -167
  343. package/lib/video-recap/skills/video-understanding/scripts/brief_timeline.py +93 -208
  344. package/lib/video-recap/skills/video-understanding/scripts/consolidate.py +1 -1
  345. package/lib/video-recap/skills/video-understanding/scripts/deslop_qc.py +20 -46
  346. package/lib/video-recap/skills/video-understanding/scripts/lib.py +31 -26
  347. package/lib/video-recap/skills/video-understanding/scripts/narration_lint.py +145 -140
  348. package/lib/video-recap/skills/video-understanding/scripts/speech_ownership.py +39 -100
  349. package/lib/video-recap/skills/video-understanding/scripts/timeline_fusion.py +33 -124
  350. package/lib/video-recap/skills/video-understanding/scripts/vlm.py +1 -4
  351. package/lib/video-recap/skills/video-voiceover/scripts/dub.py +7 -13
  352. package/lib/video-recap/skills/video-voiceover/scripts/fish_audio.py +12 -30
  353. package/lib/video-recap/skills/video-voiceover/scripts/lib.py +98 -131
  354. package/lib/video-recap/skills/video-voiceover/scripts/tts_audio.py +17 -28
  355. package/lib/video-recap/skills/video-voiceover/scripts/voiceover.py +151 -240
  356. package/package.json +45 -45
  357. package/lib/novel-to-game/skills/game-world-design/references/dialogue-design-method.md +0 -59
  358. package/lib/novel-to-game/skills/game-world-design/references/game-writing-craft.md +0 -53
  359. package/lib/novel-to-game/skills/novel-to-game/references/intake-benchmark-reference.md +0 -42
  360. package/lib/oh-story/skills/story-long-write/references/state-tracking.md +0 -108
@@ -256,8 +256,6 @@ body {
256
256
  }
257
257
 
258
258
  .choice-button span { color: #676a79; }
259
- .choice-button .choice-meta { color: #9a6834; }
260
-
261
259
  .choice-button:hover:not(:disabled):not([aria-disabled="true"]),
262
260
  .choice-button:focus-visible {
263
261
  border-color: rgba(200,79,92,.5);
@@ -305,12 +303,6 @@ body {
305
303
  .door-knock,
306
304
  .door-forecast dd { color: #666978; }
307
305
 
308
- /* 人物近景保留插画质感;只在文字所在一侧覆浅色雾纱。 */
309
- .close-portrait,
310
- .close-portrait.closer {
311
- filter: drop-shadow(-16px 20px 22px rgba(74,64,87,.17)) saturate(1.03) brightness(1.04) contrast(1.01);
312
- }
313
-
314
306
  #app .dialogue-stage::after,
315
307
  #app .morning-stage::after { background: linear-gradient(90deg, rgba(255,249,245,.34), transparent 60%); }
316
308
 
@@ -854,6 +846,25 @@ body {
854
846
  .ending-copy > p:not(.eyebrow):not(.ending-tag):not(.ending-note) { color: #5f6372; }
855
847
  .ending-note { color: #737584; }
856
848
 
849
+ /* 长结局总账允许读者翻动正文,但结果动作始终像书页脚签一样留在视口内。 */
850
+ .ending-copy > .button-row {
851
+ position: sticky;
852
+ z-index: 4;
853
+ bottom: -4vh;
854
+ margin: auto -1.2vw -4vh;
855
+ padding: .7rem 1.2vw .8rem;
856
+ border-top: 1px solid rgba(80, 95, 123, .16);
857
+ background: linear-gradient(0deg, rgba(250,248,247,.995), rgba(250,248,247,.96));
858
+ box-shadow: 0 -12px 28px rgba(67,63,84,.08);
859
+ }
860
+
861
+ .ending-copy > .button-row .ink-button {
862
+ flex: 1 1 7.5rem;
863
+ min-width: 0;
864
+ padding: .58rem .7rem;
865
+ font-size: .7rem;
866
+ }
867
+
857
868
  .ending-ledger span,
858
869
  .ending-habits,
859
870
  .ending-habits article,
@@ -1103,3 +1114,381 @@ body {
1103
1114
  animation: none !important;
1104
1115
  }
1105
1116
  }
1117
+
1118
+ /* 2026-09 画面重构:把标题做成一张可读的“人物权力总账”,而不是文案压在 CG 上。 */
1119
+ .title-folio {
1120
+ position: absolute;
1121
+ z-index: 3;
1122
+ top: 4.5vh;
1123
+ left: 2.2vw;
1124
+ display: grid;
1125
+ gap: .3rem;
1126
+ padding-left: .75rem;
1127
+ border-left: 2px solid rgba(200, 79, 92, .54);
1128
+ color: #3d4251;
1129
+ writing-mode: vertical-rl;
1130
+ }
1131
+
1132
+ .title-folio b {
1133
+ font-size: .78rem;
1134
+ font-weight: 600;
1135
+ letter-spacing: .24em;
1136
+ }
1137
+
1138
+ .title-folio span {
1139
+ color: #8c6670;
1140
+ font: .62rem var(--sans);
1141
+ letter-spacing: .14em;
1142
+ }
1143
+
1144
+ .title-cast {
1145
+ position: absolute;
1146
+ z-index: 4;
1147
+ right: 2.2vw;
1148
+ bottom: 2.4vh;
1149
+ width: min(50rem, 55vw);
1150
+ display: grid;
1151
+ grid-template-columns: repeat(5, minmax(0, 1fr));
1152
+ gap: 1px;
1153
+ margin: 0;
1154
+ padding: 0;
1155
+ list-style: none;
1156
+ border: 1px solid rgba(255,255,255,.62);
1157
+ background: rgba(76, 78, 99, .12);
1158
+ box-shadow: 0 16px 40px rgba(65, 56, 74, .16);
1159
+ backdrop-filter: blur(18px) saturate(.86);
1160
+ }
1161
+
1162
+ .title-cast li {
1163
+ position: relative;
1164
+ min-width: 0;
1165
+ display: grid;
1166
+ grid-template-columns: auto 1fr;
1167
+ grid-template-rows: auto auto;
1168
+ column-gap: .65rem;
1169
+ padding: .72rem .8rem .66rem;
1170
+ color: #353947;
1171
+ background: rgba(255, 251, 247, .78);
1172
+ }
1173
+
1174
+ .title-cast li::after {
1175
+ content: "";
1176
+ position: absolute;
1177
+ inset: auto .8rem 0;
1178
+ height: 2px;
1179
+ background: var(--cast-color, var(--cinnabar));
1180
+ }
1181
+
1182
+ .title-cast li:nth-child(1) { --cast-color: var(--azurite); }
1183
+ .title-cast li:nth-child(2) { --cast-color: var(--cinnabar); }
1184
+ .title-cast li:nth-child(3) { --cast-color: #d5aa65; }
1185
+ .title-cast li:nth-child(4) { --cast-color: var(--lilac); }
1186
+ .title-cast li:nth-child(5) { --cast-color: var(--jade); }
1187
+ .title-cast i {
1188
+ grid-row: 1 / 3;
1189
+ align-self: center;
1190
+ color: var(--cast-color);
1191
+ font: 500 .62rem/1 var(--sans);
1192
+ }
1193
+ .title-cast span { font-size: .84rem; letter-spacing: .12em; }
1194
+ .title-cast b { color: #777987; font: 500 .6rem/1.4 var(--sans); letter-spacing: .1em; }
1195
+
1196
+ /* 开局把抉择变成一张靠左的案件封套,留出右侧五人的完整表情和器物。 */
1197
+ .opening-scene::after {
1198
+ background:
1199
+ linear-gradient(90deg, rgba(250,246,244,.96) 0%, rgba(250,246,244,.76) 38%, rgba(250,246,244,.08) 64%, transparent 78%),
1200
+ linear-gradient(0deg, rgba(69,61,79,.12), transparent 58%);
1201
+ }
1202
+
1203
+ .opening-panel {
1204
+ left: 4vw;
1205
+ top: 50%;
1206
+ bottom: auto;
1207
+ width: min(38rem, 44vw);
1208
+ display: grid;
1209
+ grid-template-columns: 4.2rem minmax(0, 1fr);
1210
+ column-gap: 1.15rem;
1211
+ padding: 1.5rem 1.5rem 1.35rem 1.2rem;
1212
+ transform: translateY(-50%);
1213
+ }
1214
+
1215
+ .opening-panel::before {
1216
+ inset: 8px;
1217
+ border-color: rgba(53,95,152,.1);
1218
+ }
1219
+
1220
+ .opening-panel > :not(.opening-case) { grid-column: 2; }
1221
+ .opening-case {
1222
+ grid-column: 1;
1223
+ grid-row: 1 / 4;
1224
+ min-height: 100%;
1225
+ display: flex;
1226
+ flex-direction: column;
1227
+ align-items: center;
1228
+ padding-right: 1rem;
1229
+ border-right: 1px solid rgba(76, 92, 119, .18);
1230
+ }
1231
+ .opening-case span { color: #aa5260; font: 700 .52rem/1 var(--sans); letter-spacing: .18em; }
1232
+ .opening-case b { margin: .35rem 0; color: #343846; font: 300 2.8rem/1 var(--serif); }
1233
+ .opening-case i { color: #8b6a47; font: 500 .65rem/1.6 var(--sans); letter-spacing: .12em; writing-mode: vertical-rl; }
1234
+ .opening-panel .phase-header h2 { font-size: clamp(1.85rem, 2.55vw, 2.8rem); }
1235
+ .opening-panel .speaker-line {
1236
+ margin: .9rem 0 1rem;
1237
+ padding: .65rem .75rem;
1238
+ border-left: 2px solid rgba(200,79,92,.48);
1239
+ }
1240
+ .opening-panel .choice-grid { gap: .55rem; }
1241
+ .opening-panel .choice-button { min-height: 4.2rem; }
1242
+
1243
+ @media (max-width: 900px) {
1244
+ .title-folio { display: none; }
1245
+ .title-cast {
1246
+ top: 35.5%;
1247
+ right: 1rem;
1248
+ bottom: auto;
1249
+ left: 1rem;
1250
+ width: auto;
1251
+ box-shadow: 0 10px 30px rgba(65,56,74,.12);
1252
+ }
1253
+ .title-cast li {
1254
+ display: grid;
1255
+ grid-template-columns: 1fr;
1256
+ justify-items: center;
1257
+ gap: .18rem;
1258
+ padding: .48rem .2rem .45rem;
1259
+ }
1260
+ .title-cast i { display: none; }
1261
+ .title-cast span { font-size: .72rem; letter-spacing: .08em; }
1262
+ .title-cast b { font-size: .48rem; }
1263
+ .title-copy { padding-top: 46vh; }
1264
+
1265
+ .opening-scene::after {
1266
+ background: linear-gradient(0deg, rgba(247,243,245,.99) 0%, rgba(247,243,245,.92) 42%, rgba(247,243,245,.04) 76%);
1267
+ }
1268
+ .opening-panel {
1269
+ left: 3%;
1270
+ right: 3%;
1271
+ top: auto;
1272
+ bottom: 2%;
1273
+ width: auto;
1274
+ max-height: 74%;
1275
+ grid-template-columns: 1fr;
1276
+ gap: 0;
1277
+ padding: 1rem;
1278
+ transform: none;
1279
+ }
1280
+ .opening-panel > :not(.opening-case) { grid-column: 1; }
1281
+ .opening-case {
1282
+ grid-column: 1;
1283
+ grid-row: auto;
1284
+ min-height: 0;
1285
+ flex-direction: row;
1286
+ justify-content: flex-start;
1287
+ gap: .4rem;
1288
+ margin-bottom: .35rem;
1289
+ padding: 0 0 .4rem;
1290
+ border-right: 0;
1291
+ border-bottom: 1px solid rgba(76,92,119,.16);
1292
+ }
1293
+ .opening-case b { margin: 0; font-size: 1.2rem; }
1294
+ .opening-case i { writing-mode: horizontal-tb; }
1295
+ .opening-panel .phase-header h2 { font-size: clamp(1.65rem, 7vw, 2rem); }
1296
+ .opening-panel .phase-header > p:last-child { line-height: 1.65; }
1297
+ .opening-panel .speaker-line { margin: .55rem 0 .7rem; padding: .45rem .55rem; }
1298
+ }
1299
+
1300
+ @media (max-width: 460px) {
1301
+ .title-copy h1 { font-size: 1.9rem; }
1302
+ .title-subtitle { margin-bottom: .7rem; font-size: .88rem; }
1303
+ .identity-line { margin-bottom: .8rem; font-size: .78rem; line-height: 1.65; }
1304
+ .title-actions { gap: .45rem; margin-bottom: .65rem; }
1305
+ .title-actions .ink-button { flex: 1 1 calc(50% - .45rem); min-width: 0; padding: .65rem .7rem; }
1306
+ .title-actions #btn-gallery { flex-basis: 100%; }
1307
+ .rating-line, .save-note { margin-block: .3rem; font-size: .62rem; }
1308
+ .opening-panel { max-height: 78%; }
1309
+ .opening-panel .choice-grid { grid-template-columns: 1fr; gap: .4rem; }
1310
+ .opening-panel .choice-button { min-height: 3.6rem; }
1311
+ }
1312
+
1313
+ /* 2026-09 第二轮整体重设:正戏不再是一组等重的审计卡,而是一桌、一物、一人。 */
1314
+ :root {
1315
+ --scene-ink: #171d29;
1316
+ --scene-paper: #f2eadc;
1317
+ --scene-red: #9f2630;
1318
+ --scene-gold: #c5a264;
1319
+ }
1320
+
1321
+ /* 标题页不再套用第二轮的深色覆盖:那组规则是为已撤回的暗色群像配的,会把原版明亮封面压暗。
1322
+ * 标题沿用上方 08-25 的亮底规则;下方白日、路线与夜谈的重设保留。 */
1323
+
1324
+ /* 白日:一张掀起的宣纸靠左,院落与人物行动留出大面积呼吸。 */
1325
+ #app .hub-stage:not(.evening)::after {
1326
+ background:
1327
+ linear-gradient(90deg, rgba(20,28,36,.24) 0%, rgba(21,28,36,.04) 58%),
1328
+ linear-gradient(0deg, rgba(19,27,34,.24), transparent 52%);
1329
+ }
1330
+ #app .day-panel {
1331
+ left: clamp(1.2rem,5vw,5.5rem);
1332
+ right: auto;
1333
+ top: 50%;
1334
+ bottom: auto;
1335
+ width: min(42rem,48vw);
1336
+ max-height: 88%;
1337
+ padding: clamp(1.3rem,2.3vw,2.4rem) clamp(1.2rem,2.5vw,2.7rem) clamp(1.2rem,2.2vw,2.2rem) 6.1rem;
1338
+ transform: translateY(-50%) rotate(-.22deg);
1339
+ border: 0;
1340
+ border-radius: 0 1.4rem 1.4rem 0;
1341
+ background:
1342
+ linear-gradient(96deg, rgba(229,217,197,.98), rgba(250,244,232,.94) 78%, rgba(248,241,228,.88));
1343
+ box-shadow: 20px 28px 70px rgba(20,26,32,.3), inset 1px 0 rgba(255,255,255,.9);
1344
+ backdrop-filter: blur(7px);
1345
+ }
1346
+ #app .day-panel::before { inset: .65rem; border: 0; border-left: 1px solid rgba(144,73,54,.22); }
1347
+ .day-scene-mark {
1348
+ position: absolute;
1349
+ left: 1rem;
1350
+ top: 1.35rem;
1351
+ bottom: 1.35rem;
1352
+ width: 3.8rem;
1353
+ display: flex;
1354
+ flex-direction: column;
1355
+ align-items: center;
1356
+ gap: .35rem;
1357
+ padding-right: .8rem;
1358
+ border-right: 1px solid rgba(91,79,64,.2);
1359
+ }
1360
+ .day-scene-mark span { color: #a0443e; font: 700 .55rem var(--sans); letter-spacing: .24em; }
1361
+ .day-scene-mark b { color: #252a31; font: 300 2.5rem/1 var(--serif); }
1362
+ .day-scene-mark i { color: #72604c; font: 500 .66rem/1.5 var(--sans); letter-spacing: .14em; writing-mode: vertical-rl; }
1363
+ .day-panel .phase-header .eyebrow { color: #9e413d; letter-spacing: .19em; }
1364
+ .day-panel .phase-header h2 { color: #222833; font-size: clamp(2rem,3vw,3.25rem); line-height: 1.04; }
1365
+ .day-panel .phase-header > p:last-child { color: #574f45; max-width: 34rem; font-size: .95rem; line-height: 1.78; }
1366
+ .day-actions { counter-reset: day-choice; gap: .6rem; }
1367
+ .day-actions .choice-button { counter-increment: day-choice; position: relative; padding-left: 3.25rem; border: 0; border-bottom: 1px solid rgba(91,73,55,.2); border-radius: .2rem; background: rgba(255,252,244,.6); box-shadow: none; }
1368
+ .day-actions .choice-button::before { content: counter(day-choice, cjk-ideographic); position:absolute; left:.9rem; top:50%; translate:0 -50%; color:#a02d35; font: 500 1.2rem var(--serif); }
1369
+ .day-actions .choice-button:hover:not(:disabled) { transform: translateX(.35rem); background: #fffaf0; box-shadow: -4px 0 #9f2630; }
1370
+
1371
+ /* 人物路线与普通夜晚:近景占右,左侧窄绢只承载她此刻的一句话。 */
1372
+ #app :is(.dialogue-stage, .night-talk-stage)::after {
1373
+ background:
1374
+ linear-gradient(90deg, rgba(13,18,28,.96) 0%, rgba(19,24,36,.91) 38%, rgba(18,23,34,.28) 61%, rgba(12,17,26,.08) 100%),
1375
+ linear-gradient(0deg, rgba(7,12,21,.45), transparent 62%);
1376
+ }
1377
+ #app :is(.dialogue-stage, .night-talk-stage) .close-cg { filter: saturate(.92) brightness(.86) contrast(1.08); }
1378
+ #app :is(.dialogue-panel, .night-talk-panel) {
1379
+ left: clamp(1.15rem,4.5vw,5rem);
1380
+ right: auto;
1381
+ top: 50%;
1382
+ bottom: auto;
1383
+ width: min(35rem,41vw);
1384
+ max-height: 88%;
1385
+ padding: 2rem 2rem 1.7rem 4.4rem;
1386
+ transform: translateY(-50%);
1387
+ color: #ede1cf;
1388
+ border: 0;
1389
+ border-left: 1px solid rgba(198,162,99,.56);
1390
+ border-radius: 0;
1391
+ background: linear-gradient(90deg, rgba(16,21,31,.93), rgba(24,29,41,.78));
1392
+ box-shadow: 30px 0 70px rgba(5,8,14,.22);
1393
+ backdrop-filter: blur(10px);
1394
+ }
1395
+ #app :is(.dialogue-panel, .night-talk-panel)::before { display: none; }
1396
+ #app :is(.dialogue-panel, .night-talk-panel) .phase-header .eyebrow { color: #c7a46c; letter-spacing: .2em; }
1397
+ #app :is(.dialogue-panel, .night-talk-panel) .phase-header h2 { color: #fff2da; font-size: clamp(2.4rem,4vw,4.5rem); line-height: .96; }
1398
+ #app :is(.dialogue-panel, .night-talk-panel) .phase-header > p:last-child { color: #e1d2bd; font-size: 1rem; line-height: 1.8; }
1399
+ .character-seal { position:absolute; left:.8rem; top:2rem; display:grid; justify-items:center; gap:.5rem; }
1400
+ .character-seal i { display:grid; place-items:center; width:2.25rem; aspect-ratio:1; color:#ffe8bd; border:1px solid rgba(202,161,95,.65); border-radius:50%; font:500 1rem var(--serif); }
1401
+ .character-seal span { color:rgba(231,211,178,.62); font:600 .55rem var(--sans); letter-spacing:.16em; writing-mode:vertical-rl; }
1402
+ #app .dialogue-panel p.want-line { margin:.85rem 0 1rem; padding:.8rem 0 .8rem 1rem; color:#d8c8b2; border:0; border-left:2px solid #8f2832; background:rgba(255,255,255,.035); }
1403
+ #app .dialogue-panel .want-line > b { display:block; margin-bottom:.3rem; color:#c9a568; font:600 .58rem var(--sans); letter-spacing:.14em; }
1404
+ #app .dialogue-panel .want-line span { color:#bdad97; }
1405
+ #app .dialogue-panel .want-line small { color:rgba(218,204,184,.64); }
1406
+ #app :is(.dialogue-panel, .night-talk-panel) :is(.choice-stack,.choice-grid) { counter-reset: night-choice; gap:.55rem; }
1407
+ #app :is(.dialogue-panel, .night-talk-panel) .choice-button { counter-increment:night-choice; position:relative; min-height:3.6rem; padding:.7rem .9rem .7rem 3.2rem; color:#f1e5d2; border:1px solid rgba(209,178,125,.2); border-left:0; background:rgba(239,223,194,.055); box-shadow:none; }
1408
+ #app :is(.dialogue-panel, .night-talk-panel) .choice-button::before { content:counter(night-choice, cjk-ideographic); position:absolute; left:1rem; top:50%; translate:0 -50%; color:#c5a264; font:500 1rem var(--serif); }
1409
+ #app :is(.dialogue-panel, .night-talk-panel) .choice-button span { color:rgba(224,208,184,.62); }
1410
+ #app :is(.dialogue-panel, .night-talk-panel) .choice-button:hover:not(:disabled) { color:#fff8eb; border-color:rgba(184,54,65,.68); background:rgba(151,35,45,.42); transform:translateX(.3rem); }
1411
+ #app :is(.dialogue-panel, .night-talk-panel) .consent-note { color:rgba(231,215,192,.65); }
1412
+
1413
+ @media (max-width: 900px) {
1414
+ #app .day-panel { left:3%; right:3%; top:auto; bottom:2%; width:auto; max-height:77%; padding:1rem 1rem 1rem 4.4rem; transform:none; }
1415
+ .day-scene-mark { left:.65rem; top:1rem; bottom:1rem; width:3rem; }
1416
+ .day-scene-mark b { font-size:1.8rem; }
1417
+ #app :is(.dialogue-panel, .night-talk-panel) { left:3%; right:3%; top:auto; bottom:2%; width:auto; max-height:74%; padding:1.1rem 1rem 1rem 3.5rem; transform:none; background:linear-gradient(90deg, rgba(16,21,31,.97),rgba(24,29,41,.92)); }
1418
+ .character-seal { left:.55rem; top:1.2rem; }
1419
+ }
1420
+
1421
+ /* 第二轮文字可读性复核:纹理退到空气层,必要事实不能靠低对比度降级。 */
1422
+ #app::after {
1423
+ opacity: .08;
1424
+ mix-blend-mode: soft-light;
1425
+ background-image: linear-gradient(115deg, rgba(255,255,255,.05), transparent 42%, rgba(111,58,68,.035));
1426
+ background-size: auto;
1427
+ }
1428
+ #app :is(.dialogue-stage, .night-talk-stage)::after {
1429
+ background:
1430
+ linear-gradient(90deg, rgba(16,22,32,.88) 0%, rgba(19,26,37,.72) 39%, rgba(19,25,36,.16) 61%, transparent 100%),
1431
+ linear-gradient(0deg, rgba(21,27,38,.14), transparent 58%);
1432
+ }
1433
+ #app :is(.dialogue-panel, .night-talk-panel) {
1434
+ background: linear-gradient(100deg, rgba(25,33,45,.96), rgba(32,40,53,.91));
1435
+ }
1436
+ #app :is(.dialogue-panel, .night-talk-panel) .phase-header > p:last-child {
1437
+ color: #f0e3d0;
1438
+ font-size: 1.04rem;
1439
+ line-height: 1.82;
1440
+ }
1441
+ #app .dialogue-panel p.want-line {
1442
+ color: #eadbc5;
1443
+ background: #303a49;
1444
+ font-size: .9rem;
1445
+ line-height: 1.68;
1446
+ }
1447
+ #app .dialogue-panel .want-line > b { color: #e2bd78; font-size: .75rem; }
1448
+ #app .dialogue-panel .want-line span { color: #dbc8ab; font-size: .86rem; }
1449
+ #app .dialogue-panel .want-line small { color: #cfc0aa; font-size: .76rem; line-height: 1.65; }
1450
+ #app :is(.dialogue-panel, .night-talk-panel) .choice-button b {
1451
+ color: #fff1da;
1452
+ font-size: .93rem;
1453
+ line-height: 1.38;
1454
+ }
1455
+ #app :is(.dialogue-panel, .night-talk-panel) .choice-button span {
1456
+ color: #d7c5a9;
1457
+ font-size: .76rem;
1458
+ line-height: 1.5;
1459
+ }
1460
+ #app :is(.dialogue-panel, .night-talk-panel) .choice-button {
1461
+ border-color: rgba(224,193,140,.3);
1462
+ background: rgba(249,231,201,.085);
1463
+ }
1464
+ #app :is(.dialogue-panel, .night-talk-panel) .choice-button:focus-visible {
1465
+ outline: 2px solid #e2bd78;
1466
+ outline-offset: 3px;
1467
+ }
1468
+ .ending-old-account {
1469
+ margin: .8rem 0 1rem;
1470
+ color: #5f5860;
1471
+ border-top: 1px solid rgba(114,82,72,.18);
1472
+ border-bottom: 1px solid rgba(114,82,72,.18);
1473
+ }
1474
+ .ending-old-account summary {
1475
+ padding: .65rem 0;
1476
+ color: #8d514a;
1477
+ cursor: pointer;
1478
+ font: 600 .76rem var(--sans);
1479
+ letter-spacing: .08em;
1480
+ }
1481
+ .ending-old-account p { margin: 0 0 .8rem; }
1482
+ @media (max-width: 900px) {
1483
+ #app :is(.dialogue-panel, .night-talk-panel) { max-height: 82%; }
1484
+ }
1485
+ @media (max-width: 460px) {
1486
+ #app :is(.dialogue-panel, .night-talk-panel) { padding-top: .9rem; padding-bottom: .8rem; }
1487
+ #app :is(.dialogue-panel, .night-talk-panel) .phase-header h2 { font-size: 2.1rem; }
1488
+ #app :is(.dialogue-panel, .night-talk-panel) .phase-header > p:last-child { font-size: .92rem; line-height: 1.66; }
1489
+ #app .dialogue-panel p.want-line { margin: .55rem 0 .65rem; padding-block: .5rem; font-size: .84rem; }
1490
+ #app .dialogue-panel .want-line span { font-size: .79rem; }
1491
+ #app .dialogue-panel .want-line small { font-size: .75rem; }
1492
+ #app .dialogue-panel .choice-stack { grid-template-columns: 1fr; gap: .4rem; }
1493
+ #app :is(.dialogue-panel, .night-talk-panel) .choice-button { min-height: 3.15rem; padding-block: .55rem; }
1494
+ }
@@ -292,7 +292,6 @@ button:focus-visible { outline: 2px solid var(--gold-bright); outline-offset: 2p
292
292
  color: #e7dbc7;
293
293
  background: linear-gradient(180deg, #211713, #160f0d);
294
294
  }
295
- .rail-kicker { margin: 0 .2rem; color: #897d6b; font: .68rem var(--sans); letter-spacing: .22em; }
296
295
  .relation-card { position: relative; padding: .46rem .58rem .44rem; border: 1px solid rgba(224,202,162,.22); background: rgba(236,222,194,.055); overflow: hidden; }
297
296
  .relation-card::before { content: ""; position: absolute; inset: 0 auto 0 0; width: 3px; background: var(--gold); }
298
297
  .relation-pan_jinlian::before { background: #aa3d30; }
@@ -611,7 +610,6 @@ button:focus-visible { outline: 2px solid var(--gold-bright); outline-offset: 2p
611
610
  }
612
611
  .choice-button b { font-size: .95rem; letter-spacing: .06em; }
613
612
  .choice-button span { margin-top: .32rem; color: #b4a48e; font: .74rem/1.5 var(--sans); }
614
- .choice-button .choice-meta { margin-top: auto; padding-top: .42rem; color: #cfaa67; font: normal .6rem/1.35 var(--sans); letter-spacing: .05em; }
615
613
  .choice-button:hover:not(:disabled):not([aria-disabled="true"]) { transform: translateX(3px); border-color: rgba(226,171,104,.9); background: rgba(157,45,37,.17); }
616
614
  .choice-button:focus-visible { outline: 0; background: rgba(157,45,37,.13); box-shadow: inset 3px 0 var(--gold-bright); }
617
615
  .choice-button[aria-disabled="true"]:focus-visible { opacity: .72; outline: 2px solid #cfaa67; outline-offset: 3px; }
@@ -662,8 +660,6 @@ button:focus-visible { outline: 2px solid var(--gold-bright); outline-offset: 2p
662
660
 
663
661
  /* 对话近景 */
664
662
  .dialogue-stage { background: #211712; }
665
- .close-portrait { position: absolute; z-index: 2; right: -2%; top: -1%; height: 192%; width: 70%; object-fit: contain; object-position: top center; filter: drop-shadow(-24px 20px 18px rgba(0,0,0,.48)) saturate(.96); }
666
- .close-portrait.closer { height: 208%; right: -4%; filter: drop-shadow(-24px 20px 18px rgba(0,0,0,.58)) saturate(1.05); }
667
663
  /* 单张整版之后,舞台级 scrim 与 CG 上的 100° 斜向 scrim 必然打架,统一撤掉。 */
668
664
  .dialogue-stage::after, .morning-stage::after { background: none; }
669
665
  .dialogue-panel { left: 3.5%; top: 6%; bottom: 5%; width: 40%; padding: 1.5rem; overflow: clip; }
@@ -733,10 +729,6 @@ button:focus-visible { outline: 2px solid var(--gold-bright); outline-offset: 2p
733
729
  .intimacy-memory b { margin-top:.16rem; color:#d4e0d8; font:.7rem/1.35 var(--serif); }
734
730
  .intimacy-memory p { display:-webkit-box; margin:.25rem 0 0; overflow:hidden; color:#a9b9b0; font:.62rem/1.48 var(--sans); -webkit-line-clamp:2; -webkit-box-orient:vertical; }
735
731
  .intimacy-memory em { display:-webkit-box; margin:.25rem 0 0; overflow:hidden; color:#8fa59b; font:normal .58rem/1.48 var(--sans); -webkit-line-clamp:2; -webkit-box-orient:vertical; }
736
- .aftermath-intimacy-echo { margin:.45rem 0; padding:.48rem .58rem; border-left:2px solid #709b8b; color:#9bb8ad; font:.6rem/1.4 var(--sans); background:rgba(39,75,63,.18); }
737
- .aftermath-intimacy-echo span,.aftermath-intimacy-echo b { display:block; }
738
- .aftermath-intimacy-echo span { color:#718f84; letter-spacing:.1em; }
739
- .aftermath-intimacy-echo b { margin-top:.16rem; color:#c7dbd1; font-size:.68rem; }
740
732
  .ordinary-night-memory { margin:.55rem 0; padding:.58rem .65rem; border:1px solid rgba(177,126,75,.3); border-left:2px solid #a96748; background:linear-gradient(110deg,rgba(91,48,31,.22),rgba(0,0,0,.14)); }
741
733
  .ordinary-night-memory small,.ordinary-night-memory b { display:block; }
742
734
  .ordinary-night-memory small { color:#a37960; font:.55rem var(--sans); letter-spacing:.08em; }
@@ -749,16 +741,6 @@ button:focus-visible { outline: 2px solid var(--gold-bright); outline-offset: 2p
749
741
  .night-conversation-life-memory .stake { margin-top:.22rem; color:#c5aa78; font:.56rem/1.4 var(--sans); }
750
742
  .night-conversation-life-memory p { display:-webkit-box; margin:.25rem 0 0; overflow:hidden; color:#adc0b6; font:.61rem/1.48 var(--sans); -webkit-line-clamp:3; -webkit-box-orient:vertical; }
751
743
  .night-conversation-life-memory em { margin-top:.3rem; color:#86a99b; font:.56rem/1.45 var(--sans); font-style:normal; }
752
- .aftermath-night-memory { margin:.45rem 0; padding:.48rem .58rem; border-left:2px solid #a96748; color:#b59b86; font:.6rem/1.4 var(--sans); background:rgba(91,48,31,.18); }
753
- .aftermath-night-memory span,.aftermath-night-memory b,.aftermath-night-memory small { display:block; }
754
- .aftermath-night-memory span { color:#9c715a; letter-spacing:.08em; }
755
- .aftermath-night-memory b { margin-top:.15rem; color:#e0bea0; font-size:.68rem; }
756
- .aftermath-night-memory small { margin-top:.16rem; color:#ad9a85; line-height:1.45; }
757
- .aftermath-conversation-memory { margin:.45rem 0; padding:.5rem .6rem; border-left:2px solid #6f9b8b; color:#acc0b5; font:.6rem/1.42 var(--sans); background:rgba(45,75,66,.2); }
758
- .aftermath-conversation-memory span,.aftermath-conversation-memory b,.aftermath-conversation-memory small { display:block; }
759
- .aftermath-conversation-memory span { color:#82a596; letter-spacing:.08em; }
760
- .aftermath-conversation-memory b { margin-top:.15rem; color:#c9dfd2; font-size:.68rem; }
761
- .aftermath-conversation-memory small { margin-top:.17rem; color:#adbbb3; line-height:1.48; }
762
744
  .night-talk-observer-reaction { margin:.6rem 0; padding:.58rem .68rem; border:1px solid rgba(112,155,139,.32); border-left:3px solid #6f9b8b; background:rgba(45,75,66,.22); }
763
745
  .night-talk-observer-reaction span,.night-talk-observer-reaction b { display:block; }
764
746
  .night-talk-observer-reaction span { color:#83a496; font:.56rem var(--sans); letter-spacing:.09em; }
@@ -1090,12 +1072,6 @@ button:focus-visible { outline: 2px solid var(--gold-bright); outline-offset: 2p
1090
1072
  .invitation-aftermath-stage.resolved .invitation-aftermath-rule { border-color:rgba(82,156,105,.68); background:rgba(24,67,43,.18); }
1091
1073
  .invitation-aftermath-choices { grid-template-columns:repeat(2,minmax(0,1fr)); }
1092
1074
  .invitation-aftermath-panel > .ink-button { min-width:12rem; }
1093
- .pov-prop { position: absolute; z-index: 3; right: 30%; bottom: -8%; width: 28%; height: 28%; transform: rotate(13deg); border-radius: 48% 55% 20% 18%; background: linear-gradient(135deg, #25354e, #111b2d); box-shadow: inset 0 0 0 8px rgba(196,157,92,.12), 0 12px 24px rgba(0,0,0,.5); }
1094
- .pov-prop::after { content: ""; position: absolute; right: -14%; top: 8%; width: 27%; height: 35%; border-radius: 50%; background: #c39772; }
1095
- .pov-prop.cup::before { content: ""; position: absolute; right: -28%; top: -24%; width: 62px; height: 40px; border: 5px solid #aa8052; border-radius: 50%; background: radial-gradient(ellipse, #3c1d18 40%, #b38753 44%, #50402d 55%); }
1096
-
1097
- /* 次晨 */
1098
- .morning-portrait { position: absolute; z-index: 2; right: 3%; top: 0; height: 140%; filter: drop-shadow(-22px 20px 18px rgba(0,0,0,.45)); }
1099
1075
  .morning-panel { left: 4%; top: 8%; width: 47%; padding: 1.45rem; }
1100
1076
  .tone-jealous .morning-panel { border-color: rgba(188,73,61,.72); }
1101
1077
  .tone-backing .morning-panel { border-color: rgba(126,167,149,.65); }
@@ -1554,11 +1530,6 @@ button:focus-visible { outline: 2px solid var(--gold-bright); outline-offset: 2p
1554
1530
  .collapse-final-question p { margin: .3rem 0 0; color: #ae9988; font: .6rem/1.5 var(--sans); }
1555
1531
  .collapse-final-choices { grid-template-columns: 1fr 1fr; }
1556
1532
  .collapse-continue,.collapse-result-continue { min-width: 15rem; border-color: rgba(198,103,75,.58); }
1557
- .collapse-result-voices { display: grid; grid-template-columns: repeat(2,minmax(0,1fr)); gap: .34rem; margin: .58rem 0; }
1558
- .collapse-result-voices blockquote { margin: 0; padding: .46rem .54rem; border-left: 2px solid rgba(188,95,68,.52); background: rgba(86,34,25,.17); }
1559
- .collapse-result-voices blockquote:last-child { grid-column: 1 / -1; }
1560
- .collapse-result-voices b { color: #cf8668; font: .58rem var(--sans); letter-spacing: .08em; }
1561
- .collapse-result-voices p { margin: .18rem 0 0; color: #cfbaa9; font: .6rem/1.5 var(--serif); }
1562
1533
  .collapse-result-current-voice { margin:.62rem 0; padding:.72rem .78rem; border-left:3px solid rgba(202,108,78,.72); background:rgba(96,38,27,.22); }
1563
1534
  .collapse-result-current-voice b { color:#dc9271; font:.62rem var(--sans); letter-spacing:.1em; }
1564
1535
  .collapse-result-current-voice p { margin:.3rem 0 0; color:#e0cbbb; font:.74rem/1.66 var(--serif); }
@@ -2106,8 +2077,6 @@ img[alt="孙雪娥"] { --heroine-focus-x: 68%; }
2106
2077
  .collapse-cast span,.collapse-result-cast span { display: none; }
2107
2078
  .collapse-finale-panel,.collapse-result-panel { top: auto; max-height: 94%; }
2108
2079
  .collapse-final-choices,.collapse-result-voices { grid-template-columns: 1fr; gap: .26rem; }
2109
- .collapse-result-voices blockquote:last-child { grid-column: auto; }
2110
- .collapse-result-voices blockquote { padding: .42rem .48rem; }
2111
2080
  .collapse-current-voice { padding: .55rem .62rem; }
2112
2081
  .collapse-cause-ledger,.collapse-result-ledger { margin: .45rem 0; padding: .42rem .48rem; }
2113
2082
  .collapse-continue,.collapse-result-continue { width: 100%; min-width: 0; }