@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
@@ -0,0 +1,241 @@
1
+ /**
2
+ * Phase 7 — hook promotion rules.
3
+ *
4
+ * Architect produces a pool of hook seeds (every row in the initial
5
+ * pending_hooks table is conceptually a seed). Not every seed belongs in
6
+ * the live `pending_hooks.md` ledger — pushing all of them there turns the
7
+ * ledger into noise within a few chapters.
8
+ *
9
+ * A seed is *promoted* into the ledger when any of these four conditions
10
+ * holds. The consolidator (maintains pending_hooks.md post-chapter) calls
11
+ * `shouldPromoteHook` for every tracked seed, and the ledger retains only
12
+ * the hooks that cross the threshold.
13
+ *
14
+ * 1. cross_volume — the hook spans volume boundaries. It either pays off
15
+ * in a later volume, or depends on hooks declared in a later volume.
16
+ * 2. advanced_count >= 2 — the hook has been advanced/pushed in two or
17
+ * more chapters since planting, proving readers already track it.
18
+ * 3. depends_on non-empty — the hook has upstream causal dependencies
19
+ * worth tracking, even if it hasn't been touched recently.
20
+ * 4. core_hook === true — architect marked this hook as main-line
21
+ * load-bearing; it always belongs in the ledger.
22
+ */
23
+ export function shouldPromoteHook(hook, context) {
24
+ const reasons = [];
25
+ if (hook.coreHook === true) {
26
+ reasons.push("core_hook");
27
+ }
28
+ if ((hook.dependsOn?.length ?? 0) > 0) {
29
+ reasons.push("depends_on");
30
+ }
31
+ const advancedCount = hook.advancedCount
32
+ ?? context.advancedCounts.get(hook.hookId)
33
+ ?? 0;
34
+ if (advancedCount >= 2) {
35
+ reasons.push("advanced_count");
36
+ }
37
+ if (isCrossVolume(hook, context)) {
38
+ reasons.push("cross_volume");
39
+ }
40
+ return {
41
+ promote: reasons.length > 0,
42
+ reasons,
43
+ };
44
+ }
45
+ function isCrossVolume(hook, context) {
46
+ const { volumeBoundaries, allSeedStartChapters } = context;
47
+ if (volumeBoundaries.length < 2)
48
+ return false;
49
+ const seedVolumeIndex = findVolumeIndex(volumeBoundaries, hook.startChapter);
50
+ if (seedVolumeIndex < 0)
51
+ return false;
52
+ // Case A: upstream hook is declared in a later volume than this seed.
53
+ for (const upstreamId of hook.dependsOn ?? []) {
54
+ const upstreamStart = allSeedStartChapters.get(upstreamId);
55
+ if (upstreamStart === undefined)
56
+ continue;
57
+ const upstreamVolumeIndex = findVolumeIndex(volumeBoundaries, upstreamStart);
58
+ if (upstreamVolumeIndex > seedVolumeIndex)
59
+ return true;
60
+ }
61
+ // Case B: pays_off_in_arc mentions a different volume. We stay prose-friendly
62
+ // and only detect obvious "第 N 卷" / "volume N" tokens. When parsing fails
63
+ // we fall back to payoff timing heuristics.
64
+ const arcVolumeIndex = extractVolumeIndexFromArc(hook.paysOffInArc ?? "");
65
+ if (arcVolumeIndex !== null && arcVolumeIndex !== seedVolumeIndex) {
66
+ return true;
67
+ }
68
+ // Case C: payoff timing marks it as endgame / slow-burn while the hook is
69
+ // planted in an early volume — that alone qualifies as cross-volume.
70
+ if ((hook.payoffTiming === "endgame" || hook.payoffTiming === "slow-burn")
71
+ && seedVolumeIndex < volumeBoundaries.length - 1) {
72
+ return true;
73
+ }
74
+ return false;
75
+ }
76
+ function findVolumeIndex(boundaries, chapter) {
77
+ for (let i = 0; i < boundaries.length; i++) {
78
+ const vol = boundaries[i];
79
+ if (chapter >= vol.startCh && chapter <= vol.endCh)
80
+ return i;
81
+ }
82
+ // Chapter 0 (seed time) counts as volume 0 if volumes start at 1.
83
+ if (chapter <= 0 && boundaries.length > 0)
84
+ return 0;
85
+ return -1;
86
+ }
87
+ const VOLUME_PATTERNS = [
88
+ /第\s*([一二三四五六七八九十百千\d]+)\s*卷/u,
89
+ /volume\s+(\d+)/i,
90
+ /vol\.?\s*(\d+)/i,
91
+ ];
92
+ function extractVolumeIndexFromArc(arc) {
93
+ const trimmed = arc.trim();
94
+ if (!trimmed)
95
+ return null;
96
+ for (const pattern of VOLUME_PATTERNS) {
97
+ const match = trimmed.match(pattern);
98
+ if (!match)
99
+ continue;
100
+ const token = match[1] ?? "";
101
+ const n = parseVolumeNumber(token);
102
+ if (n !== null)
103
+ return n - 1; // 1-indexed in prose, 0-indexed here.
104
+ }
105
+ return null;
106
+ }
107
+ const CHINESE_NUMERALS = {
108
+ 一: 1, 二: 2, 三: 3, 四: 4, 五: 5,
109
+ 六: 6, 七: 7, 八: 8, 九: 9, 十: 10,
110
+ };
111
+ function parseVolumeNumber(token) {
112
+ if (/^\d+$/.test(token))
113
+ return parseInt(token, 10);
114
+ if (token.length === 1 && CHINESE_NUMERALS[token])
115
+ return CHINESE_NUMERALS[token];
116
+ if (token === "十")
117
+ return 10;
118
+ return null;
119
+ }
120
+ /**
121
+ * Derive the default half-life (in chapters) for a hook that did not set it
122
+ * explicitly. Mirrors the prompt defaults: immediate/near-term = 10,
123
+ * mid-arc = 30, slow-burn/endgame = 80. Unknown timing falls to mid-arc.
124
+ */
125
+ export function defaultHalfLifeChapters(payoffTiming) {
126
+ switch (payoffTiming) {
127
+ case "immediate":
128
+ case "near-term":
129
+ return 10;
130
+ case "slow-burn":
131
+ case "endgame":
132
+ return 80;
133
+ case "mid-arc":
134
+ default:
135
+ return 30;
136
+ }
137
+ }
138
+ export function resolveHalfLifeChapters(hook) {
139
+ return hook.halfLifeChapters ?? defaultHalfLifeChapters(hook.payoffTiming);
140
+ }
141
+ // ---------------------------------------------------------------------------
142
+ // Shared advanced_count promotion pass (used by both consolidator and runner)
143
+ // ---------------------------------------------------------------------------
144
+ /**
145
+ * Escape special regex characters in a string so it can be used as a
146
+ * literal pattern inside `new RegExp(...)`.
147
+ */
148
+ export function escapeRegex(s) {
149
+ return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
150
+ }
151
+ /**
152
+ * Derive hook advancement counts from chapter_summaries.md content.
153
+ *
154
+ * Counts how many chapter-summary data rows mention each hook id in the
155
+ * hookActivity column (index 5, 0-based — "伏笔动态" / "hookActivity").
156
+ */
157
+ export function deriveAdvancedCountsFromSummaries(summariesRaw, hookIds) {
158
+ const counts = new Map();
159
+ if (!summariesRaw.trim() || hookIds.length === 0)
160
+ return counts;
161
+ const lines = summariesRaw.split("\n");
162
+ // Detect hookActivity column index from the header row.
163
+ const hookActivityIndex = detectHookActivityColumnIndex(lines);
164
+ for (const hookId of hookIds) {
165
+ const escaped = escapeRegex(hookId);
166
+ const pattern = new RegExp(`\\b${escaped}\\b`, "i");
167
+ let count = 0;
168
+ for (const line of lines) {
169
+ if (!line.startsWith("|"))
170
+ continue;
171
+ // Skip header / separator rows.
172
+ if (line.includes("---") || /\|\s*(章节|Chapter)\s*\|/i.test(line))
173
+ continue;
174
+ // Only match in the hookActivity column, not the full row.
175
+ const cell = extractColumn(line, hookActivityIndex);
176
+ if (cell !== null && pattern.test(cell))
177
+ count += 1;
178
+ }
179
+ if (count > 0)
180
+ counts.set(hookId, count);
181
+ }
182
+ return counts;
183
+ }
184
+ /**
185
+ * Find the 0-based column index of the hookActivity / 伏笔动态 header.
186
+ * Falls back to 5 (the standard position in our schema).
187
+ */
188
+ function detectHookActivityColumnIndex(lines) {
189
+ const DEFAULT_INDEX = 5;
190
+ for (const line of lines) {
191
+ if (!line.startsWith("|"))
192
+ continue;
193
+ if (/\|\s*(章节|Chapter)\s*\|/i.test(line)) {
194
+ const cols = line.split("|").map((c) => c.trim());
195
+ const idx = cols.findIndex((c) => /^(伏笔动态|hookActivity)$/i.test(c));
196
+ return idx >= 0 ? idx : DEFAULT_INDEX;
197
+ }
198
+ }
199
+ return DEFAULT_INDEX;
200
+ }
201
+ /**
202
+ * Extract a single column value from a pipe-delimited table row.
203
+ * Returns null when the column index is out of range.
204
+ */
205
+ function extractColumn(row, index) {
206
+ const cols = row.split("|");
207
+ if (index >= 0 && index < cols.length) {
208
+ return cols[index].trim();
209
+ }
210
+ return null;
211
+ }
212
+ /**
213
+ * Lightweight promotion pass: read hooks + chapter_summaries, check
214
+ * advancedCount >= 2, flip promoted flag. No LLM calls.
215
+ *
216
+ * Returns the result without doing any I/O — caller decides whether to
217
+ * persist.
218
+ */
219
+ export function rerunPromotionPass(hooks, summariesRaw) {
220
+ if (hooks.length === 0) {
221
+ return { updated: false, hooks, flippedCount: 0 };
222
+ }
223
+ const derivedCounts = deriveAdvancedCountsFromSummaries(summariesRaw, hooks.map((h) => h.hookId));
224
+ let flipped = 0;
225
+ const nextHooks = hooks.map((hook) => {
226
+ if (hook.promoted === true)
227
+ return hook;
228
+ const advanced = hook.advancedCount ?? derivedCounts.get(hook.hookId) ?? 0;
229
+ if (advanced >= 2) {
230
+ flipped += 1;
231
+ return { ...hook, promoted: true };
232
+ }
233
+ return hook;
234
+ });
235
+ return {
236
+ updated: flipped > 0,
237
+ hooks: nextHooks,
238
+ flippedCount: flipped,
239
+ };
240
+ }
241
+ //# sourceMappingURL=hook-promotion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook-promotion.js","sourceRoot":"","sources":["../../src/utils/hook-promotion.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Phase 7 — stale / blocked hook detection.
3
+ *
4
+ * Runs per-chapter (called from the writer's runtime-state projection
5
+ * pipeline when it emits pending_hooks.md). Tags hooks the reviewer and
6
+ * writer-planner should pay attention to:
7
+ *
8
+ * stale — planted long ago (distance > half_life) and still not
9
+ * marked paid-off / resolved.
10
+ * blocked — depends_on references upstream hooks that are still
11
+ * unplanted or unresolved.
12
+ *
13
+ * The detection is pure: given the current hook list + current chapter
14
+ * number, it returns a map of hook id -> diagnostic flags. Nothing is
15
+ * persisted outside the rendered markdown.
16
+ */
17
+ import type { StoredHook } from "../state/memory-db.js";
18
+ import type { HookRecord } from "../models/runtime-state.js";
19
+ export interface HookDiagnostics {
20
+ readonly stale: boolean;
21
+ readonly blocked: boolean;
22
+ readonly missingUpstream: ReadonlyArray<string>;
23
+ readonly distance: number;
24
+ readonly halfLife: number;
25
+ /**
26
+ * Phase 7 hotfix 3 — number of chapters this hook has been blocked.
27
+ *
28
+ * When blocked=false this is 0. When blocked=true it is computed as:
29
+ * max over unresolved upstream of (currentChapter - referenceChapter)
30
+ * where referenceChapter is:
31
+ * - upstream.startChapter, if upstream is planted (startChapter > 0)
32
+ * - hook.startChapter, if upstream is missing or not yet planted
33
+ * (blocked since this hook's own planting)
34
+ *
35
+ * Reviewer reads this as the "blocked Y chapters" token for threshold
36
+ * evaluation (5/6+ chapters → warning).
37
+ */
38
+ readonly blockedDistance: number;
39
+ }
40
+ type HookLike = StoredHook | HookRecord;
41
+ export declare function computeHookDiagnostics(params: {
42
+ readonly hooks: ReadonlyArray<HookLike>;
43
+ readonly currentChapter: number;
44
+ }): Map<string, HookDiagnostics>;
45
+ /**
46
+ * Render the diagnostic flags as a compact marker string suitable for
47
+ * appending to an existing table cell. Empty when nothing is flagged.
48
+ */
49
+ export declare function renderHookDiagnosticMarker(diagnostics: HookDiagnostics, language: "zh" | "en"): string;
50
+ export {};
51
+ //# sourceMappingURL=hook-stale-detection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook-stale-detection.d.ts","sourceRoot":"","sources":["../../src/utils/hook-stale-detection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAG7D,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,eAAe,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAChD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B;;;;;;;;;;;;OAYG;IACH,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;CAClC;AAED,KAAK,QAAQ,GAAG,UAAU,GAAG,UAAU,CAAC;AAexC,wBAAgB,sBAAsB,CAAC,MAAM,EAAE;IAC7C,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;IACxC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC,GAAG,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,CA2E/B;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,WAAW,EAAE,eAAe,EAC5B,QAAQ,EAAE,IAAI,GAAG,IAAI,GACpB,MAAM,CAsBR"}
@@ -0,0 +1,125 @@
1
+ /**
2
+ * Phase 7 — stale / blocked hook detection.
3
+ *
4
+ * Runs per-chapter (called from the writer's runtime-state projection
5
+ * pipeline when it emits pending_hooks.md). Tags hooks the reviewer and
6
+ * writer-planner should pay attention to:
7
+ *
8
+ * stale — planted long ago (distance > half_life) and still not
9
+ * marked paid-off / resolved.
10
+ * blocked — depends_on references upstream hooks that are still
11
+ * unplanted or unresolved.
12
+ *
13
+ * The detection is pure: given the current hook list + current chapter
14
+ * number, it returns a map of hook id -> diagnostic flags. Nothing is
15
+ * persisted outside the rendered markdown.
16
+ */
17
+ import { resolveHalfLifeChapters } from "./hook-promotion.js";
18
+ const RESOLVED_STATUSES = [
19
+ /^resolved$/i,
20
+ /^closed$/i,
21
+ /^done$/i,
22
+ /^已回收$/,
23
+ /^已解决$/,
24
+ ];
25
+ function isResolved(hook) {
26
+ const status = (hook.status ?? "").trim();
27
+ return RESOLVED_STATUSES.some((pattern) => pattern.test(status));
28
+ }
29
+ export function computeHookDiagnostics(params) {
30
+ const { hooks, currentChapter } = params;
31
+ const byId = new Map();
32
+ for (const hook of hooks) {
33
+ byId.set(hook.hookId, hook);
34
+ }
35
+ const result = new Map();
36
+ for (const hook of hooks) {
37
+ const halfLife = resolveHalfLifeChapters(hook);
38
+ const plantedChapter = Math.max(0, hook.startChapter);
39
+ const distance = Math.max(0, currentChapter - plantedChapter);
40
+ // Stale: past half-life AND not resolved AND actually planted
41
+ // (startChapter > 0 — a seed with startChapter 0 is a pre-planting seed).
42
+ const stale = !isResolved(hook)
43
+ && plantedChapter > 0
44
+ && distance > halfLife;
45
+ // Blocked: depends_on references a hook that is unplanted or unresolved.
46
+ // Hotfix 3: also track per-upstream reference chapter so we can compute
47
+ // how long this hook has been blocked (for reviewer threshold eval).
48
+ const missingUpstream = [];
49
+ const upstreamReferenceChapters = [];
50
+ for (const upstreamId of hook.dependsOn ?? []) {
51
+ const upstream = byId.get(upstreamId);
52
+ if (!upstream) {
53
+ missingUpstream.push(upstreamId);
54
+ // Upstream missing from ledger entirely — we've been blocked since
55
+ // our own planting (or since chapter 0 if we're a pre-planting seed).
56
+ upstreamReferenceChapters.push(plantedChapter);
57
+ continue;
58
+ }
59
+ // Upstream is "planted but not delivered" if startChapter is non-zero
60
+ // AND it's not resolved. An upstream that is still a seed (startChapter
61
+ // 0) counts as unplanted.
62
+ const upstreamResolved = isResolved(upstream);
63
+ const upstreamPlanted = upstream.startChapter > 0
64
+ && upstream.startChapter <= currentChapter;
65
+ if (!upstreamPlanted || !upstreamResolved) {
66
+ // We only block when the upstream genuinely has not cleared its gate.
67
+ // For a pure "must be planted first" relationship, "planted but not
68
+ // resolved" still counts as blocking the downstream from firing.
69
+ missingUpstream.push(upstreamId);
70
+ // Blocked since upstream planting (if planted) or since our own
71
+ // planting (if upstream still unplanted).
72
+ const referenceChapter = upstreamPlanted
73
+ ? upstream.startChapter
74
+ : plantedChapter;
75
+ upstreamReferenceChapters.push(referenceChapter);
76
+ }
77
+ }
78
+ const blocked = missingUpstream.length > 0 && !isResolved(hook);
79
+ // Blocked distance = chapters elapsed since the *earliest* reference
80
+ // chapter among unresolved upstream. Picking the min reference yields the
81
+ // max distance — the longest any of these gates has held us up.
82
+ let blockedDistance = 0;
83
+ if (blocked && upstreamReferenceChapters.length > 0) {
84
+ const earliestReference = Math.min(...upstreamReferenceChapters);
85
+ blockedDistance = Math.max(0, currentChapter - earliestReference);
86
+ }
87
+ result.set(hook.hookId, {
88
+ stale,
89
+ blocked,
90
+ missingUpstream,
91
+ distance,
92
+ halfLife,
93
+ blockedDistance,
94
+ });
95
+ }
96
+ return result;
97
+ }
98
+ /**
99
+ * Render the diagnostic flags as a compact marker string suitable for
100
+ * appending to an existing table cell. Empty when nothing is flagged.
101
+ */
102
+ export function renderHookDiagnosticMarker(diagnostics, language) {
103
+ const tokens = [];
104
+ if (diagnostics.stale) {
105
+ tokens.push(language === "en"
106
+ ? `stale (d=${diagnostics.distance}/half=${diagnostics.halfLife})`
107
+ : `过期 (距=${diagnostics.distance}/半衰=${diagnostics.halfLife})`);
108
+ }
109
+ if (diagnostics.blocked) {
110
+ const missing = diagnostics.missingUpstream.join(", ");
111
+ // Hotfix 3: embed the blocked distance so reviewer can apply its 5/6-chapter
112
+ // threshold without guessing. Token format is load-bearing — it's read by
113
+ // the reviewer prompt verbatim.
114
+ const distanceToken = diagnostics.blockedDistance > 0
115
+ ? (language === "en"
116
+ ? ` (blocked ${diagnostics.blockedDistance} chapters)`
117
+ : ` (已阻 ${diagnostics.blockedDistance} 章)`)
118
+ : "";
119
+ tokens.push(language === "en"
120
+ ? `blocked on ${missing}${distanceToken}`
121
+ : `受阻于 ${missing}${distanceToken}`);
122
+ }
123
+ return tokens.join("; ");
124
+ }
125
+ //# sourceMappingURL=hook-stale-detection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook-stale-detection.js","sourceRoot":"","sources":["../../src/utils/hook-stale-detection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare function isApiKeyOptionalForEndpoint(params: {
2
+ readonly provider?: string | undefined;
3
+ readonly baseUrl?: string | undefined;
4
+ }): boolean;
5
+ //# sourceMappingURL=llm-endpoint-auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-endpoint-auth.d.ts","sourceRoot":"","sources":["../../src/utils/llm-endpoint-auth.ts"],"names":[],"mappings":"AAAA,wBAAgB,2BAA2B,CAAC,MAAM,EAAE;IAClD,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACvC,GAAG,OAAO,CAwBV"}
@@ -0,0 +1,36 @@
1
+ export function isApiKeyOptionalForEndpoint(params) {
2
+ if (params.provider === "anthropic") {
3
+ return false;
4
+ }
5
+ if (!params.baseUrl) {
6
+ return false;
7
+ }
8
+ try {
9
+ const url = new URL(params.baseUrl);
10
+ const hostname = url.hostname.toLowerCase();
11
+ return (hostname === "localhost"
12
+ || hostname === "127.0.0.1"
13
+ || hostname === "::1"
14
+ || hostname === "0.0.0.0"
15
+ || hostname === "host.docker.internal"
16
+ || hostname.endsWith(".local")
17
+ || isPrivateIpv4(hostname));
18
+ }
19
+ catch {
20
+ return false;
21
+ }
22
+ }
23
+ function isPrivateIpv4(hostname) {
24
+ const parts = hostname.split(".").map((segment) => Number.parseInt(segment, 10));
25
+ if (parts.length !== 4 || parts.some((part) => Number.isNaN(part) || part < 0 || part > 255)) {
26
+ return false;
27
+ }
28
+ if (parts[0] === 10)
29
+ return true;
30
+ if (parts[0] === 192 && parts[1] === 168)
31
+ return true;
32
+ if (parts[0] === 172 && parts[1] >= 16 && parts[1] <= 31)
33
+ return true;
34
+ return false;
35
+ }
36
+ //# sourceMappingURL=llm-endpoint-auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-endpoint-auth.js","sourceRoot":"","sources":["../../src/utils/llm-endpoint-auth.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,2BAA2B,CAAC,MAG3C;IACC,IAAI,MAAM,CAAC,QAAQ,KAAK,WAAW,EAAE,CAAC;QACpC,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACpC,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;QAE5C,OAAO,CACL,QAAQ,KAAK,WAAW;eACrB,QAAQ,KAAK,WAAW;eACxB,QAAQ,KAAK,KAAK;eAClB,QAAQ,KAAK,SAAS;eACtB,QAAQ,KAAK,sBAAsB;eACnC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC;eAC3B,aAAa,CAAC,QAAQ,CAAC,CAC3B,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,QAAgB;IACrC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;IACjF,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;QAC7F,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IACjC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IACtD,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE;QAAE,OAAO,IAAI,CAAC;IACtE,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,14 @@
1
+ export declare const GLOBAL_CONFIG_DIR: string;
2
+ export declare const GLOBAL_ENV_PATH: string;
3
+ export type LLMEnvMap = Record<string, string | undefined>;
4
+ export interface LLMEnvLayers {
5
+ readonly global: LLMEnvMap;
6
+ readonly project: LLMEnvMap;
7
+ readonly process: LLMEnvMap;
8
+ }
9
+ export declare function loadLLMEnvLayers(root: string, processEnv?: NodeJS.ProcessEnv): Promise<LLMEnvLayers>;
10
+ export declare function mergeEnvMaps(...layers: readonly LLMEnvMap[]): LLMEnvMap;
11
+ export declare function studioIgnoredEnv(layers: LLMEnvLayers): LLMEnvMap;
12
+ export declare function cliOverlayEnv(layers: LLMEnvLayers): LLMEnvMap;
13
+ export declare function legacyEnv(layers: LLMEnvLayers): LLMEnvMap;
14
+ //# sourceMappingURL=llm-env.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-env.d.ts","sourceRoot":"","sources":["../../src/utils/llm-env.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,iBAAiB,QAA4B,CAAC;AAC3D,eAAO,MAAM,eAAe,QAAkC,CAAC;AAE/D,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;AAE3D,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC;CAC7B;AAED,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,MAAM,EACZ,UAAU,GAAE,MAAM,CAAC,UAAwB,GAC1C,OAAO,CAAC,YAAY,CAAC,CAWvB;AAED,wBAAgB,YAAY,CAAC,GAAG,MAAM,EAAE,SAAS,SAAS,EAAE,GAAG,SAAS,CAQvE;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,YAAY,GAAG,SAAS,CAEhE;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,YAAY,GAAG,SAAS,CAE7D;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,YAAY,GAAG,SAAS,CAEzD"}
@@ -0,0 +1,53 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { homedir } from "node:os";
3
+ import { join } from "node:path";
4
+ import { parse } from "dotenv";
5
+ export const GLOBAL_CONFIG_DIR = join(homedir(), ".inkos");
6
+ export const GLOBAL_ENV_PATH = join(GLOBAL_CONFIG_DIR, ".env");
7
+ export async function loadLLMEnvLayers(root, processEnv = process.env) {
8
+ const global = await parseEnvFile(GLOBAL_ENV_PATH);
9
+ const project = await parseEnvFile(join(root, ".env"));
10
+ // Compatibility: modelOverrides.apiKeyEnv and detector config still read process.env directly.
11
+ hydrateProcessEnvFromEnvFiles(processEnv, global, project);
12
+ return {
13
+ global,
14
+ project,
15
+ process: { ...processEnv },
16
+ };
17
+ }
18
+ export function mergeEnvMaps(...layers) {
19
+ const merged = {};
20
+ for (const layer of layers) {
21
+ for (const [key, value] of Object.entries(layer)) {
22
+ if (value !== undefined)
23
+ merged[key] = value;
24
+ }
25
+ }
26
+ return merged;
27
+ }
28
+ export function studioIgnoredEnv(layers) {
29
+ return mergeEnvMaps(layers.global, layers.project, layers.process);
30
+ }
31
+ export function cliOverlayEnv(layers) {
32
+ return mergeEnvMaps(layers.global, layers.project, layers.process);
33
+ }
34
+ export function legacyEnv(layers) {
35
+ return mergeEnvMaps(layers.global, layers.project, layers.process);
36
+ }
37
+ async function parseEnvFile(path) {
38
+ try {
39
+ return parse(await readFile(path, "utf-8"));
40
+ }
41
+ catch {
42
+ return {};
43
+ }
44
+ }
45
+ function hydrateProcessEnvFromEnvFiles(processEnv, global, project) {
46
+ const fileEnv = mergeEnvMaps(global, project);
47
+ for (const [key, value] of Object.entries(fileEnv)) {
48
+ if (value !== undefined && processEnv[key] === undefined) {
49
+ processEnv[key] = value;
50
+ }
51
+ }
52
+ }
53
+ //# sourceMappingURL=llm-env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-env.js","sourceRoot":"","sources":["../../src/utils/llm-env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAE/B,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAC;AAC3D,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;AAU/D,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,IAAY,EACZ,aAAgC,OAAO,CAAC,GAAG;IAE3C,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,eAAe,CAAC,CAAC;IACnD,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IACvD,+FAA+F;IAC/F,6BAA6B,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAE3D,OAAO;QACL,MAAM;QACN,OAAO;QACP,OAAO,EAAE,EAAE,GAAG,UAAU,EAAE;KAC3B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,GAAG,MAA4B;IAC1D,MAAM,MAAM,GAAc,EAAE,CAAC;IAC7B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACjD,IAAI,KAAK,KAAK,SAAS;gBAAE,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QAC/C,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAAoB;IACnD,OAAO,YAAY,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAAoB;IAChD,OAAO,YAAY,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,MAAoB;IAC5C,OAAO,YAAY,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;AACrE,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,IAAY;IACtC,IAAI,CAAC;QACH,OAAO,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,6BAA6B,CACpC,UAA6B,EAC7B,MAAiB,EACjB,OAAkB;IAElB,MAAM,OAAO,GAAG,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACnD,IAAI,KAAK,KAAK,SAAS,IAAI,UAAU,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE,CAAC;YACzD,UAAU,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QAC1B,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -1,10 +1,16 @@
1
1
  import { type Fact, type StoredHook, type StoredSummary } from "../state/memory-db.js";
2
- export { buildPlannerHookAgenda, isFuturePlannedHook, isHookWithinChapterWindow, } from "./hook-agenda.js";
2
+ export { isFuturePlannedHook, isHookWithinChapterWindow, } from "./hook-lifecycle.js";
3
3
  export { parseChapterSummariesMarkdown, parseCurrentStateFacts, parsePendingHooksMarkdown, renderHookSnapshot, renderSummarySnapshot, } from "./story-markdown.js";
4
4
  export interface MemorySelection {
5
5
  readonly summaries: ReadonlyArray<StoredSummary>;
6
6
  readonly hooks: ReadonlyArray<StoredHook>;
7
7
  readonly activeHooks: ReadonlyArray<StoredHook>;
8
+ /**
9
+ * Hooks with recycling pressure — stale hooks that the planner must
10
+ * advance/resolve/defer (and if deferred, justify). Sorted by staleness DESC
11
+ * (most overdue first). See computeRecyclableHooks for the selection rule.
12
+ */
13
+ readonly recyclableHooks: ReadonlyArray<StoredHook>;
8
14
  readonly facts: ReadonlyArray<Fact>;
9
15
  readonly volumeSummaries: ReadonlyArray<VolumeSummarySelection>;
10
16
  readonly dbPath?: string;
@@ -21,5 +27,21 @@ export declare function retrieveMemorySelection(params: {
21
27
  readonly outlineNode?: string;
22
28
  readonly mustKeep?: ReadonlyArray<string>;
23
29
  }): Promise<MemorySelection>;
30
+ /**
31
+ * Phase 9-2: Hooks that the planner MUST address this chapter.
32
+ *
33
+ * An active hook is "recyclable" (i.e., stale enough to force an
34
+ * advance/resolve/defer decision) when any of the following holds:
35
+ *
36
+ * - pressured / near_payoff / progressing: silent for ≥ 5 chapters
37
+ * - planted / open: silent for ≥ 10 chapters
38
+ * - coreHook === true: silent for ≥ 8 chapters
39
+ *
40
+ * "Silent" = (chapterNumber − max(startChapter, lastAdvancedChapter)).
41
+ * Future-planted hooks are excluded (they aren't overdue yet).
42
+ * Sorted by silence DESC — most overdue first — so the planner sees the
43
+ * worst debt at the top of its prompt slice.
44
+ */
45
+ export declare function computeRecyclableHooks(hooks: ReadonlyArray<StoredHook>, chapterNumber: number): StoredHook[];
24
46
  export declare function extractQueryTerms(goal: string, outlineNode: string | undefined, mustKeep: ReadonlyArray<string>): string[];
25
47
  //# sourceMappingURL=memory-retrieval.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"memory-retrieval.d.ts","sourceRoot":"","sources":["../../src/utils/memory-retrieval.ts"],"names":[],"mappings":"AAQA,OAAO,EAAY,KAAK,IAAI,EAAE,KAAK,UAAU,EAAE,KAAK,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAejG,OAAO,EACL,sBAAsB,EACtB,mBAAmB,EACnB,yBAAyB,GAC1B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,6BAA6B,EAC7B,sBAAsB,EACtB,yBAAyB,EACzB,kBAAkB,EAClB,qBAAqB,GACtB,MAAM,qBAAqB,CAAC;AAE7B,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC;IACjD,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;IAC1C,QAAQ,CAAC,WAAW,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;IAChD,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC;IACpC,QAAQ,CAAC,eAAe,EAAE,aAAa,CAAC,sBAAsB,CAAC,CAAC;IAChE,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,wBAAsB,uBAAuB,CAAC,MAAM,EAAE;IACpD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,QAAQ,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;CAC3C,GAAG,OAAO,CAAC,eAAe,CAAC,CAmG3B;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE,CAc1H"}
1
+ {"version":3,"file":"memory-retrieval.d.ts","sourceRoot":"","sources":["../../src/utils/memory-retrieval.ts"],"names":[],"mappings":"AAQA,OAAO,EAAY,KAAK,IAAI,EAAE,KAAK,UAAU,EAAE,KAAK,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAcjG,OAAO,EACL,mBAAmB,EACnB,yBAAyB,GAC1B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,6BAA6B,EAC7B,sBAAsB,EACtB,yBAAyB,EACzB,kBAAkB,EAClB,qBAAqB,GACtB,MAAM,qBAAqB,CAAC;AAE7B,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC;IACjD,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;IAC1C,QAAQ,CAAC,WAAW,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;IAChD;;;;OAIG;IACH,QAAQ,CAAC,eAAe,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;IACpD,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC;IACpC,QAAQ,CAAC,eAAe,EAAE,aAAa,CAAC,sBAAsB,CAAC,CAAC;IAChE,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,wBAAsB,uBAAuB,CAAC,MAAM,EAAE;IACpD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,QAAQ,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;CAC3C,GAAG,OAAO,CAAC,eAAe,CAAC,CAqG3B;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,aAAa,CAAC,UAAU,CAAC,EAChC,aAAa,EAAE,MAAM,GACpB,UAAU,EAAE,CAQd;AAmBD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE,CAc1H"}