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.
- package/dist/agents/ai-tells.d.ts +26 -0
- package/dist/agents/ai-tells.d.ts.map +1 -0
- package/dist/agents/ai-tells.js +140 -0
- package/dist/agents/ai-tells.js.map +1 -0
- package/dist/agents/architect.d.ts +34 -0
- package/dist/agents/architect.d.ts.map +1 -0
- package/dist/agents/architect.js +906 -0
- package/dist/agents/architect.js.map +1 -0
- package/dist/agents/base.d.ts +30 -0
- package/dist/agents/base.d.ts.map +1 -0
- package/dist/agents/base.js +70 -0
- package/dist/agents/base.js.map +1 -0
- package/dist/agents/chapter-analyzer.d.ts +30 -0
- package/dist/agents/chapter-analyzer.d.ts.map +1 -0
- package/dist/agents/chapter-analyzer.js +476 -0
- package/dist/agents/chapter-analyzer.js.map +1 -0
- package/dist/agents/composer.d.ts +36 -0
- package/dist/agents/composer.d.ts.map +1 -0
- package/dist/agents/composer.js +319 -0
- package/dist/agents/composer.js.map +1 -0
- package/dist/agents/consolidator.d.ts +23 -0
- package/dist/agents/consolidator.d.ts.map +1 -0
- package/dist/agents/consolidator.js +141 -0
- package/dist/agents/consolidator.js.map +1 -0
- package/dist/agents/continuity.d.ts +39 -0
- package/dist/agents/continuity.d.ts.map +1 -0
- package/dist/agents/continuity.js +612 -0
- package/dist/agents/continuity.js.map +1 -0
- package/dist/agents/detection-insights.d.ts +9 -0
- package/dist/agents/detection-insights.d.ts.map +1 -0
- package/dist/agents/detection-insights.js +54 -0
- package/dist/agents/detection-insights.js.map +1 -0
- package/dist/agents/detector.d.ts +17 -0
- package/dist/agents/detector.d.ts.map +1 -0
- package/dist/agents/detector.js +77 -0
- package/dist/agents/detector.js.map +1 -0
- package/dist/agents/en-prompt-sections.d.ts +8 -0
- package/dist/agents/en-prompt-sections.d.ts.map +1 -0
- package/dist/agents/en-prompt-sections.js +120 -0
- package/dist/agents/en-prompt-sections.js.map +1 -0
- package/dist/agents/fanfic-canon-importer.d.ts +15 -0
- package/dist/agents/fanfic-canon-importer.d.ts.map +1 -0
- package/dist/agents/fanfic-canon-importer.js +117 -0
- package/dist/agents/fanfic-canon-importer.js.map +1 -0
- package/dist/agents/fanfic-dimensions.d.ts +14 -0
- package/dist/agents/fanfic-dimensions.d.ts.map +1 -0
- package/dist/agents/fanfic-dimensions.js +63 -0
- package/dist/agents/fanfic-dimensions.js.map +1 -0
- package/dist/agents/fanfic-prompt-sections.d.ts +5 -0
- package/dist/agents/fanfic-prompt-sections.d.ts.map +1 -0
- package/dist/agents/fanfic-prompt-sections.js +85 -0
- package/dist/agents/fanfic-prompt-sections.js.map +1 -0
- package/dist/agents/foundation-reviewer.d.ts +29 -0
- package/dist/agents/foundation-reviewer.d.ts.map +1 -0
- package/dist/agents/foundation-reviewer.js +153 -0
- package/dist/agents/foundation-reviewer.js.map +1 -0
- package/dist/agents/length-normalizer.d.ts +32 -0
- package/dist/agents/length-normalizer.d.ts.map +1 -0
- package/dist/agents/length-normalizer.js +156 -0
- package/dist/agents/length-normalizer.js.map +1 -0
- package/dist/agents/observer-prompts.d.ts +10 -0
- package/dist/agents/observer-prompts.d.ts.map +1 -0
- package/dist/agents/observer-prompts.js +113 -0
- package/dist/agents/observer-prompts.js.map +1 -0
- package/dist/agents/planner.d.ts +57 -0
- package/dist/agents/planner.d.ts.map +1 -0
- package/dist/agents/planner.js +594 -0
- package/dist/agents/planner.js.map +1 -0
- package/dist/agents/post-write-validator.d.ts +34 -0
- package/dist/agents/post-write-validator.d.ts.map +1 -0
- package/dist/agents/post-write-validator.js +696 -0
- package/dist/agents/post-write-validator.js.map +1 -0
- package/dist/agents/radar-source.d.ts +38 -0
- package/dist/agents/radar-source.d.ts.map +1 -0
- package/dist/agents/radar-source.js +92 -0
- package/dist/agents/radar-source.js.map +1 -0
- package/dist/agents/radar.d.ts +24 -0
- package/dist/agents/radar.d.ts.map +1 -0
- package/dist/agents/radar.js +85 -0
- package/dist/agents/radar.js.map +1 -0
- package/dist/agents/reviser.d.ts +32 -0
- package/dist/agents/reviser.d.ts.map +1 -0
- package/dist/agents/reviser.js +282 -0
- package/dist/agents/reviser.js.map +1 -0
- package/dist/agents/rules-reader.d.ts +27 -0
- package/dist/agents/rules-reader.d.ts.map +1 -0
- package/dist/agents/rules-reader.js +99 -0
- package/dist/agents/rules-reader.js.map +1 -0
- package/dist/agents/sensitive-words.d.ts +24 -0
- package/dist/agents/sensitive-words.d.ts.map +1 -0
- package/dist/agents/sensitive-words.js +103 -0
- package/dist/agents/sensitive-words.js.map +1 -0
- package/dist/agents/settler-delta-parser.d.ts +7 -0
- package/dist/agents/settler-delta-parser.d.ts.map +1 -0
- package/dist/agents/settler-delta-parser.js +40 -0
- package/dist/agents/settler-delta-parser.js.map +1 -0
- package/dist/agents/settler-parser.d.ts +13 -0
- package/dist/agents/settler-parser.d.ts.map +1 -0
- package/dist/agents/settler-parser.js +20 -0
- package/dist/agents/settler-parser.js.map +1 -0
- package/dist/agents/settler-prompts.d.ts +22 -0
- package/dist/agents/settler-prompts.d.ts.map +1 -0
- package/dist/agents/settler-prompts.js +193 -0
- package/dist/agents/settler-prompts.js.map +1 -0
- package/dist/agents/state-validator.d.ts +26 -0
- package/dist/agents/state-validator.d.ts.map +1 -0
- package/dist/agents/state-validator.js +229 -0
- package/dist/agents/state-validator.js.map +1 -0
- package/dist/agents/style-analyzer.d.ts +11 -0
- package/dist/agents/style-analyzer.d.ts.map +1 -0
- package/dist/agents/style-analyzer.js +81 -0
- package/dist/agents/style-analyzer.js.map +1 -0
- package/dist/agents/writer-parser.d.ts +17 -0
- package/dist/agents/writer-parser.d.ts.map +1 -0
- package/dist/agents/writer-parser.js +131 -0
- package/dist/agents/writer-parser.js.map +1 -0
- package/dist/agents/writer-prompts.d.ts +11 -0
- package/dist/agents/writer-prompts.d.ts.map +1 -0
- package/dist/agents/writer-prompts.js +549 -0
- package/dist/agents/writer-prompts.js.map +1 -0
- package/dist/agents/writer.d.ts +103 -0
- package/dist/agents/writer.d.ts.map +1 -0
- package/dist/agents/writer.js +1052 -0
- package/dist/agents/writer.js.map +1 -0
- package/dist/index.d.ts +80 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +84 -0
- package/dist/index.js.map +1 -0
- package/dist/interaction/edit-controller.d.ts +55 -0
- package/dist/interaction/edit-controller.d.ts.map +1 -0
- package/dist/interaction/edit-controller.js +187 -0
- package/dist/interaction/edit-controller.js.map +1 -0
- package/dist/interaction/events.d.ts +45 -0
- package/dist/interaction/events.d.ts.map +1 -0
- package/dist/interaction/events.js +32 -0
- package/dist/interaction/events.js.map +1 -0
- package/dist/interaction/intents.d.ts +96 -0
- package/dist/interaction/intents.d.ts.map +1 -0
- package/dist/interaction/intents.js +58 -0
- package/dist/interaction/intents.js.map +1 -0
- package/dist/interaction/modes.d.ts +5 -0
- package/dist/interaction/modes.d.ts.map +1 -0
- package/dist/interaction/modes.js +7 -0
- package/dist/interaction/modes.js.map +1 -0
- package/dist/interaction/nl-router.d.ts +8 -0
- package/dist/interaction/nl-router.d.ts.map +1 -0
- package/dist/interaction/nl-router.js +218 -0
- package/dist/interaction/nl-router.js.map +1 -0
- package/dist/interaction/project-control.d.ts +85 -0
- package/dist/interaction/project-control.d.ts.map +1 -0
- package/dist/interaction/project-control.js +123 -0
- package/dist/interaction/project-control.js.map +1 -0
- package/dist/interaction/project-session-store.d.ts +7 -0
- package/dist/interaction/project-session-store.d.ts.map +1 -0
- package/dist/interaction/project-session-store.js +46 -0
- package/dist/interaction/project-session-store.js.map +1 -0
- package/dist/interaction/project-tools.d.ts +20 -0
- package/dist/interaction/project-tools.d.ts.map +1 -0
- package/dist/interaction/project-tools.js +527 -0
- package/dist/interaction/project-tools.js.map +1 -0
- package/dist/interaction/request-router.d.ts +3 -0
- package/dist/interaction/request-router.d.ts.map +1 -0
- package/dist/interaction/request-router.js +5 -0
- package/dist/interaction/request-router.js.map +1 -0
- package/dist/interaction/runtime.d.ts +54 -0
- package/dist/interaction/runtime.d.ts.map +1 -0
- package/dist/interaction/runtime.js +943 -0
- package/dist/interaction/runtime.js.map +1 -0
- package/dist/interaction/session.d.ts +352 -0
- package/dist/interaction/session.d.ts.map +1 -0
- package/dist/interaction/session.js +98 -0
- package/dist/interaction/session.js.map +1 -0
- package/dist/interaction/truth-authority.d.ts +4 -0
- package/dist/interaction/truth-authority.d.ts.map +1 -0
- package/dist/interaction/truth-authority.js +37 -0
- package/dist/interaction/truth-authority.js.map +1 -0
- package/dist/llm/provider.d.ts +87 -0
- package/dist/llm/provider.d.ts.map +1 -0
- package/dist/llm/provider.js +798 -0
- package/dist/llm/provider.js.map +1 -0
- package/dist/models/book-rules.d.ts +118 -0
- package/dist/models/book-rules.d.ts.map +1 -0
- package/dist/models/book-rules.js +55 -0
- package/dist/models/book-rules.js.map +1 -0
- package/dist/models/book.d.ts +51 -0
- package/dist/models/book.d.ts.map +1 -0
- package/dist/models/book.js +27 -0
- package/dist/models/book.js.map +1 -0
- package/dist/models/chapter.d.ts +136 -0
- package/dist/models/chapter.d.ts.map +1 -0
- package/dist/models/chapter.js +38 -0
- package/dist/models/chapter.js.map +1 -0
- package/dist/models/detection.d.ts +25 -0
- package/dist/models/detection.d.ts.map +1 -0
- package/dist/models/detection.js +2 -0
- package/dist/models/detection.js.map +1 -0
- package/dist/models/genre-profile.d.ts +45 -0
- package/dist/models/genre-profile.d.ts.map +1 -0
- package/dist/models/genre-profile.js +26 -0
- package/dist/models/genre-profile.js.map +1 -0
- package/dist/models/input-governance.d.ts +516 -0
- package/dist/models/input-governance.d.ts.map +1 -0
- package/dist/models/input-governance.js +112 -0
- package/dist/models/input-governance.js.map +1 -0
- package/dist/models/length-governance.d.ts +93 -0
- package/dist/models/length-governance.d.ts.map +1 -0
- package/dist/models/length-governance.js +34 -0
- package/dist/models/length-governance.js.map +1 -0
- package/dist/models/project.d.ts +475 -0
- package/dist/models/project.d.ts.map +1 -0
- package/dist/models/project.js +100 -0
- package/dist/models/project.js.map +1 -0
- package/dist/models/runtime-state.d.ts +588 -0
- package/dist/models/runtime-state.d.ts.map +1 -0
- package/dist/models/runtime-state.js +93 -0
- package/dist/models/runtime-state.js.map +1 -0
- package/dist/models/state.d.ts +48 -0
- package/dist/models/state.d.ts.map +1 -0
- package/dist/models/state.js +6 -0
- package/dist/models/state.js.map +1 -0
- package/dist/models/style-profile.d.ts +16 -0
- package/dist/models/style-profile.d.ts.map +1 -0
- package/dist/models/style-profile.js +2 -0
- package/dist/models/style-profile.js.map +1 -0
- package/dist/notify/dispatcher.d.ts +10 -0
- package/dist/notify/dispatcher.d.ts.map +1 -0
- package/dist/notify/dispatcher.js +55 -0
- package/dist/notify/dispatcher.js.map +1 -0
- package/dist/notify/feishu.d.ts +5 -0
- package/dist/notify/feishu.d.ts.map +1 -0
- package/dist/notify/feishu.js +26 -0
- package/dist/notify/feishu.js.map +1 -0
- package/dist/notify/telegram.d.ts +6 -0
- package/dist/notify/telegram.d.ts.map +1 -0
- package/dist/notify/telegram.js +17 -0
- package/dist/notify/telegram.js.map +1 -0
- package/dist/notify/webhook.d.ts +15 -0
- package/dist/notify/webhook.d.ts.map +1 -0
- package/dist/notify/webhook.js +28 -0
- package/dist/notify/webhook.js.map +1 -0
- package/dist/notify/wechat-work.d.ts +5 -0
- package/dist/notify/wechat-work.d.ts.map +1 -0
- package/dist/notify/wechat-work.js +15 -0
- package/dist/notify/wechat-work.js.map +1 -0
- package/dist/pipeline/agent.d.ts +15 -0
- package/dist/pipeline/agent.d.ts.map +1 -0
- package/dist/pipeline/agent.js +550 -0
- package/dist/pipeline/agent.js.map +1 -0
- package/dist/pipeline/chapter-persistence.d.ts +33 -0
- package/dist/pipeline/chapter-persistence.d.ts.map +1 -0
- package/dist/pipeline/chapter-persistence.js +35 -0
- package/dist/pipeline/chapter-persistence.js.map +1 -0
- package/dist/pipeline/chapter-review-cycle.d.ts +79 -0
- package/dist/pipeline/chapter-review-cycle.d.ts.map +1 -0
- package/dist/pipeline/chapter-review-cycle.js +97 -0
- package/dist/pipeline/chapter-review-cycle.js.map +1 -0
- package/dist/pipeline/chapter-state-recovery.d.ts +59 -0
- package/dist/pipeline/chapter-state-recovery.d.ts.map +1 -0
- package/dist/pipeline/chapter-state-recovery.js +133 -0
- package/dist/pipeline/chapter-state-recovery.js.map +1 -0
- package/dist/pipeline/chapter-truth-validation.d.ts +41 -0
- package/dist/pipeline/chapter-truth-validation.d.ts.map +1 -0
- package/dist/pipeline/chapter-truth-validation.js +67 -0
- package/dist/pipeline/chapter-truth-validation.js.map +1 -0
- package/dist/pipeline/detection-runner.d.ts +31 -0
- package/dist/pipeline/detection-runner.d.ts.map +1 -0
- package/dist/pipeline/detection-runner.js +109 -0
- package/dist/pipeline/detection-runner.js.map +1 -0
- package/dist/pipeline/persisted-governed-plan.d.ts +4 -0
- package/dist/pipeline/persisted-governed-plan.d.ts.map +1 -0
- package/dist/pipeline/persisted-governed-plan.js +85 -0
- package/dist/pipeline/persisted-governed-plan.js.map +1 -0
- package/dist/pipeline/runner.d.ts +212 -0
- package/dist/pipeline/runner.d.ts.map +1 -0
- package/dist/pipeline/runner.js +2265 -0
- package/dist/pipeline/runner.js.map +1 -0
- package/dist/pipeline/scheduler.d.ts +58 -0
- package/dist/pipeline/scheduler.d.ts.map +1 -0
- package/dist/pipeline/scheduler.js +322 -0
- package/dist/pipeline/scheduler.js.map +1 -0
- package/dist/state/manager.d.ts +48 -0
- package/dist/state/manager.d.ts.map +1 -0
- package/dist/state/manager.js +435 -0
- package/dist/state/manager.js.map +1 -0
- package/dist/state/memory-db.d.ts +77 -0
- package/dist/state/memory-db.d.ts.map +1 -0
- package/dist/state/memory-db.js +249 -0
- package/dist/state/memory-db.js.map +1 -0
- package/dist/state/runtime-state-store.d.ts +25 -0
- package/dist/state/runtime-state-store.d.ts.map +1 -0
- package/dist/state/runtime-state-store.js +108 -0
- package/dist/state/runtime-state-store.js.map +1 -0
- package/dist/state/state-bootstrap.d.ts +21 -0
- package/dist/state/state-bootstrap.d.ts.map +1 -0
- package/dist/state/state-bootstrap.js +434 -0
- package/dist/state/state-bootstrap.js.map +1 -0
- package/dist/state/state-projections.d.ts +5 -0
- package/dist/state/state-projections.d.ts.map +1 -0
- package/dist/state/state-projections.js +166 -0
- package/dist/state/state-projections.js.map +1 -0
- package/dist/state/state-reducer.d.ts +13 -0
- package/dist/state/state-reducer.d.ts.map +1 -0
- package/dist/state/state-reducer.js +194 -0
- package/dist/state/state-reducer.js.map +1 -0
- package/dist/state/state-validator.d.ts +12 -0
- package/dist/state/state-validator.d.ts.map +1 -0
- package/dist/state/state-validator.js +67 -0
- package/dist/state/state-validator.js.map +1 -0
- package/dist/utils/analytics.d.ts +39 -0
- package/dist/utils/analytics.d.ts.map +1 -0
- package/dist/utils/analytics.js +50 -0
- package/dist/utils/analytics.js.map +1 -0
- package/dist/utils/cadence-policy.d.ts +36 -0
- package/dist/utils/cadence-policy.d.ts.map +1 -0
- package/dist/utils/cadence-policy.js +38 -0
- package/dist/utils/cadence-policy.js.map +1 -0
- package/dist/utils/chapter-cadence.d.ts +34 -0
- package/dist/utils/chapter-cadence.d.ts.map +1 -0
- package/dist/utils/chapter-cadence.js +142 -0
- package/dist/utils/chapter-cadence.js.map +1 -0
- package/dist/utils/chapter-splitter.d.ts +18 -0
- package/dist/utils/chapter-splitter.d.ts.map +1 -0
- package/dist/utils/chapter-splitter.js +60 -0
- package/dist/utils/chapter-splitter.js.map +1 -0
- package/dist/utils/config-loader.d.ts +15 -0
- package/dist/utils/config-loader.d.ts.map +1 -0
- package/dist/utils/config-loader.js +136 -0
- package/dist/utils/config-loader.js.map +1 -0
- package/dist/utils/context-filter.d.ts +20 -0
- package/dist/utils/context-filter.d.ts.map +1 -0
- package/dist/utils/context-filter.js +134 -0
- package/dist/utils/context-filter.js.map +1 -0
- package/dist/utils/governed-context.d.ts +11 -0
- package/dist/utils/governed-context.d.ts.map +1 -0
- package/dist/utils/governed-context.js +42 -0
- package/dist/utils/governed-context.js.map +1 -0
- package/dist/utils/governed-working-set.d.ts +18 -0
- package/dist/utils/governed-working-set.d.ts.map +1 -0
- package/dist/utils/governed-working-set.js +296 -0
- package/dist/utils/governed-working-set.js.map +1 -0
- package/dist/utils/hook-agenda.d.ts +21 -0
- package/dist/utils/hook-agenda.d.ts.map +1 -0
- package/dist/utils/hook-agenda.js +95 -0
- package/dist/utils/hook-agenda.js.map +1 -0
- package/dist/utils/hook-arbiter.d.ts +15 -0
- package/dist/utils/hook-arbiter.d.ts.map +1 -0
- package/dist/utils/hook-arbiter.js +268 -0
- package/dist/utils/hook-arbiter.js.map +1 -0
- package/dist/utils/hook-governance.d.ts +28 -0
- package/dist/utils/hook-governance.d.ts.map +1 -0
- package/dist/utils/hook-governance.js +144 -0
- package/dist/utils/hook-governance.js.map +1 -0
- package/dist/utils/hook-health.d.ts +15 -0
- package/dist/utils/hook-health.d.ts.map +1 -0
- package/dist/utils/hook-health.js +128 -0
- package/dist/utils/hook-health.js.map +1 -0
- package/dist/utils/hook-lifecycle.d.ts +34 -0
- package/dist/utils/hook-lifecycle.d.ts.map +1 -0
- package/dist/utils/hook-lifecycle.js +125 -0
- package/dist/utils/hook-lifecycle.js.map +1 -0
- package/dist/utils/hook-policy.d.ts +74 -0
- package/dist/utils/hook-policy.d.ts.map +1 -0
- package/dist/utils/hook-policy.js +126 -0
- package/dist/utils/hook-policy.js.map +1 -0
- package/dist/utils/length-metrics.d.ts +10 -0
- package/dist/utils/length-metrics.d.ts.map +1 -0
- package/dist/utils/length-metrics.js +85 -0
- package/dist/utils/length-metrics.js.map +1 -0
- package/dist/utils/logger.d.ts +31 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +79 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/long-span-fatigue.d.ts +28 -0
- package/dist/utils/long-span-fatigue.d.ts.map +1 -0
- package/dist/utils/long-span-fatigue.js +406 -0
- package/dist/utils/long-span-fatigue.js.map +1 -0
- package/dist/utils/memory-retrieval.d.ts +25 -0
- package/dist/utils/memory-retrieval.d.ts.map +1 -0
- package/dist/utils/memory-retrieval.js +319 -0
- package/dist/utils/memory-retrieval.js.map +1 -0
- package/dist/utils/pov-filter.d.ts +30 -0
- package/dist/utils/pov-filter.d.ts.map +1 -0
- package/dist/utils/pov-filter.js +129 -0
- package/dist/utils/pov-filter.js.map +1 -0
- package/dist/utils/spot-fix-patches.d.ts +14 -0
- package/dist/utils/spot-fix-patches.d.ts.map +1 -0
- package/dist/utils/spot-fix-patches.js +75 -0
- package/dist/utils/spot-fix-patches.js.map +1 -0
- package/dist/utils/story-markdown.d.ts +13 -0
- package/dist/utils/story-markdown.d.ts.map +1 -0
- package/dist/utils/story-markdown.js +218 -0
- package/dist/utils/story-markdown.js.map +1 -0
- package/dist/utils/web-search.d.ts +23 -0
- package/dist/utils/web-search.d.ts.map +1 -0
- package/dist/utils/web-search.js +68 -0
- package/dist/utils/web-search.js.map +1 -0
- package/genres/cozy.md +43 -0
- package/genres/cultivation.md +42 -0
- package/genres/dungeon-core.md +40 -0
- package/genres/horror.md +51 -0
- package/genres/isekai.md +43 -0
- package/genres/litrpg.md +43 -0
- package/genres/other.md +24 -0
- package/genres/progression.md +41 -0
- package/genres/romantasy.md +45 -0
- package/genres/sci-fi.md +42 -0
- package/genres/system-apocalypse.md +40 -0
- package/genres/tower-climber.md +41 -0
- package/genres/urban.md +53 -0
- package/genres/xianxia.md +46 -0
- package/genres/xuanhuan.md +64 -0
- 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":"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"}
|
|
@@ -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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"}
|