|
|
@@ -260,11 +260,14 @@ export class ComposerAgent extends BaseAgent {
|
|
|
}>,
|
|
|
language: "zh" | "en",
|
|
|
): Promise<ContextPackage["selectedContext"]> {
|
|
|
- const targetHookIds = [...new Set([
|
|
|
- ...plan.intent.hookAgenda.eligibleResolve,
|
|
|
- ...plan.intent.hookAgenda.mustAdvance,
|
|
|
- ...plan.intent.hookAgenda.staleDebt,
|
|
|
- ])];
|
|
|
+ const targetHookIds = [
|
|
|
+ ...new Set([
|
|
|
+ ...plan.intent.hookAgenda.pressureMap.map((entry) => entry.hookId),
|
|
|
+ ...plan.intent.hookAgenda.eligibleResolve,
|
|
|
+ ...plan.intent.hookAgenda.mustAdvance,
|
|
|
+ ...plan.intent.hookAgenda.staleDebt,
|
|
|
+ ]),
|
|
|
+ ];
|
|
|
if (targetHookIds.length === 0) {
|
|
|
return [];
|
|
|
}
|
|
|
@@ -282,7 +285,14 @@ export class ComposerAgent extends BaseAgent {
|
|
|
const seedSummary = this.findHookSummary(summaries, hook.hookId, hook.startChapter, "seed");
|
|
|
const latestSummary = this.findHookSummary(summaries, hook.hookId, hook.lastAdvancedChapter, "latest");
|
|
|
const cadence = localizeHookPayoffTiming(resolveHookPayoffTiming(hook), language);
|
|
|
+ const guidance = this.findHookPressure(plan, hook.hookId);
|
|
|
const role = this.describeHookAgendaRole(plan, hook.hookId, language);
|
|
|
+ const movement = guidance
|
|
|
+ ? this.describeHookMovement(guidance.movement, language)
|
|
|
+ : role;
|
|
|
+ const pressure = guidance
|
|
|
+ ? this.describeHookPressure(guidance.pressure, language)
|
|
|
+ : (language === "en" ? "medium" : "中");
|
|
|
const promise = hook.expectedPayoff || (language === "en" ? "(unspecified)" : "(未写明)");
|
|
|
const seedBeat = seedSummary
|
|
|
? this.renderHookDebtBeat(seedSummary)
|
|
|
@@ -290,6 +300,14 @@ export class ComposerAgent extends BaseAgent {
|
|
|
const latestBeat = latestSummary
|
|
|
? this.renderHookDebtBeat(latestSummary)
|
|
|
: (hook.notes || promise);
|
|
|
+ const reason = guidance
|
|
|
+ ? this.describeHookReason(guidance.reason, language)
|
|
|
+ : (language === "en"
|
|
|
+ ? "Keep the original promise legible and materially change the on-page situation."
|
|
|
+ : "保持原始承诺清晰可见,并让页上局势发生实质变化。");
|
|
|
+ const suppressSiblingHooks = guidance?.blockSiblingHooks
|
|
|
+ ? (language === "en" ? "yes" : "是")
|
|
|
+ : (language === "en" ? "no" : "否");
|
|
|
|
|
|
return [{
|
|
|
source: `runtime/hook_debt#${hook.hookId}`,
|
|
|
@@ -297,8 +315,8 @@ export class ComposerAgent extends BaseAgent {
|
|
|
? "Narrative debt brief for an explicit hook agenda target."
|
|
|
: "显式 hook agenda 目标的叙事债务简报。",
|
|
|
excerpt: language === "en"
|
|
|
- ? `${hook.hookId} | role: ${role} | cadence: ${cadence} | promise: ${promise} | seed: ${seedBeat} | latest: ${latestBeat}`
|
|
|
- : `${hook.hookId} | 角色: ${role} | 节奏: ${cadence} | 承诺: ${promise} | 种子: ${seedBeat} | 最近推进: ${latestBeat}`,
|
|
|
+ ? `${hook.hookId} | role: ${role} | movement: ${movement} | pressure: ${pressure} | cadence: ${cadence} | suppress siblings: ${suppressSiblingHooks} | reason: ${reason} | promise: ${promise} | seed: ${seedBeat} | latest: ${latestBeat}`
|
|
|
+ : `${hook.hookId} | 角色: ${role} | 动作: ${movement} | 压力: ${pressure} | 节奏: ${cadence} | 抑制同类开坑: ${suppressSiblingHooks} | 原因: ${reason} | 承诺: ${promise} | 种子: ${seedBeat} | 最近推进: ${latestBeat}`,
|
|
|
}];
|
|
|
});
|
|
|
}
|
|
|
@@ -354,7 +372,7 @@ export class ComposerAgent extends BaseAgent {
|
|
|
language: "zh" | "en",
|
|
|
): string {
|
|
|
if (plan.intent.hookAgenda.eligibleResolve.includes(hookId)) {
|
|
|
- return language === "en" ? "payoff candidate" : "本章优先兑现";
|
|
|
+ return language === "en" ? "payoff candidate" : "优先兑现";
|
|
|
}
|
|
|
if (plan.intent.hookAgenda.staleDebt.includes(hookId)) {
|
|
|
return language === "en" ? "stale debt" : "高压旧债";
|
|
|
@@ -362,6 +380,71 @@ export class ComposerAgent extends BaseAgent {
|
|
|
return language === "en" ? "must advance" : "本章必须推进";
|
|
|
}
|
|
|
|
|
|
+ private findHookPressure(
|
|
|
+ plan: PlanChapterOutput,
|
|
|
+ hookId: string,
|
|
|
+ ): PlanChapterOutput["intent"]["hookAgenda"]["pressureMap"][number] | undefined {
|
|
|
+ return plan.intent.hookAgenda.pressureMap.find((entry) => entry.hookId === hookId);
|
|
|
+ }
|
|
|
+
|
|
|
+ private describeHookMovement(
|
|
|
+ movement: PlanChapterOutput["intent"]["hookAgenda"]["pressureMap"][number]["movement"],
|
|
|
+ language: "zh" | "en",
|
|
|
+ ): string {
|
|
|
+ if (language === "en") {
|
|
|
+ return movement.replace(/-/g, " ");
|
|
|
+ }
|
|
|
+
|
|
|
+ return {
|
|
|
+ "quiet-hold": "轻压保温",
|
|
|
+ refresh: "重新点亮",
|
|
|
+ advance: "推进",
|
|
|
+ "partial-payoff": "局部兑现",
|
|
|
+ "full-payoff": "完整兑现",
|
|
|
+ }[movement];
|
|
|
+ }
|
|
|
+
|
|
|
+ private describeHookPressure(
|
|
|
+ pressure: PlanChapterOutput["intent"]["hookAgenda"]["pressureMap"][number]["pressure"],
|
|
|
+ language: "zh" | "en",
|
|
|
+ ): string {
|
|
|
+ if (language === "en") {
|
|
|
+ return pressure;
|
|
|
+ }
|
|
|
+
|
|
|
+ return {
|
|
|
+ low: "低",
|
|
|
+ medium: "中",
|
|
|
+ high: "高",
|
|
|
+ critical: "极高",
|
|
|
+ }[pressure];
|
|
|
+ }
|
|
|
+
|
|
|
+ private describeHookReason(
|
|
|
+ reason: PlanChapterOutput["intent"]["hookAgenda"]["pressureMap"][number]["reason"],
|
|
|
+ language: "zh" | "en",
|
|
|
+ ): string {
|
|
|
+ if (language === "en") {
|
|
|
+ return {
|
|
|
+ "fresh-promise": "fresh promise",
|
|
|
+ "building-debt": "building debt",
|
|
|
+ "stale-promise": "stale promise",
|
|
|
+ "ripe-payoff": "ripe payoff",
|
|
|
+ "overdue-payoff": "overdue payoff",
|
|
|
+ "long-arc-hold": "long arc hold",
|
|
|
+ }[reason];
|
|
|
+ }
|
|
|
+
|
|
|
+ return {
|
|
|
+ "fresh-promise": "新近承诺,先保持清晰存在",
|
|
|
+ "building-debt": "债务正在累积,需要继续加码",
|
|
|
+ "stale-promise": "旧承诺已停滞,需要重新推动或缩圈",
|
|
|
+ "ripe-payoff": "已经进入可兑现窗口",
|
|
|
+ "overdue-payoff": "已经拖过理想兑现窗口",
|
|
|
+ "long-arc-hold": "长线承诺仍应保温,不宜提前兑付",
|
|
|
+ }[reason];
|
|
|
+ }
|
|
|
+
|
|
|
private findHookSummary(
|
|
|
summaries: ReadonlyArray<ReturnType<typeof parseChapterSummariesMarkdown>[number]>,
|
|
|
hookId: string,
|