inkos-n-core 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (412) hide show
  1. package/dist/agents/ai-tells.d.ts +26 -0
  2. package/dist/agents/ai-tells.d.ts.map +1 -0
  3. package/dist/agents/ai-tells.js +140 -0
  4. package/dist/agents/ai-tells.js.map +1 -0
  5. package/dist/agents/architect.d.ts +34 -0
  6. package/dist/agents/architect.d.ts.map +1 -0
  7. package/dist/agents/architect.js +906 -0
  8. package/dist/agents/architect.js.map +1 -0
  9. package/dist/agents/base.d.ts +30 -0
  10. package/dist/agents/base.d.ts.map +1 -0
  11. package/dist/agents/base.js +70 -0
  12. package/dist/agents/base.js.map +1 -0
  13. package/dist/agents/chapter-analyzer.d.ts +30 -0
  14. package/dist/agents/chapter-analyzer.d.ts.map +1 -0
  15. package/dist/agents/chapter-analyzer.js +476 -0
  16. package/dist/agents/chapter-analyzer.js.map +1 -0
  17. package/dist/agents/composer.d.ts +36 -0
  18. package/dist/agents/composer.d.ts.map +1 -0
  19. package/dist/agents/composer.js +319 -0
  20. package/dist/agents/composer.js.map +1 -0
  21. package/dist/agents/consolidator.d.ts +23 -0
  22. package/dist/agents/consolidator.d.ts.map +1 -0
  23. package/dist/agents/consolidator.js +141 -0
  24. package/dist/agents/consolidator.js.map +1 -0
  25. package/dist/agents/continuity.d.ts +39 -0
  26. package/dist/agents/continuity.d.ts.map +1 -0
  27. package/dist/agents/continuity.js +612 -0
  28. package/dist/agents/continuity.js.map +1 -0
  29. package/dist/agents/detection-insights.d.ts +9 -0
  30. package/dist/agents/detection-insights.d.ts.map +1 -0
  31. package/dist/agents/detection-insights.js +54 -0
  32. package/dist/agents/detection-insights.js.map +1 -0
  33. package/dist/agents/detector.d.ts +17 -0
  34. package/dist/agents/detector.d.ts.map +1 -0
  35. package/dist/agents/detector.js +77 -0
  36. package/dist/agents/detector.js.map +1 -0
  37. package/dist/agents/en-prompt-sections.d.ts +8 -0
  38. package/dist/agents/en-prompt-sections.d.ts.map +1 -0
  39. package/dist/agents/en-prompt-sections.js +120 -0
  40. package/dist/agents/en-prompt-sections.js.map +1 -0
  41. package/dist/agents/fanfic-canon-importer.d.ts +15 -0
  42. package/dist/agents/fanfic-canon-importer.d.ts.map +1 -0
  43. package/dist/agents/fanfic-canon-importer.js +117 -0
  44. package/dist/agents/fanfic-canon-importer.js.map +1 -0
  45. package/dist/agents/fanfic-dimensions.d.ts +14 -0
  46. package/dist/agents/fanfic-dimensions.d.ts.map +1 -0
  47. package/dist/agents/fanfic-dimensions.js +63 -0
  48. package/dist/agents/fanfic-dimensions.js.map +1 -0
  49. package/dist/agents/fanfic-prompt-sections.d.ts +5 -0
  50. package/dist/agents/fanfic-prompt-sections.d.ts.map +1 -0
  51. package/dist/agents/fanfic-prompt-sections.js +85 -0
  52. package/dist/agents/fanfic-prompt-sections.js.map +1 -0
  53. package/dist/agents/foundation-reviewer.d.ts +29 -0
  54. package/dist/agents/foundation-reviewer.d.ts.map +1 -0
  55. package/dist/agents/foundation-reviewer.js +153 -0
  56. package/dist/agents/foundation-reviewer.js.map +1 -0
  57. package/dist/agents/length-normalizer.d.ts +32 -0
  58. package/dist/agents/length-normalizer.d.ts.map +1 -0
  59. package/dist/agents/length-normalizer.js +156 -0
  60. package/dist/agents/length-normalizer.js.map +1 -0
  61. package/dist/agents/observer-prompts.d.ts +10 -0
  62. package/dist/agents/observer-prompts.d.ts.map +1 -0
  63. package/dist/agents/observer-prompts.js +113 -0
  64. package/dist/agents/observer-prompts.js.map +1 -0
  65. package/dist/agents/planner.d.ts +57 -0
  66. package/dist/agents/planner.d.ts.map +1 -0
  67. package/dist/agents/planner.js +594 -0
  68. package/dist/agents/planner.js.map +1 -0
  69. package/dist/agents/post-write-validator.d.ts +34 -0
  70. package/dist/agents/post-write-validator.d.ts.map +1 -0
  71. package/dist/agents/post-write-validator.js +696 -0
  72. package/dist/agents/post-write-validator.js.map +1 -0
  73. package/dist/agents/radar-source.d.ts +38 -0
  74. package/dist/agents/radar-source.d.ts.map +1 -0
  75. package/dist/agents/radar-source.js +92 -0
  76. package/dist/agents/radar-source.js.map +1 -0
  77. package/dist/agents/radar.d.ts +24 -0
  78. package/dist/agents/radar.d.ts.map +1 -0
  79. package/dist/agents/radar.js +85 -0
  80. package/dist/agents/radar.js.map +1 -0
  81. package/dist/agents/reviser.d.ts +32 -0
  82. package/dist/agents/reviser.d.ts.map +1 -0
  83. package/dist/agents/reviser.js +282 -0
  84. package/dist/agents/reviser.js.map +1 -0
  85. package/dist/agents/rules-reader.d.ts +27 -0
  86. package/dist/agents/rules-reader.d.ts.map +1 -0
  87. package/dist/agents/rules-reader.js +99 -0
  88. package/dist/agents/rules-reader.js.map +1 -0
  89. package/dist/agents/sensitive-words.d.ts +24 -0
  90. package/dist/agents/sensitive-words.d.ts.map +1 -0
  91. package/dist/agents/sensitive-words.js +103 -0
  92. package/dist/agents/sensitive-words.js.map +1 -0
  93. package/dist/agents/settler-delta-parser.d.ts +7 -0
  94. package/dist/agents/settler-delta-parser.d.ts.map +1 -0
  95. package/dist/agents/settler-delta-parser.js +40 -0
  96. package/dist/agents/settler-delta-parser.js.map +1 -0
  97. package/dist/agents/settler-parser.d.ts +13 -0
  98. package/dist/agents/settler-parser.d.ts.map +1 -0
  99. package/dist/agents/settler-parser.js +20 -0
  100. package/dist/agents/settler-parser.js.map +1 -0
  101. package/dist/agents/settler-prompts.d.ts +22 -0
  102. package/dist/agents/settler-prompts.d.ts.map +1 -0
  103. package/dist/agents/settler-prompts.js +193 -0
  104. package/dist/agents/settler-prompts.js.map +1 -0
  105. package/dist/agents/state-validator.d.ts +26 -0
  106. package/dist/agents/state-validator.d.ts.map +1 -0
  107. package/dist/agents/state-validator.js +229 -0
  108. package/dist/agents/state-validator.js.map +1 -0
  109. package/dist/agents/style-analyzer.d.ts +11 -0
  110. package/dist/agents/style-analyzer.d.ts.map +1 -0
  111. package/dist/agents/style-analyzer.js +81 -0
  112. package/dist/agents/style-analyzer.js.map +1 -0
  113. package/dist/agents/writer-parser.d.ts +17 -0
  114. package/dist/agents/writer-parser.d.ts.map +1 -0
  115. package/dist/agents/writer-parser.js +131 -0
  116. package/dist/agents/writer-parser.js.map +1 -0
  117. package/dist/agents/writer-prompts.d.ts +11 -0
  118. package/dist/agents/writer-prompts.d.ts.map +1 -0
  119. package/dist/agents/writer-prompts.js +549 -0
  120. package/dist/agents/writer-prompts.js.map +1 -0
  121. package/dist/agents/writer.d.ts +103 -0
  122. package/dist/agents/writer.d.ts.map +1 -0
  123. package/dist/agents/writer.js +1052 -0
  124. package/dist/agents/writer.js.map +1 -0
  125. package/dist/index.d.ts +80 -0
  126. package/dist/index.d.ts.map +1 -0
  127. package/dist/index.js +84 -0
  128. package/dist/index.js.map +1 -0
  129. package/dist/interaction/edit-controller.d.ts +55 -0
  130. package/dist/interaction/edit-controller.d.ts.map +1 -0
  131. package/dist/interaction/edit-controller.js +187 -0
  132. package/dist/interaction/edit-controller.js.map +1 -0
  133. package/dist/interaction/events.d.ts +45 -0
  134. package/dist/interaction/events.d.ts.map +1 -0
  135. package/dist/interaction/events.js +32 -0
  136. package/dist/interaction/events.js.map +1 -0
  137. package/dist/interaction/intents.d.ts +96 -0
  138. package/dist/interaction/intents.d.ts.map +1 -0
  139. package/dist/interaction/intents.js +58 -0
  140. package/dist/interaction/intents.js.map +1 -0
  141. package/dist/interaction/modes.d.ts +5 -0
  142. package/dist/interaction/modes.d.ts.map +1 -0
  143. package/dist/interaction/modes.js +7 -0
  144. package/dist/interaction/modes.js.map +1 -0
  145. package/dist/interaction/nl-router.d.ts +8 -0
  146. package/dist/interaction/nl-router.d.ts.map +1 -0
  147. package/dist/interaction/nl-router.js +218 -0
  148. package/dist/interaction/nl-router.js.map +1 -0
  149. package/dist/interaction/project-control.d.ts +85 -0
  150. package/dist/interaction/project-control.d.ts.map +1 -0
  151. package/dist/interaction/project-control.js +123 -0
  152. package/dist/interaction/project-control.js.map +1 -0
  153. package/dist/interaction/project-session-store.d.ts +7 -0
  154. package/dist/interaction/project-session-store.d.ts.map +1 -0
  155. package/dist/interaction/project-session-store.js +46 -0
  156. package/dist/interaction/project-session-store.js.map +1 -0
  157. package/dist/interaction/project-tools.d.ts +20 -0
  158. package/dist/interaction/project-tools.d.ts.map +1 -0
  159. package/dist/interaction/project-tools.js +527 -0
  160. package/dist/interaction/project-tools.js.map +1 -0
  161. package/dist/interaction/request-router.d.ts +3 -0
  162. package/dist/interaction/request-router.d.ts.map +1 -0
  163. package/dist/interaction/request-router.js +5 -0
  164. package/dist/interaction/request-router.js.map +1 -0
  165. package/dist/interaction/runtime.d.ts +54 -0
  166. package/dist/interaction/runtime.d.ts.map +1 -0
  167. package/dist/interaction/runtime.js +943 -0
  168. package/dist/interaction/runtime.js.map +1 -0
  169. package/dist/interaction/session.d.ts +352 -0
  170. package/dist/interaction/session.d.ts.map +1 -0
  171. package/dist/interaction/session.js +98 -0
  172. package/dist/interaction/session.js.map +1 -0
  173. package/dist/interaction/truth-authority.d.ts +4 -0
  174. package/dist/interaction/truth-authority.d.ts.map +1 -0
  175. package/dist/interaction/truth-authority.js +37 -0
  176. package/dist/interaction/truth-authority.js.map +1 -0
  177. package/dist/llm/provider.d.ts +87 -0
  178. package/dist/llm/provider.d.ts.map +1 -0
  179. package/dist/llm/provider.js +798 -0
  180. package/dist/llm/provider.js.map +1 -0
  181. package/dist/models/book-rules.d.ts +118 -0
  182. package/dist/models/book-rules.d.ts.map +1 -0
  183. package/dist/models/book-rules.js +55 -0
  184. package/dist/models/book-rules.js.map +1 -0
  185. package/dist/models/book.d.ts +51 -0
  186. package/dist/models/book.d.ts.map +1 -0
  187. package/dist/models/book.js +27 -0
  188. package/dist/models/book.js.map +1 -0
  189. package/dist/models/chapter.d.ts +136 -0
  190. package/dist/models/chapter.d.ts.map +1 -0
  191. package/dist/models/chapter.js +38 -0
  192. package/dist/models/chapter.js.map +1 -0
  193. package/dist/models/detection.d.ts +25 -0
  194. package/dist/models/detection.d.ts.map +1 -0
  195. package/dist/models/detection.js +2 -0
  196. package/dist/models/detection.js.map +1 -0
  197. package/dist/models/genre-profile.d.ts +45 -0
  198. package/dist/models/genre-profile.d.ts.map +1 -0
  199. package/dist/models/genre-profile.js +26 -0
  200. package/dist/models/genre-profile.js.map +1 -0
  201. package/dist/models/input-governance.d.ts +516 -0
  202. package/dist/models/input-governance.d.ts.map +1 -0
  203. package/dist/models/input-governance.js +112 -0
  204. package/dist/models/input-governance.js.map +1 -0
  205. package/dist/models/length-governance.d.ts +93 -0
  206. package/dist/models/length-governance.d.ts.map +1 -0
  207. package/dist/models/length-governance.js +34 -0
  208. package/dist/models/length-governance.js.map +1 -0
  209. package/dist/models/project.d.ts +475 -0
  210. package/dist/models/project.d.ts.map +1 -0
  211. package/dist/models/project.js +100 -0
  212. package/dist/models/project.js.map +1 -0
  213. package/dist/models/runtime-state.d.ts +588 -0
  214. package/dist/models/runtime-state.d.ts.map +1 -0
  215. package/dist/models/runtime-state.js +93 -0
  216. package/dist/models/runtime-state.js.map +1 -0
  217. package/dist/models/state.d.ts +48 -0
  218. package/dist/models/state.d.ts.map +1 -0
  219. package/dist/models/state.js +6 -0
  220. package/dist/models/state.js.map +1 -0
  221. package/dist/models/style-profile.d.ts +16 -0
  222. package/dist/models/style-profile.d.ts.map +1 -0
  223. package/dist/models/style-profile.js +2 -0
  224. package/dist/models/style-profile.js.map +1 -0
  225. package/dist/notify/dispatcher.d.ts +10 -0
  226. package/dist/notify/dispatcher.d.ts.map +1 -0
  227. package/dist/notify/dispatcher.js +55 -0
  228. package/dist/notify/dispatcher.js.map +1 -0
  229. package/dist/notify/feishu.d.ts +5 -0
  230. package/dist/notify/feishu.d.ts.map +1 -0
  231. package/dist/notify/feishu.js +26 -0
  232. package/dist/notify/feishu.js.map +1 -0
  233. package/dist/notify/telegram.d.ts +6 -0
  234. package/dist/notify/telegram.d.ts.map +1 -0
  235. package/dist/notify/telegram.js +17 -0
  236. package/dist/notify/telegram.js.map +1 -0
  237. package/dist/notify/webhook.d.ts +15 -0
  238. package/dist/notify/webhook.d.ts.map +1 -0
  239. package/dist/notify/webhook.js +28 -0
  240. package/dist/notify/webhook.js.map +1 -0
  241. package/dist/notify/wechat-work.d.ts +5 -0
  242. package/dist/notify/wechat-work.d.ts.map +1 -0
  243. package/dist/notify/wechat-work.js +15 -0
  244. package/dist/notify/wechat-work.js.map +1 -0
  245. package/dist/pipeline/agent.d.ts +15 -0
  246. package/dist/pipeline/agent.d.ts.map +1 -0
  247. package/dist/pipeline/agent.js +550 -0
  248. package/dist/pipeline/agent.js.map +1 -0
  249. package/dist/pipeline/chapter-persistence.d.ts +33 -0
  250. package/dist/pipeline/chapter-persistence.d.ts.map +1 -0
  251. package/dist/pipeline/chapter-persistence.js +35 -0
  252. package/dist/pipeline/chapter-persistence.js.map +1 -0
  253. package/dist/pipeline/chapter-review-cycle.d.ts +79 -0
  254. package/dist/pipeline/chapter-review-cycle.d.ts.map +1 -0
  255. package/dist/pipeline/chapter-review-cycle.js +97 -0
  256. package/dist/pipeline/chapter-review-cycle.js.map +1 -0
  257. package/dist/pipeline/chapter-state-recovery.d.ts +59 -0
  258. package/dist/pipeline/chapter-state-recovery.d.ts.map +1 -0
  259. package/dist/pipeline/chapter-state-recovery.js +133 -0
  260. package/dist/pipeline/chapter-state-recovery.js.map +1 -0
  261. package/dist/pipeline/chapter-truth-validation.d.ts +41 -0
  262. package/dist/pipeline/chapter-truth-validation.d.ts.map +1 -0
  263. package/dist/pipeline/chapter-truth-validation.js +67 -0
  264. package/dist/pipeline/chapter-truth-validation.js.map +1 -0
  265. package/dist/pipeline/detection-runner.d.ts +31 -0
  266. package/dist/pipeline/detection-runner.d.ts.map +1 -0
  267. package/dist/pipeline/detection-runner.js +109 -0
  268. package/dist/pipeline/detection-runner.js.map +1 -0
  269. package/dist/pipeline/persisted-governed-plan.d.ts +4 -0
  270. package/dist/pipeline/persisted-governed-plan.d.ts.map +1 -0
  271. package/dist/pipeline/persisted-governed-plan.js +85 -0
  272. package/dist/pipeline/persisted-governed-plan.js.map +1 -0
  273. package/dist/pipeline/runner.d.ts +212 -0
  274. package/dist/pipeline/runner.d.ts.map +1 -0
  275. package/dist/pipeline/runner.js +2265 -0
  276. package/dist/pipeline/runner.js.map +1 -0
  277. package/dist/pipeline/scheduler.d.ts +58 -0
  278. package/dist/pipeline/scheduler.d.ts.map +1 -0
  279. package/dist/pipeline/scheduler.js +322 -0
  280. package/dist/pipeline/scheduler.js.map +1 -0
  281. package/dist/state/manager.d.ts +48 -0
  282. package/dist/state/manager.d.ts.map +1 -0
  283. package/dist/state/manager.js +435 -0
  284. package/dist/state/manager.js.map +1 -0
  285. package/dist/state/memory-db.d.ts +77 -0
  286. package/dist/state/memory-db.d.ts.map +1 -0
  287. package/dist/state/memory-db.js +249 -0
  288. package/dist/state/memory-db.js.map +1 -0
  289. package/dist/state/runtime-state-store.d.ts +25 -0
  290. package/dist/state/runtime-state-store.d.ts.map +1 -0
  291. package/dist/state/runtime-state-store.js +108 -0
  292. package/dist/state/runtime-state-store.js.map +1 -0
  293. package/dist/state/state-bootstrap.d.ts +21 -0
  294. package/dist/state/state-bootstrap.d.ts.map +1 -0
  295. package/dist/state/state-bootstrap.js +434 -0
  296. package/dist/state/state-bootstrap.js.map +1 -0
  297. package/dist/state/state-projections.d.ts +5 -0
  298. package/dist/state/state-projections.d.ts.map +1 -0
  299. package/dist/state/state-projections.js +166 -0
  300. package/dist/state/state-projections.js.map +1 -0
  301. package/dist/state/state-reducer.d.ts +13 -0
  302. package/dist/state/state-reducer.d.ts.map +1 -0
  303. package/dist/state/state-reducer.js +194 -0
  304. package/dist/state/state-reducer.js.map +1 -0
  305. package/dist/state/state-validator.d.ts +12 -0
  306. package/dist/state/state-validator.d.ts.map +1 -0
  307. package/dist/state/state-validator.js +67 -0
  308. package/dist/state/state-validator.js.map +1 -0
  309. package/dist/utils/analytics.d.ts +39 -0
  310. package/dist/utils/analytics.d.ts.map +1 -0
  311. package/dist/utils/analytics.js +50 -0
  312. package/dist/utils/analytics.js.map +1 -0
  313. package/dist/utils/cadence-policy.d.ts +36 -0
  314. package/dist/utils/cadence-policy.d.ts.map +1 -0
  315. package/dist/utils/cadence-policy.js +38 -0
  316. package/dist/utils/cadence-policy.js.map +1 -0
  317. package/dist/utils/chapter-cadence.d.ts +34 -0
  318. package/dist/utils/chapter-cadence.d.ts.map +1 -0
  319. package/dist/utils/chapter-cadence.js +142 -0
  320. package/dist/utils/chapter-cadence.js.map +1 -0
  321. package/dist/utils/chapter-splitter.d.ts +18 -0
  322. package/dist/utils/chapter-splitter.d.ts.map +1 -0
  323. package/dist/utils/chapter-splitter.js +60 -0
  324. package/dist/utils/chapter-splitter.js.map +1 -0
  325. package/dist/utils/config-loader.d.ts +15 -0
  326. package/dist/utils/config-loader.d.ts.map +1 -0
  327. package/dist/utils/config-loader.js +136 -0
  328. package/dist/utils/config-loader.js.map +1 -0
  329. package/dist/utils/context-filter.d.ts +20 -0
  330. package/dist/utils/context-filter.d.ts.map +1 -0
  331. package/dist/utils/context-filter.js +134 -0
  332. package/dist/utils/context-filter.js.map +1 -0
  333. package/dist/utils/governed-context.d.ts +11 -0
  334. package/dist/utils/governed-context.d.ts.map +1 -0
  335. package/dist/utils/governed-context.js +42 -0
  336. package/dist/utils/governed-context.js.map +1 -0
  337. package/dist/utils/governed-working-set.d.ts +18 -0
  338. package/dist/utils/governed-working-set.d.ts.map +1 -0
  339. package/dist/utils/governed-working-set.js +296 -0
  340. package/dist/utils/governed-working-set.js.map +1 -0
  341. package/dist/utils/hook-agenda.d.ts +21 -0
  342. package/dist/utils/hook-agenda.d.ts.map +1 -0
  343. package/dist/utils/hook-agenda.js +95 -0
  344. package/dist/utils/hook-agenda.js.map +1 -0
  345. package/dist/utils/hook-arbiter.d.ts +15 -0
  346. package/dist/utils/hook-arbiter.d.ts.map +1 -0
  347. package/dist/utils/hook-arbiter.js +268 -0
  348. package/dist/utils/hook-arbiter.js.map +1 -0
  349. package/dist/utils/hook-governance.d.ts +28 -0
  350. package/dist/utils/hook-governance.d.ts.map +1 -0
  351. package/dist/utils/hook-governance.js +144 -0
  352. package/dist/utils/hook-governance.js.map +1 -0
  353. package/dist/utils/hook-health.d.ts +15 -0
  354. package/dist/utils/hook-health.d.ts.map +1 -0
  355. package/dist/utils/hook-health.js +128 -0
  356. package/dist/utils/hook-health.js.map +1 -0
  357. package/dist/utils/hook-lifecycle.d.ts +34 -0
  358. package/dist/utils/hook-lifecycle.d.ts.map +1 -0
  359. package/dist/utils/hook-lifecycle.js +125 -0
  360. package/dist/utils/hook-lifecycle.js.map +1 -0
  361. package/dist/utils/hook-policy.d.ts +74 -0
  362. package/dist/utils/hook-policy.d.ts.map +1 -0
  363. package/dist/utils/hook-policy.js +126 -0
  364. package/dist/utils/hook-policy.js.map +1 -0
  365. package/dist/utils/length-metrics.d.ts +10 -0
  366. package/dist/utils/length-metrics.d.ts.map +1 -0
  367. package/dist/utils/length-metrics.js +85 -0
  368. package/dist/utils/length-metrics.js.map +1 -0
  369. package/dist/utils/logger.d.ts +31 -0
  370. package/dist/utils/logger.d.ts.map +1 -0
  371. package/dist/utils/logger.js +79 -0
  372. package/dist/utils/logger.js.map +1 -0
  373. package/dist/utils/long-span-fatigue.d.ts +28 -0
  374. package/dist/utils/long-span-fatigue.d.ts.map +1 -0
  375. package/dist/utils/long-span-fatigue.js +406 -0
  376. package/dist/utils/long-span-fatigue.js.map +1 -0
  377. package/dist/utils/memory-retrieval.d.ts +25 -0
  378. package/dist/utils/memory-retrieval.d.ts.map +1 -0
  379. package/dist/utils/memory-retrieval.js +319 -0
  380. package/dist/utils/memory-retrieval.js.map +1 -0
  381. package/dist/utils/pov-filter.d.ts +30 -0
  382. package/dist/utils/pov-filter.d.ts.map +1 -0
  383. package/dist/utils/pov-filter.js +129 -0
  384. package/dist/utils/pov-filter.js.map +1 -0
  385. package/dist/utils/spot-fix-patches.d.ts +14 -0
  386. package/dist/utils/spot-fix-patches.d.ts.map +1 -0
  387. package/dist/utils/spot-fix-patches.js +75 -0
  388. package/dist/utils/spot-fix-patches.js.map +1 -0
  389. package/dist/utils/story-markdown.d.ts +13 -0
  390. package/dist/utils/story-markdown.d.ts.map +1 -0
  391. package/dist/utils/story-markdown.js +218 -0
  392. package/dist/utils/story-markdown.js.map +1 -0
  393. package/dist/utils/web-search.d.ts +23 -0
  394. package/dist/utils/web-search.d.ts.map +1 -0
  395. package/dist/utils/web-search.js +68 -0
  396. package/dist/utils/web-search.js.map +1 -0
  397. package/genres/cozy.md +43 -0
  398. package/genres/cultivation.md +42 -0
  399. package/genres/dungeon-core.md +40 -0
  400. package/genres/horror.md +51 -0
  401. package/genres/isekai.md +43 -0
  402. package/genres/litrpg.md +43 -0
  403. package/genres/other.md +24 -0
  404. package/genres/progression.md +41 -0
  405. package/genres/romantasy.md +45 -0
  406. package/genres/sci-fi.md +42 -0
  407. package/genres/system-apocalypse.md +40 -0
  408. package/genres/tower-climber.md +41 -0
  409. package/genres/urban.md +53 -0
  410. package/genres/xianxia.md +46 -0
  411. package/genres/xuanhuan.md +64 -0
  412. package/package.json +58 -0
@@ -0,0 +1,268 @@
1
+ import { RuntimeStateDeltaSchema, } from "../models/runtime-state.js";
2
+ import { evaluateHookAdmission } from "./hook-governance.js";
3
+ import { resolveHookPayoffTiming } from "./hook-lifecycle.js";
4
+ export function arbitrateRuntimeStateDeltaHooks(params) {
5
+ const delta = RuntimeStateDeltaSchema.parse(params.delta);
6
+ const workingHooks = params.hooks.map((hook) => ({ ...hook }));
7
+ const knownHookIds = new Set(workingHooks.map((hook) => hook.hookId));
8
+ const upsertsById = new Map();
9
+ const mentions = new Set(delta.hookOps.mention);
10
+ const resolves = uniqueStrings(delta.hookOps.resolve);
11
+ const defers = uniqueStrings(delta.hookOps.defer);
12
+ const fallbackCandidates = [];
13
+ const decisions = [];
14
+ for (const hook of delta.hookOps.upsert) {
15
+ if (knownHookIds.has(hook.hookId)) {
16
+ const normalized = { ...hook };
17
+ upsertsById.set(normalized.hookId, normalized);
18
+ replaceWorkingHook(workingHooks, normalized);
19
+ continue;
20
+ }
21
+ fallbackCandidates.push({
22
+ type: hook.type,
23
+ expectedPayoff: hook.expectedPayoff,
24
+ notes: hook.notes,
25
+ preferredHookId: hook.hookId,
26
+ });
27
+ }
28
+ for (const candidate of [...fallbackCandidates, ...delta.newHookCandidates]) {
29
+ const activeHooks = workingHooks.filter((hook) => hook.status !== "resolved");
30
+ const admission = evaluateHookAdmission({
31
+ candidate,
32
+ activeHooks,
33
+ });
34
+ if (!admission.admit) {
35
+ if (admission.reason === "duplicate_family" && admission.matchedHookId) {
36
+ const matched = workingHooks.find((hook) => hook.hookId === admission.matchedHookId);
37
+ if (!matched) {
38
+ decisions.push({
39
+ action: "rejected",
40
+ reason: "duplicate_family_without_match",
41
+ candidate,
42
+ });
43
+ continue;
44
+ }
45
+ if (isPureRestatement(candidate, matched)) {
46
+ if (!upsertsById.has(matched.hookId) && !resolves.includes(matched.hookId) && !defers.includes(matched.hookId)) {
47
+ mentions.add(matched.hookId);
48
+ }
49
+ decisions.push({
50
+ action: "mentioned",
51
+ reason: "restated_existing_family",
52
+ hookId: matched.hookId,
53
+ candidate,
54
+ });
55
+ continue;
56
+ }
57
+ const base = upsertsById.get(matched.hookId) ?? matched;
58
+ const mapped = mergeCandidateIntoExistingHook(base, candidate, delta.chapter);
59
+ upsertsById.set(mapped.hookId, mapped);
60
+ mentions.delete(mapped.hookId);
61
+ replaceWorkingHook(workingHooks, mapped);
62
+ decisions.push({
63
+ action: "mapped",
64
+ reason: "duplicate_family_with_novelty",
65
+ hookId: matched.hookId,
66
+ candidate,
67
+ });
68
+ continue;
69
+ }
70
+ decisions.push({
71
+ action: "rejected",
72
+ reason: admission.reason,
73
+ candidate,
74
+ });
75
+ continue;
76
+ }
77
+ const created = createCanonicalHook({
78
+ candidate,
79
+ chapter: delta.chapter,
80
+ existingIds: new Set([
81
+ ...workingHooks.map((hook) => hook.hookId),
82
+ ...upsertsById.keys(),
83
+ ]),
84
+ });
85
+ upsertsById.set(created.hookId, created);
86
+ workingHooks.push(created);
87
+ decisions.push({
88
+ action: "created",
89
+ reason: "admit",
90
+ hookId: created.hookId,
91
+ candidate,
92
+ });
93
+ }
94
+ const resolvedDelta = RuntimeStateDeltaSchema.parse({
95
+ ...delta,
96
+ hookOps: {
97
+ upsert: [...upsertsById.values()].sort(sortHooks),
98
+ mention: [...mentions]
99
+ .filter((hookId) => !upsertsById.has(hookId))
100
+ .filter((hookId) => !resolves.includes(hookId))
101
+ .filter((hookId) => !defers.includes(hookId))
102
+ .sort(),
103
+ resolve: resolves,
104
+ defer: defers,
105
+ },
106
+ newHookCandidates: [],
107
+ });
108
+ return {
109
+ resolvedDelta,
110
+ decisions,
111
+ };
112
+ }
113
+ function mergeCandidateIntoExistingHook(existing, candidate, chapter) {
114
+ return {
115
+ ...existing,
116
+ type: preferRicherText(existing.type, candidate.type),
117
+ status: existing.status === "resolved" ? "resolved" : "progressing",
118
+ lastAdvancedChapter: Math.max(existing.lastAdvancedChapter, chapter),
119
+ expectedPayoff: preferRicherText(existing.expectedPayoff, candidate.expectedPayoff),
120
+ payoffTiming: resolveHookPayoffTiming({
121
+ payoffTiming: candidate.payoffTiming ?? existing.payoffTiming,
122
+ expectedPayoff: preferRicherText(existing.expectedPayoff, candidate.expectedPayoff),
123
+ notes: preferRicherText(existing.notes, candidate.notes),
124
+ }),
125
+ notes: preferRicherText(existing.notes, candidate.notes),
126
+ };
127
+ }
128
+ function createCanonicalHook(params) {
129
+ return {
130
+ hookId: buildCanonicalHookId(params.candidate, params.existingIds),
131
+ startChapter: params.chapter,
132
+ type: params.candidate.type.trim(),
133
+ status: "open",
134
+ lastAdvancedChapter: params.chapter,
135
+ expectedPayoff: params.candidate.expectedPayoff.trim(),
136
+ payoffTiming: resolveHookPayoffTiming(params.candidate),
137
+ notes: params.candidate.notes.trim(),
138
+ };
139
+ }
140
+ function buildCanonicalHookId(candidate, existingIds) {
141
+ const preferred = candidate.preferredHookId?.trim();
142
+ if (preferred && !existingIds.has(preferred)) {
143
+ return preferred;
144
+ }
145
+ const base = slugifyHookStem([
146
+ candidate.type,
147
+ candidate.expectedPayoff,
148
+ candidate.notes,
149
+ ].join(" "));
150
+ let next = base;
151
+ let suffix = 2;
152
+ while (existingIds.has(next)) {
153
+ next = `${base}-${suffix}`;
154
+ suffix += 1;
155
+ }
156
+ return next;
157
+ }
158
+ function slugifyHookStem(value) {
159
+ const normalized = value
160
+ .trim()
161
+ .toLowerCase()
162
+ .replace(/[^a-z0-9\u4e00-\u9fff]+/g, " ")
163
+ .replace(/\s+/g, " ")
164
+ .trim();
165
+ const englishTerms = (normalized.match(/[a-z0-9]{3,}/g) ?? [])
166
+ .filter((term) => !STOP_WORDS.has(term))
167
+ .slice(0, 5);
168
+ const chineseTerms = (normalized.match(/[\u4e00-\u9fff]{2,6}/g) ?? []).slice(0, 3);
169
+ const stem = [...englishTerms, ...chineseTerms].join("-").slice(0, 64).replace(/-+$/g, "");
170
+ return stem || "hook";
171
+ }
172
+ function isPureRestatement(candidate, existing) {
173
+ const candidateText = normalizeText([
174
+ candidate.type,
175
+ candidate.expectedPayoff,
176
+ candidate.notes,
177
+ ].join(" "));
178
+ const existingText = normalizeText([
179
+ existing.type,
180
+ existing.expectedPayoff,
181
+ existing.notes,
182
+ ].join(" "));
183
+ if (!candidateText)
184
+ return true;
185
+ if (candidateText === existingText)
186
+ return true;
187
+ const candidateTerms = extractTerms(candidateText);
188
+ const existingTerms = extractTerms(existingText);
189
+ const novelTerms = [...candidateTerms].filter((term) => !existingTerms.has(term));
190
+ const candidateChinese = extractChineseBigrams(candidateText);
191
+ const existingChinese = extractChineseBigrams(existingText);
192
+ const novelChinese = [...candidateChinese].filter((term) => !existingChinese.has(term));
193
+ return novelTerms.length === 0 && novelChinese.length < 2;
194
+ }
195
+ function replaceWorkingHook(workingHooks, hook) {
196
+ const index = workingHooks.findIndex((candidate) => candidate.hookId === hook.hookId);
197
+ if (index >= 0) {
198
+ workingHooks[index] = hook;
199
+ return;
200
+ }
201
+ workingHooks.push(hook);
202
+ }
203
+ function sortHooks(left, right) {
204
+ return left.startChapter - right.startChapter
205
+ || left.lastAdvancedChapter - right.lastAdvancedChapter
206
+ || left.hookId.localeCompare(right.hookId);
207
+ }
208
+ function uniqueStrings(values) {
209
+ return [...new Set(values.map((value) => value.trim()).filter(Boolean))];
210
+ }
211
+ function preferRicherText(primary, fallback) {
212
+ const left = primary.trim();
213
+ const right = fallback.trim();
214
+ if (!left)
215
+ return right;
216
+ if (!right)
217
+ return left;
218
+ if (left === right)
219
+ return left;
220
+ return right.length > left.length ? right : left;
221
+ }
222
+ function normalizeText(value) {
223
+ return value
224
+ .trim()
225
+ .toLowerCase()
226
+ .replace(/[^a-z0-9\u4e00-\u9fff]+/g, " ")
227
+ .replace(/\s+/g, " ")
228
+ .trim();
229
+ }
230
+ function extractTerms(value) {
231
+ const english = value
232
+ .split(" ")
233
+ .map((term) => term.trim())
234
+ .filter((term) => term.length >= 4)
235
+ .filter((term) => !STOP_WORDS.has(term));
236
+ const chinese = value.match(/[\u4e00-\u9fff]{2,6}/g) ?? [];
237
+ return new Set([...english, ...chinese]);
238
+ }
239
+ function extractChineseBigrams(value) {
240
+ const segments = value.match(/[\u4e00-\u9fff]+/g) ?? [];
241
+ const terms = new Set();
242
+ for (const segment of segments) {
243
+ if (segment.length < 2) {
244
+ continue;
245
+ }
246
+ for (let index = 0; index <= segment.length - 2; index += 1) {
247
+ terms.add(segment.slice(index, index + 2));
248
+ }
249
+ }
250
+ return terms;
251
+ }
252
+ const STOP_WORDS = new Set([
253
+ "that",
254
+ "this",
255
+ "with",
256
+ "from",
257
+ "into",
258
+ "still",
259
+ "just",
260
+ "have",
261
+ "will",
262
+ "reveal",
263
+ "about",
264
+ "already",
265
+ "question",
266
+ "chapter",
267
+ ]);
268
+ //# sourceMappingURL=hook-arbiter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook-arbiter.js","sourceRoot":"","sources":["../../src/utils/hook-arbiter.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,GAIxB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAa9D,MAAM,UAAU,+BAA+B,CAAC,MAG/C;IAIC,MAAM,KAAK,GAAG,uBAAuB,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC1D,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC;IAC/D,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IACtE,MAAM,WAAW,GAAG,IAAI,GAAG,EAAsB,CAAC;IAClD,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAChD,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACtD,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAClD,MAAM,kBAAkB,GAA2B,EAAE,CAAC;IACtD,MAAM,SAAS,GAA0B,EAAE,CAAC;IAE5C,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACxC,IAAI,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YAClC,MAAM,UAAU,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC;YAC/B,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;YAC/C,kBAAkB,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;YAC7C,SAAS;QACX,CAAC;QAED,kBAAkB,CAAC,IAAI,CAAC;YACtB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,cAAc,EAAE,IAAI,CAAC,cAAc;YACnC,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,eAAe,EAAE,IAAI,CAAC,MAAM;SAC7B,CAAC,CAAC;IACL,CAAC;IAED,KAAK,MAAM,SAAS,IAAI,CAAC,GAAG,kBAAkB,EAAE,GAAG,KAAK,CAAC,iBAAiB,CAAC,EAAE,CAAC;QAC5E,MAAM,WAAW,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC;QAC9E,MAAM,SAAS,GAAG,qBAAqB,CAAC;YACtC,SAAS;YACT,WAAW;SACZ,CAAC,CAAC;QAEH,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;YACrB,IAAI,SAAS,CAAC,MAAM,KAAK,kBAAkB,IAAI,SAAS,CAAC,aAAa,EAAE,CAAC;gBACvE,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,aAAa,CAAC,CAAC;gBACrF,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,SAAS,CAAC,IAAI,CAAC;wBACb,MAAM,EAAE,UAAU;wBAClB,MAAM,EAAE,gCAAgC;wBACxC,SAAS;qBACV,CAAC,CAAC;oBACH,SAAS;gBACX,CAAC;gBAED,IAAI,iBAAiB,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,CAAC;oBAC1C,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;wBAC/G,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;oBAC/B,CAAC;oBACD,SAAS,CAAC,IAAI,CAAC;wBACb,MAAM,EAAE,WAAW;wBACnB,MAAM,EAAE,0BAA0B;wBAClC,MAAM,EAAE,OAAO,CAAC,MAAM;wBACtB,SAAS;qBACV,CAAC,CAAC;oBACH,SAAS;gBACX,CAAC;gBAED,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC;gBACxD,MAAM,MAAM,GAAG,8BAA8B,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;gBAC9E,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBACvC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBAC/B,kBAAkB,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;gBACzC,SAAS,CAAC,IAAI,CAAC;oBACb,MAAM,EAAE,QAAQ;oBAChB,MAAM,EAAE,+BAA+B;oBACvC,MAAM,EAAE,OAAO,CAAC,MAAM;oBACtB,SAAS;iBACV,CAAC,CAAC;gBACH,SAAS;YACX,CAAC;YAED,SAAS,CAAC,IAAI,CAAC;gBACb,MAAM,EAAE,UAAU;gBAClB,MAAM,EAAE,SAAS,CAAC,MAAM;gBACxB,SAAS;aACV,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QAED,MAAM,OAAO,GAAG,mBAAmB,CAAC;YAClC,SAAS;YACT,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,WAAW,EAAE,IAAI,GAAG,CAAC;gBACnB,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC;gBAC1C,GAAG,WAAW,CAAC,IAAI,EAAE;aACtB,CAAC;SACH,CAAC,CAAC;QACH,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACzC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC3B,SAAS,CAAC,IAAI,CAAC;YACb,MAAM,EAAE,SAAS;YACjB,MAAM,EAAE,OAAO;YACf,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,SAAS;SACV,CAAC,CAAC;IACL,CAAC;IAED,MAAM,aAAa,GAAG,uBAAuB,CAAC,KAAK,CAAC;QAClD,GAAG,KAAK;QACR,OAAO,EAAE;YACP,MAAM,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC;YACjD,OAAO,EAAE,CAAC,GAAG,QAAQ,CAAC;iBACnB,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;iBAC5C,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;iBAC9C,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;iBAC5C,IAAI,EAAE;YACT,OAAO,EAAE,QAAQ;YACjB,KAAK,EAAE,MAAM;SACd;QACD,iBAAiB,EAAE,EAAE;KACtB,CAAC,CAAC;IAEH,OAAO;QACL,aAAa;QACb,SAAS;KACV,CAAC;AACJ,CAAC;AAED,SAAS,8BAA8B,CACrC,QAAoB,EACpB,SAA2B,EAC3B,OAAe;IAEf,OAAO;QACL,GAAG,QAAQ;QACX,IAAI,EAAE,gBAAgB,CAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC;QACrD,MAAM,EAAE,QAAQ,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,aAAa;QACnE,mBAAmB,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,mBAAmB,EAAE,OAAO,CAAC;QACpE,cAAc,EAAE,gBAAgB,CAAC,QAAQ,CAAC,cAAc,EAAE,SAAS,CAAC,cAAc,CAAC;QACnF,YAAY,EAAE,uBAAuB,CAAC;YACpC,YAAY,EAAE,SAAS,CAAC,YAAY,IAAI,QAAQ,CAAC,YAAY;YAC7D,cAAc,EAAE,gBAAgB,CAAC,QAAQ,CAAC,cAAc,EAAE,SAAS,CAAC,cAAc,CAAC;YACnF,KAAK,EAAE,gBAAgB,CAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC;SACzD,CAAC;QACF,KAAK,EAAE,gBAAgB,CAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC;KACzD,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAAC,MAI5B;IACC,OAAO;QACL,MAAM,EAAE,oBAAoB,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,WAAW,CAAC;QAClE,YAAY,EAAE,MAAM,CAAC,OAAO;QAC5B,IAAI,EAAE,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE;QAClC,MAAM,EAAE,MAAM;QACd,mBAAmB,EAAE,MAAM,CAAC,OAAO;QACnC,cAAc,EAAE,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,EAAE;QACtD,YAAY,EAAE,uBAAuB,CAAC,MAAM,CAAC,SAAS,CAAC;QACvD,KAAK,EAAE,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE;KACrC,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAC3B,SAA+B,EAC/B,WAAgC;IAEhC,MAAM,SAAS,GAAG,SAAS,CAAC,eAAe,EAAE,IAAI,EAAE,CAAC;IACpD,IAAI,SAAS,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7C,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,IAAI,GAAG,eAAe,CAAC;QAC3B,SAAS,CAAC,IAAI;QACd,SAAS,CAAC,cAAc;QACxB,SAAS,CAAC,KAAK;KAChB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACb,IAAI,IAAI,GAAG,IAAI,CAAC;IAChB,IAAI,MAAM,GAAG,CAAC,CAAC;IAEf,OAAO,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7B,IAAI,GAAG,GAAG,IAAI,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,IAAI,CAAC,CAAC;IACd,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,eAAe,CAAC,KAAa;IACpC,MAAM,UAAU,GAAG,KAAK;SACrB,IAAI,EAAE;SACN,WAAW,EAAE;SACb,OAAO,CAAC,0BAA0B,EAAE,GAAG,CAAC;SACxC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,IAAI,EAAE,CAAC;IACV,MAAM,YAAY,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC;SAC3D,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;SACvC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACf,MAAM,YAAY,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,uBAAuB,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACnF,MAAM,IAAI,GAAG,CAAC,GAAG,YAAY,EAAE,GAAG,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC3F,OAAO,IAAI,IAAI,MAAM,CAAC;AACxB,CAAC;AAED,SAAS,iBAAiB,CAAC,SAA2B,EAAE,QAAoB;IAC1E,MAAM,aAAa,GAAG,aAAa,CAAC;QAClC,SAAS,CAAC,IAAI;QACd,SAAS,CAAC,cAAc;QACxB,SAAS,CAAC,KAAK;KAChB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACb,MAAM,YAAY,GAAG,aAAa,CAAC;QACjC,QAAQ,CAAC,IAAI;QACb,QAAQ,CAAC,cAAc;QACvB,QAAQ,CAAC,KAAK;KACf,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAEb,IAAI,CAAC,aAAa;QAAE,OAAO,IAAI,CAAC;IAChC,IAAI,aAAa,KAAK,YAAY;QAAE,OAAO,IAAI,CAAC;IAEhD,MAAM,cAAc,GAAG,YAAY,CAAC,aAAa,CAAC,CAAC;IACnD,MAAM,aAAa,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC;IACjD,MAAM,UAAU,GAAG,CAAC,GAAG,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IAElF,MAAM,gBAAgB,GAAG,qBAAqB,CAAC,aAAa,CAAC,CAAC;IAC9D,MAAM,eAAe,GAAG,qBAAqB,CAAC,YAAY,CAAC,CAAC;IAC5D,MAAM,YAAY,GAAG,CAAC,GAAG,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IAExF,OAAO,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;AAC5D,CAAC;AAED,SAAS,kBAAkB,CAAC,YAA0B,EAAE,IAAgB;IACtE,MAAM,KAAK,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC;IACtF,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QACf,YAAY,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;QAC3B,OAAO;IACT,CAAC;IAED,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,SAAS,CAAC,IAAgB,EAAE,KAAiB;IACpD,OAAO,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,YAAY;WACxC,IAAI,CAAC,mBAAmB,GAAG,KAAK,CAAC,mBAAmB;WACpD,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,aAAa,CAAC,MAA6B;IAClD,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAC3E,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAe,EAAE,QAAgB;IACzD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAC5B,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;IAE9B,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IACxB,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,IAAI,IAAI,KAAK,KAAK;QAAE,OAAO,IAAI,CAAC;IAChC,OAAO,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AACnD,CAAC;AAED,SAAS,aAAa,CAAC,KAAa;IAClC,OAAO,KAAK;SACT,IAAI,EAAE;SACN,WAAW,EAAE;SACb,OAAO,CAAC,0BAA0B,EAAE,GAAG,CAAC;SACxC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,IAAI,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,YAAY,CAAC,KAAa;IACjC,MAAM,OAAO,GAAG,KAAK;SAClB,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;SAC1B,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;SAClC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,uBAAuB,CAAC,IAAI,EAAE,CAAC;IAC3D,OAAO,IAAI,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC;AAC3C,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAa;IAC1C,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,mBAAmB,CAAC,IAAI,EAAE,CAAC;IACxD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAEhC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,SAAS;QACX,CAAC;QAED,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;YAC5D,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC;IACzB,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,OAAO;IACP,MAAM;IACN,MAAM;IACN,MAAM;IACN,QAAQ;IACR,OAAO;IACP,SAAS;IACT,UAAU;IACV,SAAS;CACV,CAAC,CAAC"}
@@ -0,0 +1,28 @@
1
+ import type { HookRecord, RuntimeStateDelta } from "../models/runtime-state.js";
2
+ export type HookDisposition = "none" | "mention" | "advance" | "resolve" | "defer";
3
+ export interface HookAdmissionCandidate {
4
+ readonly type: string;
5
+ readonly expectedPayoff?: string;
6
+ readonly payoffTiming?: string;
7
+ readonly notes?: string;
8
+ }
9
+ export interface HookAdmissionDecision {
10
+ readonly admit: boolean;
11
+ readonly reason: "admit" | "missing_type" | "missing_payoff_signal" | "duplicate_family";
12
+ readonly matchedHookId?: string;
13
+ }
14
+ export declare function collectStaleHookDebt(params: {
15
+ readonly hooks: ReadonlyArray<HookRecord>;
16
+ readonly chapterNumber: number;
17
+ readonly targetChapters?: number;
18
+ readonly staleAfterChapters?: number;
19
+ }): HookRecord[];
20
+ export declare function evaluateHookAdmission(params: {
21
+ readonly candidate: HookAdmissionCandidate;
22
+ readonly activeHooks: ReadonlyArray<HookRecord>;
23
+ }): HookAdmissionDecision;
24
+ export declare function classifyHookDisposition(params: {
25
+ readonly hookId: string;
26
+ readonly delta: Pick<RuntimeStateDelta, "chapter" | "hookOps">;
27
+ }): HookDisposition;
28
+ //# sourceMappingURL=hook-governance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook-governance.d.ts","sourceRoot":"","sources":["../../src/utils/hook-governance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAGhF,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;AAEnF,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,OAAO,GAAG,cAAc,GAAG,uBAAuB,GAAG,kBAAkB,CAAC;IACzF,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE;IAC3C,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;IAC1C,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;CACtC,GAAG,UAAU,EAAE,CA2Bf;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE;IAC5C,QAAQ,CAAC,SAAS,EAAE,sBAAsB,CAAC;IAC3C,QAAQ,CAAC,WAAW,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;CACjD,GAAG,qBAAqB,CAqExB;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE;IAC9C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,iBAAiB,EAAE,SAAS,GAAG,SAAS,CAAC,CAAC;CAChE,GAAG,eAAe,CAoBlB"}
@@ -0,0 +1,144 @@
1
+ import { describeHookLifecycle } from "./hook-lifecycle.js";
2
+ export function collectStaleHookDebt(params) {
3
+ return params.hooks
4
+ .filter((hook) => hook.status !== "resolved" && hook.status !== "deferred")
5
+ .filter((hook) => hook.startChapter <= params.chapterNumber)
6
+ .filter((hook) => {
7
+ const lifecycle = describeHookLifecycle({
8
+ payoffTiming: hook.payoffTiming,
9
+ expectedPayoff: hook.expectedPayoff,
10
+ notes: hook.notes,
11
+ startChapter: hook.startChapter,
12
+ lastAdvancedChapter: hook.lastAdvancedChapter,
13
+ status: hook.status,
14
+ chapterNumber: params.chapterNumber,
15
+ targetChapters: params.targetChapters,
16
+ });
17
+ if (params.staleAfterChapters !== undefined) {
18
+ return hook.lastAdvancedChapter <= params.chapterNumber - params.staleAfterChapters;
19
+ }
20
+ return lifecycle.stale || lifecycle.overdue;
21
+ })
22
+ .sort((left, right) => (left.lastAdvancedChapter - right.lastAdvancedChapter
23
+ || left.startChapter - right.startChapter
24
+ || left.hookId.localeCompare(right.hookId)));
25
+ }
26
+ export function evaluateHookAdmission(params) {
27
+ const candidateType = normalizeText(params.candidate.type);
28
+ if (!candidateType) {
29
+ return {
30
+ admit: false,
31
+ reason: "missing_type",
32
+ };
33
+ }
34
+ const payoffSignal = [params.candidate.expectedPayoff, params.candidate.notes]
35
+ .filter((value) => Boolean(value && value.trim()))
36
+ .join(" ")
37
+ .trim();
38
+ if (!payoffSignal) {
39
+ return {
40
+ admit: false,
41
+ reason: "missing_payoff_signal",
42
+ };
43
+ }
44
+ const candidateNormalized = normalizeText([
45
+ params.candidate.type,
46
+ params.candidate.expectedPayoff ?? "",
47
+ params.candidate.payoffTiming ?? "",
48
+ params.candidate.notes ?? "",
49
+ ].join(" "));
50
+ const candidateTerms = extractTerms(candidateNormalized);
51
+ const candidateChineseBigrams = extractChineseBigrams(candidateNormalized);
52
+ for (const hook of params.activeHooks) {
53
+ const activeNormalized = normalizeText([
54
+ hook.type,
55
+ hook.expectedPayoff,
56
+ hook.payoffTiming ?? "",
57
+ hook.notes,
58
+ ].join(" "));
59
+ if (candidateNormalized === activeNormalized) {
60
+ return {
61
+ admit: false,
62
+ reason: "duplicate_family",
63
+ matchedHookId: hook.hookId,
64
+ };
65
+ }
66
+ if (candidateType !== normalizeText(hook.type)) {
67
+ continue;
68
+ }
69
+ const activeTerms = extractTerms(activeNormalized);
70
+ const overlap = [...candidateTerms].filter((term) => activeTerms.has(term));
71
+ const activeChineseBigrams = extractChineseBigrams(activeNormalized);
72
+ const chineseOverlap = [...candidateChineseBigrams].filter((term) => activeChineseBigrams.has(term));
73
+ if (overlap.length >= 2 || chineseOverlap.length >= 3) {
74
+ return {
75
+ admit: false,
76
+ reason: "duplicate_family",
77
+ matchedHookId: hook.hookId,
78
+ };
79
+ }
80
+ }
81
+ return {
82
+ admit: true,
83
+ reason: "admit",
84
+ };
85
+ }
86
+ export function classifyHookDisposition(params) {
87
+ const { hookId, delta } = params;
88
+ if (delta.hookOps.defer.includes(hookId)) {
89
+ return "defer";
90
+ }
91
+ if (delta.hookOps.resolve.includes(hookId)) {
92
+ return "resolve";
93
+ }
94
+ if (delta.hookOps.upsert.some((hook) => hook.hookId === hookId && hook.lastAdvancedChapter === delta.chapter)) {
95
+ return "advance";
96
+ }
97
+ if (delta.hookOps.mention.includes(hookId)) {
98
+ return "mention";
99
+ }
100
+ return "none";
101
+ }
102
+ function normalizeText(value) {
103
+ return value
104
+ .trim()
105
+ .toLowerCase()
106
+ .replace(/[^a-z0-9\u4e00-\u9fff]+/g, " ")
107
+ .replace(/\s+/g, " ")
108
+ .trim();
109
+ }
110
+ function extractTerms(value) {
111
+ const english = value
112
+ .split(" ")
113
+ .map((term) => term.trim())
114
+ .filter((term) => term.length >= 4)
115
+ .filter((term) => !STOP_WORDS.has(term));
116
+ const chinese = value.match(/[\u4e00-\u9fff]{2,6}/g) ?? [];
117
+ return new Set([...english, ...chinese]);
118
+ }
119
+ function extractChineseBigrams(value) {
120
+ const segments = value.match(/[\u4e00-\u9fff]+/g) ?? [];
121
+ const terms = new Set();
122
+ for (const segment of segments) {
123
+ if (segment.length < 2) {
124
+ continue;
125
+ }
126
+ for (let index = 0; index <= segment.length - 2; index += 1) {
127
+ terms.add(segment.slice(index, index + 2));
128
+ }
129
+ }
130
+ return terms;
131
+ }
132
+ const STOP_WORDS = new Set([
133
+ "that",
134
+ "this",
135
+ "with",
136
+ "from",
137
+ "into",
138
+ "still",
139
+ "just",
140
+ "have",
141
+ "will",
142
+ "reveal",
143
+ ]);
144
+ //# sourceMappingURL=hook-governance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook-governance.js","sourceRoot":"","sources":["../../src/utils/hook-governance.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { AuditIssue } from "../agents/continuity.js";
2
+ import type { HookRecord, RuntimeStateDelta } from "../models/runtime-state.js";
3
+ export declare function analyzeHookHealth(params: {
4
+ readonly language: "zh" | "en";
5
+ readonly chapterNumber: number;
6
+ readonly targetChapters?: number;
7
+ readonly hooks: ReadonlyArray<HookRecord>;
8
+ readonly delta?: Pick<RuntimeStateDelta, "chapter" | "hookOps">;
9
+ readonly existingHookIds?: ReadonlyArray<string>;
10
+ readonly maxActiveHooks?: number;
11
+ readonly staleAfterChapters?: number;
12
+ readonly noAdvanceWindow?: number;
13
+ readonly newHookBurstThreshold?: number;
14
+ }): AuditIssue[];
15
+ //# sourceMappingURL=hook-health.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook-health.d.ts","sourceRoot":"","sources":["../../src/utils/hook-health.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAKhF,wBAAgB,iBAAiB,CAAC,MAAM,EAAE;IACxC,QAAQ,CAAC,QAAQ,EAAE,IAAI,GAAG,IAAI,CAAC;IAC/B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;IAC1C,QAAQ,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,iBAAiB,EAAE,SAAS,GAAG,SAAS,CAAC,CAAC;IAChE,QAAQ,CAAC,eAAe,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACjD,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,MAAM,CAAC;CACzC,GAAG,UAAU,EAAE,CA+Gf"}
@@ -0,0 +1,128 @@
1
+ import { classifyHookDisposition, collectStaleHookDebt } from "./hook-governance.js";
2
+ import { describeHookLifecycle, localizeHookPayoffTiming } from "./hook-lifecycle.js";
3
+ import { HOOK_HEALTH_DEFAULTS } from "./hook-policy.js";
4
+ export function analyzeHookHealth(params) {
5
+ const maxActiveHooks = params.maxActiveHooks ?? HOOK_HEALTH_DEFAULTS.maxActiveHooks;
6
+ const staleAfterChapters = params.staleAfterChapters ?? HOOK_HEALTH_DEFAULTS.staleAfterChapters;
7
+ const noAdvanceWindow = params.noAdvanceWindow ?? HOOK_HEALTH_DEFAULTS.noAdvanceWindow;
8
+ const newHookBurstThreshold = params.newHookBurstThreshold ?? HOOK_HEALTH_DEFAULTS.newHookBurstThreshold;
9
+ const issues = [];
10
+ const activeHooks = params.hooks.filter((hook) => hook.status !== "resolved");
11
+ const lifecycleEntries = activeHooks.map((hook) => ({
12
+ hook,
13
+ lifecycle: describeHookLifecycle({
14
+ payoffTiming: hook.payoffTiming,
15
+ expectedPayoff: hook.expectedPayoff,
16
+ notes: hook.notes,
17
+ startChapter: hook.startChapter,
18
+ lastAdvancedChapter: hook.lastAdvancedChapter,
19
+ status: hook.status,
20
+ chapterNumber: params.chapterNumber,
21
+ targetChapters: params.targetChapters,
22
+ }),
23
+ }));
24
+ if (activeHooks.length > maxActiveHooks) {
25
+ issues.push(warning(params.language, params.language === "en"
26
+ ? `There are ${activeHooks.length} active hooks, above the recommended cap of ${maxActiveHooks}.`
27
+ : `当前有 ${activeHooks.length} 个活跃伏笔,已经高于建议上限 ${maxActiveHooks} 个。`, params.language === "en"
28
+ ? "Prefer advancing, resolving, or deferring existing debt before opening more hooks."
29
+ : "优先推进、回收或延后已有伏笔,再继续开新伏笔。"));
30
+ }
31
+ const staleHookIds = new Set(collectStaleHookDebt({
32
+ hooks: activeHooks,
33
+ chapterNumber: params.chapterNumber,
34
+ targetChapters: params.targetChapters,
35
+ staleAfterChapters,
36
+ }).map((hook) => hook.hookId));
37
+ const pressuredHooks = lifecycleEntries.filter(({ hook, lifecycle }) => staleHookIds.has(hook.hookId)
38
+ || lifecycle.readyToResolve
39
+ || lifecycle.overdue);
40
+ const unresolvedPressure = pressuredHooks.filter(({ hook }) => {
41
+ if (!params.delta) {
42
+ return true;
43
+ }
44
+ const disposition = classifyHookDisposition({
45
+ hookId: hook.hookId,
46
+ delta: params.delta,
47
+ });
48
+ return disposition === "none" || disposition === "mention";
49
+ });
50
+ if (unresolvedPressure.length > 0) {
51
+ issues.push(warning(params.language, buildPressureDescription({
52
+ language: params.language,
53
+ entries: unresolvedPressure,
54
+ mentionsCurrentChapter: Boolean(params.delta),
55
+ }), params.language === "en"
56
+ ? "Move one pressured hook with a real payoff, escalation, or explicit defer before opening adjacent debt."
57
+ : "先让一个已进入压力区的伏笔发生真实推进、回收或明确延后,再继续扩展同类债务。"));
58
+ }
59
+ else {
60
+ const latestRealAdvance = activeHooks.reduce((max, hook) => Math.max(max, hook.lastAdvancedChapter), 0);
61
+ if (params.noAdvanceWindow !== undefined
62
+ && activeHooks.length > 0
63
+ && params.chapterNumber - latestRealAdvance >= noAdvanceWindow) {
64
+ issues.push(warning(params.language, params.language === "en"
65
+ ? `No real hook advancement has landed for ${params.chapterNumber - latestRealAdvance} chapters.`
66
+ : `已经连续 ${params.chapterNumber - latestRealAdvance} 章没有真实伏笔推进。`, params.language === "en"
67
+ ? "Schedule one old hook for real movement instead of opening parallel restatements."
68
+ : "下一章优先让一个旧伏笔发生真实推进,而不是继续平行重述。"));
69
+ }
70
+ }
71
+ if (params.delta) {
72
+ const existingHookIds = new Set(params.existingHookIds ?? []);
73
+ const resultingHookIds = new Set(params.hooks.map((hook) => hook.hookId));
74
+ const newHookIds = params.delta.hookOps.upsert
75
+ .map((hook) => hook.hookId)
76
+ .filter((hookId) => !existingHookIds.has(hookId) && resultingHookIds.has(hookId));
77
+ if (newHookIds.length >= newHookBurstThreshold && params.delta.hookOps.resolve.length === 0) {
78
+ issues.push(warning(params.language, params.language === "en"
79
+ ? `Opened ${newHookIds.length} new hooks without resolving any older debt.`
80
+ : `本章新开了 ${newHookIds.length} 个伏笔,但没有回收任何旧债。`, params.language === "en"
81
+ ? "Keep the hook table from ballooning by pairing new openings with old payoffs."
82
+ : "控制伏笔膨胀,新开伏笔时尽量配套回收旧伏笔。"));
83
+ }
84
+ }
85
+ return issues;
86
+ }
87
+ function buildPressureDescription(params) {
88
+ const summarized = params.entries
89
+ .slice(0, 3)
90
+ .map(({ hook, lifecycle }) => {
91
+ const timing = localizeHookPayoffTiming(lifecycle.timing, params.language);
92
+ const pressure = localizePressureLabel(lifecycle, params.language);
93
+ return params.language === "en"
94
+ ? `${hook.hookId} (${timing}, ${pressure})`
95
+ : `${hook.hookId}(${timing},${pressure})`;
96
+ });
97
+ const suffix = params.entries.length > summarized.length
98
+ ? params.language === "en"
99
+ ? `, +${params.entries.length - summarized.length} more`
100
+ : `,另有 ${params.entries.length - summarized.length} 条`
101
+ : "";
102
+ if (params.language === "en") {
103
+ return params.mentionsCurrentChapter
104
+ ? `Hooks are already under payoff pressure but this chapter left them untouched: ${summarized.join(", ")}${suffix}.`
105
+ : `Hooks are already under payoff pressure without recent movement: ${summarized.join(", ")}${suffix}.`;
106
+ }
107
+ return params.mentionsCurrentChapter
108
+ ? `这些伏笔已经进入回收/推进压力,但本章没有真正处理:${summarized.join("、")}${suffix}。`
109
+ : `这些伏笔已经进入回收/推进压力,但近期没有真实推进:${summarized.join("、")}${suffix}。`;
110
+ }
111
+ function localizePressureLabel(lifecycle, language) {
112
+ if (lifecycle.overdue) {
113
+ return language === "en" ? "overdue" : "已逾期";
114
+ }
115
+ if (lifecycle.readyToResolve) {
116
+ return language === "en" ? "ready to pay off" : "可回收";
117
+ }
118
+ return language === "en" ? "stale" : "陈旧";
119
+ }
120
+ function warning(language, description, suggestion) {
121
+ return {
122
+ severity: "warning",
123
+ category: language === "en" ? "Hook Debt" : "伏笔债务",
124
+ description,
125
+ suggestion,
126
+ };
127
+ }
128
+ //# sourceMappingURL=hook-health.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook-health.js","sourceRoot":"","sources":["../../src/utils/hook-health.ts"],"names":[],"mappings":"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"}