@actalk/inkos-core 1.3.6 → 1.3.7

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 (444) hide show
  1. package/dist/agent/agent-session.d.ts +7 -7
  2. package/dist/agent/agent-session.d.ts.map +1 -1
  3. package/dist/agent/agent-session.js +392 -63
  4. package/dist/agent/agent-session.js.map +1 -1
  5. package/dist/agent/agent-system-prompt.d.ts.map +1 -1
  6. package/dist/agent/agent-system-prompt.js +20 -16
  7. package/dist/agent/agent-system-prompt.js.map +1 -1
  8. package/dist/agent/agent-tools.d.ts +4 -1
  9. package/dist/agent/agent-tools.d.ts.map +1 -1
  10. package/dist/agent/agent-tools.js +81 -64
  11. package/dist/agent/agent-tools.js.map +1 -1
  12. package/dist/agents/architect.d.ts +18 -20
  13. package/dist/agents/architect.d.ts.map +1 -1
  14. package/dist/agents/architect.js +513 -632
  15. package/dist/agents/architect.js.map +1 -1
  16. package/dist/agents/chapter-analyzer.d.ts.map +1 -1
  17. package/dist/agents/chapter-analyzer.js +10 -6
  18. package/dist/agents/chapter-analyzer.js.map +1 -1
  19. package/dist/agents/composer.d.ts +1 -13
  20. package/dist/agents/composer.d.ts.map +1 -1
  21. package/dist/agents/composer.js +297 -290
  22. package/dist/agents/composer.js.map +1 -1
  23. package/dist/agents/consolidator.d.ts +17 -1
  24. package/dist/agents/consolidator.d.ts.map +1 -1
  25. package/dist/agents/consolidator.js +44 -6
  26. package/dist/agents/consolidator.js.map +1 -1
  27. package/dist/agents/continuity.d.ts +4 -1
  28. package/dist/agents/continuity.d.ts.map +1 -1
  29. package/dist/agents/continuity.js +111 -21
  30. package/dist/agents/continuity.js.map +1 -1
  31. package/dist/agents/length-normalizer.d.ts.map +1 -1
  32. package/dist/agents/length-normalizer.js +1 -4
  33. package/dist/agents/length-normalizer.js.map +1 -1
  34. package/dist/agents/planner-context.d.ts +54 -0
  35. package/dist/agents/planner-context.d.ts.map +1 -0
  36. package/dist/agents/planner-context.js +245 -0
  37. package/dist/agents/planner-context.js.map +1 -0
  38. package/dist/agents/planner-prompts.d.ts +36 -0
  39. package/dist/agents/planner-prompts.d.ts.map +1 -0
  40. package/dist/agents/planner-prompts.js +350 -0
  41. package/dist/agents/planner-prompts.js.map +1 -0
  42. package/dist/agents/planner.d.ts +39 -11
  43. package/dist/agents/planner.d.ts.map +1 -1
  44. package/dist/agents/planner.js +212 -195
  45. package/dist/agents/planner.js.map +1 -1
  46. package/dist/agents/polisher.d.ts +33 -0
  47. package/dist/agents/polisher.d.ts.map +1 -0
  48. package/dist/agents/polisher.js +122 -0
  49. package/dist/agents/polisher.js.map +1 -0
  50. package/dist/agents/post-write-validator.d.ts +1 -0
  51. package/dist/agents/post-write-validator.d.ts.map +1 -1
  52. package/dist/agents/post-write-validator.js +13 -0
  53. package/dist/agents/post-write-validator.js.map +1 -1
  54. package/dist/agents/reviser.d.ts +6 -2
  55. package/dist/agents/reviser.d.ts.map +1 -1
  56. package/dist/agents/reviser.js +379 -98
  57. package/dist/agents/reviser.js.map +1 -1
  58. package/dist/agents/rules-reader.d.ts +15 -2
  59. package/dist/agents/rules-reader.d.ts.map +1 -1
  60. package/dist/agents/rules-reader.js +49 -6
  61. package/dist/agents/rules-reader.js.map +1 -1
  62. package/dist/agents/state-validator.d.ts +9 -1
  63. package/dist/agents/state-validator.d.ts.map +1 -1
  64. package/dist/agents/state-validator.js +37 -1
  65. package/dist/agents/state-validator.js.map +1 -1
  66. package/dist/agents/writer-prompts.d.ts +1 -0
  67. package/dist/agents/writer-prompts.d.ts.map +1 -1
  68. package/dist/agents/writer-prompts.js +272 -29
  69. package/dist/agents/writer-prompts.js.map +1 -1
  70. package/dist/agents/writer.d.ts +12 -3
  71. package/dist/agents/writer.d.ts.map +1 -1
  72. package/dist/agents/writer.js +77 -107
  73. package/dist/agents/writer.js.map +1 -1
  74. package/dist/index.d.ts +20 -5
  75. package/dist/index.d.ts.map +1 -1
  76. package/dist/index.js +19 -5
  77. package/dist/index.js.map +1 -1
  78. package/dist/interaction/book-session-store.d.ts.map +1 -1
  79. package/dist/interaction/book-session-store.js +84 -69
  80. package/dist/interaction/book-session-store.js.map +1 -1
  81. package/dist/interaction/events.d.ts +2 -2
  82. package/dist/interaction/project-tools.d.ts +1 -0
  83. package/dist/interaction/project-tools.d.ts.map +1 -1
  84. package/dist/interaction/project-tools.js +51 -3
  85. package/dist/interaction/project-tools.js.map +1 -1
  86. package/dist/interaction/session-transcript-legacy.d.ts +4 -0
  87. package/dist/interaction/session-transcript-legacy.d.ts.map +1 -0
  88. package/dist/interaction/session-transcript-legacy.js +100 -0
  89. package/dist/interaction/session-transcript-legacy.js.map +1 -0
  90. package/dist/interaction/session-transcript-restore.d.ts +17 -0
  91. package/dist/interaction/session-transcript-restore.d.ts.map +1 -0
  92. package/dist/interaction/session-transcript-restore.js +493 -0
  93. package/dist/interaction/session-transcript-restore.js.map +1 -0
  94. package/dist/interaction/session-transcript-schema.d.ts +402 -0
  95. package/dist/interaction/session-transcript-schema.d.ts.map +1 -0
  96. package/dist/interaction/session-transcript-schema.js +59 -0
  97. package/dist/interaction/session-transcript-schema.js.map +1 -0
  98. package/dist/interaction/session-transcript.d.ts +14 -0
  99. package/dist/interaction/session-transcript.d.ts.map +1 -0
  100. package/dist/interaction/session-transcript.js +152 -0
  101. package/dist/interaction/session-transcript.js.map +1 -0
  102. package/dist/interaction/session.d.ts +10 -10
  103. package/dist/interaction/session.d.ts.map +1 -1
  104. package/dist/interaction/session.js +5 -3
  105. package/dist/interaction/session.js.map +1 -1
  106. package/dist/llm/provider.d.ts +6 -9
  107. package/dist/llm/provider.d.ts.map +1 -1
  108. package/dist/llm/provider.js +255 -63
  109. package/dist/llm/provider.js.map +1 -1
  110. package/dist/llm/providers/endpoints/ai360.d.ts +10 -0
  111. package/dist/llm/providers/endpoints/ai360.d.ts.map +1 -0
  112. package/dist/llm/providers/endpoints/ai360.js +34 -0
  113. package/dist/llm/providers/endpoints/ai360.js.map +1 -0
  114. package/dist/llm/providers/endpoints/anthropic.d.ts +12 -0
  115. package/dist/llm/providers/endpoints/anthropic.d.ts.map +1 -0
  116. package/dist/llm/providers/endpoints/anthropic.js +72 -0
  117. package/dist/llm/providers/endpoints/anthropic.js.map +1 -0
  118. package/dist/llm/providers/endpoints/astronCodingPlan.d.ts +16 -0
  119. package/dist/llm/providers/endpoints/astronCodingPlan.d.ts.map +1 -0
  120. package/dist/llm/providers/endpoints/astronCodingPlan.js +16 -0
  121. package/dist/llm/providers/endpoints/astronCodingPlan.js.map +1 -0
  122. package/dist/llm/providers/endpoints/baichuan.d.ts +10 -0
  123. package/dist/llm/providers/endpoints/baichuan.d.ts.map +1 -0
  124. package/dist/llm/providers/endpoints/baichuan.js +20 -0
  125. package/dist/llm/providers/endpoints/baichuan.js.map +1 -0
  126. package/dist/llm/providers/endpoints/bailian.d.ts +25 -0
  127. package/dist/llm/providers/endpoints/bailian.d.ts.map +1 -0
  128. package/dist/llm/providers/endpoints/bailian.js +42 -0
  129. package/dist/llm/providers/endpoints/bailian.js.map +1 -0
  130. package/dist/llm/providers/endpoints/bailianCodingPlan.d.ts +10 -0
  131. package/dist/llm/providers/endpoints/bailianCodingPlan.d.ts.map +1 -0
  132. package/dist/llm/providers/endpoints/bailianCodingPlan.js +22 -0
  133. package/dist/llm/providers/endpoints/bailianCodingPlan.js.map +1 -0
  134. package/dist/llm/providers/endpoints/custom.d.ts +16 -0
  135. package/dist/llm/providers/endpoints/custom.d.ts.map +1 -0
  136. package/dist/llm/providers/endpoints/custom.js +15 -0
  137. package/dist/llm/providers/endpoints/custom.js.map +1 -0
  138. package/dist/llm/providers/endpoints/deepseek.d.ts +17 -0
  139. package/dist/llm/providers/endpoints/deepseek.d.ts.map +1 -0
  140. package/dist/llm/providers/endpoints/deepseek.js +20 -0
  141. package/dist/llm/providers/endpoints/deepseek.js.map +1 -0
  142. package/dist/llm/providers/endpoints/giteeai.d.ts +10 -0
  143. package/dist/llm/providers/endpoints/giteeai.d.ts.map +1 -0
  144. package/dist/llm/providers/endpoints/giteeai.js +33 -0
  145. package/dist/llm/providers/endpoints/giteeai.js.map +1 -0
  146. package/dist/llm/providers/endpoints/githubCopilot.d.ts +10 -0
  147. package/dist/llm/providers/endpoints/githubCopilot.d.ts.map +1 -0
  148. package/dist/llm/providers/endpoints/githubCopilot.js +35 -0
  149. package/dist/llm/providers/endpoints/githubCopilot.js.map +1 -0
  150. package/dist/llm/providers/endpoints/glmCodingPlan.d.ts +9 -0
  151. package/dist/llm/providers/endpoints/glmCodingPlan.d.ts.map +1 -0
  152. package/dist/llm/providers/endpoints/glmCodingPlan.js +21 -0
  153. package/dist/llm/providers/endpoints/glmCodingPlan.js.map +1 -0
  154. package/dist/llm/providers/endpoints/google.d.ts +12 -0
  155. package/dist/llm/providers/endpoints/google.d.ts.map +1 -0
  156. package/dist/llm/providers/endpoints/google.js +41 -0
  157. package/dist/llm/providers/endpoints/google.js.map +1 -0
  158. package/dist/llm/providers/endpoints/hunyuan.d.ts +10 -0
  159. package/dist/llm/providers/endpoints/hunyuan.d.ts.map +1 -0
  160. package/dist/llm/providers/endpoints/hunyuan.js +34 -0
  161. package/dist/llm/providers/endpoints/hunyuan.js.map +1 -0
  162. package/dist/llm/providers/endpoints/infiniai.d.ts +10 -0
  163. package/dist/llm/providers/endpoints/infiniai.d.ts.map +1 -0
  164. package/dist/llm/providers/endpoints/infiniai.js +64 -0
  165. package/dist/llm/providers/endpoints/infiniai.js.map +1 -0
  166. package/dist/llm/providers/endpoints/internlm.d.ts +10 -0
  167. package/dist/llm/providers/endpoints/internlm.d.ts.map +1 -0
  168. package/dist/llm/providers/endpoints/internlm.js +20 -0
  169. package/dist/llm/providers/endpoints/internlm.js.map +1 -0
  170. package/dist/llm/providers/endpoints/kimiCodingPlan.d.ts +9 -0
  171. package/dist/llm/providers/endpoints/kimiCodingPlan.d.ts.map +1 -0
  172. package/dist/llm/providers/endpoints/kimiCodingPlan.js +17 -0
  173. package/dist/llm/providers/endpoints/kimiCodingPlan.js.map +1 -0
  174. package/dist/llm/providers/endpoints/longcat.d.ts +9 -0
  175. package/dist/llm/providers/endpoints/longcat.d.ts.map +1 -0
  176. package/dist/llm/providers/endpoints/longcat.js +18 -0
  177. package/dist/llm/providers/endpoints/longcat.js.map +1 -0
  178. package/dist/llm/providers/endpoints/minimax.d.ts +15 -0
  179. package/dist/llm/providers/endpoints/minimax.d.ts.map +1 -0
  180. package/dist/llm/providers/endpoints/minimax.js +26 -0
  181. package/dist/llm/providers/endpoints/minimax.js.map +1 -0
  182. package/dist/llm/providers/endpoints/minimaxCodingPlan.d.ts +9 -0
  183. package/dist/llm/providers/endpoints/minimaxCodingPlan.d.ts.map +1 -0
  184. package/dist/llm/providers/endpoints/minimaxCodingPlan.js +21 -0
  185. package/dist/llm/providers/endpoints/minimaxCodingPlan.js.map +1 -0
  186. package/dist/llm/providers/endpoints/mistral.d.ts +11 -0
  187. package/dist/llm/providers/endpoints/mistral.d.ts.map +1 -0
  188. package/dist/llm/providers/endpoints/mistral.js +31 -0
  189. package/dist/llm/providers/endpoints/mistral.js.map +1 -0
  190. package/dist/llm/providers/endpoints/modelscope.d.ts +10 -0
  191. package/dist/llm/providers/endpoints/modelscope.d.ts.map +1 -0
  192. package/dist/llm/providers/endpoints/modelscope.js +22 -0
  193. package/dist/llm/providers/endpoints/modelscope.js.map +1 -0
  194. package/dist/llm/providers/endpoints/moonshot.d.ts +12 -0
  195. package/dist/llm/providers/endpoints/moonshot.d.ts.map +1 -0
  196. package/dist/llm/providers/endpoints/moonshot.js +29 -0
  197. package/dist/llm/providers/endpoints/moonshot.js.map +1 -0
  198. package/dist/llm/providers/endpoints/newapi.d.ts +14 -0
  199. package/dist/llm/providers/endpoints/newapi.d.ts.map +1 -0
  200. package/dist/llm/providers/endpoints/newapi.js +14 -0
  201. package/dist/llm/providers/endpoints/newapi.js.map +1 -0
  202. package/dist/llm/providers/endpoints/ollama.d.ts +12 -0
  203. package/dist/llm/providers/endpoints/ollama.d.ts.map +1 -0
  204. package/dist/llm/providers/endpoints/ollama.js +63 -0
  205. package/dist/llm/providers/endpoints/ollama.js.map +1 -0
  206. package/dist/llm/providers/endpoints/openai.d.ts +12 -0
  207. package/dist/llm/providers/endpoints/openai.d.ts.map +1 -0
  208. package/dist/llm/providers/endpoints/openai.js +67 -0
  209. package/dist/llm/providers/endpoints/openai.js.map +1 -0
  210. package/dist/llm/providers/endpoints/opencodeCodingPlan.d.ts +9 -0
  211. package/dist/llm/providers/endpoints/opencodeCodingPlan.d.ts.map +1 -0
  212. package/dist/llm/providers/endpoints/opencodeCodingPlan.js +23 -0
  213. package/dist/llm/providers/endpoints/opencodeCodingPlan.js.map +1 -0
  214. package/dist/llm/providers/endpoints/openrouter.d.ts +15 -0
  215. package/dist/llm/providers/endpoints/openrouter.d.ts.map +1 -0
  216. package/dist/llm/providers/endpoints/openrouter.js +74 -0
  217. package/dist/llm/providers/endpoints/openrouter.js.map +1 -0
  218. package/dist/llm/providers/endpoints/ppio.d.ts +15 -0
  219. package/dist/llm/providers/endpoints/ppio.d.ts.map +1 -0
  220. package/dist/llm/providers/endpoints/ppio.js +73 -0
  221. package/dist/llm/providers/endpoints/ppio.js.map +1 -0
  222. package/dist/llm/providers/endpoints/qiniu.d.ts +10 -0
  223. package/dist/llm/providers/endpoints/qiniu.d.ts.map +1 -0
  224. package/dist/llm/providers/endpoints/qiniu.js +24 -0
  225. package/dist/llm/providers/endpoints/qiniu.js.map +1 -0
  226. package/dist/llm/providers/endpoints/sensenova.d.ts +10 -0
  227. package/dist/llm/providers/endpoints/sensenova.d.ts.map +1 -0
  228. package/dist/llm/providers/endpoints/sensenova.js +37 -0
  229. package/dist/llm/providers/endpoints/sensenova.js.map +1 -0
  230. package/dist/llm/providers/endpoints/siliconcloud.d.ts +14 -0
  231. package/dist/llm/providers/endpoints/siliconcloud.d.ts.map +1 -0
  232. package/dist/llm/providers/endpoints/siliconcloud.js +114 -0
  233. package/dist/llm/providers/endpoints/siliconcloud.js.map +1 -0
  234. package/dist/llm/providers/endpoints/spark.d.ts +14 -0
  235. package/dist/llm/providers/endpoints/spark.d.ts.map +1 -0
  236. package/dist/llm/providers/endpoints/spark.js +21 -0
  237. package/dist/llm/providers/endpoints/spark.js.map +1 -0
  238. package/dist/llm/providers/endpoints/stepfun.d.ts +10 -0
  239. package/dist/llm/providers/endpoints/stepfun.d.ts.map +1 -0
  240. package/dist/llm/providers/endpoints/stepfun.js +27 -0
  241. package/dist/llm/providers/endpoints/stepfun.js.map +1 -0
  242. package/dist/llm/providers/endpoints/tencentcloud.d.ts +10 -0
  243. package/dist/llm/providers/endpoints/tencentcloud.d.ts.map +1 -0
  244. package/dist/llm/providers/endpoints/tencentcloud.js +17 -0
  245. package/dist/llm/providers/endpoints/tencentcloud.js.map +1 -0
  246. package/dist/llm/providers/endpoints/volcengine.d.ts +10 -0
  247. package/dist/llm/providers/endpoints/volcengine.d.ts.map +1 -0
  248. package/dist/llm/providers/endpoints/volcengine.js +44 -0
  249. package/dist/llm/providers/endpoints/volcengine.js.map +1 -0
  250. package/dist/llm/providers/endpoints/volcengineCodingPlan.d.ts +19 -0
  251. package/dist/llm/providers/endpoints/volcengineCodingPlan.d.ts.map +1 -0
  252. package/dist/llm/providers/endpoints/volcengineCodingPlan.js +25 -0
  253. package/dist/llm/providers/endpoints/volcengineCodingPlan.js.map +1 -0
  254. package/dist/llm/providers/endpoints/wenxin.d.ts +10 -0
  255. package/dist/llm/providers/endpoints/wenxin.d.ts.map +1 -0
  256. package/dist/llm/providers/endpoints/wenxin.js +98 -0
  257. package/dist/llm/providers/endpoints/wenxin.js.map +1 -0
  258. package/dist/llm/providers/endpoints/xai.d.ts +11 -0
  259. package/dist/llm/providers/endpoints/xai.d.ts.map +1 -0
  260. package/dist/llm/providers/endpoints/xai.js +25 -0
  261. package/dist/llm/providers/endpoints/xai.js.map +1 -0
  262. package/dist/llm/providers/endpoints/xiaomimimo.d.ts +12 -0
  263. package/dist/llm/providers/endpoints/xiaomimimo.d.ts.map +1 -0
  264. package/dist/llm/providers/endpoints/xiaomimimo.js +16 -0
  265. package/dist/llm/providers/endpoints/xiaomimimo.js.map +1 -0
  266. package/dist/llm/providers/endpoints/zeroone.d.ts +10 -0
  267. package/dist/llm/providers/endpoints/zeroone.d.ts.map +1 -0
  268. package/dist/llm/providers/endpoints/zeroone.js +26 -0
  269. package/dist/llm/providers/endpoints/zeroone.js.map +1 -0
  270. package/dist/llm/providers/endpoints/zhipu.d.ts +12 -0
  271. package/dist/llm/providers/endpoints/zhipu.d.ts.map +1 -0
  272. package/dist/llm/providers/endpoints/zhipu.js +51 -0
  273. package/dist/llm/providers/endpoints/zhipu.js.map +1 -0
  274. package/dist/llm/providers/index.d.ts +5 -0
  275. package/dist/llm/providers/index.d.ts.map +1 -0
  276. package/dist/llm/providers/index.js +67 -0
  277. package/dist/llm/providers/index.js.map +1 -0
  278. package/dist/llm/providers/lookup.d.ts +16 -0
  279. package/dist/llm/providers/lookup.d.ts.map +1 -0
  280. package/dist/llm/providers/lookup.js +68 -0
  281. package/dist/llm/providers/lookup.js.map +1 -0
  282. package/dist/llm/providers/probe.d.ts +11 -0
  283. package/dist/llm/providers/probe.d.ts.map +1 -0
  284. package/dist/llm/providers/probe.js +24 -0
  285. package/dist/llm/providers/probe.js.map +1 -0
  286. package/dist/llm/providers/types.d.ts +71 -0
  287. package/dist/llm/providers/types.d.ts.map +1 -0
  288. package/dist/llm/providers/types.js +9 -0
  289. package/dist/llm/providers/types.js.map +1 -0
  290. package/dist/llm/providers/verify.d.ts +27 -0
  291. package/dist/llm/providers/verify.d.ts.map +1 -0
  292. package/dist/llm/providers/verify.js +77 -0
  293. package/dist/llm/providers/verify.js.map +1 -0
  294. package/dist/llm/secrets.d.ts.map +1 -1
  295. package/dist/llm/secrets.js +27 -2
  296. package/dist/llm/secrets.js.map +1 -1
  297. package/dist/llm/service-presets.d.ts +13 -3
  298. package/dist/llm/service-presets.d.ts.map +1 -1
  299. package/dist/llm/service-presets.js +78 -42
  300. package/dist/llm/service-presets.js.map +1 -1
  301. package/dist/llm/service-resolver.d.ts +1 -1
  302. package/dist/llm/service-resolver.d.ts.map +1 -1
  303. package/dist/llm/service-resolver.js +13 -0
  304. package/dist/llm/service-resolver.js.map +1 -1
  305. package/dist/models/book-rules.d.ts +23 -1
  306. package/dist/models/book-rules.d.ts.map +1 -1
  307. package/dist/models/book-rules.js +54 -2
  308. package/dist/models/book-rules.js.map +1 -1
  309. package/dist/models/input-governance.d.ts +20 -244
  310. package/dist/models/input-governance.d.ts.map +1 -1
  311. package/dist/models/input-governance.js +7 -51
  312. package/dist/models/input-governance.js.map +1 -1
  313. package/dist/models/project.d.ts +29 -28
  314. package/dist/models/project.d.ts.map +1 -1
  315. package/dist/models/project.js +11 -9
  316. package/dist/models/project.js.map +1 -1
  317. package/dist/models/runtime-state.d.ts +120 -0
  318. package/dist/models/runtime-state.d.ts.map +1 -1
  319. package/dist/models/runtime-state.js +12 -0
  320. package/dist/models/runtime-state.js.map +1 -1
  321. package/dist/pipeline/agent.d.ts.map +1 -1
  322. package/dist/pipeline/agent.js +59 -10
  323. package/dist/pipeline/agent.js.map +1 -1
  324. package/dist/pipeline/chapter-review-cycle.d.ts +11 -4
  325. package/dist/pipeline/chapter-review-cycle.d.ts.map +1 -1
  326. package/dist/pipeline/chapter-review-cycle.js +156 -73
  327. package/dist/pipeline/chapter-review-cycle.js.map +1 -1
  328. package/dist/pipeline/chapter-truth-validation.d.ts +2 -1
  329. package/dist/pipeline/chapter-truth-validation.d.ts.map +1 -1
  330. package/dist/pipeline/chapter-truth-validation.js +1 -1
  331. package/dist/pipeline/chapter-truth-validation.js.map +1 -1
  332. package/dist/pipeline/persisted-governed-plan.d.ts +1 -0
  333. package/dist/pipeline/persisted-governed-plan.d.ts.map +1 -1
  334. package/dist/pipeline/persisted-governed-plan.js +181 -66
  335. package/dist/pipeline/persisted-governed-plan.js.map +1 -1
  336. package/dist/pipeline/runner.d.ts +20 -17
  337. package/dist/pipeline/runner.d.ts.map +1 -1
  338. package/dist/pipeline/runner.js +359 -84
  339. package/dist/pipeline/runner.js.map +1 -1
  340. package/dist/state/manager.d.ts.map +1 -1
  341. package/dist/state/manager.js +44 -4
  342. package/dist/state/manager.js.map +1 -1
  343. package/dist/state/memory-db.d.ts +6 -0
  344. package/dist/state/memory-db.d.ts.map +1 -1
  345. package/dist/state/memory-db.js.map +1 -1
  346. package/dist/state/runtime-state-store.d.ts.map +1 -1
  347. package/dist/state/runtime-state-store.js +4 -1
  348. package/dist/state/runtime-state-store.js.map +1 -1
  349. package/dist/state/state-projections.d.ts +3 -1
  350. package/dist/state/state-projections.d.ts.map +1 -1
  351. package/dist/state/state-projections.js +58 -15
  352. package/dist/state/state-projections.js.map +1 -1
  353. package/dist/utils/book-id.d.ts +4 -0
  354. package/dist/utils/book-id.d.ts.map +1 -0
  355. package/dist/utils/book-id.js +27 -0
  356. package/dist/utils/book-id.js.map +1 -0
  357. package/dist/utils/chapter-cadence.js +1 -0
  358. package/dist/utils/chapter-cadence.js.map +1 -1
  359. package/dist/utils/chapter-memo-parser.d.ts +19 -0
  360. package/dist/utils/chapter-memo-parser.d.ts.map +1 -0
  361. package/dist/utils/chapter-memo-parser.js +114 -0
  362. package/dist/utils/chapter-memo-parser.js.map +1 -0
  363. package/dist/utils/config-loader.d.ts +7 -11
  364. package/dist/utils/config-loader.d.ts.map +1 -1
  365. package/dist/utils/config-loader.js +13 -253
  366. package/dist/utils/config-loader.js.map +1 -1
  367. package/dist/utils/context-assembly.d.ts +24 -0
  368. package/dist/utils/context-assembly.d.ts.map +1 -0
  369. package/dist/utils/context-assembly.js +77 -0
  370. package/dist/utils/context-assembly.js.map +1 -0
  371. package/dist/utils/effective-llm-config.d.ts +34 -0
  372. package/dist/utils/effective-llm-config.d.ts.map +1 -0
  373. package/dist/utils/effective-llm-config.js +417 -0
  374. package/dist/utils/effective-llm-config.js.map +1 -0
  375. package/dist/utils/governed-working-set.js +1 -1
  376. package/dist/utils/governed-working-set.js.map +1 -1
  377. package/dist/utils/hook-ledger-validator.d.ts +82 -0
  378. package/dist/utils/hook-ledger-validator.d.ts.map +1 -0
  379. package/dist/utils/hook-ledger-validator.js +225 -0
  380. package/dist/utils/hook-ledger-validator.js.map +1 -0
  381. package/dist/utils/hook-lifecycle.d.ts +5 -0
  382. package/dist/utils/hook-lifecycle.d.ts.map +1 -1
  383. package/dist/utils/hook-lifecycle.js +32 -0
  384. package/dist/utils/hook-lifecycle.js.map +1 -1
  385. package/dist/utils/hook-policy.d.ts +0 -17
  386. package/dist/utils/hook-policy.d.ts.map +1 -1
  387. package/dist/utils/hook-policy.js +0 -30
  388. package/dist/utils/hook-policy.js.map +1 -1
  389. package/dist/utils/hook-promotion.d.ts +83 -0
  390. package/dist/utils/hook-promotion.d.ts.map +1 -0
  391. package/dist/utils/hook-promotion.js +241 -0
  392. package/dist/utils/hook-promotion.js.map +1 -0
  393. package/dist/utils/hook-stale-detection.d.ts +51 -0
  394. package/dist/utils/hook-stale-detection.d.ts.map +1 -0
  395. package/dist/utils/hook-stale-detection.js +125 -0
  396. package/dist/utils/hook-stale-detection.js.map +1 -0
  397. package/dist/utils/llm-endpoint-auth.d.ts +5 -0
  398. package/dist/utils/llm-endpoint-auth.d.ts.map +1 -0
  399. package/dist/utils/llm-endpoint-auth.js +36 -0
  400. package/dist/utils/llm-endpoint-auth.js.map +1 -0
  401. package/dist/utils/llm-env.d.ts +14 -0
  402. package/dist/utils/llm-env.d.ts.map +1 -0
  403. package/dist/utils/llm-env.js +53 -0
  404. package/dist/utils/llm-env.js.map +1 -0
  405. package/dist/utils/memory-retrieval.d.ts +23 -1
  406. package/dist/utils/memory-retrieval.d.ts.map +1 -1
  407. package/dist/utils/memory-retrieval.js +45 -2
  408. package/dist/utils/memory-retrieval.js.map +1 -1
  409. package/dist/utils/narrative-control.d.ts +16 -0
  410. package/dist/utils/narrative-control.d.ts.map +1 -0
  411. package/dist/utils/narrative-control.js +131 -0
  412. package/dist/utils/narrative-control.js.map +1 -0
  413. package/dist/utils/path-safety.d.ts +2 -0
  414. package/dist/utils/path-safety.d.ts.map +1 -0
  415. package/dist/utils/path-safety.js +11 -0
  416. package/dist/utils/path-safety.js.map +1 -0
  417. package/dist/utils/planning-materials.d.ts +35 -0
  418. package/dist/utils/planning-materials.d.ts.map +1 -0
  419. package/dist/utils/planning-materials.js +123 -0
  420. package/dist/utils/planning-materials.js.map +1 -0
  421. package/dist/utils/proxy-fetch.d.ts +9 -0
  422. package/dist/utils/proxy-fetch.d.ts.map +1 -0
  423. package/dist/utils/proxy-fetch.js +31 -0
  424. package/dist/utils/proxy-fetch.js.map +1 -0
  425. package/dist/utils/runtime-writer.d.ts +14 -0
  426. package/dist/utils/runtime-writer.d.ts.map +1 -0
  427. package/dist/utils/runtime-writer.js +21 -0
  428. package/dist/utils/runtime-writer.js.map +1 -0
  429. package/dist/utils/spot-fix-patches.d.ts +7 -0
  430. package/dist/utils/spot-fix-patches.d.ts.map +1 -1
  431. package/dist/utils/spot-fix-patches.js +109 -36
  432. package/dist/utils/spot-fix-patches.js.map +1 -1
  433. package/dist/utils/story-markdown.d.ts.map +1 -1
  434. package/dist/utils/story-markdown.js +104 -6
  435. package/dist/utils/story-markdown.js.map +1 -1
  436. package/dist/utils/writing-methodology.d.ts +10 -0
  437. package/dist/utils/writing-methodology.d.ts.map +1 -0
  438. package/dist/utils/writing-methodology.js +163 -0
  439. package/dist/utils/writing-methodology.js.map +1 -0
  440. package/package.json +3 -2
  441. package/dist/utils/hook-agenda.d.ts +0 -21
  442. package/dist/utils/hook-agenda.d.ts.map +0 -1
  443. package/dist/utils/hook-agenda.js +0 -95
  444. package/dist/utils/hook-agenda.js.map +0 -1
@@ -1,319 +1,326 @@
1
- import { readFile, readdir, writeFile, mkdir } from "node:fs/promises";
1
+ import { readFile, readdir, mkdir } from "node:fs/promises";
2
2
  import { dirname, join } from "node:path";
3
- import yaml from "js-yaml";
4
3
  import { BaseAgent } from "./base.js";
5
- import { ChapterTraceSchema, ContextPackageSchema, RuleStackSchema, } from "../models/input-governance.js";
4
+ import { ContextPackageSchema, } from "../models/input-governance.js";
6
5
  import { parseChapterSummariesMarkdown, retrieveMemorySelection, } from "../utils/memory-retrieval.js";
6
+ import { buildGovernedRuleStack, buildGovernedTrace, } from "../utils/context-assembly.js";
7
+ import { writeGovernedRuntimeArtifacts } from "../utils/runtime-writer.js";
8
+ export async function composeGovernedChapter(input) {
9
+ const storyDir = join(input.bookDir, "story");
10
+ const runtimeDir = join(storyDir, "runtime");
11
+ await mkdir(runtimeDir, { recursive: true });
12
+ const selectedContext = await collectSelectedContext(storyDir, input.plan, input.book.language ?? "zh");
13
+ const contextPackage = ContextPackageSchema.parse({
14
+ chapter: input.chapterNumber,
15
+ selectedContext,
16
+ });
17
+ const ruleStack = buildGovernedRuleStack(input.plan, input.chapterNumber);
18
+ const trace = buildGovernedTrace({
19
+ chapterNumber: input.chapterNumber,
20
+ plan: input.plan,
21
+ contextPackage,
22
+ composerInputs: [input.plan.runtimePath],
23
+ });
24
+ const { contextPath, ruleStackPath, tracePath, } = await writeGovernedRuntimeArtifacts({
25
+ runtimeDir,
26
+ chapterNumber: input.chapterNumber,
27
+ contextPackage,
28
+ ruleStack,
29
+ trace,
30
+ });
31
+ return {
32
+ contextPackage,
33
+ ruleStack,
34
+ trace,
35
+ contextPath,
36
+ ruleStackPath,
37
+ tracePath,
38
+ };
39
+ }
7
40
  export class ComposerAgent extends BaseAgent {
8
41
  get name() {
9
42
  return "composer";
10
43
  }
11
44
  async composeChapter(input) {
12
- const storyDir = join(input.bookDir, "story");
13
- const runtimeDir = join(storyDir, "runtime");
14
- await mkdir(runtimeDir, { recursive: true });
15
- const selectedContext = await this.collectSelectedContext(storyDir, input.plan, input.book.language ?? "zh");
16
- const contextPackage = ContextPackageSchema.parse({
17
- chapter: input.chapterNumber,
18
- selectedContext,
19
- });
20
- const ruleStack = RuleStackSchema.parse({
21
- layers: [
22
- { id: "L1", name: "hard_facts", precedence: 100, scope: "global" },
23
- { id: "L2", name: "author_intent", precedence: 80, scope: "book" },
24
- { id: "L3", name: "planning", precedence: 60, scope: "arc" },
25
- { id: "L4", name: "current_task", precedence: 70, scope: "local" },
26
- ],
27
- sections: {
28
- hard: ["story_bible", "current_state", "book_rules"],
29
- soft: ["author_intent", "current_focus", "volume_outline"],
30
- diagnostic: ["anti_ai_checks", "continuity_audit", "style_regression_checks"],
31
- },
32
- overrideEdges: [
33
- { from: "L4", to: "L3", allowed: true, scope: "current_chapter" },
34
- { from: "L4", to: "L2", allowed: false, scope: "current_chapter" },
35
- { from: "L4", to: "L1", allowed: false, scope: "current_chapter" },
36
- ],
37
- activeOverrides: input.plan.intent.conflicts.map((conflict) => ({
38
- from: "L4",
39
- to: "L3",
40
- target: input.plan.intent.outlineNode ?? `chapter_${input.chapterNumber}`,
41
- reason: conflict.resolution,
42
- })),
43
- });
44
- const trace = ChapterTraceSchema.parse({
45
- chapter: input.chapterNumber,
46
- plannerInputs: input.plan.plannerInputs,
47
- composerInputs: [input.plan.runtimePath],
48
- selectedSources: contextPackage.selectedContext.map((entry) => entry.source),
49
- notes: input.plan.intent.conflicts.map((conflict) => conflict.resolution),
45
+ return composeGovernedChapter(input);
46
+ }
47
+ }
48
+ async function collectSelectedContext(storyDir, plan, language) {
49
+ const retrievalHints = deriveRetrievalHints(plan);
50
+ const memoBodyExcerpt = plan.memo.body.trim();
51
+ const chapterMemoEntry = memoBodyExcerpt.length > 0
52
+ ? [{
53
+ source: "runtime/chapter_memo",
54
+ reason: "Carry the planner's chapter memo into governed writing.",
55
+ excerpt: [
56
+ `goal=${plan.memo.goal}`,
57
+ plan.memo.isGoldenOpening ? "golden-opening=true" : undefined,
58
+ memoBodyExcerpt,
59
+ ].filter(Boolean).join(" | "),
60
+ }]
61
+ : [{
62
+ source: "runtime/chapter_memo",
63
+ reason: "Carry the planner's chapter memo into governed writing.",
64
+ excerpt: `goal=${plan.memo.goal}`,
65
+ }];
66
+ const entries = await Promise.all([
67
+ maybeContextSource(storyDir, "current_focus.md", "Current task focus for this chapter."),
68
+ maybeContextSource(storyDir, "audit_drift.md", "Carry forward audit drift guidance from the previous chapter without polluting hard state facts."),
69
+ maybeContextSource(storyDir, "current_state.md", "Preserve hard state facts referenced by the active chapter brief or hard constraints.", retrievalHints),
70
+ maybeContextSource(storyDir, "outline/story_frame.md", "Preserve canon constraints referenced by the active chapter brief or hard constraints.", retrievalHints),
71
+ maybeContextSource(storyDir, "outline/volume_map.md", "Anchor the default planning node for this chapter.", plan.intent.outlineNode ? [plan.intent.outlineNode] : []),
72
+ maybeContextSource(storyDir, "parent_canon.md", "Preserve parent canon constraints for governed continuation or fanfic writing."),
73
+ maybeContextSource(storyDir, "fanfic_canon.md", "Preserve extracted fanfic canon constraints for governed writing."),
74
+ ]);
75
+ const trailEntries = await buildRecentChapterTrailEntries(storyDir, plan.intent.chapter);
76
+ const memorySelection = await retrieveMemorySelection({
77
+ bookDir: dirname(storyDir),
78
+ chapterNumber: plan.intent.chapter,
79
+ goal: plan.intent.goal,
80
+ outlineNode: plan.intent.outlineNode,
81
+ mustKeep: retrievalHints,
82
+ });
83
+ const hookDebtEntries = await buildHookDebtEntries(storyDir, plan, memorySelection.activeHooks, language);
84
+ const summaryEntries = memorySelection.summaries.map((summary) => ({
85
+ source: `story/chapter_summaries.md#${summary.chapter}`,
86
+ reason: "Relevant episodic memory retrieved for the current chapter goal.",
87
+ excerpt: [summary.title, summary.events, summary.stateChanges, summary.hookActivity]
88
+ .filter(Boolean)
89
+ .join(" | "),
90
+ }));
91
+ const factEntries = memorySelection.facts.map((fact) => ({
92
+ source: `story/current_state.md#${toFactAnchor(fact.predicate)}`,
93
+ reason: "Relevant current-state fact retrieved for the current chapter goal.",
94
+ excerpt: `${fact.predicate} | ${fact.object}`,
95
+ }));
96
+ const hookEntries = memorySelection.hooks.map((hook) => ({
97
+ source: `story/pending_hooks.md#${hook.hookId}`,
98
+ reason: "Carry forward unresolved hooks that match the chapter focus.",
99
+ excerpt: [hook.type, hook.status, hook.expectedPayoff, hook.payoffTiming, hook.notes]
100
+ .filter(Boolean)
101
+ .join(" | "),
102
+ }));
103
+ const volumeSummaryEntries = memorySelection.volumeSummaries.map((summary) => ({
104
+ source: `story/volume_summaries.md#${summary.anchor}`,
105
+ reason: "Carry forward long-span arc memory compressed from earlier volumes.",
106
+ excerpt: `${summary.heading} | ${summary.content}`,
107
+ }));
108
+ return [
109
+ ...chapterMemoEntry,
110
+ ...entries.filter((entry) => entry !== null),
111
+ ...trailEntries,
112
+ ...hookDebtEntries,
113
+ ...factEntries,
114
+ ...summaryEntries,
115
+ ...volumeSummaryEntries,
116
+ ...hookEntries,
117
+ ];
118
+ }
119
+ function deriveRetrievalHints(plan) {
120
+ return [
121
+ plan.intent.goal,
122
+ plan.intent.outlineNode,
123
+ ...plan.memo.threadRefs,
124
+ ].filter((value) => Boolean(value));
125
+ }
126
+ async function buildRecentChapterTrailEntries(storyDir, chapterNumber) {
127
+ const content = await readFileOrDefault(join(storyDir, "chapter_summaries.md"));
128
+ if (!content || content === "(文件尚未创建)") {
129
+ return [];
130
+ }
131
+ const recentSummaries = parseChapterSummariesMarkdown(content)
132
+ .filter((summary) => summary.chapter < chapterNumber)
133
+ .sort((left, right) => right.chapter - left.chapter)
134
+ .slice(0, 5);
135
+ if (recentSummaries.length === 0) {
136
+ return [];
137
+ }
138
+ const entries = [];
139
+ const recentTitles = recentSummaries
140
+ .map((summary) => [summary.chapter, summary.title].filter(Boolean).join(": "))
141
+ .filter(Boolean)
142
+ .join(" | ");
143
+ if (recentTitles) {
144
+ entries.push({
145
+ source: "story/chapter_summaries.md#recent_titles",
146
+ reason: "Keep recent title history visible to avoid repetitive chapter naming.",
147
+ excerpt: recentTitles,
50
148
  });
51
- const chapterSlug = `chapter-${String(input.chapterNumber).padStart(4, "0")}`;
52
- const contextPath = join(runtimeDir, `${chapterSlug}.context.json`);
53
- const ruleStackPath = join(runtimeDir, `${chapterSlug}.rule-stack.yaml`);
54
- const tracePath = join(runtimeDir, `${chapterSlug}.trace.json`);
55
- await Promise.all([
56
- writeFile(contextPath, JSON.stringify(contextPackage, null, 2), "utf-8"),
57
- writeFile(ruleStackPath, yaml.dump(ruleStack, { lineWidth: 120 }), "utf-8"),
58
- writeFile(tracePath, JSON.stringify(trace, null, 2), "utf-8"),
59
- ]);
60
- return {
61
- contextPackage,
62
- ruleStack,
63
- trace,
64
- contextPath,
65
- ruleStackPath,
66
- tracePath,
67
- };
68
149
  }
69
- async collectSelectedContext(storyDir, plan, language) {
70
- const entries = await Promise.all([
71
- this.maybeContextSource(storyDir, "current_focus.md", "Current task focus for this chapter."),
72
- this.maybeContextSource(storyDir, "audit_drift.md", "Carry forward audit drift guidance from the previous chapter without polluting hard state facts."),
73
- this.maybeContextSource(storyDir, "current_state.md", "Preserve hard state facts referenced by mustKeep.", plan.intent.mustKeep),
74
- this.maybeContextSource(storyDir, "story_bible.md", "Preserve canon constraints referenced by mustKeep.", plan.intent.mustKeep),
75
- this.maybeContextSource(storyDir, "volume_outline.md", "Anchor the default planning node for this chapter.", plan.intent.outlineNode ? [plan.intent.outlineNode] : []),
76
- this.maybeContextSource(storyDir, "parent_canon.md", "Preserve parent canon constraints for governed continuation or fanfic writing."),
77
- this.maybeContextSource(storyDir, "fanfic_canon.md", "Preserve extracted fanfic canon constraints for governed writing."),
78
- ]);
79
- const trailEntries = await this.buildRecentChapterTrailEntries(storyDir, plan.intent.chapter);
80
- const planningAnchor = plan.intent.conflicts.length > 0 ? undefined : plan.intent.outlineNode;
81
- const memorySelection = await retrieveMemorySelection({
82
- bookDir: dirname(storyDir),
83
- chapterNumber: plan.intent.chapter,
84
- goal: plan.intent.goal,
85
- outlineNode: planningAnchor,
86
- mustKeep: plan.intent.mustKeep,
150
+ const moodTrail = recentSummaries
151
+ .filter((summary) => summary.mood || summary.chapterType)
152
+ .map((summary) => `${summary.chapter}: ${summary.mood || "(none)"} / ${summary.chapterType || "(none)"}`)
153
+ .join(" | ");
154
+ if (moodTrail) {
155
+ entries.push({
156
+ source: "story/chapter_summaries.md#recent_mood_type_trail",
157
+ reason: "Keep recent mood and chapter-type cadence visible before writing the next chapter.",
158
+ excerpt: moodTrail,
87
159
  });
88
- const hookDebtEntries = await this.buildHookDebtEntries(storyDir, plan, memorySelection.activeHooks, language);
89
- const summaryEntries = memorySelection.summaries.map((summary) => ({
90
- source: `story/chapter_summaries.md#${summary.chapter}`,
91
- reason: "Relevant episodic memory retrieved for the current chapter goal.",
92
- excerpt: [summary.title, summary.events, summary.stateChanges, summary.hookActivity]
93
- .filter(Boolean)
94
- .join(" | "),
95
- }));
96
- const factEntries = memorySelection.facts.map((fact) => ({
97
- source: `story/current_state.md#${this.toFactAnchor(fact.predicate)}`,
98
- reason: "Relevant current-state fact retrieved for the current chapter goal.",
99
- excerpt: `${fact.predicate} | ${fact.object}`,
100
- }));
101
- const hookEntries = memorySelection.hooks.map((hook) => ({
102
- source: `story/pending_hooks.md#${hook.hookId}`,
103
- reason: "Carry forward unresolved hooks that match the chapter focus.",
104
- excerpt: [hook.type, hook.status, hook.expectedPayoff, hook.payoffTiming, hook.notes]
105
- .filter(Boolean)
106
- .join(" | "),
107
- }));
108
- const volumeSummaryEntries = memorySelection.volumeSummaries.map((summary) => ({
109
- source: `story/volume_summaries.md#${summary.anchor}`,
110
- reason: "Carry forward long-span arc memory compressed from earlier volumes.",
111
- excerpt: `${summary.heading} | ${summary.content}`,
112
- }));
113
- return [
114
- ...entries.filter((entry) => entry !== null),
115
- ...trailEntries,
116
- ...hookDebtEntries,
117
- ...factEntries,
118
- ...summaryEntries,
119
- ...volumeSummaryEntries,
120
- ...hookEntries,
121
- ];
122
160
  }
123
- async buildRecentChapterTrailEntries(storyDir, chapterNumber) {
124
- const content = await this.readFileOrDefault(join(storyDir, "chapter_summaries.md"));
125
- if (!content || content === "(文件尚未创建)") {
126
- return [];
127
- }
128
- const recentSummaries = parseChapterSummariesMarkdown(content)
129
- .filter((summary) => summary.chapter < chapterNumber)
130
- .sort((left, right) => right.chapter - left.chapter)
131
- .slice(0, 5);
132
- if (recentSummaries.length === 0) {
133
- return [];
134
- }
135
- const entries = [];
136
- const recentTitles = recentSummaries
137
- .map((summary) => [summary.chapter, summary.title].filter(Boolean).join(": "))
138
- .filter(Boolean)
139
- .join(" | ");
140
- if (recentTitles) {
141
- entries.push({
142
- source: "story/chapter_summaries.md#recent_titles",
143
- reason: "Keep recent title history visible to avoid repetitive chapter naming.",
144
- excerpt: recentTitles,
145
- });
146
- }
147
- const moodTrail = recentSummaries
148
- .filter((summary) => summary.mood || summary.chapterType)
149
- .map((summary) => `${summary.chapter}: ${summary.mood || "(none)"} / ${summary.chapterType || "(none)"}`)
150
- .join(" | ");
151
- if (moodTrail) {
152
- entries.push({
153
- source: "story/chapter_summaries.md#recent_mood_type_trail",
154
- reason: "Keep recent mood and chapter-type cadence visible before writing the next chapter.",
155
- excerpt: moodTrail,
156
- });
157
- }
158
- const endingTrail = await this.buildRecentEndingTrail(storyDir, chapterNumber);
159
- if (endingTrail) {
160
- entries.push({
161
- source: "story/chapters#recent_endings",
162
- reason: "Show how recent chapters ended so the writer avoids structural repetition (e.g. 3 consecutive collapse endings).",
163
- excerpt: endingTrail,
164
- });
165
- }
166
- return entries;
161
+ const endingTrail = await buildRecentEndingTrail(storyDir, chapterNumber);
162
+ if (endingTrail) {
163
+ entries.push({
164
+ source: "story/chapters#recent_endings",
165
+ reason: "Show how recent chapters ended so the writer avoids structural repetition (e.g. 3 consecutive collapse endings).",
166
+ excerpt: endingTrail,
167
+ });
167
168
  }
168
- async buildRecentEndingTrail(storyDir, chapterNumber) {
169
- const chaptersDir = join(dirname(storyDir), "chapters");
170
- try {
171
- const files = await readdir(chaptersDir);
172
- const chapterFiles = files
173
- .filter((file) => file.endsWith(".md"))
174
- .map((file) => ({ file, num: parseInt(file.slice(0, 4), 10) }))
175
- .filter((entry) => Number.isFinite(entry.num) && entry.num < chapterNumber)
176
- .sort((a, b) => b.num - a.num)
177
- .slice(0, 3);
178
- const endings = [];
179
- for (const entry of chapterFiles.reverse()) {
180
- const content = await readFile(join(chaptersDir, entry.file), "utf-8");
181
- const lastLine = this.extractLastMeaningfulSentence(content);
182
- if (lastLine) {
183
- endings.push(`ch${entry.num}: ${lastLine}`);
184
- }
169
+ return entries;
170
+ }
171
+ async function buildRecentEndingTrail(storyDir, chapterNumber) {
172
+ const chaptersDir = join(dirname(storyDir), "chapters");
173
+ try {
174
+ const files = await readdir(chaptersDir);
175
+ const chapterFiles = files
176
+ .filter((file) => file.endsWith(".md"))
177
+ .map((file) => ({ file, num: parseInt(file.slice(0, 4), 10) }))
178
+ .filter((entry) => Number.isFinite(entry.num) && entry.num < chapterNumber)
179
+ .sort((a, b) => b.num - a.num)
180
+ .slice(0, 3);
181
+ const endings = [];
182
+ for (const entry of chapterFiles.reverse()) {
183
+ const content = await readFile(join(chaptersDir, entry.file), "utf-8");
184
+ const lastLine = extractLastMeaningfulSentence(content);
185
+ if (lastLine) {
186
+ endings.push(`ch${entry.num}: ${lastLine}`);
185
187
  }
186
- return endings.length >= 2 ? endings.join(" | ") : undefined;
187
- }
188
- catch {
189
- return undefined;
190
188
  }
189
+ return endings.length >= 2 ? endings.join(" | ") : undefined;
191
190
  }
192
- extractLastMeaningfulSentence(content) {
193
- const lines = content.split("\n").map((line) => line.trim()).filter((line) => line.length > 5 && !line.startsWith("#") && !line.startsWith("|") && !line.startsWith("==="));
194
- const last = lines.at(-1);
195
- if (!last)
196
- return undefined;
197
- return last.length > 60 ? last.slice(0, 57) + "..." : last;
191
+ catch {
192
+ return undefined;
198
193
  }
199
- async buildHookDebtEntries(storyDir, plan, activeHooks, language) {
200
- const targetHookIds = [
201
- ...new Set([
202
- ...plan.intent.hookAgenda.pressureMap.map((entry) => entry.hookId),
203
- ...plan.intent.hookAgenda.eligibleResolve,
204
- ...plan.intent.hookAgenda.mustAdvance,
205
- ...plan.intent.hookAgenda.staleDebt,
206
- ]),
207
- ];
208
- if (targetHookIds.length === 0) {
194
+ }
195
+ function extractLastMeaningfulSentence(content) {
196
+ const lines = content.split("\n").map((line) => line.trim()).filter((line) => line.length > 5 && !line.startsWith("#") && !line.startsWith("|") && !line.startsWith("==="));
197
+ const last = lines.at(-1);
198
+ if (!last)
199
+ return undefined;
200
+ return last.length > 60 ? last.slice(0, 57) + "..." : last;
201
+ }
202
+ async function buildHookDebtEntries(storyDir, plan, activeHooks, language) {
203
+ const targetHookIds = [...new Set(plan.memo.threadRefs)];
204
+ if (targetHookIds.length === 0) {
205
+ return [];
206
+ }
207
+ const summaries = parseChapterSummariesMarkdown(await readFileOrDefault(join(storyDir, "chapter_summaries.md")));
208
+ return targetHookIds.flatMap((hookId) => {
209
+ const hook = activeHooks.find((entry) => entry.hookId === hookId);
210
+ if (!hook) {
209
211
  return [];
210
212
  }
211
- const summaries = parseChapterSummariesMarkdown(await this.readFileOrDefault(join(storyDir, "chapter_summaries.md")));
212
- return targetHookIds.flatMap((hookId) => {
213
- const hook = activeHooks.find((entry) => entry.hookId === hookId);
214
- if (!hook) {
215
- return [];
213
+ const seedSummary = findHookSummary(summaries, hook.hookId, hook.startChapter, "seed");
214
+ const latestSummary = findHookSummary(summaries, hook.hookId, hook.lastAdvancedChapter, "latest");
215
+ const role = language === "en" ? "memo-referenced debt" : "备忘引用旧债";
216
+ const promise = hook.expectedPayoff || (language === "en" ? "(unspecified)" : "(未写明)");
217
+ const seedBeat = seedSummary
218
+ ? renderHookDebtBeat(seedSummary)
219
+ : (hook.notes || promise);
220
+ const latestBeat = latestSummary && latestSummary !== seedSummary
221
+ ? renderHookDebtBeat(latestSummary)
222
+ : undefined;
223
+ const age = Math.max(0, plan.intent.chapter - Math.max(1, hook.startChapter));
224
+ return [{
225
+ source: `runtime/hook_debt#${hook.hookId}`,
226
+ reason: language === "en"
227
+ ? "Narrative debt brief with original seed text for this hook agenda target."
228
+ : "含原始种子文本的叙事债务简报。",
229
+ excerpt: language === "en"
230
+ ? [
231
+ `${hook.hookId} (${hook.type}, ${role}, open ${age} chapters)`,
232
+ `reader promise: ${promise}`,
233
+ `original seed (ch${hook.startChapter}): ${seedBeat}`,
234
+ latestBeat ? `latest turn (ch${hook.lastAdvancedChapter}): ${latestBeat}` : undefined,
235
+ ].filter(Boolean).join(" | ")
236
+ : [
237
+ `${hook.hookId}(${hook.type},${role},已开${age}章)`,
238
+ `读者承诺:${promise}`,
239
+ `种于第${hook.startChapter}章:${seedBeat}`,
240
+ latestBeat ? `推进于第${hook.lastAdvancedChapter}章:${latestBeat}` : undefined,
241
+ ].filter(Boolean).join(" | "),
242
+ }];
243
+ });
244
+ }
245
+ async function maybeContextSource(storyDir, fileName, reason, preferredExcerpts = []) {
246
+ const path = join(storyDir, fileName);
247
+ let content = await readFileOrDefault(path);
248
+ let resolvedFileName = fileName;
249
+ if ((!content || content === "(文件尚未创建)")) {
250
+ // Phase 5 back-compat: the new outline/ files may be absent on legacy
251
+ // books. Fall back to the deprecated paths transparently.
252
+ const legacyFallback = outlineFallback(fileName);
253
+ if (legacyFallback) {
254
+ const legacyPath = join(storyDir, legacyFallback);
255
+ const legacyContent = await readFileOrDefault(legacyPath);
256
+ if (legacyContent && legacyContent !== "(文件尚未创建)") {
257
+ content = legacyContent;
258
+ resolvedFileName = legacyFallback;
216
259
  }
217
- const seedSummary = this.findHookSummary(summaries, hook.hookId, hook.startChapter, "seed");
218
- const latestSummary = this.findHookSummary(summaries, hook.hookId, hook.lastAdvancedChapter, "latest");
219
- const role = this.describeHookAgendaRole(plan, hook.hookId, language);
220
- const promise = hook.expectedPayoff || (language === "en" ? "(unspecified)" : "(未写明)");
221
- const seedBeat = seedSummary
222
- ? this.renderHookDebtBeat(seedSummary)
223
- : (hook.notes || promise);
224
- const latestBeat = latestSummary && latestSummary !== seedSummary
225
- ? this.renderHookDebtBeat(latestSummary)
226
- : undefined;
227
- const age = Math.max(0, plan.intent.chapter - Math.max(1, hook.startChapter));
228
- return [{
229
- source: `runtime/hook_debt#${hook.hookId}`,
230
- reason: language === "en"
231
- ? "Narrative debt brief with original seed text for this hook agenda target."
232
- : "含原始种子文本的叙事债务简报。",
233
- excerpt: language === "en"
234
- ? [
235
- `${hook.hookId} (${hook.type}, ${role}, open ${age} chapters)`,
236
- `reader promise: ${promise}`,
237
- `original seed (ch${hook.startChapter}): ${seedBeat}`,
238
- latestBeat ? `latest turn (ch${hook.lastAdvancedChapter}): ${latestBeat}` : undefined,
239
- ].filter(Boolean).join(" | ")
240
- : [
241
- `${hook.hookId}(${hook.type},${role},已开${age}章)`,
242
- `读者承诺:${promise}`,
243
- `种于第${hook.startChapter}章:${seedBeat}`,
244
- latestBeat ? `推进于第${hook.lastAdvancedChapter}章:${latestBeat}` : undefined,
245
- ].filter(Boolean).join(" | "),
246
- }];
247
- });
248
- }
249
- async maybeContextSource(storyDir, fileName, reason, preferredExcerpts = []) {
250
- const path = join(storyDir, fileName);
251
- const content = await this.readFileOrDefault(path);
252
- if (!content || content === "(文件尚未创建)")
253
- return null;
254
- return {
255
- source: `story/${fileName}`,
256
- reason,
257
- excerpt: this.pickExcerpt(content, preferredExcerpts),
258
- };
259
- }
260
- pickExcerpt(content, preferredExcerpts) {
261
- for (const preferred of preferredExcerpts) {
262
- if (preferred && content.includes(preferred))
263
- return preferred;
264
260
  }
265
- return content
266
- .split("\n")
267
- .map((line) => line.trim())
268
- .find((line) => line.length > 0 && !line.startsWith("#"));
269
261
  }
270
- toFactAnchor(predicate) {
271
- return predicate
272
- .trim()
273
- .toLowerCase()
274
- .replace(/[^a-z0-9\u4e00-\u9fff]+/g, "-")
275
- .replace(/^-+|-+$/g, "")
276
- || "fact";
262
+ if (!content || content === "(文件尚未创建)")
263
+ return null;
264
+ return {
265
+ source: `story/${resolvedFileName}`,
266
+ reason,
267
+ excerpt: pickExcerpt(content, preferredExcerpts),
268
+ };
269
+ }
270
+ function outlineFallback(fileName) {
271
+ if (fileName === "outline/story_frame.md")
272
+ return "story_bible.md";
273
+ if (fileName === "outline/volume_map.md")
274
+ return "volume_outline.md";
275
+ return null;
276
+ }
277
+ function pickExcerpt(content, preferredExcerpts) {
278
+ for (const preferred of preferredExcerpts) {
279
+ if (preferred && content.includes(preferred))
280
+ return preferred;
277
281
  }
278
- async readFileOrDefault(path) {
279
- try {
280
- return await readFile(path, "utf-8");
281
- }
282
- catch {
283
- return "(文件尚未创建)";
284
- }
282
+ return content
283
+ .split("\n")
284
+ .map((line) => line.trim())
285
+ .find((line) => line.length > 0 && !line.startsWith("#"));
286
+ }
287
+ function toFactAnchor(predicate) {
288
+ return predicate
289
+ .trim()
290
+ .toLowerCase()
291
+ .replace(/[^a-z0-9\u4e00-\u9fff]+/g, "-")
292
+ .replace(/^-+|-+$/g, "")
293
+ || "fact";
294
+ }
295
+ async function readFileOrDefault(path) {
296
+ try {
297
+ return await readFile(path, "utf-8");
285
298
  }
286
- describeHookAgendaRole(plan, hookId, language) {
287
- if (plan.intent.hookAgenda.eligibleResolve.includes(hookId)) {
288
- return language === "en" ? "payoff-ready debt" : "可兑现旧债";
289
- }
290
- if (plan.intent.hookAgenda.staleDebt.includes(hookId)) {
291
- return language === "en" ? "high-pressure debt" : "高压旧债";
292
- }
293
- return language === "en" ? "mainline debt" : "主要旧债";
299
+ catch {
300
+ return "(文件尚未创建)";
294
301
  }
295
- findHookSummary(summaries, hookId, chapter, mode) {
296
- const directChapterHit = summaries.find((summary) => summary.chapter === chapter);
297
- const hookMentions = summaries.filter((summary) => this.summaryMentionsHook(summary, hookId));
298
- if (mode === "seed") {
299
- return hookMentions.find((summary) => summary.chapter === chapter)
300
- ?? hookMentions.at(0)
301
- ?? directChapterHit;
302
- }
303
- return [...hookMentions].reverse().find((summary) => summary.chapter === chapter)
304
- ?? hookMentions.at(-1)
302
+ }
303
+ function findHookSummary(summaries, hookId, chapter, mode) {
304
+ const directChapterHit = summaries.find((summary) => summary.chapter === chapter);
305
+ const hookMentions = summaries.filter((summary) => summaryMentionsHook(summary, hookId));
306
+ if (mode === "seed") {
307
+ return hookMentions.find((summary) => summary.chapter === chapter)
308
+ ?? hookMentions.at(0)
305
309
  ?? directChapterHit;
306
310
  }
307
- summaryMentionsHook(summary, hookId) {
308
- return [
309
- summary.title,
310
- summary.events,
311
- summary.stateChanges,
312
- summary.hookActivity,
313
- ].some((text) => text.includes(hookId));
314
- }
315
- renderHookDebtBeat(summary) {
316
- return `ch${summary.chapter} ${summary.title} - ${summary.events || summary.hookActivity || summary.stateChanges || "(none)"}`;
317
- }
311
+ return [...hookMentions].reverse().find((summary) => summary.chapter === chapter)
312
+ ?? hookMentions.at(-1)
313
+ ?? directChapterHit;
314
+ }
315
+ function summaryMentionsHook(summary, hookId) {
316
+ return [
317
+ summary.title,
318
+ summary.events,
319
+ summary.stateChanges,
320
+ summary.hookActivity,
321
+ ].some((text) => text.includes(hookId));
322
+ }
323
+ function renderHookDebtBeat(summary) {
324
+ return `ch${summary.chapter} ${summary.title} - ${summary.events || summary.hookActivity || summary.stateChanges || "(none)"}`;
318
325
  }
319
326
  //# sourceMappingURL=composer.js.map