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,142 @@
|
|
|
1
|
+
import { CADENCE_PRESSURE_THRESHOLDS, CADENCE_WINDOW_DEFAULTS, resolveCadencePressure, } from "./cadence-policy.js";
|
|
2
|
+
export const DEFAULT_CHAPTER_CADENCE_WINDOW = CADENCE_WINDOW_DEFAULTS.summaryLookback;
|
|
3
|
+
const HIGH_TENSION_KEYWORDS = [
|
|
4
|
+
"紧张", "冷硬", "压抑", "逼仄", "肃杀", "沉重", "凝重",
|
|
5
|
+
"冷峻", "压迫", "阴沉", "焦灼", "窒息", "凛冽", "锋利",
|
|
6
|
+
"克制", "危机", "对峙", "绷紧", "僵持", "杀意",
|
|
7
|
+
"tense", "cold", "oppressive", "grim", "ominous", "dark",
|
|
8
|
+
"bleak", "hostile", "threatening", "heavy", "suffocating",
|
|
9
|
+
];
|
|
10
|
+
const ENGLISH_STOP_WORDS = new Set([
|
|
11
|
+
"the", "and", "with", "from", "into", "after", "before",
|
|
12
|
+
"over", "under", "this", "that", "your", "their",
|
|
13
|
+
]);
|
|
14
|
+
export function analyzeChapterCadence(params) {
|
|
15
|
+
const recentRows = [...params.rows]
|
|
16
|
+
.sort((left, right) => left.chapter - right.chapter)
|
|
17
|
+
.slice(-CADENCE_WINDOW_DEFAULTS.summaryLookback);
|
|
18
|
+
return {
|
|
19
|
+
scenePressure: analyzeScenePressure(recentRows),
|
|
20
|
+
moodPressure: analyzeMoodPressure(recentRows),
|
|
21
|
+
titlePressure: analyzeTitlePressure(recentRows, params.language),
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
export function isHighTensionMood(mood) {
|
|
25
|
+
const lowerMood = mood.toLowerCase();
|
|
26
|
+
return HIGH_TENSION_KEYWORDS.some((keyword) => lowerMood.includes(keyword));
|
|
27
|
+
}
|
|
28
|
+
function analyzeScenePressure(rows) {
|
|
29
|
+
const types = rows
|
|
30
|
+
.map((row) => row.chapterType.trim())
|
|
31
|
+
.filter((value) => isMeaningfulValue(value));
|
|
32
|
+
if (types.length < 2) {
|
|
33
|
+
return undefined;
|
|
34
|
+
}
|
|
35
|
+
const repeatedType = types.at(-1);
|
|
36
|
+
if (!repeatedType) {
|
|
37
|
+
return undefined;
|
|
38
|
+
}
|
|
39
|
+
let streak = 0;
|
|
40
|
+
for (const type of [...types].reverse()) {
|
|
41
|
+
if (type.toLowerCase() !== repeatedType.toLowerCase()) {
|
|
42
|
+
break;
|
|
43
|
+
}
|
|
44
|
+
streak += 1;
|
|
45
|
+
}
|
|
46
|
+
const pressure = resolveCadencePressure({
|
|
47
|
+
count: streak,
|
|
48
|
+
total: types.length,
|
|
49
|
+
highThreshold: CADENCE_PRESSURE_THRESHOLDS.scene.highCount,
|
|
50
|
+
mediumThreshold: CADENCE_PRESSURE_THRESHOLDS.scene.mediumCount,
|
|
51
|
+
mediumWindowFloor: CADENCE_PRESSURE_THRESHOLDS.scene.mediumWindowFloor,
|
|
52
|
+
});
|
|
53
|
+
if (pressure) {
|
|
54
|
+
return { pressure, repeatedType, streak };
|
|
55
|
+
}
|
|
56
|
+
return undefined;
|
|
57
|
+
}
|
|
58
|
+
function analyzeMoodPressure(rows) {
|
|
59
|
+
const moods = rows
|
|
60
|
+
.map((row) => row.mood.trim())
|
|
61
|
+
.filter((value) => isMeaningfulValue(value));
|
|
62
|
+
if (moods.length < 2) {
|
|
63
|
+
return undefined;
|
|
64
|
+
}
|
|
65
|
+
const recentMoods = [];
|
|
66
|
+
let highTensionStreak = 0;
|
|
67
|
+
for (const mood of [...moods].reverse()) {
|
|
68
|
+
if (!isHighTensionMood(mood)) {
|
|
69
|
+
break;
|
|
70
|
+
}
|
|
71
|
+
recentMoods.unshift(mood);
|
|
72
|
+
highTensionStreak += 1;
|
|
73
|
+
}
|
|
74
|
+
const pressure = resolveCadencePressure({
|
|
75
|
+
count: highTensionStreak,
|
|
76
|
+
total: moods.length,
|
|
77
|
+
highThreshold: CADENCE_PRESSURE_THRESHOLDS.mood.highCount,
|
|
78
|
+
mediumThreshold: CADENCE_PRESSURE_THRESHOLDS.mood.mediumCount,
|
|
79
|
+
mediumWindowFloor: CADENCE_PRESSURE_THRESHOLDS.mood.mediumWindowFloor,
|
|
80
|
+
});
|
|
81
|
+
if (pressure) {
|
|
82
|
+
return { pressure, highTensionStreak, recentMoods };
|
|
83
|
+
}
|
|
84
|
+
return undefined;
|
|
85
|
+
}
|
|
86
|
+
function analyzeTitlePressure(rows, language) {
|
|
87
|
+
const titles = rows
|
|
88
|
+
.map((row) => row.title.trim())
|
|
89
|
+
.filter((value) => isMeaningfulValue(value));
|
|
90
|
+
if (titles.length < 2) {
|
|
91
|
+
return undefined;
|
|
92
|
+
}
|
|
93
|
+
const counts = new Map();
|
|
94
|
+
for (const title of titles) {
|
|
95
|
+
for (const token of extractTitleTokens(title, language)) {
|
|
96
|
+
counts.set(token, (counts.get(token) ?? 0) + 1);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
const repeated = [...counts.entries()]
|
|
100
|
+
.sort((left, right) => right[1] - left[1] || right[0].length - left[0].length || left[0].localeCompare(right[0]))
|
|
101
|
+
.find((entry) => entry[1] >= CADENCE_PRESSURE_THRESHOLDS.title.minimumRepeatedCount);
|
|
102
|
+
if (!repeated) {
|
|
103
|
+
return undefined;
|
|
104
|
+
}
|
|
105
|
+
const [repeatedToken, count] = repeated;
|
|
106
|
+
const pressure = resolveCadencePressure({
|
|
107
|
+
count,
|
|
108
|
+
total: titles.length,
|
|
109
|
+
highThreshold: CADENCE_PRESSURE_THRESHOLDS.title.highCount,
|
|
110
|
+
mediumThreshold: CADENCE_PRESSURE_THRESHOLDS.title.mediumCount,
|
|
111
|
+
mediumWindowFloor: CADENCE_PRESSURE_THRESHOLDS.title.mediumWindowFloor,
|
|
112
|
+
});
|
|
113
|
+
if (pressure) {
|
|
114
|
+
return { pressure, repeatedToken, count, recentTitles: titles };
|
|
115
|
+
}
|
|
116
|
+
return undefined;
|
|
117
|
+
}
|
|
118
|
+
function extractTitleTokens(title, language) {
|
|
119
|
+
if (language === "en") {
|
|
120
|
+
const words = title.match(/[a-z]{4,}/gi) ?? [];
|
|
121
|
+
return [...new Set(words
|
|
122
|
+
.map((word) => word.toLowerCase())
|
|
123
|
+
.filter((word) => !ENGLISH_STOP_WORDS.has(word)))];
|
|
124
|
+
}
|
|
125
|
+
const segments = title.match(/[\u4e00-\u9fff]{2,}/g) ?? [];
|
|
126
|
+
const tokens = new Set();
|
|
127
|
+
for (const segment of segments) {
|
|
128
|
+
for (let size = 2; size <= Math.min(4, segment.length); size += 1) {
|
|
129
|
+
for (let index = 0; index <= segment.length - size; index += 1) {
|
|
130
|
+
tokens.add(segment.slice(index, index + size));
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return [...tokens];
|
|
135
|
+
}
|
|
136
|
+
function isMeaningfulValue(value) {
|
|
137
|
+
const normalized = value.trim().toLowerCase();
|
|
138
|
+
if (!normalized)
|
|
139
|
+
return false;
|
|
140
|
+
return normalized !== "none" && normalized !== "(none)" && normalized !== "无";
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=chapter-cadence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chapter-cadence.js","sourceRoot":"","sources":["../../src/utils/chapter-cadence.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface SplitChapter {
|
|
2
|
+
readonly title: string;
|
|
3
|
+
readonly content: string;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Split a single text file into chapters by matching title lines.
|
|
7
|
+
*
|
|
8
|
+
* Default pattern matches:
|
|
9
|
+
* - "第一章 xxxx" / "第1章 xxxx"
|
|
10
|
+
* - "第一回 xxxx" / "第1回 xxxx"
|
|
11
|
+
* - "# 第1章 xxxx" / "## 第23章 xxxx"
|
|
12
|
+
* - "CHAPTER I." / "CHAPTER II."
|
|
13
|
+
*
|
|
14
|
+
* Each match marks the start of a new chapter. Content between matches
|
|
15
|
+
* belongs to the preceding chapter.
|
|
16
|
+
*/
|
|
17
|
+
export declare function splitChapters(text: string, pattern?: string): ReadonlyArray<SplitChapter>;
|
|
18
|
+
//# sourceMappingURL=chapter-splitter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chapter-splitter.d.ts","sourceRoot":"","sources":["../../src/utils/chapter-splitter.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,MAAM,GACf,aAAa,CAAC,YAAY,CAAC,CAsC7B"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Split a single text file into chapters by matching title lines.
|
|
3
|
+
*
|
|
4
|
+
* Default pattern matches:
|
|
5
|
+
* - "第一章 xxxx" / "第1章 xxxx"
|
|
6
|
+
* - "第一回 xxxx" / "第1回 xxxx"
|
|
7
|
+
* - "# 第1章 xxxx" / "## 第23章 xxxx"
|
|
8
|
+
* - "CHAPTER I." / "CHAPTER II."
|
|
9
|
+
*
|
|
10
|
+
* Each match marks the start of a new chapter. Content between matches
|
|
11
|
+
* belongs to the preceding chapter.
|
|
12
|
+
*/
|
|
13
|
+
export function splitChapters(text, pattern) {
|
|
14
|
+
const defaultPattern = /^#{0,2}\s*(?:第[零〇○O0一二三四五六七八九十百千万\d]+(?:章|回)(?:[::]|\s+)?\s*(.*)|Chapter\s+(?:\d+|[IVXLCDM]+)(?:\.|:|\s+)?\s*(.*))/i;
|
|
15
|
+
const regex = pattern ? new RegExp(pattern, "m") : defaultPattern;
|
|
16
|
+
const lines = text.split("\n");
|
|
17
|
+
const chapters = [];
|
|
18
|
+
for (let i = 0; i < lines.length; i++) {
|
|
19
|
+
const match = lines[i].match(regex);
|
|
20
|
+
if (match) {
|
|
21
|
+
chapters.push({
|
|
22
|
+
title: (match[1] ?? match[2] ?? "").trim(),
|
|
23
|
+
startLine: i,
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
if (chapters.length === 0) {
|
|
28
|
+
return [];
|
|
29
|
+
}
|
|
30
|
+
const result = [];
|
|
31
|
+
for (let i = 0; i < chapters.length; i++) {
|
|
32
|
+
const chapter = chapters[i];
|
|
33
|
+
const nextStart = i + 1 < chapters.length ? chapters[i + 1].startLine : lines.length;
|
|
34
|
+
// Content starts after the title line
|
|
35
|
+
const contentLines = lines.slice(chapter.startLine + 1, nextStart);
|
|
36
|
+
const content = stripTrailingLicense(contentLines.join("\n")).trim();
|
|
37
|
+
result.push({
|
|
38
|
+
title: chapter.title || inferFallbackTitle(lines[chapter.startLine] ?? "", i + 1),
|
|
39
|
+
content,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
return result;
|
|
43
|
+
}
|
|
44
|
+
function stripTrailingLicense(content) {
|
|
45
|
+
const trailerMatch = content.match(/^\s*Project Gutenberg(?:™|\(TM\))?.*$/im);
|
|
46
|
+
if (!trailerMatch || trailerMatch.index === undefined) {
|
|
47
|
+
return content;
|
|
48
|
+
}
|
|
49
|
+
return content.slice(0, trailerMatch.index).trimEnd();
|
|
50
|
+
}
|
|
51
|
+
function inferFallbackTitle(headingLine, chapterNumber) {
|
|
52
|
+
if (/chapter\s+(?:\d+|[ivxlcdm]+)/i.test(headingLine)) {
|
|
53
|
+
return `Chapter ${chapterNumber}`;
|
|
54
|
+
}
|
|
55
|
+
if (/第[零一二三四五六七八九十百千万\d]+回/.test(headingLine)) {
|
|
56
|
+
return `第${chapterNumber}回`;
|
|
57
|
+
}
|
|
58
|
+
return `第${chapterNumber}章`;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=chapter-splitter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chapter-splitter.js","sourceRoot":"","sources":["../../src/utils/chapter-splitter.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,aAAa,CAC3B,IAAY,EACZ,OAAgB;IAEhB,MAAM,cAAc,GAAG,qHAAqH,CAAC;IAC7I,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC;IAElE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,QAAQ,GAAgD,EAAE,CAAC;IAEjE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACrC,IAAI,KAAK,EAAE,CAAC;YACV,QAAQ,CAAC,IAAI,CAAC;gBACZ,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;gBAC1C,SAAS,EAAE,CAAC;aACb,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,MAAM,GAAmB,EAAE,CAAC;IAElC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAE,CAAC;QAC7B,MAAM,SAAS,GAAG,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;QAEtF,sCAAsC;QACtC,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,GAAG,CAAC,EAAE,SAAS,CAAC,CAAC;QACnE,MAAM,OAAO,GAAG,oBAAoB,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAErE,MAAM,CAAC,IAAI,CAAC;YACV,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,kBAAkB,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;YACjF,OAAO;SACR,CAAC,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,oBAAoB,CAAC,OAAe;IAC3C,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAC9E,IAAI,CAAC,YAAY,IAAI,YAAY,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QACtD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;AACxD,CAAC;AAED,SAAS,kBAAkB,CAAC,WAAmB,EAAE,aAAqB;IACpE,IAAI,+BAA+B,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;QACtD,OAAO,WAAW,aAAa,EAAE,CAAC;IACpC,CAAC;IAED,IAAI,uBAAuB,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;QAC9C,OAAO,IAAI,aAAa,GAAG,CAAC;IAC9B,CAAC;IAED,OAAO,IAAI,aAAa,GAAG,CAAC;AAC9B,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type ProjectConfig } from "../models/project.js";
|
|
2
|
+
export declare const GLOBAL_CONFIG_DIR: string;
|
|
3
|
+
export declare const GLOBAL_ENV_PATH: string;
|
|
4
|
+
export declare function isApiKeyOptionalForEndpoint(params: {
|
|
5
|
+
readonly provider?: string | undefined;
|
|
6
|
+
readonly baseUrl?: string | undefined;
|
|
7
|
+
}): boolean;
|
|
8
|
+
/**
|
|
9
|
+
* Load project config from inkos.json with .env overrides.
|
|
10
|
+
* Shared by CLI and Studio — single source of truth for config loading.
|
|
11
|
+
*/
|
|
12
|
+
export declare function loadProjectConfig(root: string, options?: {
|
|
13
|
+
readonly requireApiKey?: boolean;
|
|
14
|
+
}): Promise<ProjectConfig>;
|
|
15
|
+
//# sourceMappingURL=config-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../../src/utils/config-loader.ts"],"names":[],"mappings":"AAGA,OAAO,EAAuB,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE/E,eAAO,MAAM,iBAAiB,QAA4B,CAAC;AAC3D,eAAO,MAAM,eAAe,QAAkC,CAAC;AAE/D,wBAAgB,2BAA2B,CAAC,MAAM,EAAE;IAClD,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACvC,GAAG,OAAO,CAwBV;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;IAAE,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAA;CAAE,GAC7C,OAAO,CAAC,aAAa,CAAC,CAmFxB"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { readFile, access } from "node:fs/promises";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { ProjectConfigSchema } from "../models/project.js";
|
|
5
|
+
export const GLOBAL_CONFIG_DIR = join(homedir(), ".inkos");
|
|
6
|
+
export const GLOBAL_ENV_PATH = join(GLOBAL_CONFIG_DIR, ".env");
|
|
7
|
+
export function isApiKeyOptionalForEndpoint(params) {
|
|
8
|
+
if (params.provider === "anthropic") {
|
|
9
|
+
return false;
|
|
10
|
+
}
|
|
11
|
+
if (!params.baseUrl) {
|
|
12
|
+
return false;
|
|
13
|
+
}
|
|
14
|
+
try {
|
|
15
|
+
const url = new URL(params.baseUrl);
|
|
16
|
+
const hostname = url.hostname.toLowerCase();
|
|
17
|
+
return (hostname === "localhost"
|
|
18
|
+
|| hostname === "127.0.0.1"
|
|
19
|
+
|| hostname === "::1"
|
|
20
|
+
|| hostname === "0.0.0.0"
|
|
21
|
+
|| hostname === "host.docker.internal"
|
|
22
|
+
|| hostname.endsWith(".local")
|
|
23
|
+
|| isPrivateIpv4(hostname));
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Load project config from inkos.json with .env overrides.
|
|
31
|
+
* Shared by CLI and Studio — single source of truth for config loading.
|
|
32
|
+
*/
|
|
33
|
+
export async function loadProjectConfig(root, options) {
|
|
34
|
+
// Load global ~/.inkos/.env first, then project .env overrides
|
|
35
|
+
const { config: loadEnv } = await import("dotenv");
|
|
36
|
+
loadEnv({ path: GLOBAL_ENV_PATH });
|
|
37
|
+
loadEnv({ path: join(root, ".env"), override: true });
|
|
38
|
+
const configPath = join(root, "inkos.json");
|
|
39
|
+
try {
|
|
40
|
+
await access(configPath);
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
throw new Error(`inkos.json not found in ${root}.\nMake sure you are inside an InkOS project directory (cd into the project created by 'inkos init').`);
|
|
44
|
+
}
|
|
45
|
+
const raw = await readFile(configPath, "utf-8");
|
|
46
|
+
let config;
|
|
47
|
+
try {
|
|
48
|
+
config = JSON.parse(raw);
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
throw new Error(`inkos.json in ${root} is not valid JSON. Check the file for syntax errors.`);
|
|
52
|
+
}
|
|
53
|
+
// .env overrides inkos.json for LLM settings
|
|
54
|
+
const env = process.env;
|
|
55
|
+
const llm = (config.llm ?? {});
|
|
56
|
+
if (env.INKOS_LLM_PROVIDER)
|
|
57
|
+
llm.provider = env.INKOS_LLM_PROVIDER;
|
|
58
|
+
if (env.INKOS_LLM_BASE_URL)
|
|
59
|
+
llm.baseUrl = env.INKOS_LLM_BASE_URL;
|
|
60
|
+
if (env.INKOS_LLM_MODEL)
|
|
61
|
+
llm.model = env.INKOS_LLM_MODEL;
|
|
62
|
+
if (env.INKOS_LLM_TEMPERATURE)
|
|
63
|
+
llm.temperature = parseFloat(env.INKOS_LLM_TEMPERATURE);
|
|
64
|
+
if (env.INKOS_LLM_MAX_TOKENS)
|
|
65
|
+
llm.maxTokens = parseInt(env.INKOS_LLM_MAX_TOKENS, 10);
|
|
66
|
+
if (env.INKOS_LLM_THINKING_BUDGET)
|
|
67
|
+
llm.thinkingBudget = parseInt(env.INKOS_LLM_THINKING_BUDGET, 10);
|
|
68
|
+
// Extra params from env: INKOS_LLM_EXTRA_<key>=<value>
|
|
69
|
+
const extraFromEnv = {};
|
|
70
|
+
for (const [key, value] of Object.entries(env)) {
|
|
71
|
+
if (key.startsWith("INKOS_LLM_EXTRA_") && value) {
|
|
72
|
+
const paramName = key.slice("INKOS_LLM_EXTRA_".length);
|
|
73
|
+
// Auto-coerce: numbers, booleans, JSON objects
|
|
74
|
+
if (/^\d+(\.\d+)?$/.test(value))
|
|
75
|
+
extraFromEnv[paramName] = parseFloat(value);
|
|
76
|
+
else if (value === "true")
|
|
77
|
+
extraFromEnv[paramName] = true;
|
|
78
|
+
else if (value === "false")
|
|
79
|
+
extraFromEnv[paramName] = false;
|
|
80
|
+
else if (value.startsWith("{") || value.startsWith("[")) {
|
|
81
|
+
try {
|
|
82
|
+
extraFromEnv[paramName] = JSON.parse(value);
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
extraFromEnv[paramName] = value;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
else
|
|
89
|
+
extraFromEnv[paramName] = value;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
if (Object.keys(extraFromEnv).length > 0) {
|
|
93
|
+
llm.extra = { ...(llm.extra ?? {}), ...extraFromEnv };
|
|
94
|
+
}
|
|
95
|
+
if (env.INKOS_LLM_API_FORMAT)
|
|
96
|
+
llm.apiFormat = env.INKOS_LLM_API_FORMAT;
|
|
97
|
+
config.llm = llm;
|
|
98
|
+
// Global language override
|
|
99
|
+
if (env.INKOS_DEFAULT_LANGUAGE)
|
|
100
|
+
config.language = env.INKOS_DEFAULT_LANGUAGE;
|
|
101
|
+
// API key ONLY from env — never stored in inkos.json
|
|
102
|
+
const apiKey = env.INKOS_LLM_API_KEY;
|
|
103
|
+
const provider = typeof llm.provider === "string" ? llm.provider : undefined;
|
|
104
|
+
const baseUrl = typeof llm.baseUrl === "string" ? llm.baseUrl : undefined;
|
|
105
|
+
const apiKeyOptional = isApiKeyOptionalForEndpoint({ provider, baseUrl });
|
|
106
|
+
if (!apiKey && options?.requireApiKey !== false && !apiKeyOptional) {
|
|
107
|
+
throw new Error("INKOS_LLM_API_KEY not set. Run 'inkos config set-global' or add it to project .env file.");
|
|
108
|
+
}
|
|
109
|
+
if (options?.requireApiKey === false) {
|
|
110
|
+
llm.provider = typeof llm.provider === "string" && llm.provider.length > 0
|
|
111
|
+
? llm.provider
|
|
112
|
+
: "openai";
|
|
113
|
+
llm.baseUrl = typeof llm.baseUrl === "string" && llm.baseUrl.length > 0
|
|
114
|
+
? llm.baseUrl
|
|
115
|
+
: "https://example.invalid/v1";
|
|
116
|
+
llm.model = typeof llm.model === "string" && llm.model.length > 0
|
|
117
|
+
? llm.model
|
|
118
|
+
: "noop-model";
|
|
119
|
+
}
|
|
120
|
+
llm.apiKey = apiKey ?? "";
|
|
121
|
+
return ProjectConfigSchema.parse(config);
|
|
122
|
+
}
|
|
123
|
+
function isPrivateIpv4(hostname) {
|
|
124
|
+
const parts = hostname.split(".").map((segment) => Number.parseInt(segment, 10));
|
|
125
|
+
if (parts.length !== 4 || parts.some((part) => Number.isNaN(part) || part < 0 || part > 255)) {
|
|
126
|
+
return false;
|
|
127
|
+
}
|
|
128
|
+
if (parts[0] === 10)
|
|
129
|
+
return true;
|
|
130
|
+
if (parts[0] === 192 && parts[1] === 168)
|
|
131
|
+
return true;
|
|
132
|
+
if (parts[0] === 172 && parts[1] >= 16 && parts[1] <= 31)
|
|
133
|
+
return true;
|
|
134
|
+
return false;
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=config-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-loader.js","sourceRoot":"","sources":["../../src/utils/config-loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Smart context filtering for Writer and Auditor prompts.
|
|
3
|
+
*
|
|
4
|
+
* Reduces noise by injecting only relevant parts of truth files.
|
|
5
|
+
* Every filter falls back to the full input if filtering would empty it.
|
|
6
|
+
*/
|
|
7
|
+
/** Filter pending_hooks: remove resolved/closed hooks. */
|
|
8
|
+
export declare function filterHooks(hooks: string): string;
|
|
9
|
+
/** Filter chapter_summaries: keep only the most recent N chapters. */
|
|
10
|
+
export declare function filterSummaries(summaries: string, currentChapter: number, keepRecent?: 4): string;
|
|
11
|
+
/** Filter subplot_board: remove closed/resolved subplots. */
|
|
12
|
+
export declare function filterSubplots(board: string): string;
|
|
13
|
+
/** Filter emotional_arcs: keep only the most recent N chapters. */
|
|
14
|
+
export declare function filterEmotionalArcs(arcs: string, currentChapter: number, keepRecent?: 4): string;
|
|
15
|
+
/**
|
|
16
|
+
* Filter character_matrix: keep only characters mentioned in the volume outline
|
|
17
|
+
* current section + protagonist.
|
|
18
|
+
*/
|
|
19
|
+
export declare function filterCharacterMatrix(matrix: string, volumeOutline: string, protagonistName?: string): string;
|
|
20
|
+
//# sourceMappingURL=context-filter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-filter.d.ts","sourceRoot":"","sources":["../../src/utils/context-filter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,0DAA0D;AAC1D,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMjD;AAED,sEAAsE;AACtE,wBAAgB,eAAe,CAC7B,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,MAAM,EACtB,UAAU,IAAiC,GAC1C,MAAM,CAOR;AAED,6DAA6D;AAC7D,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMpD;AAED,mEAAmE;AACnE,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EACZ,cAAc,EAAE,MAAM,EACtB,UAAU,IAAiC,GAC1C,MAAM,CAOR;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,MAAM,EACrB,eAAe,CAAC,EAAE,MAAM,GACvB,MAAM,CAyBR"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Smart context filtering for Writer and Auditor prompts.
|
|
3
|
+
*
|
|
4
|
+
* Reduces noise by injecting only relevant parts of truth files.
|
|
5
|
+
* Every filter falls back to the full input if filtering would empty it.
|
|
6
|
+
*/
|
|
7
|
+
import { DEFAULT_CHAPTER_CADENCE_WINDOW } from "./chapter-cadence.js";
|
|
8
|
+
/** Filter pending_hooks: remove resolved/closed hooks. */
|
|
9
|
+
export function filterHooks(hooks) {
|
|
10
|
+
if (!hooks || hooks === "(文件尚未创建)")
|
|
11
|
+
return hooks;
|
|
12
|
+
return filterTableRows(hooks, (row) => {
|
|
13
|
+
const lower = row.toLowerCase();
|
|
14
|
+
return !lower.includes("已回收") && !lower.includes("resolved") && !lower.includes("closed");
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
/** Filter chapter_summaries: keep only the most recent N chapters. */
|
|
18
|
+
export function filterSummaries(summaries, currentChapter, keepRecent = DEFAULT_CHAPTER_CADENCE_WINDOW) {
|
|
19
|
+
if (!summaries || summaries === "(文件尚未创建)")
|
|
20
|
+
return summaries;
|
|
21
|
+
return filterTableRows(summaries, (row) => {
|
|
22
|
+
const match = row.match(/\|\s*(\d+)\s*\|/);
|
|
23
|
+
if (!match)
|
|
24
|
+
return true;
|
|
25
|
+
return parseInt(match[1], 10) > currentChapter - keepRecent;
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
/** Filter subplot_board: remove closed/resolved subplots. */
|
|
29
|
+
export function filterSubplots(board) {
|
|
30
|
+
if (!board || board === "(文件尚未创建)")
|
|
31
|
+
return board;
|
|
32
|
+
return filterTableRows(board, (row) => {
|
|
33
|
+
const lower = row.toLowerCase();
|
|
34
|
+
return !lower.includes("已回收") && !lower.includes("closed") && !lower.includes("resolved") && !lower.includes("已完结");
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
/** Filter emotional_arcs: keep only the most recent N chapters. */
|
|
38
|
+
export function filterEmotionalArcs(arcs, currentChapter, keepRecent = DEFAULT_CHAPTER_CADENCE_WINDOW) {
|
|
39
|
+
if (!arcs || arcs === "(文件尚未创建)")
|
|
40
|
+
return arcs;
|
|
41
|
+
return filterTableRows(arcs, (row) => {
|
|
42
|
+
const match = row.match(/\|\s*(\d+)\s*\|/);
|
|
43
|
+
if (!match)
|
|
44
|
+
return true;
|
|
45
|
+
return parseInt(match[1], 10) > currentChapter - keepRecent;
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Filter character_matrix: keep only characters mentioned in the volume outline
|
|
50
|
+
* current section + protagonist.
|
|
51
|
+
*/
|
|
52
|
+
export function filterCharacterMatrix(matrix, volumeOutline, protagonistName) {
|
|
53
|
+
if (!matrix || matrix === "(文件尚未创建)")
|
|
54
|
+
return matrix;
|
|
55
|
+
// Extract names from outline
|
|
56
|
+
const names = extractNames(volumeOutline);
|
|
57
|
+
if (protagonistName)
|
|
58
|
+
names.add(protagonistName);
|
|
59
|
+
if (names.size === 0)
|
|
60
|
+
return matrix;
|
|
61
|
+
// Split into sections (### 角色档案, ### 相遇记录, ### 信息边界)
|
|
62
|
+
const sections = matrix.split(/(?=^###)/m);
|
|
63
|
+
const filtered = sections.map((section) => {
|
|
64
|
+
const result = filterTableRows(section, (row) => {
|
|
65
|
+
for (const name of names) {
|
|
66
|
+
if (row.includes(name))
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
return false;
|
|
70
|
+
});
|
|
71
|
+
// Keep section even if no matching rows (preserve headers for structure)
|
|
72
|
+
return result;
|
|
73
|
+
});
|
|
74
|
+
const result = filtered.join("\n");
|
|
75
|
+
// Fallback: if filtering removed all data rows, return original
|
|
76
|
+
const dataRowCount = result.split("\n").filter((l) => l.startsWith("|") && !l.includes("---") && !isHeaderRow(l)).length;
|
|
77
|
+
return dataRowCount > 0 ? result : matrix;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Extract character names from text.
|
|
81
|
+
* Chinese: 2-4 char sequences before punctuation.
|
|
82
|
+
* English: Capitalized words 3+ chars.
|
|
83
|
+
*/
|
|
84
|
+
function extractNames(text) {
|
|
85
|
+
const names = new Set();
|
|
86
|
+
// Chinese names
|
|
87
|
+
const cnRegex = /[\u4e00-\u9fff]{2,4}(?=[,、。:\s]|$)/g;
|
|
88
|
+
let match;
|
|
89
|
+
while ((match = cnRegex.exec(text)) !== null) {
|
|
90
|
+
names.add(match[0]);
|
|
91
|
+
}
|
|
92
|
+
// English names
|
|
93
|
+
const enRegex = /\b[A-Z][a-z]{2,}\b/g;
|
|
94
|
+
while ((match = enRegex.exec(text)) !== null) {
|
|
95
|
+
names.add(match[0]);
|
|
96
|
+
}
|
|
97
|
+
return names;
|
|
98
|
+
}
|
|
99
|
+
// ---------------------------------------------------------------------------
|
|
100
|
+
// Internal helpers
|
|
101
|
+
// ---------------------------------------------------------------------------
|
|
102
|
+
function isHeaderRow(line) {
|
|
103
|
+
// First data-like row in a table (contains column names)
|
|
104
|
+
return /^\|\s*(章节|角色|支线|hook_id|Chapter|Character|Subplot)/i.test(line);
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Generic markdown table row filter.
|
|
108
|
+
* Keeps header rows + separator rows + rows passing the predicate.
|
|
109
|
+
* Falls back to original if filtering empties all data rows.
|
|
110
|
+
*/
|
|
111
|
+
function filterTableRows(content, predicate) {
|
|
112
|
+
const lines = content.split("\n");
|
|
113
|
+
const nonTableLines = [];
|
|
114
|
+
const headerLines = [];
|
|
115
|
+
const dataLines = [];
|
|
116
|
+
for (const line of lines) {
|
|
117
|
+
if (!line.startsWith("|")) {
|
|
118
|
+
nonTableLines.push(line);
|
|
119
|
+
}
|
|
120
|
+
else if (line.includes("---") || isHeaderRow(line)) {
|
|
121
|
+
headerLines.push(line);
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
dataLines.push(line);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
const filtered = dataLines.filter(predicate);
|
|
128
|
+
// Fallback: if no rows pass, return original
|
|
129
|
+
if (filtered.length === 0 && dataLines.length > 0) {
|
|
130
|
+
return content;
|
|
131
|
+
}
|
|
132
|
+
return [...nonTableLines, ...headerLines, ...filtered].join("\n");
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=context-filter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-filter.js","sourceRoot":"","sources":["../../src/utils/context-filter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,8BAA8B,EAAE,MAAM,sBAAsB,CAAC;AAEtE,0DAA0D;AAC1D,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,IAAI,CAAC,KAAK,IAAI,KAAK,KAAK,UAAU;QAAE,OAAO,KAAK,CAAC;IACjD,OAAO,eAAe,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE;QACpC,MAAM,KAAK,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;QAChC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC5F,CAAC,CAAC,CAAC;AACL,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,eAAe,CAC7B,SAAiB,EACjB,cAAsB,EACtB,UAAU,GAAG,8BAA8B;IAE3C,IAAI,CAAC,SAAS,IAAI,SAAS,KAAK,UAAU;QAAE,OAAO,SAAS,CAAC;IAC7D,OAAO,eAAe,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,EAAE;QACxC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;QAC3C,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QACxB,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC,GAAG,cAAc,GAAG,UAAU,CAAC;IAC/D,CAAC,CAAC,CAAC;AACL,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,IAAI,CAAC,KAAK,IAAI,KAAK,KAAK,UAAU;QAAE,OAAO,KAAK,CAAC;IACjD,OAAO,eAAe,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE;QACpC,MAAM,KAAK,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;QAChC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACtH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,mEAAmE;AACnE,MAAM,UAAU,mBAAmB,CACjC,IAAY,EACZ,cAAsB,EACtB,UAAU,GAAG,8BAA8B;IAE3C,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,UAAU;QAAE,OAAO,IAAI,CAAC;IAC9C,OAAO,eAAe,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE;QACnC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;QAC3C,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QACxB,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC,GAAG,cAAc,GAAG,UAAU,CAAC;IAC/D,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CACnC,MAAc,EACd,aAAqB,EACrB,eAAwB;IAExB,IAAI,CAAC,MAAM,IAAI,MAAM,KAAK,UAAU;QAAE,OAAO,MAAM,CAAC;IAEpD,6BAA6B;IAC7B,MAAM,KAAK,GAAG,YAAY,CAAC,aAAa,CAAC,CAAC;IAC1C,IAAI,eAAe;QAAE,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAChD,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC;IAEpC,qDAAqD;IACrD,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;QACxC,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YAC9C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC;oBAAE,OAAO,IAAI,CAAC;YACtC,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC,CAAC,CAAC;QACH,yEAAyE;QACzE,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnC,gEAAgE;IAChE,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IACzH,OAAO,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;AAC5C,CAAC;AAED;;;;GAIG;AACH,SAAS,YAAY,CAAC,IAAY;IAChC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAEhC,gBAAgB;IAChB,MAAM,OAAO,GAAG,qCAAqC,CAAC;IACtD,IAAI,KAA6B,CAAC;IAClC,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAC7C,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACtB,CAAC;IAED,gBAAgB;IAChB,MAAM,OAAO,GAAG,qBAAqB,CAAC;IACtC,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAC7C,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACtB,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E,SAAS,WAAW,CAAC,IAAY;IAC/B,yDAAyD;IACzD,OAAO,qDAAqD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1E,CAAC;AAED;;;;GAIG;AACH,SAAS,eAAe,CAAC,OAAe,EAAE,SAAmC;IAC3E,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,aAAa,GAAa,EAAE,CAAC;IACnC,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,MAAM,SAAS,GAAa,EAAE,CAAC;IAE/B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1B,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;aAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;YACrD,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC;aAAM,CAAC;YACN,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAE7C,6CAA6C;IAC7C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,OAAO,CAAC,GAAG,aAAa,EAAE,GAAG,WAAW,EAAE,GAAG,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACpE,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ContextPackage } from "../models/input-governance.js";
|
|
2
|
+
export declare function buildGovernedMemoryEvidenceBlocks(contextPackage: ContextPackage, language?: "zh" | "en"): {
|
|
3
|
+
readonly hookDebtBlock?: string;
|
|
4
|
+
readonly hooksBlock?: string;
|
|
5
|
+
readonly summariesBlock?: string;
|
|
6
|
+
readonly volumeSummariesBlock?: string;
|
|
7
|
+
readonly titleHistoryBlock?: string;
|
|
8
|
+
readonly moodTrailBlock?: string;
|
|
9
|
+
readonly canonBlock?: string;
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=governed-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"governed-context.d.ts","sourceRoot":"","sources":["../../src/utils/governed-context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAEpE,wBAAgB,iCAAiC,CAC/C,cAAc,EAAE,cAAc,EAC9B,QAAQ,CAAC,EAAE,IAAI,GAAG,IAAI,GACrB;IACD,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IACvC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B,CAqEA"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
export function buildGovernedMemoryEvidenceBlocks(contextPackage, language) {
|
|
2
|
+
const resolvedLanguage = language ?? "zh";
|
|
3
|
+
const hookEntries = contextPackage.selectedContext.filter((entry) => entry.source.startsWith("story/pending_hooks.md#"));
|
|
4
|
+
const hookDebtEntries = contextPackage.selectedContext.filter((entry) => entry.source.startsWith("runtime/hook_debt#"));
|
|
5
|
+
const summaryEntries = contextPackage.selectedContext.filter((entry) => entry.source.startsWith("story/chapter_summaries.md#"));
|
|
6
|
+
const volumeSummaryEntries = contextPackage.selectedContext.filter((entry) => entry.source.startsWith("story/volume_summaries.md#"));
|
|
7
|
+
const titleHistoryEntries = contextPackage.selectedContext.filter((entry) => entry.source === "story/chapter_summaries.md#recent_titles");
|
|
8
|
+
const moodTrailEntries = contextPackage.selectedContext.filter((entry) => entry.source === "story/chapter_summaries.md#recent_mood_type_trail");
|
|
9
|
+
const canonEntries = contextPackage.selectedContext.filter((entry) => entry.source === "story/parent_canon.md"
|
|
10
|
+
|| entry.source === "story/fanfic_canon.md");
|
|
11
|
+
return {
|
|
12
|
+
hookDebtBlock: hookDebtEntries.length > 0
|
|
13
|
+
? renderHookDebtBlock(resolvedLanguage === "en" ? "Hook Debt Briefs" : "Hook Debt Briefs", hookDebtEntries)
|
|
14
|
+
: undefined,
|
|
15
|
+
hooksBlock: hookEntries.length > 0
|
|
16
|
+
? renderEvidenceBlock(resolvedLanguage === "en" ? "Selected Hook Evidence" : "已选伏笔证据", hookEntries)
|
|
17
|
+
: undefined,
|
|
18
|
+
summariesBlock: summaryEntries.length > 0
|
|
19
|
+
? renderEvidenceBlock(resolvedLanguage === "en" ? "Selected Chapter Summary Evidence" : "已选章节摘要证据", summaryEntries)
|
|
20
|
+
: undefined,
|
|
21
|
+
volumeSummariesBlock: volumeSummaryEntries.length > 0
|
|
22
|
+
? renderEvidenceBlock(resolvedLanguage === "en" ? "Selected Volume Summary Evidence" : "已选卷级摘要证据", volumeSummaryEntries)
|
|
23
|
+
: undefined,
|
|
24
|
+
titleHistoryBlock: titleHistoryEntries.length > 0
|
|
25
|
+
? renderEvidenceBlock(resolvedLanguage === "en" ? "Recent Title History" : "近期标题历史", titleHistoryEntries)
|
|
26
|
+
: undefined,
|
|
27
|
+
moodTrailBlock: moodTrailEntries.length > 0
|
|
28
|
+
? renderEvidenceBlock(resolvedLanguage === "en" ? "Recent Mood / Chapter Type Trail" : "近期情绪/章节类型轨迹", moodTrailEntries)
|
|
29
|
+
: undefined,
|
|
30
|
+
canonBlock: canonEntries.length > 0
|
|
31
|
+
? renderEvidenceBlock(resolvedLanguage === "en" ? "Canon Evidence" : "正典约束证据", canonEntries)
|
|
32
|
+
: undefined,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
function renderHookDebtBlock(heading, entries) {
|
|
36
|
+
return `\n## ${heading}\n${entries.map((entry) => `- ${entry.excerpt ?? entry.reason}`).join("\n")}\n`;
|
|
37
|
+
}
|
|
38
|
+
function renderEvidenceBlock(heading, entries) {
|
|
39
|
+
const lines = entries.map((entry) => `- ${entry.source}: ${entry.excerpt ?? entry.reason}`);
|
|
40
|
+
return `\n## ${heading}\n${lines.join("\n")}\n`;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=governed-context.js.map
|