@actalk/inkos-core 1.0.2 → 1.1.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/architect.d.ts +4 -2
- package/dist/agents/architect.d.ts.map +1 -1
- package/dist/agents/architect.js +59 -13
- package/dist/agents/architect.js.map +1 -1
- package/dist/agents/chapter-analyzer.js +2 -2
- package/dist/agents/composer.d.ts +8 -0
- package/dist/agents/composer.d.ts.map +1 -1
- package/dist/agents/composer.js +170 -5
- package/dist/agents/composer.js.map +1 -1
- package/dist/agents/continuity.js +8 -8
- package/dist/agents/continuity.js.map +1 -1
- package/dist/agents/fanfic-canon-importer.d.ts +1 -0
- package/dist/agents/fanfic-canon-importer.d.ts.map +1 -1
- package/dist/agents/fanfic-canon-importer.js +19 -1
- package/dist/agents/fanfic-canon-importer.js.map +1 -1
- 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/planner.d.ts +15 -0
- package/dist/agents/planner.d.ts.map +1 -1
- package/dist/agents/planner.js +247 -36
- package/dist/agents/planner.js.map +1 -1
- package/dist/agents/post-write-validator.d.ts +3 -1
- package/dist/agents/post-write-validator.d.ts.map +1 -1
- package/dist/agents/post-write-validator.js +165 -12
- package/dist/agents/post-write-validator.js.map +1 -1
- package/dist/agents/settler-prompts.d.ts +1 -0
- package/dist/agents/settler-prompts.d.ts.map +1 -1
- package/dist/agents/settler-prompts.js +8 -1
- package/dist/agents/settler-prompts.js.map +1 -1
- package/dist/agents/writer-prompts.js +10 -4
- package/dist/agents/writer-prompts.js.map +1 -1
- package/dist/agents/writer.d.ts +15 -0
- package/dist/agents/writer.d.ts.map +1 -1
- package/dist/agents/writer.js +181 -15
- package/dist/agents/writer.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/llm/provider.d.ts.map +1 -1
- package/dist/llm/provider.js +25 -1
- package/dist/llm/provider.js.map +1 -1
- package/dist/models/chapter.d.ts +4 -4
- package/dist/models/chapter.d.ts.map +1 -1
- package/dist/models/chapter.js +1 -0
- package/dist/models/chapter.js.map +1 -1
- package/dist/models/input-governance.d.ts +165 -0
- package/dist/models/input-governance.d.ts.map +1 -1
- package/dist/models/input-governance.js +34 -0
- package/dist/models/input-governance.js.map +1 -1
- package/dist/models/project.d.ts +8 -0
- package/dist/models/project.d.ts.map +1 -1
- package/dist/models/project.js +1 -0
- package/dist/models/project.js.map +1 -1
- package/dist/models/runtime-state.d.ts +30 -0
- package/dist/models/runtime-state.d.ts.map +1 -1
- package/dist/models/runtime-state.js +9 -0
- package/dist/models/runtime-state.js.map +1 -1
- 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 +132 -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/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 +10 -7
- package/dist/pipeline/runner.d.ts.map +1 -1
- package/dist/pipeline/runner.js +459 -283
- package/dist/pipeline/runner.js.map +1 -1
- package/dist/state/manager.d.ts +8 -0
- package/dist/state/manager.d.ts.map +1 -1
- package/dist/state/manager.js +106 -9
- package/dist/state/manager.js.map +1 -1
- package/dist/state/memory-db.d.ts +2 -0
- package/dist/state/memory-db.d.ts.map +1 -1
- package/dist/state/memory-db.js +13 -2
- package/dist/state/memory-db.js.map +1 -1
- package/dist/state/runtime-state-store.d.ts.map +1 -1
- package/dist/state/runtime-state-store.js +1 -0
- package/dist/state/runtime-state-store.js.map +1 -1
- package/dist/state/state-bootstrap.d.ts +2 -5
- package/dist/state/state-bootstrap.d.ts.map +1 -1
- package/dist/state/state-bootstrap.js +61 -141
- package/dist/state/state-bootstrap.js.map +1 -1
- package/dist/state/state-projections.d.ts.map +1 -1
- package/dist/state/state-projections.js +6 -4
- package/dist/state/state-projections.js.map +1 -1
- package/dist/state/state-reducer.d.ts.map +1 -1
- package/dist/state/state-reducer.js +6 -0
- package/dist/state/state-reducer.js.map +1 -1
- 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/context-filter.d.ts +2 -2
- package/dist/utils/context-filter.d.ts.map +1 -1
- package/dist/utils/context-filter.js +3 -2
- package/dist/utils/context-filter.js.map +1 -1
- package/dist/utils/governed-context.d.ts +4 -0
- package/dist/utils/governed-context.d.ts.map +1 -1
- package/dist/utils/governed-context.js +20 -0
- package/dist/utils/governed-context.js.map +1 -1
- package/dist/utils/governed-working-set.d.ts.map +1 -1
- package/dist/utils/governed-working-set.js +2 -1
- package/dist/utils/governed-working-set.js.map +1 -1
- 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.map +1 -1
- package/dist/utils/hook-arbiter.js +7 -0
- package/dist/utils/hook-arbiter.js.map +1 -1
- package/dist/utils/hook-governance.d.ts +2 -0
- package/dist/utils/hook-governance.d.ts.map +1 -1
- package/dist/utils/hook-governance.js +19 -3
- package/dist/utils/hook-governance.js.map +1 -1
- package/dist/utils/hook-health.d.ts +1 -0
- package/dist/utils/hook-health.d.ts.map +1 -1
- package/dist/utils/hook-health.js +85 -26
- package/dist/utils/hook-health.js.map +1 -1
- 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/long-span-fatigue.d.ts.map +1 -1
- package/dist/utils/long-span-fatigue.js +75 -28
- package/dist/utils/long-span-fatigue.js.map +1 -1
- package/dist/utils/memory-retrieval.d.ts +2 -16
- package/dist/utils/memory-retrieval.d.ts.map +1 -1
- package/dist/utils/memory-retrieval.js +14 -269
- package/dist/utils/memory-retrieval.js.map +1 -1
- 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/package.json +1 -1
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { resolveHookPayoffTiming } from "./hook-lifecycle.js";
|
|
2
|
+
export const DEFAULT_HOOK_LOOKAHEAD_CHAPTERS = 3;
|
|
3
|
+
/**
|
|
4
|
+
* Build the hook agenda using simple stalest-first sorting.
|
|
5
|
+
* No lifecycle pressure formulas — just pick the hooks that have been
|
|
6
|
+
* dormant the longest and the ones that are ripe for resolution.
|
|
7
|
+
*/
|
|
8
|
+
export function buildPlannerHookAgenda(params) {
|
|
9
|
+
const agendaHooks = params.hooks
|
|
10
|
+
.map(normalizeStoredHook)
|
|
11
|
+
.filter((hook) => !isFuturePlannedHook(hook, params.chapterNumber, 0))
|
|
12
|
+
.filter((hook) => hook.status !== "resolved" && hook.status !== "deferred");
|
|
13
|
+
// mustAdvance: stalest first (lowest lastAdvancedChapter)
|
|
14
|
+
const mustAdvanceHooks = agendaHooks
|
|
15
|
+
.slice()
|
|
16
|
+
.sort((left, right) => (left.lastAdvancedChapter - right.lastAdvancedChapter
|
|
17
|
+
|| left.startChapter - right.startChapter
|
|
18
|
+
|| left.hookId.localeCompare(right.hookId)))
|
|
19
|
+
.slice(0, params.maxMustAdvance ?? 2);
|
|
20
|
+
// staleDebt: hooks not advanced for 10+ chapters
|
|
21
|
+
const staleThreshold = params.chapterNumber - 10;
|
|
22
|
+
const staleDebtHooks = agendaHooks
|
|
23
|
+
.filter((hook) => {
|
|
24
|
+
const lastTouch = Math.max(hook.startChapter, hook.lastAdvancedChapter);
|
|
25
|
+
return lastTouch > 0 && lastTouch <= staleThreshold;
|
|
26
|
+
})
|
|
27
|
+
.sort((left, right) => (left.lastAdvancedChapter - right.lastAdvancedChapter
|
|
28
|
+
|| left.startChapter - right.startChapter
|
|
29
|
+
|| left.hookId.localeCompare(right.hookId)))
|
|
30
|
+
.slice(0, params.maxStaleDebt ?? 2);
|
|
31
|
+
// eligibleResolve: started 3+ chapters ago AND recently advanced
|
|
32
|
+
const eligibleResolveHooks = agendaHooks
|
|
33
|
+
.filter((hook) => hook.startChapter <= params.chapterNumber - 3)
|
|
34
|
+
.filter((hook) => hook.lastAdvancedChapter >= params.chapterNumber - 2)
|
|
35
|
+
.sort((left, right) => (left.startChapter - right.startChapter
|
|
36
|
+
|| right.lastAdvancedChapter - left.lastAdvancedChapter
|
|
37
|
+
|| left.hookId.localeCompare(right.hookId)))
|
|
38
|
+
.slice(0, params.maxEligibleResolve ?? 1);
|
|
39
|
+
const avoidNewHookFamilies = [...new Set([
|
|
40
|
+
...staleDebtHooks.map((hook) => hook.type.trim()).filter(Boolean),
|
|
41
|
+
...mustAdvanceHooks.map((hook) => hook.type.trim()).filter(Boolean),
|
|
42
|
+
...eligibleResolveHooks.map((hook) => hook.type.trim()).filter(Boolean),
|
|
43
|
+
])].slice(0, 3);
|
|
44
|
+
return {
|
|
45
|
+
pressureMap: [],
|
|
46
|
+
mustAdvance: mustAdvanceHooks.map((hook) => hook.hookId),
|
|
47
|
+
eligibleResolve: eligibleResolveHooks.map((hook) => hook.hookId),
|
|
48
|
+
staleDebt: staleDebtHooks.map((hook) => hook.hookId),
|
|
49
|
+
avoidNewHookFamilies,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
function normalizeStoredHook(hook) {
|
|
53
|
+
return {
|
|
54
|
+
hookId: hook.hookId,
|
|
55
|
+
startChapter: Math.max(0, hook.startChapter),
|
|
56
|
+
type: hook.type,
|
|
57
|
+
status: normalizeStoredHookStatus(hook.status),
|
|
58
|
+
lastAdvancedChapter: Math.max(0, hook.lastAdvancedChapter),
|
|
59
|
+
expectedPayoff: hook.expectedPayoff,
|
|
60
|
+
payoffTiming: resolveHookPayoffTiming(hook),
|
|
61
|
+
notes: hook.notes,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
function normalizeStoredHookStatus(status) {
|
|
65
|
+
if (/^(resolved|closed|done|已回收|已解决)$/i.test(status.trim()))
|
|
66
|
+
return "resolved";
|
|
67
|
+
if (/^(deferred|paused|hold|延后|延期|搁置|暂缓)$/i.test(status.trim()))
|
|
68
|
+
return "deferred";
|
|
69
|
+
if (/^(progressing|advanced|重大推进|持续推进)$/i.test(status.trim()))
|
|
70
|
+
return "progressing";
|
|
71
|
+
return "open";
|
|
72
|
+
}
|
|
73
|
+
export function filterActiveHooks(hooks) {
|
|
74
|
+
return hooks.filter((hook) => normalizeStoredHookStatus(hook.status) !== "resolved");
|
|
75
|
+
}
|
|
76
|
+
export function isFuturePlannedHook(hook, chapterNumber, lookahead = DEFAULT_HOOK_LOOKAHEAD_CHAPTERS) {
|
|
77
|
+
return hook.lastAdvancedChapter <= 0 && hook.startChapter > chapterNumber + lookahead;
|
|
78
|
+
}
|
|
79
|
+
export function isHookWithinChapterWindow(hook, chapterNumber, recentWindow = 5, lookahead = DEFAULT_HOOK_LOOKAHEAD_CHAPTERS) {
|
|
80
|
+
const recentCutoff = Math.max(0, chapterNumber - recentWindow);
|
|
81
|
+
if (hook.lastAdvancedChapter > 0 && hook.lastAdvancedChapter >= recentCutoff) {
|
|
82
|
+
return true;
|
|
83
|
+
}
|
|
84
|
+
if (hook.lastAdvancedChapter > 0) {
|
|
85
|
+
return false;
|
|
86
|
+
}
|
|
87
|
+
if (hook.startChapter <= 0) {
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
if (hook.startChapter >= recentCutoff && hook.startChapter <= chapterNumber) {
|
|
91
|
+
return true;
|
|
92
|
+
}
|
|
93
|
+
return hook.startChapter > chapterNumber && hook.startChapter <= chapterNumber + lookahead;
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=hook-agenda.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook-agenda.js","sourceRoot":"","sources":["../../src/utils/hook-agenda.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hook-arbiter.d.ts","sourceRoot":"","sources":["../../src/utils/hook-arbiter.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,UAAU,EACf,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACvB,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"hook-arbiter.d.ts","sourceRoot":"","sources":["../../src/utils/hook-arbiter.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,UAAU,EACf,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACvB,MAAM,4BAA4B,CAAC;AAIpC,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,QAAQ,GAAG,WAAW,GAAG,UAAU,CAAC;IACjE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,gBAAgB,CAAC;CACtC;AAMD,wBAAgB,+BAA+B,CAAC,MAAM,EAAE;IACtD,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;IAC1C,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAC;CACnC,GAAG;IACF,QAAQ,CAAC,aAAa,EAAE,iBAAiB,CAAC;IAC1C,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC,mBAAmB,CAAC,CAAC;CACxD,CAsHA"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { RuntimeStateDeltaSchema, } from "../models/runtime-state.js";
|
|
2
2
|
import { evaluateHookAdmission } from "./hook-governance.js";
|
|
3
|
+
import { resolveHookPayoffTiming } from "./hook-lifecycle.js";
|
|
3
4
|
export function arbitrateRuntimeStateDeltaHooks(params) {
|
|
4
5
|
const delta = RuntimeStateDeltaSchema.parse(params.delta);
|
|
5
6
|
const workingHooks = params.hooks.map((hook) => ({ ...hook }));
|
|
@@ -116,6 +117,11 @@ function mergeCandidateIntoExistingHook(existing, candidate, chapter) {
|
|
|
116
117
|
status: existing.status === "resolved" ? "resolved" : "progressing",
|
|
117
118
|
lastAdvancedChapter: Math.max(existing.lastAdvancedChapter, chapter),
|
|
118
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
|
+
}),
|
|
119
125
|
notes: preferRicherText(existing.notes, candidate.notes),
|
|
120
126
|
};
|
|
121
127
|
}
|
|
@@ -127,6 +133,7 @@ function createCanonicalHook(params) {
|
|
|
127
133
|
status: "open",
|
|
128
134
|
lastAdvancedChapter: params.chapter,
|
|
129
135
|
expectedPayoff: params.candidate.expectedPayoff.trim(),
|
|
136
|
+
payoffTiming: resolveHookPayoffTiming(params.candidate),
|
|
130
137
|
notes: params.candidate.notes.trim(),
|
|
131
138
|
};
|
|
132
139
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hook-arbiter.js","sourceRoot":"","sources":["../../src/utils/hook-arbiter.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,GAIxB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"hook-arbiter.js","sourceRoot":"","sources":["../../src/utils/hook-arbiter.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,7 @@ export type HookDisposition = "none" | "mention" | "advance" | "resolve" | "defe
|
|
|
3
3
|
export interface HookAdmissionCandidate {
|
|
4
4
|
readonly type: string;
|
|
5
5
|
readonly expectedPayoff?: string;
|
|
6
|
+
readonly payoffTiming?: string;
|
|
6
7
|
readonly notes?: string;
|
|
7
8
|
}
|
|
8
9
|
export interface HookAdmissionDecision {
|
|
@@ -13,6 +14,7 @@ export interface HookAdmissionDecision {
|
|
|
13
14
|
export declare function collectStaleHookDebt(params: {
|
|
14
15
|
readonly hooks: ReadonlyArray<HookRecord>;
|
|
15
16
|
readonly chapterNumber: number;
|
|
17
|
+
readonly targetChapters?: number;
|
|
16
18
|
readonly staleAfterChapters?: number;
|
|
17
19
|
}): HookRecord[];
|
|
18
20
|
export declare function evaluateHookAdmission(params: {
|
|
@@ -1 +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;
|
|
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"}
|
|
@@ -1,10 +1,24 @@
|
|
|
1
|
+
import { describeHookLifecycle } from "./hook-lifecycle.js";
|
|
1
2
|
export function collectStaleHookDebt(params) {
|
|
2
|
-
const staleAfterChapters = params.staleAfterChapters ?? 10;
|
|
3
|
-
const staleCutoff = params.chapterNumber - staleAfterChapters;
|
|
4
3
|
return params.hooks
|
|
5
4
|
.filter((hook) => hook.status !== "resolved" && hook.status !== "deferred")
|
|
6
5
|
.filter((hook) => hook.startChapter <= params.chapterNumber)
|
|
7
|
-
.filter((hook) =>
|
|
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
|
+
})
|
|
8
22
|
.sort((left, right) => (left.lastAdvancedChapter - right.lastAdvancedChapter
|
|
9
23
|
|| left.startChapter - right.startChapter
|
|
10
24
|
|| left.hookId.localeCompare(right.hookId)));
|
|
@@ -30,6 +44,7 @@ export function evaluateHookAdmission(params) {
|
|
|
30
44
|
const candidateNormalized = normalizeText([
|
|
31
45
|
params.candidate.type,
|
|
32
46
|
params.candidate.expectedPayoff ?? "",
|
|
47
|
+
params.candidate.payoffTiming ?? "",
|
|
33
48
|
params.candidate.notes ?? "",
|
|
34
49
|
].join(" "));
|
|
35
50
|
const candidateTerms = extractTerms(candidateNormalized);
|
|
@@ -38,6 +53,7 @@ export function evaluateHookAdmission(params) {
|
|
|
38
53
|
const activeNormalized = normalizeText([
|
|
39
54
|
hook.type,
|
|
40
55
|
hook.expectedPayoff,
|
|
56
|
+
hook.payoffTiming ?? "",
|
|
41
57
|
hook.notes,
|
|
42
58
|
].join(" "));
|
|
43
59
|
if (candidateNormalized === activeNormalized) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hook-governance.js","sourceRoot":"","sources":["../../src/utils/hook-governance.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"hook-governance.js","sourceRoot":"","sources":["../../src/utils/hook-governance.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,7 @@ import type { HookRecord, RuntimeStateDelta } from "../models/runtime-state.js";
|
|
|
3
3
|
export declare function analyzeHookHealth(params: {
|
|
4
4
|
readonly language: "zh" | "en";
|
|
5
5
|
readonly chapterNumber: number;
|
|
6
|
+
readonly targetChapters?: number;
|
|
6
7
|
readonly hooks: ReadonlyArray<HookRecord>;
|
|
7
8
|
readonly delta?: Pick<RuntimeStateDelta, "chapter" | "hookOps">;
|
|
8
9
|
readonly existingHookIds?: ReadonlyArray<string>;
|
|
@@ -1 +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;
|
|
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"}
|
|
@@ -1,11 +1,26 @@
|
|
|
1
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";
|
|
2
4
|
export function analyzeHookHealth(params) {
|
|
3
|
-
const maxActiveHooks = params.maxActiveHooks ??
|
|
4
|
-
const staleAfterChapters = params.staleAfterChapters ??
|
|
5
|
-
const noAdvanceWindow = params.noAdvanceWindow ??
|
|
6
|
-
const newHookBurstThreshold = params.newHookBurstThreshold ??
|
|
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;
|
|
7
9
|
const issues = [];
|
|
8
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
|
+
}));
|
|
9
24
|
if (activeHooks.length > maxActiveHooks) {
|
|
10
25
|
issues.push(warning(params.language, params.language === "en"
|
|
11
26
|
? `There are ${activeHooks.length} active hooks, above the recommended cap of ${maxActiveHooks}.`
|
|
@@ -13,33 +28,44 @@ export function analyzeHookHealth(params) {
|
|
|
13
28
|
? "Prefer advancing, resolving, or deferring existing debt before opening more hooks."
|
|
14
29
|
: "优先推进、回收或延后已有伏笔,再继续开新伏笔。"));
|
|
15
30
|
}
|
|
16
|
-
const
|
|
17
|
-
if (activeHooks.length > 0 && params.chapterNumber - latestRealAdvance >= noAdvanceWindow) {
|
|
18
|
-
issues.push(warning(params.language, params.language === "en"
|
|
19
|
-
? `No real hook advancement has landed for ${params.chapterNumber - latestRealAdvance} chapters.`
|
|
20
|
-
: `已经连续 ${params.chapterNumber - latestRealAdvance} 章没有真实伏笔推进。`, params.language === "en"
|
|
21
|
-
? "Schedule one old hook for real movement instead of opening parallel restatements."
|
|
22
|
-
: "下一章优先让一个旧伏笔发生真实推进,而不是继续平行重述。"));
|
|
23
|
-
}
|
|
24
|
-
const staleHooks = collectStaleHookDebt({
|
|
31
|
+
const staleHookIds = new Set(collectStaleHookDebt({
|
|
25
32
|
hooks: activeHooks,
|
|
26
33
|
chapterNumber: params.chapterNumber,
|
|
34
|
+
targetChapters: params.targetChapters,
|
|
27
35
|
staleAfterChapters,
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
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,
|
|
36
47
|
});
|
|
37
|
-
|
|
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) {
|
|
38
64
|
issues.push(warning(params.language, params.language === "en"
|
|
39
|
-
? `
|
|
40
|
-
:
|
|
41
|
-
? "
|
|
42
|
-
: "
|
|
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
|
+
: "下一章优先让一个旧伏笔发生真实推进,而不是继续平行重述。"));
|
|
43
69
|
}
|
|
44
70
|
}
|
|
45
71
|
if (params.delta) {
|
|
@@ -58,6 +84,39 @@ export function analyzeHookHealth(params) {
|
|
|
58
84
|
}
|
|
59
85
|
return issues;
|
|
60
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
|
+
}
|
|
61
120
|
function warning(language, description, suggestion) {
|
|
62
121
|
return {
|
|
63
122
|
severity: "warning",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hook-health.js","sourceRoot":"","sources":["../../src/utils/hook-health.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"hook-health.js","sourceRoot":"","sources":["../../src/utils/hook-health.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { HookPayoffTiming } from "../models/runtime-state.js";
|
|
2
|
+
import { type HookPhase } from "./hook-policy.js";
|
|
3
|
+
export declare function normalizeHookPayoffTiming(value: string | undefined | null): HookPayoffTiming | undefined;
|
|
4
|
+
export declare function inferHookPayoffTiming(params: {
|
|
5
|
+
readonly expectedPayoff?: string;
|
|
6
|
+
readonly notes?: string;
|
|
7
|
+
}): HookPayoffTiming;
|
|
8
|
+
export declare function resolveHookPayoffTiming(params: {
|
|
9
|
+
readonly payoffTiming?: string | null;
|
|
10
|
+
readonly expectedPayoff?: string;
|
|
11
|
+
readonly notes?: string;
|
|
12
|
+
}): HookPayoffTiming;
|
|
13
|
+
export declare function localizeHookPayoffTiming(timing: HookPayoffTiming, language: "zh" | "en"): string;
|
|
14
|
+
export declare function describeHookLifecycle(params: {
|
|
15
|
+
readonly payoffTiming?: string | null;
|
|
16
|
+
readonly expectedPayoff?: string;
|
|
17
|
+
readonly notes?: string;
|
|
18
|
+
readonly startChapter: number;
|
|
19
|
+
readonly lastAdvancedChapter: number;
|
|
20
|
+
readonly status: string;
|
|
21
|
+
readonly chapterNumber: number;
|
|
22
|
+
readonly targetChapters?: number;
|
|
23
|
+
}): {
|
|
24
|
+
readonly timing: HookPayoffTiming;
|
|
25
|
+
readonly phase: HookPhase;
|
|
26
|
+
readonly age: number;
|
|
27
|
+
readonly dormancy: number;
|
|
28
|
+
readonly readyToResolve: boolean;
|
|
29
|
+
readonly stale: boolean;
|
|
30
|
+
readonly overdue: boolean;
|
|
31
|
+
readonly advancePressure: number;
|
|
32
|
+
readonly resolvePressure: number;
|
|
33
|
+
};
|
|
34
|
+
//# sourceMappingURL=hook-lifecycle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook-lifecycle.d.ts","sourceRoot":"","sources":["../../src/utils/hook-lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAML,KAAK,SAAS,EACf,MAAM,kBAAkB,CAAC;AAmC1B,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,gBAAgB,GAAG,SAAS,CAWxG;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE;IAC5C,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB,GAAG,gBAAgB,CAcnB;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE;IAC9C,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB,GAAG,gBAAgB,CAMnB;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,gBAAgB,EACxB,QAAQ,EAAE,IAAI,GAAG,IAAI,GACpB,MAAM,CAER;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE;IAC5C,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;CAClC,GAAG;IACF,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC;IAClC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;CAClC,CAgDA"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { HOOK_ACTIVITY_THRESHOLDS, HOOK_PHASE_THRESHOLDS, HOOK_PHASE_WEIGHT, HOOK_PRESSURE_WEIGHTS, HOOK_TIMING_PROFILES, } from "./hook-policy.js";
|
|
2
|
+
const LABELS = {
|
|
3
|
+
en: {
|
|
4
|
+
immediate: "immediate",
|
|
5
|
+
"near-term": "near-term",
|
|
6
|
+
"mid-arc": "mid-arc",
|
|
7
|
+
"slow-burn": "slow-burn",
|
|
8
|
+
endgame: "endgame",
|
|
9
|
+
},
|
|
10
|
+
zh: {
|
|
11
|
+
immediate: "立即",
|
|
12
|
+
"near-term": "近期",
|
|
13
|
+
"mid-arc": "中程",
|
|
14
|
+
"slow-burn": "慢烧",
|
|
15
|
+
endgame: "终局",
|
|
16
|
+
},
|
|
17
|
+
};
|
|
18
|
+
const TIMING_ALIASES = [
|
|
19
|
+
["immediate", /^(?:立即|马上|当章|本章|下一章|immediate|instant|next(?:\s+chapter|\s+beat)?|right\s+away)$/i],
|
|
20
|
+
["near-term", /^(?:近期|近几章|短线|soon|short(?:\s+run)?|near(?:\s*-\s*|\s+)term|current\s+sequence)$/i],
|
|
21
|
+
["mid-arc", /^(?:中程|中期|卷中|mid(?:\s*-\s*|\s+)arc|mid(?:\s*-\s*|\s+)book|middle)$/i],
|
|
22
|
+
["slow-burn", /^(?:慢烧|长线|后续|later|late(?:r)?|long(?:\s*-\s*|\s+)arc|slow(?:\s*-\s*|\s+)burn)$/i],
|
|
23
|
+
["endgame", /^(?:终局|终章|大结局|最终|climax|finale|endgame|late\s+book)$/i],
|
|
24
|
+
];
|
|
25
|
+
const SIGNAL_PATTERNS = [
|
|
26
|
+
["endgame", /(终局|终章|大结局|最终揭晓|最终摊牌|climax|finale|endgame|final reveal|last act)/i],
|
|
27
|
+
["immediate", /(当章|本章|下一章|马上|立刻|即刻|immediate|next chapter|right away|at once)/i],
|
|
28
|
+
["near-term", /(近期|近几章|很快|短线|soon|near-term|short run|current sequence)/i],
|
|
29
|
+
["mid-arc", /(中期|卷中|本卷中段|mid-book|mid arc|middle of the arc)/i],
|
|
30
|
+
["slow-burn", /(长线|慢烧|后续发酵|慢慢揭开|later|slow burn|long arc|long tail)/i],
|
|
31
|
+
];
|
|
32
|
+
export function normalizeHookPayoffTiming(value) {
|
|
33
|
+
const normalized = value?.trim();
|
|
34
|
+
if (!normalized)
|
|
35
|
+
return undefined;
|
|
36
|
+
for (const [timing, pattern] of TIMING_ALIASES) {
|
|
37
|
+
if (pattern.test(normalized)) {
|
|
38
|
+
return timing;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return undefined;
|
|
42
|
+
}
|
|
43
|
+
export function inferHookPayoffTiming(params) {
|
|
44
|
+
const combined = [params.expectedPayoff, params.notes]
|
|
45
|
+
.filter((value) => Boolean(value && value.trim()))
|
|
46
|
+
.join(" ")
|
|
47
|
+
.trim();
|
|
48
|
+
if (!combined)
|
|
49
|
+
return "mid-arc";
|
|
50
|
+
for (const [timing, pattern] of SIGNAL_PATTERNS) {
|
|
51
|
+
if (pattern.test(combined)) {
|
|
52
|
+
return timing;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return "mid-arc";
|
|
56
|
+
}
|
|
57
|
+
export function resolveHookPayoffTiming(params) {
|
|
58
|
+
return normalizeHookPayoffTiming(params.payoffTiming)
|
|
59
|
+
?? inferHookPayoffTiming({
|
|
60
|
+
expectedPayoff: params.expectedPayoff,
|
|
61
|
+
notes: params.notes,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
export function localizeHookPayoffTiming(timing, language) {
|
|
65
|
+
return LABELS[language][timing];
|
|
66
|
+
}
|
|
67
|
+
export function describeHookLifecycle(params) {
|
|
68
|
+
const timing = resolveHookPayoffTiming(params);
|
|
69
|
+
const profile = HOOK_TIMING_PROFILES[timing];
|
|
70
|
+
const phase = resolveHookPhase(params.chapterNumber, params.targetChapters);
|
|
71
|
+
const age = Math.max(0, params.chapterNumber - Math.max(1, params.startChapter));
|
|
72
|
+
const lastTouchChapter = Math.max(params.startChapter, params.lastAdvancedChapter);
|
|
73
|
+
const dormancy = Math.max(0, params.chapterNumber - Math.max(1, lastTouchChapter));
|
|
74
|
+
const explicitProgressing = /^(progressing|advanced|重大推进|持续推进)$/i.test(params.status.trim());
|
|
75
|
+
const phaseReady = HOOK_PHASE_WEIGHT[phase] >= HOOK_PHASE_WEIGHT[profile.minimumPhase];
|
|
76
|
+
const recentlyTouched = dormancy <= HOOK_ACTIVITY_THRESHOLDS.recentlyTouchedDormancy;
|
|
77
|
+
const overdue = phaseReady && age >= profile.overdueAge;
|
|
78
|
+
const cadenceReady = timing === "slow-burn"
|
|
79
|
+
? phase === "late" || overdue
|
|
80
|
+
: timing === "endgame"
|
|
81
|
+
? phase === "late"
|
|
82
|
+
: true;
|
|
83
|
+
const momentum = explicitProgressing || recentlyTouched;
|
|
84
|
+
const stale = phaseReady && (dormancy >= profile.staleDormancy
|
|
85
|
+
|| (overdue && !momentum));
|
|
86
|
+
const readyToResolve = phaseReady
|
|
87
|
+
&& cadenceReady
|
|
88
|
+
&& age >= profile.earliestResolveAge
|
|
89
|
+
&& (momentum || (overdue && explicitProgressing));
|
|
90
|
+
return {
|
|
91
|
+
timing,
|
|
92
|
+
phase,
|
|
93
|
+
age,
|
|
94
|
+
dormancy,
|
|
95
|
+
readyToResolve,
|
|
96
|
+
stale,
|
|
97
|
+
overdue,
|
|
98
|
+
advancePressure: age
|
|
99
|
+
+ dormancy
|
|
100
|
+
+ (stale ? HOOK_PRESSURE_WEIGHTS.staleAdvanceBonus : 0)
|
|
101
|
+
+ (overdue ? HOOK_PRESSURE_WEIGHTS.overdueAdvanceBonus : 0),
|
|
102
|
+
resolvePressure: readyToResolve
|
|
103
|
+
? profile.resolveBias * HOOK_PRESSURE_WEIGHTS.resolveBiasMultiplier
|
|
104
|
+
+ (explicitProgressing ? HOOK_PRESSURE_WEIGHTS.progressingResolveBonus : 0)
|
|
105
|
+
+ Math.min(HOOK_PRESSURE_WEIGHTS.maxDormancyResolveBonus, dormancy * HOOK_PRESSURE_WEIGHTS.dormancyResolveMultiplier)
|
|
106
|
+
+ (overdue ? HOOK_PRESSURE_WEIGHTS.overdueResolveBonus : 0)
|
|
107
|
+
: 0,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
function resolveHookPhase(chapterNumber, targetChapters) {
|
|
111
|
+
if (targetChapters && targetChapters > 0) {
|
|
112
|
+
const progress = chapterNumber / targetChapters;
|
|
113
|
+
if (progress >= HOOK_PHASE_THRESHOLDS.lateProgress)
|
|
114
|
+
return "late";
|
|
115
|
+
if (progress >= HOOK_PHASE_THRESHOLDS.middleProgress)
|
|
116
|
+
return "middle";
|
|
117
|
+
return "opening";
|
|
118
|
+
}
|
|
119
|
+
if (chapterNumber >= HOOK_PHASE_THRESHOLDS.lateChapter)
|
|
120
|
+
return "late";
|
|
121
|
+
if (chapterNumber >= HOOK_PHASE_THRESHOLDS.middleChapter)
|
|
122
|
+
return "middle";
|
|
123
|
+
return "opening";
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=hook-lifecycle.js.map
|