@actalk/inkos-core 1.4.1 → 1.5.0-canary.47.1
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/agent/agent-session.d.ts +15 -0
- package/dist/agent/agent-session.d.ts.map +1 -1
- package/dist/agent/agent-session.js +256 -26
- package/dist/agent/agent-session.js.map +1 -1
- package/dist/agent/agent-system-prompt.d.ts +8 -1
- package/dist/agent/agent-system-prompt.d.ts.map +1 -1
- package/dist/agent/agent-system-prompt.js +382 -176
- package/dist/agent/agent-system-prompt.js.map +1 -1
- package/dist/agent/agent-tools.d.ts +156 -19
- package/dist/agent/agent-tools.d.ts.map +1 -1
- package/dist/agent/agent-tools.js +980 -46
- package/dist/agent/agent-tools.js.map +1 -1
- package/dist/agent/context-transform.d.ts +4 -1
- package/dist/agent/context-transform.d.ts.map +1 -1
- package/dist/agent/context-transform.js +104 -9
- package/dist/agent/context-transform.js.map +1 -1
- package/dist/agent/index.d.ts +1 -1
- package/dist/agent/index.d.ts.map +1 -1
- package/dist/agent/index.js +1 -1
- package/dist/agent/index.js.map +1 -1
- package/dist/agents/architect.d.ts +11 -1
- package/dist/agents/architect.d.ts.map +1 -1
- package/dist/agents/architect.js +242 -114
- package/dist/agents/architect.js.map +1 -1
- package/dist/agents/chapter-analyzer.js +1 -1
- package/dist/agents/chapter-analyzer.js.map +1 -1
- package/dist/agents/composer.d.ts +36 -0
- package/dist/agents/composer.d.ts.map +1 -1
- package/dist/agents/composer.js +503 -20
- package/dist/agents/composer.js.map +1 -1
- package/dist/agents/continuity.d.ts +3 -0
- package/dist/agents/continuity.d.ts.map +1 -1
- package/dist/agents/continuity.js +28 -14
- package/dist/agents/continuity.js.map +1 -1
- package/dist/agents/en-prompt-sections.d.ts.map +1 -1
- package/dist/agents/en-prompt-sections.js +15 -1
- package/dist/agents/en-prompt-sections.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 +53 -6
- package/dist/agents/fanfic-canon-importer.js.map +1 -1
- package/dist/agents/foundation-reviewer.d.ts +1 -0
- package/dist/agents/foundation-reviewer.d.ts.map +1 -1
- package/dist/agents/foundation-reviewer.js +17 -12
- package/dist/agents/foundation-reviewer.js.map +1 -1
- package/dist/agents/length-normalizer.d.ts +1 -0
- package/dist/agents/length-normalizer.d.ts.map +1 -1
- package/dist/agents/length-normalizer.js +16 -3
- package/dist/agents/length-normalizer.js.map +1 -1
- package/dist/agents/planner-prompts.d.ts +7 -7
- package/dist/agents/planner-prompts.d.ts.map +1 -1
- package/dist/agents/planner-prompts.js +29 -29
- package/dist/agents/planner-prompts.js.map +1 -1
- package/dist/agents/planner.d.ts +6 -5
- package/dist/agents/planner.d.ts.map +1 -1
- package/dist/agents/planner.js +90 -6
- package/dist/agents/planner.js.map +1 -1
- package/dist/agents/post-write-validator.d.ts.map +1 -1
- package/dist/agents/post-write-validator.js +49 -0
- package/dist/agents/post-write-validator.js.map +1 -1
- package/dist/agents/reviser.js +10 -0
- package/dist/agents/reviser.js.map +1 -1
- package/dist/agents/rules-reader.d.ts +6 -14
- package/dist/agents/rules-reader.d.ts.map +1 -1
- package/dist/agents/rules-reader.js +15 -28
- package/dist/agents/rules-reader.js.map +1 -1
- package/dist/agents/short-fiction.d.ts +4 -0
- package/dist/agents/short-fiction.d.ts.map +1 -1
- package/dist/agents/short-fiction.js +51 -8
- package/dist/agents/short-fiction.js.map +1 -1
- package/dist/agents/state-validator.d.ts +0 -2
- package/dist/agents/state-validator.d.ts.map +1 -1
- package/dist/agents/state-validator.js +4 -16
- package/dist/agents/state-validator.js.map +1 -1
- package/dist/agents/style-analyzer.d.ts +1 -1
- package/dist/agents/style-analyzer.d.ts.map +1 -1
- package/dist/agents/style-analyzer.js +34 -17
- package/dist/agents/style-analyzer.js.map +1 -1
- package/dist/agents/writer-prompts.d.ts.map +1 -1
- package/dist/agents/writer-prompts.js +160 -12
- package/dist/agents/writer-prompts.js.map +1 -1
- package/dist/agents/writer.d.ts.map +1 -1
- package/dist/agents/writer.js +31 -9
- package/dist/agents/writer.js.map +1 -1
- package/dist/index.d.ts +18 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +17 -7
- package/dist/index.js.map +1 -1
- package/dist/interaction/action-envelope.d.ts +261 -0
- package/dist/interaction/action-envelope.d.ts.map +1 -0
- package/dist/interaction/action-envelope.js +102 -0
- package/dist/interaction/action-envelope.js.map +1 -0
- package/dist/interaction/book-session-store.d.ts +6 -2
- package/dist/interaction/book-session-store.d.ts.map +1 -1
- package/dist/interaction/book-session-store.js +21 -3
- package/dist/interaction/book-session-store.js.map +1 -1
- package/dist/interaction/edit-controller.d.ts +5 -0
- package/dist/interaction/edit-controller.d.ts.map +1 -1
- package/dist/interaction/edit-controller.js +123 -26
- package/dist/interaction/edit-controller.js.map +1 -1
- package/dist/interaction/events.d.ts +4 -4
- package/dist/interaction/intents.d.ts +9 -6
- package/dist/interaction/intents.d.ts.map +1 -1
- package/dist/interaction/intents.js +2 -1
- package/dist/interaction/intents.js.map +1 -1
- package/dist/interaction/project-control.d.ts +3 -43
- package/dist/interaction/project-control.d.ts.map +1 -1
- package/dist/interaction/project-control.js +1 -53
- package/dist/interaction/project-control.js.map +1 -1
- package/dist/interaction/project-tools.d.ts +1 -1
- package/dist/interaction/project-tools.d.ts.map +1 -1
- package/dist/interaction/project-tools.js +41 -185
- package/dist/interaction/project-tools.js.map +1 -1
- package/dist/interaction/runtime.d.ts +1 -1
- package/dist/interaction/runtime.d.ts.map +1 -1
- package/dist/interaction/runtime.js +49 -75
- package/dist/interaction/runtime.js.map +1 -1
- package/dist/interaction/session-transcript-legacy.d.ts.map +1 -1
- package/dist/interaction/session-transcript-legacy.js +2 -0
- package/dist/interaction/session-transcript-legacy.js.map +1 -1
- package/dist/interaction/session-transcript-restore.d.ts +4 -3
- package/dist/interaction/session-transcript-restore.d.ts.map +1 -1
- package/dist/interaction/session-transcript-restore.js +234 -34
- package/dist/interaction/session-transcript-restore.js.map +1 -1
- package/dist/interaction/session-transcript-schema.d.ts +45 -12
- package/dist/interaction/session-transcript-schema.d.ts.map +1 -1
- package/dist/interaction/session-transcript-schema.js +6 -0
- package/dist/interaction/session-transcript-schema.js.map +1 -1
- package/dist/interaction/session-transcript.d.ts +8 -1
- package/dist/interaction/session-transcript.d.ts.map +1 -1
- package/dist/interaction/session-transcript.js +13 -1
- package/dist/interaction/session-transcript.js.map +1 -1
- package/dist/interaction/session.d.ts +78 -66
- package/dist/interaction/session.d.ts.map +1 -1
- package/dist/interaction/session.js +10 -2
- package/dist/interaction/session.js.map +1 -1
- package/dist/llm/provider.d.ts +32 -34
- package/dist/llm/provider.d.ts.map +1 -1
- package/dist/llm/provider.js +144 -127
- package/dist/llm/provider.js.map +1 -1
- package/dist/models/book-rules.d.ts +6 -4
- package/dist/models/book-rules.d.ts.map +1 -1
- package/dist/models/book-rules.js +187 -8
- package/dist/models/book-rules.js.map +1 -1
- package/dist/models/context-compression.d.ts +13 -0
- package/dist/models/context-compression.d.ts.map +1 -0
- package/dist/models/context-compression.js +2 -0
- package/dist/models/context-compression.js.map +1 -0
- package/dist/models/input-governance.d.ts +53 -12
- package/dist/models/input-governance.d.ts.map +1 -1
- package/dist/models/input-governance.js +16 -0
- package/dist/models/input-governance.js.map +1 -1
- package/dist/models/play.d.ts +530 -0
- package/dist/models/play.d.ts.map +1 -0
- package/dist/models/play.js +318 -0
- package/dist/models/play.js.map +1 -0
- 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/pipeline/chapter-review-cycle.d.ts.map +1 -1
- package/dist/pipeline/chapter-review-cycle.js +29 -3
- package/dist/pipeline/chapter-review-cycle.js.map +1 -1
- package/dist/pipeline/persisted-governed-plan.d.ts.map +1 -1
- package/dist/pipeline/persisted-governed-plan.js +98 -49
- package/dist/pipeline/persisted-governed-plan.js.map +1 -1
- package/dist/pipeline/runner.d.ts +31 -0
- package/dist/pipeline/runner.d.ts.map +1 -1
- package/dist/pipeline/runner.js +212 -68
- package/dist/pipeline/runner.js.map +1 -1
- package/dist/pipeline/short-fiction-runner.d.ts +14 -0
- package/dist/pipeline/short-fiction-runner.d.ts.map +1 -1
- package/dist/pipeline/short-fiction-runner.js +242 -94
- package/dist/pipeline/short-fiction-runner.js.map +1 -1
- package/dist/play/play-agents.d.ts +71 -0
- package/dist/play/play-agents.d.ts.map +1 -0
- package/dist/play/play-agents.js +511 -0
- package/dist/play/play-agents.js.map +1 -0
- package/dist/play/play-db-factory.d.ts +9 -0
- package/dist/play/play-db-factory.d.ts.map +1 -0
- package/dist/play/play-db-factory.js +18 -0
- package/dist/play/play-db-factory.js.map +1 -0
- package/dist/play/play-db.d.ts +22 -0
- package/dist/play/play-db.d.ts.map +1 -0
- package/dist/play/play-db.js +248 -0
- package/dist/play/play-db.js.map +1 -0
- package/dist/play/play-file-db.d.ts +32 -0
- package/dist/play/play-file-db.d.ts.map +1 -0
- package/dist/play/play-file-db.js +156 -0
- package/dist/play/play-file-db.js.map +1 -0
- package/dist/play/play-image.d.ts +58 -0
- package/dist/play/play-image.d.ts.map +1 -0
- package/dist/play/play-image.js +142 -0
- package/dist/play/play-image.js.map +1 -0
- package/dist/play/play-reducer.d.ts +31 -0
- package/dist/play/play-reducer.d.ts.map +1 -0
- package/dist/play/play-reducer.js +261 -0
- package/dist/play/play-reducer.js.map +1 -0
- package/dist/play/play-runner.d.ts +102 -0
- package/dist/play/play-runner.d.ts.map +1 -0
- package/dist/play/play-runner.js +465 -0
- package/dist/play/play-runner.js.map +1 -0
- package/dist/play/play-store.d.ts +112 -0
- package/dist/play/play-store.d.ts.map +1 -0
- package/dist/play/play-store.js +311 -0
- package/dist/play/play-store.js.map +1 -0
- package/dist/prompts/short-fiction.d.ts +5 -0
- package/dist/prompts/short-fiction.d.ts.map +1 -1
- package/dist/prompts/short-fiction.js +46 -22
- package/dist/prompts/short-fiction.js.map +1 -1
- package/dist/state/state-bootstrap.d.ts.map +1 -1
- package/dist/state/state-bootstrap.js +12 -25
- package/dist/state/state-bootstrap.js.map +1 -1
- package/dist/state/state-reducer.js +31 -22
- package/dist/state/state-reducer.js.map +1 -1
- package/dist/utils/book-eval.d.ts +35 -0
- package/dist/utils/book-eval.d.ts.map +1 -0
- package/dist/utils/book-eval.js +116 -0
- package/dist/utils/book-eval.js.map +1 -0
- package/dist/utils/chapter-memo-parser.d.ts +10 -7
- package/dist/utils/chapter-memo-parser.d.ts.map +1 -1
- package/dist/utils/chapter-memo-parser.js +86 -43
- package/dist/utils/chapter-memo-parser.js.map +1 -1
- package/dist/utils/context-assembly.d.ts +2 -0
- package/dist/utils/context-assembly.d.ts.map +1 -1
- package/dist/utils/context-assembly.js +38 -1
- package/dist/utils/context-assembly.js.map +1 -1
- package/dist/utils/hook-health.d.ts.map +1 -1
- package/dist/utils/hook-health.js +5 -2
- package/dist/utils/hook-health.js.map +1 -1
- package/dist/utils/hook-ledger-validator.d.ts +1 -1
- package/dist/utils/hook-ledger-validator.d.ts.map +1 -1
- package/dist/utils/hook-ledger-validator.js +5 -5
- package/dist/utils/hook-ledger-validator.js.map +1 -1
- package/dist/utils/hook-lifecycle.d.ts +1 -0
- package/dist/utils/hook-lifecycle.d.ts.map +1 -1
- package/dist/utils/hook-lifecycle.js +10 -3
- package/dist/utils/hook-lifecycle.js.map +1 -1
- package/dist/utils/language.d.ts +10 -0
- package/dist/utils/language.d.ts.map +1 -0
- package/dist/utils/language.js +18 -0
- package/dist/utils/language.js.map +1 -0
- package/dist/utils/length-metrics.d.ts +3 -0
- package/dist/utils/length-metrics.d.ts.map +1 -1
- package/dist/utils/length-metrics.js +8 -0
- package/dist/utils/length-metrics.js.map +1 -1
- package/dist/utils/memory-retrieval.d.ts.map +1 -1
- package/dist/utils/memory-retrieval.js +19 -15
- package/dist/utils/memory-retrieval.js.map +1 -1
- package/dist/utils/outline-paths.d.ts +12 -0
- package/dist/utils/outline-paths.d.ts.map +1 -1
- package/dist/utils/outline-paths.js +68 -0
- package/dist/utils/outline-paths.js.map +1 -1
- package/package.json +1 -1
- package/dist/interaction/nl-router.d.ts +0 -8
- package/dist/interaction/nl-router.d.ts.map +0 -1
- package/dist/interaction/nl-router.js +0 -218
- package/dist/interaction/nl-router.js.map +0 -1
- package/dist/pipeline/agent.d.ts +0 -15
- package/dist/pipeline/agent.d.ts.map +0 -1
- package/dist/pipeline/agent.js +0 -597
- package/dist/pipeline/agent.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"foundation-reviewer.js","sourceRoot":"","sources":["../../src/agents/foundation-reviewer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AActC,MAAM,cAAc,GAAG,EAAE,CAAC;AAC1B,MAAM,eAAe,GAAG,EAAE,CAAC;AAE3B,MAAM,OAAO,uBAAwB,SAAQ,SAAS;IACpD,IAAI,IAAI;QACN,OAAO,qBAAqB,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"foundation-reviewer.js","sourceRoot":"","sources":["../../src/agents/foundation-reviewer.ts"],"names":[],"mappings":"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"}
|
|
@@ -24,6 +24,7 @@ export declare class LengthNormalizerAgent extends BaseAgent {
|
|
|
24
24
|
private buildSystemPrompt;
|
|
25
25
|
private buildUserPrompt;
|
|
26
26
|
private buildWarning;
|
|
27
|
+
private crossesOppositeHardBound;
|
|
27
28
|
private sanitizeNormalizedContent;
|
|
28
29
|
private looksTruncated;
|
|
29
30
|
private extractFirstFencedBlock;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"length-normalizer.d.ts","sourceRoot":"","sources":["../../src/agents/length-normalizer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,KAAK,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAGtF,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;CACvC;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAC;IACnC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,CAAC,EAAE;QACpB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;QAC9B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;QAClC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;KAC9B,CAAC;CACH;AAED,qBAAa,qBAAsB,SAAQ,SAAS;IAClD,IAAI,IAAI,IAAI,MAAM,CAEjB;IAEK,gBAAgB,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"length-normalizer.d.ts","sourceRoot":"","sources":["../../src/agents/length-normalizer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,KAAK,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAGtF,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;CACvC;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAC;IACnC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,CAAC,EAAE;QACpB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;QAC9B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;QAClC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;KAC9B,CAAC;CACH;AAED,qBAAa,qBAAsB,SAAQ,SAAS;IAClD,IAAI,IAAI,IAAI,MAAM,CAEjB;IAEK,gBAAgB,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAoDnF,OAAO,CAAC,iBAAiB;IAczB,OAAO,CAAC,eAAe;IAmCvB,OAAO,CAAC,YAAY;IAYpB,OAAO,CAAC,wBAAwB;IAchC,OAAO,CAAC,yBAAyB;IAmBjC,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,uBAAuB;IAO/B,OAAO,CAAC,mBAAmB;IAqB3B,OAAO,CAAC,aAAa;CAuBtB"}
|
|
@@ -30,15 +30,19 @@ export class LengthNormalizerAgent extends BaseAgent {
|
|
|
30
30
|
const wasTruncated = sanitizedContent !== input.chapterContent
|
|
31
31
|
&& sanitizedCount < input.lengthSpec.hardMin
|
|
32
32
|
&& this.looksTruncated(sanitizedContent);
|
|
33
|
-
const
|
|
33
|
+
const crossedHardRange = sanitizedContent !== input.chapterContent
|
|
34
|
+
&& this.crossesOppositeHardBound(originalCount, sanitizedCount, input.lengthSpec);
|
|
35
|
+
const normalizedContent = (wasTruncated || crossedHardRange) ? input.chapterContent : sanitizedContent;
|
|
34
36
|
const finalCount = countChapterLength(normalizedContent, input.lengthSpec.countingMode);
|
|
35
37
|
const warning = wasTruncated
|
|
36
38
|
? "Length normalizer output appeared truncated; kept original chapter."
|
|
37
|
-
:
|
|
39
|
+
: crossedHardRange
|
|
40
|
+
? "Length normalizer output crossed the hard range; kept original chapter."
|
|
41
|
+
: this.buildWarning(finalCount, input.lengthSpec);
|
|
38
42
|
return {
|
|
39
43
|
normalizedContent,
|
|
40
44
|
finalCount,
|
|
41
|
-
applied:
|
|
45
|
+
applied: normalizedContent !== input.chapterContent,
|
|
42
46
|
mode,
|
|
43
47
|
warning,
|
|
44
48
|
tokenUsage: response.usage,
|
|
@@ -94,6 +98,15 @@ ${input.chapterContent}`;
|
|
|
94
98
|
}
|
|
95
99
|
return `Final count ${finalCount} is outside the soft range ${lengthSpec.softMin}-${lengthSpec.softMax} after one normalization pass.`;
|
|
96
100
|
}
|
|
101
|
+
crossesOppositeHardBound(originalCount, candidateCount, lengthSpec) {
|
|
102
|
+
if (originalCount > lengthSpec.hardMax && candidateCount < lengthSpec.hardMin) {
|
|
103
|
+
return true;
|
|
104
|
+
}
|
|
105
|
+
if (originalCount < lengthSpec.hardMin && candidateCount > lengthSpec.hardMax) {
|
|
106
|
+
return true;
|
|
107
|
+
}
|
|
108
|
+
return false;
|
|
109
|
+
}
|
|
97
110
|
sanitizeNormalizedContent(rawContent, fallbackContent) {
|
|
98
111
|
const trimmed = rawContent.trim();
|
|
99
112
|
if (!trimmed)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"length-normalizer.js","sourceRoot":"","sources":["../../src/agents/length-normalizer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAsB7H,MAAM,OAAO,qBAAsB,SAAQ,SAAS;IAClD,IAAI,IAAI;QACN,OAAO,mBAAmB,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,KAA2B;QAChD,MAAM,aAAa,GAAG,kBAAkB,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;QAC9F,MAAM,IAAI,GAAG,KAAK,CAAC,UAAU,CAAC,aAAa,KAAK,MAAM;YACpD,CAAC,CAAC,mBAAmB,CAAC,aAAa,EAAE,KAAK,CAAC,UAAU,CAAC;YACtD,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,aAAa,CAAC;QAEnC,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YACpB,OAAO;gBACL,iBAAiB,EAAE,KAAK,CAAC,cAAc;gBACvC,UAAU,EAAE,aAAa;gBACzB,OAAO,EAAE,KAAK;gBACd,IAAI;aACL,CAAC;QACJ,CAAC;QAED,MAAM,YAAY,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAClD,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,aAAa,EAAE,IAAI,CAAC,CAAC;QACpE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAC9B;YACE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE;YACzC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE;SACtC,EACD;YACE,WAAW,EAAE,GAAG;SACjB,CACF,CAAC;QAEF,MAAM,gBAAgB,GAAG,IAAI,CAAC,yBAAyB,CAAC,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC;QAChG,MAAM,cAAc,GAAG,kBAAkB,CAAC,gBAAgB,EAAE,KAAK,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;QAC3F,MAAM,YAAY,GAAG,gBAAgB,KAAK,KAAK,CAAC,cAAc;eACzD,cAAc,GAAG,KAAK,CAAC,UAAU,CAAC,OAAO;eACzC,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;QAC3C,MAAM,iBAAiB,GAAG,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"length-normalizer.js","sourceRoot":"","sources":["../../src/agents/length-normalizer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Planner prompts for
|
|
2
|
+
* Planner prompts for mobile web-fiction craft methodology.
|
|
3
3
|
*
|
|
4
4
|
* The planner LLM receives the system prompt verbatim and a user message
|
|
5
|
-
* assembled from `buildPlannerUserMessage`. Output is
|
|
6
|
-
*
|
|
5
|
+
* assembled from `buildPlannerUserMessage`. Output is plain Markdown sections
|
|
6
|
+
* (NOT YAML frontmatter, NOT JSON-with-embedded-markdown).
|
|
7
7
|
*/
|
|
8
|
-
export declare const PLANNER_MEMO_SYSTEM_PROMPT = "\u4F60\u662F\u8FD9\u672C\u5C0F\u8BF4\u7684\u521B\u4F5C\u603B\u7F16\uFF0C\u804C\u8D23\u662F\u4E3A\u4E0B\u4E00\u7AE0\u4EA7\u751F\u4E00\u4EFD chapter_memo\u3002\u4F60\u4E0D\u5199\u6B63\u6587\u2014\u2014\u4F60\u53EA\u89C4\u5212\u8FD9\u7AE0\u8981\u5B8C\u6210\u4EC0\u4E48\u3001\u5151\u73B0\u4EC0\u4E48\u3001\u4E0D\u8981\u505A\u4EC0\u4E48\u3002\u4E0B\u6E38\u5199\u624B\uFF08writer\uFF09\u4F1A\u6309\u4F60\u7684 memo \u6269\u5199\u6B63\u6587\u3002\n\n\u4F60\u7684\u5DE5\u4F5C\u539F\u5219\uFF08\u5185\u5316\uFF0C\u4E0D\u8981\u5728 memo \u91CC\u5F15\u7528\u6761\u76EE\u53F7\uFF09\uFF1A\n\n1. 3-5 \u7AE0\u4E00\u4E2A\u5C0F\u76EE\u6807\u5468\u671F\uFF1A\u6BCF 3-5 \u7AE0\u5FC5\u987B\u6709\u4E00\u4E2A\u5C0F\u76EE\u6807\u8FBE\u6210\u6216\u60AC\u5FF5\u5347\u7EA7\uFF0C\u4E3B\u7EBF\u6301\u7EED\u63A8\u8FDB\n2. \u4E3B\u52A8\u5851\u9020\u8BFB\u8005\u671F\u5F85\uFF1A\u4F5C\u8005\u523B\u610F\u5236\u9020\"\u8FD8\u6CA1\u5151\u73B0\u4F46\u5FEB\u8981\u5151\u73B0\"\u7684\u7F3A\u53E3\uFF0C\u5151\u73B0\u65F6\u5FC5\u987B\u8D85\u8FC7\u8BFB\u8005\u9884\u671F 70%\n3. \u4E07\u7269\u7686\u9975\uFF1A\u65E5\u5E38/\u8FC7\u6E21\u7AE0\u8282\u7684\u6BCF\u4E00\u7B14\u90FD\u8981\u662F\u672A\u6765\u5267\u60C5\u7684\u4F0F\u7B14\u6216\u94A9\u5B50\n4. \u4EBA\u8BBE\u9632\u5D29\uFF1A\u89D2\u8272\u884C\u4E3A\u7531\"\u8FC7\u5F80\u7ECF\u5386 + \u5F53\u524D\u5229\u76CA + \u6027\u683C\u5E95\u8272\"\u5171\u540C\u9A71\u52A8\u3002\u7981\u6B62\u53CD\u6D3E\u7A81\u7136\u964D\u667A\u3001\u4E3B\u89D2\u7A81\u7136\u5723\u6BCD\n5. 1 \u4E3B\u7EBF + 1 \u652F\u7EBF\uFF1A\u652F\u7EBF\u5FC5\u987B\u4E3A\u4E3B\u7EBF\u670D\u52A1\uFF0C\u4E0D\u540C\u65F6\u63A8 3 \u6761\u4EE5\u4E0A\u652F\u7EBF\n6. \u723D\u70B9\u5BC6\u96C6\u5316\uFF1A\u6BCF 3-5 \u7AE0\u4E00\u4E2A\u5C0F\u723D\u70B9\uFF08\u5C0F\u51B2\u7A81\u2192\u5FEB\u89E3\u51B3\u2192\u5F3A\u53CD\u9988\uFF09\uFF0C\u5168\u5458\u667A\u5546\u5728\u7EBF\n7. \u9AD8\u6F6E\u524D\u94FA\u57AB\uFF1A\u5927\u9AD8\u6F6E\u524D 3-5 \u7AE0\u5FC5\u987B\u6709\u7EBF\u7D22\u57CB\u8BBE\n8. \u9AD8\u6F6E\u540E\u5F71\u54CD\uFF1A\u7206\u53D1\u7AE0\u4E4B\u540E 1-2 \u7AE0\u5FC5\u987B\u5199\u51FA\u6539\u53D8\uFF08\u4E3B\u7EBF\u63A8\u8FDB\u3001\u4EBA\u8BBE\u6210\u957F\u3001\u5173\u7CFB\u53D8\u5316\uFF09\n9. \u4EBA\u7269\u7ACB\u4F53\u5316\uFF1A\u6838\u5FC3\u6807\u7B7E + \u53CD\u5DEE\u7EC6\u8282 = \u6D3B\u4EBA\n10. \u4E94\u611F\u5177\u4F53\u5316\uFF1A\u573A\u666F\u63CF\u5199\u5FC5\u987B\u6709\u5177\u4F53\u53EF\u89C6\u5316\u611F\u5B98\u7EC6\u8282\n11. \u94A9\u5B50\u627F\u63A5\uFF1A\u6BCF\u7AE0\u7AE0\u5C3E\u7559\u94A9\n12. \u94A9\u5B50\u8D26\u672C\u5FC5\u987B\u7ED3\u8D26\uFF1A\u6BCF\u7AE0\u5BF9\u6D3B\u8DC3 hook \u505A\u660E\u786E\u52A8\u4F5C\uFF08open/advance/resolve/defer\uFF09\uFF0C\u4E0D\u5141\u8BB8\"\u65B0\u5F00\u4E00\u5806\u4E0D\u56DE\u6536\"\n13. \u5706\u5FC3\u6CD5\u540C\u573A\u591A\u89C6\u89D2\uFF1A\u5F53\u672C\u7AE0\u6709\u4E00\u4E2A\u6838\u5FC3\u4E8B\u4EF6\u628A\u4E24\u4E2A\u4EE5\u4E0A\u4E3B\u8981\u89D2\u8272\u805A\u5230\u540C\u4E00\u573A\u666F\uFF08\u5BB6\u5EAD\u51B2\u7A81\u3001\u5BF9\u8D28\u3001\u610F\u5916\u3001\u6289\u62E9\u65F6\u523B\uFF09\uFF0C\u5FC5\u987B\u628A\u8FD9\u4E2A\u4E8B\u4EF6\u5F53\u6210\u5706\u5FC3\uFF0C\u7ED9\u6BCF\u4E2A\u5728\u573A\u5173\u952E\u89D2\u8272\u5B89\u6392**\u4E00\u6BB5\u72EC\u7ACB\u7684\u5185\u5FC3\u53CD\u5E94**\u2014\u2014\u4ED6\u4EEC\u770B\u5230\u7684\u540C\u4E00\u4EF6\u4E8B\uFF0C\u5404\u81EA\u600E\u4E48\u89E3\u8BFB\u3001\u600E\u4E48\u7B97\u8BA1\u3001\u600E\u4E48\u52A8\u6447\u3002memo \u91CC\u7528 \"## \u5F53\u524D\u4EFB\u52A1\" \u6216 \"## \u65E5\u5E38/\u8FC7\u6E21\u627F\u62C5\u4EC0\u4E48\u4EFB\u52A1\" \u663E\u5F0F\u8BF4\u660E\"\u672C\u7AE0 X/Y/Z \u5404\u4ECE\u81EA\u5DF1\u89D2\u5EA6\u8FC7\u4E00\u6B21\"\uFF0C\u4E0D\u8981\u53EA\u5199\u4E00\u4E2A\u89C6\u89D2\n14. \u63ED 1 \u57CB 2 \u63A8\u8350\uFF1A\u672C\u7AE0\u6BCF resolve \u6389 1 \u4E2A\u94A9\u5B50\uFF0C\u5C3D\u91CF\u5728 open \u6BB5\u540C\u65F6\u57CB 2 \u4E2A\u65B0\u94A9\u5B50\uFF08\u4E0A\u9650\u4ECD\u662F \u2264 2 \u4E2A/\u7AE0\uFF09\uFF0C\u800C\u4E14\u65B0\u94A9\u5B50\u6700\u597D\u8DDF\u521A\u63ED\u7684\u94A9\u5B50\u6709\u56E0\u679C\u5173\u8054\uFF0C\u4E0D\u8981\u51ED\u7A7A\u5192\u51FA\u6765\u3002\u786C\u5E95\u7EBF\u662F\"\u63ED 1 \u57CB 1\"\u2014\u2014resolve \u4E86 N \u4E2A\uFF0Copen \u81F3\u5C11 N \u4E2A\uFF0C\u4E0B\u6E38 validator \u4F1A\u5361\n15. \u7528\u6237\u8BBE\u5B9A\u7684\u5185\u5BB9\u6BD4\u4F8B\u5FC5\u987B\u843D\u6210\u573A\u9762\uFF1A\u5982\u679C brief\u3001book_rules\u3001current_focus \u6216\u672C\u7AE0\u7528\u6237\u6307\u4EE4\u5199\u4E86\"\u6743\u8C0B/\u611F\u60C5\u5404\u534A\"\"\u4E8B\u4E1A\u7EBF 70% + \u604B\u7231\u7EBF 30%\"\u8FD9\u7C7B\u6BD4\u4F8B\uFF0C\u4E0D\u8981\u5728 memo \u91CC\u53EA\u590D\u8FF0\u6BD4\u4F8B\u3002\u5FC5\u987B\u628A\u6BCF\u6761\u7EBF\u5206\u914D\u5230\u672C\u7AE0\u53EF\u89C1\u573A\u666F\u3001\u5BF9\u8BDD\u3001\u884C\u52A8\u6216\u5173\u7CFB\u53D8\u5316\u91CC\uFF1B\u67D0\u6761\u7EBF\u672C\u7AE0\u6682\u4E0D\u63A8\u8FDB\u65F6\uFF0C\u8981\u5199\u6E05\u695A\u4E3A\u4EC0\u4E48\u6682\u538B\u3001\u4E0B\u4E00\u6B21\u4F55\u65F6\u8865\u3002\n\n## \u8F93\u51FA\u683C\u5F0F\uFF08\u4E25\u683C\u9075\u5B88\uFF09\n\n\u8F93\u51FA YAML frontmatter + markdown body\uFF0C\u4E0D\u8981\u7528 JSON \u5BF9\u8C61\u5305 markdown \u5B57\u7B26\u4E32\uFF0C\u4E0D\u8981\u52A0\u4EE3\u7801\u5757\u6807\u8BB0\u3002\n\n\u7ED3\u6784\u5982\u4E0B\uFF1A\n\n---\nchapter: 12\ngoal: \u628A\u4E03\u53F7\u95E8\u88AB\u52A8\u8FC7\u624B\u811A\u4ECE\u731C\u6D4B\u9489\u6210\u73B0\u573A\u5B9E\u8BC1\nisGoldenOpening: false\nthreadRefs:\n - H03\n - S004\n---\n\n## \u5F53\u524D\u4EFB\u52A1\n<\u4E00\u53E5\u8BDD\uFF1A\u672C\u7AE0\u4E3B\u89D2\u8981\u5B8C\u6210\u7684\u5177\u4F53\u52A8\u4F5C\uFF0C\u4E0D\u8981\u62BD\u8C61\u63CF\u8FF0>\n\n## \u8BFB\u8005\u6B64\u523B\u5728\u7B49\u4EC0\u4E48\n<\u4E24\u884C\uFF1A\n1) \u8BFB\u8005\u73B0\u5728\u671F\u5F85\u4EC0\u4E48\uFF08\u57FA\u4E8E\u524D\u51E0\u7AE0\u7684\u57CB\u4F0F\uFF09\n2) \u672C\u7AE0\u5BF9\u8FD9\u4E2A\u671F\u5F85\u505A\u4EC0\u4E48\u2014\u2014\u5236\u9020\u66F4\u5F3A\u7F3A\u53E3 / \u90E8\u5206\u5151\u73B0 / \u5B8C\u5168\u5151\u73B0 / \u6682\u4E0D\u5151\u73B0\u4F46\u7ED9\u6697\u793A>\n\n## \u8BE5\u5151\u73B0\u7684 / \u6682\u4E0D\u6380\u7684\n- \u8BE5\u5151\u73B0\uFF1AX \u2192 \u5151\u73B0\u5230\u4EC0\u4E48\u7A0B\u5EA6\n- \u6682\u4E0D\u6380\uFF1AY \u2192 \u5148\u538B\u4F4F\uFF0C\u7559\u5230\u7B2C N \u7AE0\n\n## \u65E5\u5E38/\u8FC7\u6E21\u627F\u62C5\u4EC0\u4E48\u4EFB\u52A1\n<\u5982\u679C\u672C\u7AE0\u662F\u975E\u9AD8\u538B\u7AE0\u8282\uFF0C\u6BCF\u6BB5\u975E\u51B2\u7A81\u6BB5\u843D\u8BF4\u660E\u529F\u80FD\u3002\u683C\u5F0F\uFF1A[\u6BB5\u843D\u4F4D\u7F6E] \u2192 [\u627F\u62C5\u529F\u80FD]\n\u5982\u679C\u672C\u7AE0\u662F\u9AD8\u538B/\u51B2\u7A81\u7AE0\u8282\uFF0C\u5199\"\u4E0D\u9002\u7528 - \u672C\u7AE0\u65E0\u65E5\u5E38\u8FC7\u6E21\">\n\n## \u5173\u952E\u6289\u62E9\u8FC7\u4E09\u8FDE\u95EE\n- \u4E3B\u89D2\u672C\u7AE0\u6700\u5173\u952E\u7684\u4E00\u6B21\u9009\u62E9\uFF1A\n - \u4E3A\u4EC0\u4E48\u8FD9\u4E48\u505A\uFF1F\n - \u7B26\u5408\u5F53\u524D\u5229\u76CA\u5417\uFF1F\n - \u7B26\u5408\u4ED6\u7684\u4EBA\u8BBE\u5417\uFF1F\n- \u5BF9\u624B/\u914D\u89D2\u672C\u7AE0\u6700\u5173\u952E\u7684\u4E00\u6B21\u9009\u62E9\uFF1A\n - \u4E3A\u4EC0\u4E48\u8FD9\u4E48\u505A\uFF1F\n - \u7B26\u5408\u5F53\u524D\u5229\u76CA\u5417\uFF1F\n - \u7B26\u5408\u4ED6\u7684\u4EBA\u8BBE\u5417\uFF1F\n\n## \u7AE0\u5C3E\u5FC5\u987B\u53D1\u751F\u7684\u6539\u53D8\n<1-3 \u6761\uFF0C\u4ECE\u4EE5\u4E0B\u7EF4\u5EA6\u9009\uFF1A\u4FE1\u606F\u6539\u53D8 / \u5173\u7CFB\u6539\u53D8 / \u7269\u7406\u6539\u53D8 / \u6743\u529B\u6539\u53D8>\n\n## \u672C\u7AE0 hook \u8D26\n**\u8FD9\u662F\u672C\u7AE0\u5BF9\u6D3B\u8DC3\u4F0F\u7B14\u7684\u8D26\u672C\uFF0C\u5199\u624B\u5FC5\u987B\u6309\u8FD9\u4EFD\u8D26\u52A8\u4F5C\u3002\u683C\u5F0F\u5982\u4E0B\uFF08\u6BCF\u4E2A\u5206\u7C7B\u4E0B\u7528 - \u5217\u8868\uFF09\uFF1A**\n\nopen:\n- [new] \u65B0\u94A9\u5B50\u63CF\u8FF0\uFF08<=30\u5B57\uFF09|| \u7406\u7531\uFF1A\u4E3A\u4EC0\u4E48\u662F\u73B0\u5728\u5F00\uFF0C\u4E0D\u5728\u672C\u7AE0\u70B9\u7834\uFF08\u4E0A\u9650 \u2264 2 \u4E2A\uFF1B\u63A8\u8350\uFF1A\u672C\u7AE0\u6BCF resolve 1 \u4E2A\u94A9\u5B50\uFF0Copen \u6BB5\u57CB 2 \u4E2A\u65B0\u94A9\u5B50\uFF0C\u786C\u5E95\u7EBF\u662F open \u2265 resolve\uFF09\n\nadvance:\n- H007 \"\u80D6\u864E\u501F\u6761\" \u2192 \u6797\u79CB\u7B2C\u4E00\u6B21\u60F3\u6495\uFF0C\u88AB\u963B\u6B62\uFF08planted \u2192 pressured\uFF09\n- H012 \"\u96F7\u67B6\u7126\u75D5\" \u2192 \u5E08\u5144\u5077\u770B\u7559\u4E0B\u5370\u5B50\uFF08pressured \u2192 near_payoff\uFF09\n\nresolve:\n- H003 \"\u6742\u5F79\u8170\u724C\" \u2192 \u6797\u79CB\u4E3B\u52A8\u6458\u4E0B\uFF08clear\uFF09\n\ndefer:\n- H009 \"\u5B88\u62D9\u8BC0\u6765\u5386\" \u2192 \u672C\u7AE0\u4E0D\u52A8\uFF0C\u7406\u7531\uFF1A\u65F6\u673A\u4E0D\u5230\uFF0C\u7B49\u5230\u7B2C N \u7AE0\n\n**\u786C\u89C4\u5219**\uFF1A\n- \u8F93\u5165\u7684 pending_hooks \u91CC\u5982\u679C\u6709\u4EFB\u4F55 hook \u72B6\u6001\u5DF2\u662F \"pressured\" \u6216 \"near_payoff\" \u4E14\u8DDD\u4E0A\u6B21\u63A8\u8FDB \u2265 5 \u7AE0\uFF0C**\u5FC5\u987B**\u653E\u5230 advance \u6216 resolve\uFF0C\u4E0D\u5141\u8BB8 defer\n- advance/resolve \u91CC\u5199\u7684 hook_id \u5FC5\u987B\u771F\u5B9E\u5B58\u5728\u4E8E pending_hooks \u8F93\u5165\u4E2D\uFF08\u4E0D\u8981\u7F16\u9020 ID\uFF09\n- \u5982\u679C\u8FD9\u7AE0\u662F\u7EAF\u9AD8\u538B/\u6218\u6597\u7AE0\u8282\u6CA1\u6709\u4F0F\u7B14\u5904\u7406\u7A7A\u95F4\uFF0C\u81F3\u5C11\u4E5F\u8981\u6709 1 \u6761 advance \u6216 defer \u58F0\u660E\n- \u672C\u7AE0\"## \u5F53\u524D\u4EFB\u52A1\"\u5982\u679C\u5929\u7136\u5BF9\u5E94\u67D0\u4E2A hook \u7684\u5151\u73B0\u52A8\u4F5C\uFF0C\u5FC5\u987B\u5728 resolve \u91CC\u663E\u5F0F\u58F0\u660E\u5BF9\u5E94 hook_id\n\n## \u4E0D\u8981\u505A\n<2-4 \u6761\u786C\u7EA6\u675F>\n\n## \u8F93\u51FA\u8981\u6C42\n\n- goal \u5B57\u6BB5\u4E0D\u8D85\u8FC7 50 \u5B57\n- threadRefs \u662F YAML \u6570\u7EC4\uFF0C\u5185\u5BB9\u662F\u4ECE\u8F93\u5165\u7684 pending_hooks/subplot_board \u4E2D\u6311\u51FA\u7684 id\n- \u6BCF\u4E2A\u4E8C\u7EA7\u6807\u9898\uFF08##\uFF09\u5FC5\u987B\u51FA\u73B0\uFF0C\u5185\u5BB9\u4E0D\u80FD\u4E3A\u7A7A\n- \u4E0D\u8981\u5728 memo \u91CC\u63D0\u65B9\u6CD5\u8BBA\u672F\u8BED\uFF08\"\u60C5\u7EEA\u7F3A\u53E3\"\u3001\"cyclePhase\"\u3001\"\u84C4\u538B\"\u7B49\uFF09\u2014\u2014\u76F4\u63A5\u7528\u8FD9\u672C\u4E66\u7684\u4EBA\u7269\u3001\u5730\u70B9\u3001\u4E8B\u4EF6\u8BF4\u4E8B\n- \u4E0D\u8981\u4EA7\u751F\u6B63\u6587\u7247\u6BB5\u6216\u5BF9\u8BDD\u7247\u6BB5\n- \u5982\u679C\u5377\u7EB2\u548C\u4E0A\u7AE0\u6458\u8981\u51B2\u7A81\uFF0C\u4FE1\u4E0A\u7AE0\u6458\u8981\uFF08\u5267\u60C5\u5DF2\u5B9E\u9645\u53D1\u751F\uFF09";
|
|
9
|
-
export declare const PLANNER_MEMO_SYSTEM_PROMPT_EN = "You are this novel's editor-in-chief. Your job is to produce a chapter_memo for the next chapter. You do NOT write prose \u2014 you plan what this chapter must accomplish, what it must pay off, and what it must NOT do. The downstream writer expands your memo into prose.\n\nYour working principles (internalize them \u2014 do not cite by number in the memo):\n\n1. Small-goal cycle every 3-5 chapters: every 3-5 chapters there must be a small goal achieved or a suspense escalation; the mainline keeps moving.\n2. Actively shape reader expectation: the author deliberately creates \"not yet paid off but imminent\" gaps; the eventual payoff must exceed reader expectation by 70%.\n3. Everything is bait: in slow / transitional chapters every beat must be a future foreshadow or hook.\n4. No persona collapse: character behavior is driven by past experience + current interest + personality core. Never let antagonists suddenly turn dumb or the protagonist suddenly turn saintly.\n5. 1 mainline + 1 subplot: subplots must serve the mainline; never run 3+ subplots concurrently.\n6. Dense satisfaction beats: every 3-5 chapters needs a small payoff (small conflict \u2192 fast resolution \u2192 strong reader feedback); everyone stays sharp.\n7. Pre-climax setup: 3-5 chapters before any big climax must seed clear setups.\n8. Post-climax fallout: 1-2 chapters after a peak must show concrete change (mainline advance, persona growth, relationship shift).\n9. Three-dimensional characters: core tag + contrast detail = a living person.\n10. Five-sense concretization: scene description must include specific, visualizable sensory detail.\n11. Hook-passing: every chapter ends with a hook for the next.\n12. Hook ledger must balance: every chapter takes explicit action on active hooks (open/advance/resolve/defer). \"Open a pile of hooks and never resolve any\" is forbidden.\n13. Center-of-circle multi-POV: when the chapter has one core event that pulls two or more main characters into the same scene (family clash, confrontation, accident, decision moment), treat that event as the center and give each present key character **a distinct inner reaction** \u2014 same event, different interpretations, different calculations, different wavering. In \"## Current task\" or \"## What the slow / transitional beats carry\", explicitly say \"X/Y/Z each run through it from their own angle this chapter\"; do not collapse everything to a single POV.\n14. Reveal 1, bury 2 (recommended): for every hook you resolve this chapter, try to open 2 new hooks in the same memo (the \u2264 2 new hooks cap still applies), and the new hooks should be causally connected to the one you just resolved, not out of nowhere. The hard floor is \"reveal 1, bury 1\" \u2014 if you resolve N, you must open \u2265 N; the downstream validator will reject otherwise.\n15. User-specified content proportions must become scenes: if the brief, book_rules, current_focus, or per-chapter user instruction says \"politics 50% / romance 50%\" or \"career line 70% + romance 30%\", do not merely repeat the ratio in the memo. Allocate each line to visible scenes, dialogue, action, or relationship movement. If a line is intentionally paused this chapter, state why and when the next visible beat should compensate.\n\n## Output format (strict)\n\nOutput
|
|
10
|
-
export declare const PLANNER_MEMO_USER_TEMPLATE_EN = "# Chapter {{chapterNumber}} memo request\n\n{{brief_block}}\n{{chapter_context_block}}\n\n## Last screen of previous chapter (excerpt)\n{{previous_chapter_ending_excerpt}}\n\n## Last 3 chapter summaries\n{{recent_summaries}}\n\n## What the current arc is pushing\n{{current_arc_prose}}\n\n## Protagonist current state\n{{protagonist_matrix_row}}\n\n## Main antagonist / opposing forces this chapter\n{{opponent_rows}}\n\n## Main collaborators this chapter\n{{collaborator_rows}}\n\n## Threads that may be touched (foreshadows + subplots)\n{{relevant_threads}}\n\n## Stale hooks \u2014 MUST be advanced / resolved / explicitly deferred this chapter\n{{recyclable_hooks}}\n\n## Out-of-volume constraints for this chapter\n- Golden opening chapter: {{isGoldenOpening}}\n- Hard rules (excerpt of items this chapter may touch):\n{{book_rules_relevant}}\n\nProduce the memo for chapter {{chapterNumber}}. Strictly emit
|
|
8
|
+
export declare const PLANNER_MEMO_SYSTEM_PROMPT = "\u4F60\u662F\u8FD9\u672C\u5C0F\u8BF4\u7684\u521B\u4F5C\u603B\u7F16\uFF0C\u804C\u8D23\u662F\u4E3A\u4E0B\u4E00\u7AE0\u4EA7\u751F\u4E00\u4EFD chapter_memo\u3002\u4F60\u4E0D\u5199\u6B63\u6587\u2014\u2014\u4F60\u53EA\u89C4\u5212\u8FD9\u7AE0\u8981\u5B8C\u6210\u4EC0\u4E48\u3001\u5151\u73B0\u4EC0\u4E48\u3001\u4E0D\u8981\u505A\u4EC0\u4E48\u3002\u4E0B\u6E38\u5199\u624B\uFF08writer\uFF09\u4F1A\u6309\u4F60\u7684 memo \u6269\u5199\u6B63\u6587\u3002\n\n\u4F60\u7684\u5DE5\u4F5C\u539F\u5219\uFF08\u5185\u5316\uFF0C\u4E0D\u8981\u5728 memo \u91CC\u5F15\u7528\u6761\u76EE\u53F7\uFF09\uFF1A\n\n1. 3-5 \u7AE0\u4E00\u4E2A\u5C0F\u76EE\u6807\u5468\u671F\uFF1A\u6BCF 3-5 \u7AE0\u5FC5\u987B\u6709\u4E00\u4E2A\u5C0F\u76EE\u6807\u8FBE\u6210\u6216\u60AC\u5FF5\u5347\u7EA7\uFF0C\u4E3B\u7EBF\u6301\u7EED\u63A8\u8FDB\n2. \u4E3B\u52A8\u5851\u9020\u8BFB\u8005\u671F\u5F85\uFF1A\u4F5C\u8005\u523B\u610F\u5236\u9020\"\u8FD8\u6CA1\u5151\u73B0\u4F46\u5FEB\u8981\u5151\u73B0\"\u7684\u7F3A\u53E3\uFF0C\u5151\u73B0\u65F6\u5FC5\u987B\u8D85\u8FC7\u8BFB\u8005\u9884\u671F 70%\n3. \u4E07\u7269\u7686\u9975\uFF1A\u65E5\u5E38/\u8FC7\u6E21\u7AE0\u8282\u7684\u6BCF\u4E00\u7B14\u90FD\u8981\u662F\u672A\u6765\u5267\u60C5\u7684\u4F0F\u7B14\u6216\u94A9\u5B50\n4. \u4EBA\u8BBE\u9632\u5D29\uFF1A\u89D2\u8272\u884C\u4E3A\u7531\"\u8FC7\u5F80\u7ECF\u5386 + \u5F53\u524D\u5229\u76CA + \u6027\u683C\u5E95\u8272\"\u5171\u540C\u9A71\u52A8\u3002\u7981\u6B62\u53CD\u6D3E\u7A81\u7136\u964D\u667A\u3001\u4E3B\u89D2\u7A81\u7136\u5723\u6BCD\n5. 1 \u4E3B\u7EBF + 1 \u652F\u7EBF\uFF1A\u652F\u7EBF\u5FC5\u987B\u4E3A\u4E3B\u7EBF\u670D\u52A1\uFF0C\u4E0D\u540C\u65F6\u63A8 3 \u6761\u4EE5\u4E0A\u652F\u7EBF\n6. \u723D\u70B9\u5BC6\u96C6\u5316\uFF1A\u6BCF 3-5 \u7AE0\u4E00\u4E2A\u5C0F\u723D\u70B9\uFF08\u5C0F\u51B2\u7A81\u2192\u5FEB\u89E3\u51B3\u2192\u5F3A\u53CD\u9988\uFF09\uFF0C\u5168\u5458\u667A\u5546\u5728\u7EBF\n7. \u9AD8\u6F6E\u524D\u94FA\u57AB\uFF1A\u5927\u9AD8\u6F6E\u524D 3-5 \u7AE0\u5FC5\u987B\u6709\u7EBF\u7D22\u57CB\u8BBE\n8. \u9AD8\u6F6E\u540E\u5F71\u54CD\uFF1A\u7206\u53D1\u7AE0\u4E4B\u540E 1-2 \u7AE0\u5FC5\u987B\u5199\u51FA\u6539\u53D8\uFF08\u4E3B\u7EBF\u63A8\u8FDB\u3001\u4EBA\u8BBE\u6210\u957F\u3001\u5173\u7CFB\u53D8\u5316\uFF09\n9. \u4EBA\u7269\u7ACB\u4F53\u5316\uFF1A\u6838\u5FC3\u6807\u7B7E + \u53CD\u5DEE\u7EC6\u8282 = \u6D3B\u4EBA\n10. \u4E94\u611F\u5177\u4F53\u5316\uFF1A\u573A\u666F\u63CF\u5199\u5FC5\u987B\u6709\u5177\u4F53\u53EF\u89C6\u5316\u611F\u5B98\u7EC6\u8282\n11. \u94A9\u5B50\u627F\u63A5\uFF1A\u6BCF\u7AE0\u7AE0\u5C3E\u7559\u94A9\n12. \u94A9\u5B50\u8D26\u672C\u5FC5\u987B\u7ED3\u8D26\uFF1A\u6BCF\u7AE0\u5BF9\u6D3B\u8DC3 hook \u505A\u660E\u786E\u52A8\u4F5C\uFF08open/advance/resolve/defer\uFF09\uFF0C\u4E0D\u5141\u8BB8\"\u65B0\u5F00\u4E00\u5806\u4E0D\u56DE\u6536\"\n13. \u5706\u5FC3\u6CD5\u540C\u573A\u591A\u89C6\u89D2\uFF1A\u5F53\u672C\u7AE0\u6709\u4E00\u4E2A\u6838\u5FC3\u4E8B\u4EF6\u628A\u4E24\u4E2A\u4EE5\u4E0A\u4E3B\u8981\u89D2\u8272\u805A\u5230\u540C\u4E00\u573A\u666F\uFF08\u5BB6\u5EAD\u51B2\u7A81\u3001\u5BF9\u8D28\u3001\u610F\u5916\u3001\u6289\u62E9\u65F6\u523B\uFF09\uFF0C\u5FC5\u987B\u628A\u8FD9\u4E2A\u4E8B\u4EF6\u5F53\u6210\u5706\u5FC3\uFF0C\u7ED9\u6BCF\u4E2A\u5728\u573A\u5173\u952E\u89D2\u8272\u5B89\u6392**\u4E00\u6BB5\u72EC\u7ACB\u7684\u5185\u5FC3\u53CD\u5E94**\u2014\u2014\u4ED6\u4EEC\u770B\u5230\u7684\u540C\u4E00\u4EF6\u4E8B\uFF0C\u5404\u81EA\u600E\u4E48\u89E3\u8BFB\u3001\u600E\u4E48\u7B97\u8BA1\u3001\u600E\u4E48\u52A8\u6447\u3002memo \u91CC\u7528 \"## \u5F53\u524D\u4EFB\u52A1\" \u6216 \"## \u65E5\u5E38/\u8FC7\u6E21\u627F\u62C5\u4EC0\u4E48\u4EFB\u52A1\" \u663E\u5F0F\u8BF4\u660E\"\u672C\u7AE0 X/Y/Z \u5404\u4ECE\u81EA\u5DF1\u89D2\u5EA6\u8FC7\u4E00\u6B21\"\uFF0C\u4E0D\u8981\u53EA\u5199\u4E00\u4E2A\u89C6\u89D2\n14. \u63ED 1 \u57CB 2 \u63A8\u8350\uFF1A\u672C\u7AE0\u6BCF resolve \u6389 1 \u4E2A\u94A9\u5B50\uFF0C\u5C3D\u91CF\u5728 open \u6BB5\u540C\u65F6\u57CB 2 \u4E2A\u65B0\u94A9\u5B50\uFF08\u4E0A\u9650\u4ECD\u662F \u2264 2 \u4E2A/\u7AE0\uFF09\uFF0C\u800C\u4E14\u65B0\u94A9\u5B50\u6700\u597D\u8DDF\u521A\u63ED\u7684\u94A9\u5B50\u6709\u56E0\u679C\u5173\u8054\uFF0C\u4E0D\u8981\u51ED\u7A7A\u5192\u51FA\u6765\u3002\u786C\u5E95\u7EBF\u662F\"\u63ED 1 \u57CB 1\"\u2014\u2014resolve \u4E86 N \u4E2A\uFF0Copen \u81F3\u5C11 N \u4E2A\uFF0C\u4E0B\u6E38 validator \u4F1A\u5361\n15. \u7528\u6237\u8BBE\u5B9A\u7684\u5185\u5BB9\u6BD4\u4F8B\u5FC5\u987B\u843D\u6210\u573A\u9762\uFF1A\u5982\u679C brief\u3001book_rules\u3001current_focus \u6216\u672C\u7AE0\u7528\u6237\u6307\u4EE4\u5199\u4E86\"\u6743\u8C0B/\u611F\u60C5\u5404\u534A\"\"\u4E8B\u4E1A\u7EBF 70% + \u604B\u7231\u7EBF 30%\"\u8FD9\u7C7B\u6BD4\u4F8B\uFF0C\u4E0D\u8981\u5728 memo \u91CC\u53EA\u590D\u8FF0\u6BD4\u4F8B\u3002\u5FC5\u987B\u628A\u6BCF\u6761\u7EBF\u5206\u914D\u5230\u672C\u7AE0\u53EF\u89C1\u573A\u666F\u3001\u5BF9\u8BDD\u3001\u884C\u52A8\u6216\u5173\u7CFB\u53D8\u5316\u91CC\uFF1B\u67D0\u6761\u7EBF\u672C\u7AE0\u6682\u4E0D\u63A8\u8FDB\u65F6\uFF0C\u8981\u5199\u6E05\u695A\u4E3A\u4EC0\u4E48\u6682\u538B\u3001\u4E0B\u4E00\u6B21\u4F55\u65F6\u8865\u3002\n\n## \u8F93\u51FA\u683C\u5F0F\uFF08\u4E25\u683C\u9075\u5B88\uFF09\n\n\u8F93\u51FA\u666E\u901A Markdown\uFF0C\u4E0D\u8981 YAML frontmatter\uFF0C\u4E0D\u8981 JSON\uFF0C\u4E0D\u8981\u4EE3\u7801\u5757\u6807\u8BB0\u3002\n\n\u7ED3\u6784\u5982\u4E0B\uFF1A\n\n# \u7B2C 12 \u7AE0 memo\n\n## \u672C\u7AE0\u76EE\u6807\n\u628A\u4E03\u53F7\u95E8\u88AB\u52A8\u8FC7\u624B\u811A\u9489\u6210\u73B0\u573A\u5B9E\u8BC1\n\n## \u5173\u8054\u7EBF\u7D22\n- H03\n- S004\n\n## \u5F53\u524D\u4EFB\u52A1\n<\u4E00\u53E5\u8BDD\uFF1A\u672C\u7AE0\u4E3B\u89D2\u8981\u5B8C\u6210\u7684\u5177\u4F53\u52A8\u4F5C\uFF0C\u4E0D\u8981\u62BD\u8C61\u63CF\u8FF0>\n\n## \u8BFB\u8005\u6B64\u523B\u5728\u7B49\u4EC0\u4E48\n<\u4E24\u884C\uFF1A\n1) \u8BFB\u8005\u73B0\u5728\u671F\u5F85\u4EC0\u4E48\uFF08\u57FA\u4E8E\u524D\u51E0\u7AE0\u7684\u57CB\u4F0F\uFF09\n2) \u672C\u7AE0\u5BF9\u8FD9\u4E2A\u671F\u5F85\u505A\u4EC0\u4E48\u2014\u2014\u5236\u9020\u66F4\u5F3A\u7F3A\u53E3 / \u90E8\u5206\u5151\u73B0 / \u5B8C\u5168\u5151\u73B0 / \u6682\u4E0D\u5151\u73B0\u4F46\u7ED9\u6697\u793A>\n\n## \u8BE5\u5151\u73B0\u7684 / \u6682\u4E0D\u6380\u7684\n- \u8BE5\u5151\u73B0\uFF1AX \u2192 \u5151\u73B0\u5230\u4EC0\u4E48\u7A0B\u5EA6\n- \u6682\u4E0D\u6380\uFF1AY \u2192 \u5148\u538B\u4F4F\uFF0C\u7559\u5230\u7B2C N \u7AE0\n\n## \u65E5\u5E38/\u8FC7\u6E21\u627F\u62C5\u4EC0\u4E48\u4EFB\u52A1\n<\u5982\u679C\u672C\u7AE0\u662F\u975E\u9AD8\u538B\u7AE0\u8282\uFF0C\u6BCF\u6BB5\u975E\u51B2\u7A81\u6BB5\u843D\u8BF4\u660E\u529F\u80FD\u3002\u683C\u5F0F\uFF1A[\u6BB5\u843D\u4F4D\u7F6E] \u2192 [\u627F\u62C5\u529F\u80FD]\n\u5982\u679C\u672C\u7AE0\u662F\u9AD8\u538B/\u51B2\u7A81\u7AE0\u8282\uFF0C\u5199\"\u4E0D\u9002\u7528 - \u672C\u7AE0\u65E0\u65E5\u5E38\u8FC7\u6E21\">\n\n## \u5173\u952E\u6289\u62E9\u8FC7\u4E09\u8FDE\u95EE\n- \u4E3B\u89D2\u672C\u7AE0\u6700\u5173\u952E\u7684\u4E00\u6B21\u9009\u62E9\uFF1A\n - \u4E3A\u4EC0\u4E48\u8FD9\u4E48\u505A\uFF1F\n - \u7B26\u5408\u5F53\u524D\u5229\u76CA\u5417\uFF1F\n - \u7B26\u5408\u4ED6\u7684\u4EBA\u8BBE\u5417\uFF1F\n- \u5BF9\u624B/\u914D\u89D2\u672C\u7AE0\u6700\u5173\u952E\u7684\u4E00\u6B21\u9009\u62E9\uFF1A\n - \u4E3A\u4EC0\u4E48\u8FD9\u4E48\u505A\uFF1F\n - \u7B26\u5408\u5F53\u524D\u5229\u76CA\u5417\uFF1F\n - \u7B26\u5408\u4ED6\u7684\u4EBA\u8BBE\u5417\uFF1F\n\n## \u7AE0\u5C3E\u5FC5\u987B\u53D1\u751F\u7684\u6539\u53D8\n<1-3 \u6761\uFF0C\u4ECE\u4EE5\u4E0B\u7EF4\u5EA6\u9009\uFF1A\u4FE1\u606F\u6539\u53D8 / \u5173\u7CFB\u6539\u53D8 / \u7269\u7406\u6539\u53D8 / \u6743\u529B\u6539\u53D8>\n\n## \u672C\u7AE0 hook \u8D26\n**\u8FD9\u662F\u672C\u7AE0\u5BF9\u6D3B\u8DC3\u4F0F\u7B14\u7684\u8D26\u672C\uFF0C\u5199\u624B\u5FC5\u987B\u6309\u8FD9\u4EFD\u8D26\u52A8\u4F5C\u3002\u683C\u5F0F\u5982\u4E0B\uFF08\u6BCF\u4E2A\u5206\u7C7B\u4E0B\u7528 - \u5217\u8868\uFF09\uFF1A**\n\nopen:\n- [new] \u65B0\u94A9\u5B50\u63CF\u8FF0\uFF08<=30\u5B57\uFF09|| \u7406\u7531\uFF1A\u4E3A\u4EC0\u4E48\u662F\u73B0\u5728\u5F00\uFF0C\u4E0D\u5728\u672C\u7AE0\u70B9\u7834\uFF08\u4E0A\u9650 \u2264 2 \u4E2A\uFF1B\u63A8\u8350\uFF1A\u672C\u7AE0\u6BCF resolve 1 \u4E2A\u94A9\u5B50\uFF0Copen \u6BB5\u57CB 2 \u4E2A\u65B0\u94A9\u5B50\uFF0C\u786C\u5E95\u7EBF\u662F open \u2265 resolve\uFF09\n\nadvance:\n- H007 \"\u80D6\u864E\u501F\u6761\" \u2192 \u6797\u79CB\u7B2C\u4E00\u6B21\u60F3\u6495\uFF0C\u88AB\u963B\u6B62\uFF08planted \u2192 pressured\uFF09\n- H012 \"\u96F7\u67B6\u7126\u75D5\" \u2192 \u5E08\u5144\u5077\u770B\u7559\u4E0B\u5370\u5B50\uFF08pressured \u2192 near_payoff\uFF09\n\nresolve:\n- H003 \"\u6742\u5F79\u8170\u724C\" \u2192 \u6797\u79CB\u4E3B\u52A8\u6458\u4E0B\uFF08clear\uFF09\n\ndefer:\n- H009 \"\u5B88\u62D9\u8BC0\u6765\u5386\" \u2192 \u672C\u7AE0\u4E0D\u52A8\uFF0C\u7406\u7531\uFF1A\u65F6\u673A\u4E0D\u5230\uFF0C\u7B49\u5230\u7B2C N \u7AE0\n\n**\u786C\u89C4\u5219**\uFF1A\n- \u8F93\u5165\u7684 pending_hooks \u91CC\u5982\u679C\u6709\u4EFB\u4F55 hook \u72B6\u6001\u5DF2\u662F \"pressured\" \u6216 \"near_payoff\" \u4E14\u8DDD\u4E0A\u6B21\u63A8\u8FDB \u2265 5 \u7AE0\uFF0C**\u5FC5\u987B**\u653E\u5230 advance \u6216 resolve\uFF0C\u4E0D\u5141\u8BB8 defer\n- advance/resolve \u91CC\u5199\u7684 hook_id \u5FC5\u987B\u771F\u5B9E\u5B58\u5728\u4E8E pending_hooks \u8F93\u5165\u4E2D\uFF08\u4E0D\u8981\u7F16\u9020 ID\uFF09\n- \u5982\u679C\u8FD9\u7AE0\u662F\u7EAF\u9AD8\u538B/\u6218\u6597\u7AE0\u8282\u6CA1\u6709\u4F0F\u7B14\u5904\u7406\u7A7A\u95F4\uFF0C\u81F3\u5C11\u4E5F\u8981\u6709 1 \u6761 advance \u6216 defer \u58F0\u660E\n- \u672C\u7AE0\"## \u5F53\u524D\u4EFB\u52A1\"\u5982\u679C\u5929\u7136\u5BF9\u5E94\u67D0\u4E2A hook \u7684\u5151\u73B0\u52A8\u4F5C\uFF0C\u5FC5\u987B\u5728 resolve \u91CC\u663E\u5F0F\u58F0\u660E\u5BF9\u5E94 hook_id\n\n## \u4E0D\u8981\u505A\n<2-4 \u6761\u786C\u7EA6\u675F>\n\n## \u8F93\u51FA\u8981\u6C42\n\n- \"## \u672C\u7AE0\u76EE\u6807\" \u4E0D\u8D85\u8FC7 50 \u5B57\n- \"## \u5173\u8054\u7EBF\u7D22\" \u7528 Markdown \u5217\u8868\u5199\u4ECE\u8F93\u5165 pending_hooks/subplot_board \u4E2D\u6311\u51FA\u7684 id\uFF1B\u6CA1\u6709\u5C31\u5199\"\u65E0\"\n- \u6BCF\u4E2A\u4E8C\u7EA7\u6807\u9898\uFF08##\uFF09\u5FC5\u987B\u51FA\u73B0\uFF0C\u5185\u5BB9\u4E0D\u80FD\u4E3A\u7A7A\n- \u4E0D\u8981\u5728 memo \u91CC\u63D0\u65B9\u6CD5\u8BBA\u672F\u8BED\uFF08\"\u60C5\u7EEA\u7F3A\u53E3\"\u3001\"cyclePhase\"\u3001\"\u84C4\u538B\"\u7B49\uFF09\u2014\u2014\u76F4\u63A5\u7528\u8FD9\u672C\u4E66\u7684\u4EBA\u7269\u3001\u5730\u70B9\u3001\u4E8B\u4EF6\u8BF4\u4E8B\n- \u4E0D\u8981\u4EA7\u751F\u6B63\u6587\u7247\u6BB5\u6216\u5BF9\u8BDD\u7247\u6BB5\n- \u5982\u679C\u5377\u7EB2\u548C\u4E0A\u7AE0\u6458\u8981\u51B2\u7A81\uFF0C\u4FE1\u4E0A\u7AE0\u6458\u8981\uFF08\u5267\u60C5\u5DF2\u5B9E\u9645\u53D1\u751F\uFF09";
|
|
9
|
+
export declare const PLANNER_MEMO_SYSTEM_PROMPT_EN = "You are this novel's editor-in-chief. Your job is to produce a chapter_memo for the next chapter. You do NOT write prose \u2014 you plan what this chapter must accomplish, what it must pay off, and what it must NOT do. The downstream writer expands your memo into prose.\n\nYour working principles (internalize them \u2014 do not cite by number in the memo):\n\n1. Small-goal cycle every 3-5 chapters: every 3-5 chapters there must be a small goal achieved or a suspense escalation; the mainline keeps moving.\n2. Actively shape reader expectation: the author deliberately creates \"not yet paid off but imminent\" gaps; the eventual payoff must exceed reader expectation by 70%.\n3. Everything is bait: in slow / transitional chapters every beat must be a future foreshadow or hook.\n4. No persona collapse: character behavior is driven by past experience + current interest + personality core. Never let antagonists suddenly turn dumb or the protagonist suddenly turn saintly.\n5. 1 mainline + 1 subplot: subplots must serve the mainline; never run 3+ subplots concurrently.\n6. Dense satisfaction beats: every 3-5 chapters needs a small payoff (small conflict \u2192 fast resolution \u2192 strong reader feedback); everyone stays sharp.\n7. Pre-climax setup: 3-5 chapters before any big climax must seed clear setups.\n8. Post-climax fallout: 1-2 chapters after a peak must show concrete change (mainline advance, persona growth, relationship shift).\n9. Three-dimensional characters: core tag + contrast detail = a living person.\n10. Five-sense concretization: scene description must include specific, visualizable sensory detail.\n11. Hook-passing: every chapter ends with a hook for the next.\n12. Hook ledger must balance: every chapter takes explicit action on active hooks (open/advance/resolve/defer). \"Open a pile of hooks and never resolve any\" is forbidden.\n13. Center-of-circle multi-POV: when the chapter has one core event that pulls two or more main characters into the same scene (family clash, confrontation, accident, decision moment), treat that event as the center and give each present key character **a distinct inner reaction** \u2014 same event, different interpretations, different calculations, different wavering. In \"## Current task\" or \"## What the slow / transitional beats carry\", explicitly say \"X/Y/Z each run through it from their own angle this chapter\"; do not collapse everything to a single POV.\n14. Reveal 1, bury 2 (recommended): for every hook you resolve this chapter, try to open 2 new hooks in the same memo (the \u2264 2 new hooks cap still applies), and the new hooks should be causally connected to the one you just resolved, not out of nowhere. The hard floor is \"reveal 1, bury 1\" \u2014 if you resolve N, you must open \u2265 N; the downstream validator will reject otherwise.\n15. User-specified content proportions must become scenes: if the brief, book_rules, current_focus, or per-chapter user instruction says \"politics 50% / romance 50%\" or \"career line 70% + romance 30%\", do not merely repeat the ratio in the memo. Allocate each line to visible scenes, dialogue, action, or relationship movement. If a line is intentionally paused this chapter, state why and when the next visible beat should compensate.\n\n## Output format (strict)\n\nOutput plain Markdown. Do NOT output YAML frontmatter. Do NOT wrap markdown in a JSON object. Do NOT add code-block fences.\n\nStructure:\n\n# Chapter 12 memo\n\n## Chapter goal\nPin Door 7 tampering as live evidence\n\n## Thread refs\n- H03\n- S004\n\n## Current task\n<one sentence: the concrete action the protagonist must complete this chapter \u2014 no abstractions>\n\n## What the reader is waiting for right now\n<two lines:\n1) what the reader currently expects (based on prior chapters' setups)\n2) what this chapter does with that expectation \u2014 widen the gap / partial payoff / full payoff / hint without paying off>\n\n## To pay off / to keep buried\n- Pay off: X \u2192 to what degree\n- Keep buried: Y \u2192 suppress until chapter N\n\n## What the slow / transitional beats carry\n<if this is a non-pressure chapter, name the function of each non-conflict paragraph. Format: [position] \u2192 [function]\nif this is a pressure / conflict chapter, write \"n/a \u2014 pressure chapter, no transitional beats\">\n\n## Three-question check on the key choice\n- Protagonist's most important choice this chapter:\n - Why this choice?\n - Does it match current interest?\n - Does it match their persona?\n- Antagonist / supporting cast's most important choice this chapter:\n - Why this choice?\n - Does it match current interest?\n - Does it match their persona?\n\n## Required end-of-chapter change\n<1-3 items, choose from: information change / relationship change / physical change / power change>\n\n## Hook ledger for this chapter\n**The per-chapter accounting of active foreshadows. The writer must act on this ledger. Format (use \"-\" bullets under each subsection):**\n\nopen:\n- [new] new hook description (<=30 chars) || reason: why open it now, do not pay it off this chapter (cap \u2264 2; recommended: for each hook resolved this chapter, open 2 new hooks; hard floor is open \u2265 resolve)\n\nadvance:\n- H007 \"Huzi's IOU\" \u2192 Lin Qiu tries to tear it, gets stopped (planted \u2192 pressured)\n- H012 \"thunder rack scar\" \u2192 a senior brother sneaks a look, leaves a mark (pressured \u2192 near_payoff)\n\nresolve:\n- H003 \"errand badge\" \u2192 Lin Qiu unpins it himself (clear)\n\ndefer:\n- H009 \"origin of Shou-Zhuo Jue\" \u2192 not touched this chapter, reason: timing not right, save until chapter N\n\n**Hard rules**:\n- If any hook in input pending_hooks is already \"pressured\" or \"near_payoff\" AND has not advanced in \u2265 5 chapters, it **must** go into advance or resolve \u2014 deferring is not allowed.\n- hook_ids in advance/resolve must exist in the input pending_hooks (do not fabricate IDs).\n- If this chapter is pure pressure / combat with no foreshadow room, emit at least 1 advance or defer entry.\n- If \"## Current task\" naturally corresponds to paying off a hook, it must appear under resolve with the hook_id.\n\n## Do not\n<2-4 hard prohibitions>\n\n## Output requirements\n\n- \"## Chapter goal\" is no more than 50 characters\n- \"## Thread refs\" is a Markdown bullet list of ids picked from the input pending_hooks / subplot_board; write \"none\" if empty\n- Every level-2 heading (##) must appear; none may be empty\n- Do NOT use methodology jargon (\"emotional gap\", \"cyclePhase\", \"pressure buildup\") in the memo \u2014 speak directly using this book's people, places, events\n- Do NOT produce prose or dialogue fragments\n- If the volume outline conflicts with the previous chapter summary, trust the summary (those events actually happened)";
|
|
10
|
+
export declare const PLANNER_MEMO_USER_TEMPLATE_EN = "# Chapter {{chapterNumber}} memo request\n\n{{brief_block}}\n{{chapter_context_block}}\n\n## Last screen of previous chapter (excerpt)\n{{previous_chapter_ending_excerpt}}\n\n## Last 3 chapter summaries\n{{recent_summaries}}\n\n## What the current arc is pushing\n{{current_arc_prose}}\n\n## Protagonist current state\n{{protagonist_matrix_row}}\n\n## Main antagonist / opposing forces this chapter\n{{opponent_rows}}\n\n## Main collaborators this chapter\n{{collaborator_rows}}\n\n## Threads that may be touched (foreshadows + subplots)\n{{relevant_threads}}\n\n## Stale hooks \u2014 MUST be advanced / resolved / explicitly deferred this chapter\n{{recyclable_hooks}}\n\n## Out-of-volume constraints for this chapter\n- Golden opening chapter: {{isGoldenOpening}}\n- Hard rules (excerpt of items this chapter may touch):\n{{book_rules_relevant}}\n\nProduce the memo for chapter {{chapterNumber}}. Strictly emit the plain Markdown section format above.";
|
|
11
11
|
/**
|
|
12
12
|
* Phase hotfix 4: select the language-appropriate planner system prompt.
|
|
13
13
|
* Defaults to zh for backward compatibility — explicit "en" required for
|
|
@@ -15,7 +15,7 @@ export declare const PLANNER_MEMO_USER_TEMPLATE_EN = "# Chapter {{chapterNumber}
|
|
|
15
15
|
*/
|
|
16
16
|
export declare function getPlannerMemoSystemPrompt(language?: "zh" | "en"): string;
|
|
17
17
|
export declare function getPlannerMemoUserTemplate(language?: "zh" | "en"): string;
|
|
18
|
-
export declare const PLANNER_MEMO_USER_TEMPLATE = "# \u7B2C {{chapterNumber}} \u7AE0 memo \u8BF7\u6C42\n\n{{brief_block}}\n{{chapter_context_block}}\n\n## \u4E0A\u4E00\u7AE0\u6700\u540E\u4E00\u5C4F\uFF08\u539F\u6587\u8282\u9009\uFF09\n{{previous_chapter_ending_excerpt}}\n\n## \u6700\u8FD1 3 \u7AE0\u6458\u8981\n{{recent_summaries}}\n\n## \u5F53\u524D arc \u6B63\u5728\u63A8\u8FDB\u4EC0\u4E48\n{{current_arc_prose}}\n\n## \u4E3B\u89D2\u5F53\u524D\u72B6\u6001\n{{protagonist_matrix_row}}\n\n## \u672C\u7AE0\u4E3B\u8981\u5BF9\u624B/\u963B\u529B\u65B9\n{{opponent_rows}}\n\n## \u672C\u7AE0\u4E3B\u8981\u534F\u4F5C\u8005\n{{collaborator_rows}}\n\n## \u53EF\u80FD\u88AB\u7275\u52A8\u7684 thread\uFF08\u4F0F\u7B14 + \u652F\u7EBF\uFF09\n{{relevant_threads}}\n\n## \u5FC5\u987B\u56DE\u6536\u7684\u9648\u65E7 hook\uFF08\u672C\u7AE0\u5FC5\u987B advance / resolve / \u663E\u5F0F defer\uFF09\n{{recyclable_hooks}}\n\n## \u672C\u7AE0\u5377\u5916\u7EA6\u675F\n- \u662F\u5426\u9EC4\u91D1\u4E09\u7AE0\uFF1A{{isGoldenOpening}}\n- \u786C\u7EA6\u675F\uFF08\u6458\u53D6\u672C\u7AE0\u53EF\u80FD\u89E6\u78B0\u7684\u6761\u76EE\uFF09\uFF1A\n{{book_rules_relevant}}\n\n\u8BF7\u4E3A\u7B2C {{chapterNumber}} \u7AE0\u4EA7\u751F memo\u3002\u4E25\u683C\u6309
|
|
18
|
+
export declare const PLANNER_MEMO_USER_TEMPLATE = "# \u7B2C {{chapterNumber}} \u7AE0 memo \u8BF7\u6C42\n\n{{brief_block}}\n{{chapter_context_block}}\n\n## \u4E0A\u4E00\u7AE0\u6700\u540E\u4E00\u5C4F\uFF08\u539F\u6587\u8282\u9009\uFF09\n{{previous_chapter_ending_excerpt}}\n\n## \u6700\u8FD1 3 \u7AE0\u6458\u8981\n{{recent_summaries}}\n\n## \u5F53\u524D arc \u6B63\u5728\u63A8\u8FDB\u4EC0\u4E48\n{{current_arc_prose}}\n\n## \u4E3B\u89D2\u5F53\u524D\u72B6\u6001\n{{protagonist_matrix_row}}\n\n## \u672C\u7AE0\u4E3B\u8981\u5BF9\u624B/\u963B\u529B\u65B9\n{{opponent_rows}}\n\n## \u672C\u7AE0\u4E3B\u8981\u534F\u4F5C\u8005\n{{collaborator_rows}}\n\n## \u53EF\u80FD\u88AB\u7275\u52A8\u7684 thread\uFF08\u4F0F\u7B14 + \u652F\u7EBF\uFF09\n{{relevant_threads}}\n\n## \u5FC5\u987B\u56DE\u6536\u7684\u9648\u65E7 hook\uFF08\u672C\u7AE0\u5FC5\u987B advance / resolve / \u663E\u5F0F defer\uFF09\n{{recyclable_hooks}}\n\n## \u672C\u7AE0\u5377\u5916\u7EA6\u675F\n- \u662F\u5426\u9EC4\u91D1\u4E09\u7AE0\uFF1A{{isGoldenOpening}}\n- \u786C\u7EA6\u675F\uFF08\u6458\u53D6\u672C\u7AE0\u53EF\u80FD\u89E6\u78B0\u7684\u6761\u76EE\uFF09\uFF1A\n{{book_rules_relevant}}\n\n\u8BF7\u4E3A\u7B2C {{chapterNumber}} \u7AE0\u4EA7\u751F memo\u3002\u4E25\u683C\u6309\u4E0A\u9762\u7684\u666E\u901A Markdown \u5C0F\u8282\u683C\u5F0F\u8F93\u51FA\u3002";
|
|
19
19
|
export interface PlannerUserMessageInput {
|
|
20
20
|
readonly chapterNumber: number;
|
|
21
21
|
readonly previousChapterEndingExcerpt: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"planner-prompts.d.ts","sourceRoot":"","sources":["../../src/agents/planner-prompts.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,eAAO,MAAM,0BAA0B,
|
|
1
|
+
{"version":3,"file":"planner-prompts.d.ts","sourceRoot":"","sources":["../../src/agents/planner-prompts.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,eAAO,MAAM,0BAA0B,gzUAgGV,CAAC;AAS9B,eAAO,MAAM,6BAA6B,msNAgG8E,CAAC;AAEzH,eAAO,MAAM,6BAA6B,87BAkC6D,CAAC;AAExG;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,QAAQ,GAAE,IAAI,GAAG,IAAW,GAAG,MAAM,CAE/E;AAED,wBAAgB,0BAA0B,CAAC,QAAQ,GAAE,IAAI,GAAG,IAAW,GAAG,MAAM,CAE/E;AAED,eAAO,MAAM,0BAA0B,gvCAkCkB,CAAC;AAE1D,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,4BAA4B,EAAE,MAAM,CAAC;IAC9C,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;IAClC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,QAAQ,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;CACjC;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,uBAAuB,GAAG,MAAM,CA0B9E;AA6CD,wBAAgB,0BAA0B,CACxC,aAAa,EAAE,MAAM,EACrB,QAAQ,GAAE,IAAI,GAAG,IAAW,GAC3B,MAAM,CAgBR"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Planner prompts for
|
|
2
|
+
* Planner prompts for mobile web-fiction craft methodology.
|
|
3
3
|
*
|
|
4
4
|
* The planner LLM receives the system prompt verbatim and a user message
|
|
5
|
-
* assembled from `buildPlannerUserMessage`. Output is
|
|
6
|
-
*
|
|
5
|
+
* assembled from `buildPlannerUserMessage`. Output is plain Markdown sections
|
|
6
|
+
* (NOT YAML frontmatter, NOT JSON-with-embedded-markdown).
|
|
7
7
|
*/
|
|
8
8
|
export const PLANNER_MEMO_SYSTEM_PROMPT = `你是这本小说的创作总编,职责是为下一章产生一份 chapter_memo。你不写正文——你只规划这章要完成什么、兑现什么、不要做什么。下游写手(writer)会按你的 memo 扩写正文。
|
|
9
9
|
|
|
@@ -27,18 +27,18 @@ export const PLANNER_MEMO_SYSTEM_PROMPT = `你是这本小说的创作总编,
|
|
|
27
27
|
|
|
28
28
|
## 输出格式(严格遵守)
|
|
29
29
|
|
|
30
|
-
|
|
30
|
+
输出普通 Markdown,不要 YAML frontmatter,不要 JSON,不要代码块标记。
|
|
31
31
|
|
|
32
32
|
结构如下:
|
|
33
33
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
34
|
+
# 第 12 章 memo
|
|
35
|
+
|
|
36
|
+
## 本章目标
|
|
37
|
+
把七号门被动过手脚钉成现场实证
|
|
38
|
+
|
|
39
|
+
## 关联线索
|
|
40
|
+
- H03
|
|
41
|
+
- S004
|
|
42
42
|
|
|
43
43
|
## 当前任务
|
|
44
44
|
<一句话:本章主角要完成的具体动作,不要抽象描述>
|
|
@@ -96,8 +96,8 @@ defer:
|
|
|
96
96
|
|
|
97
97
|
## 输出要求
|
|
98
98
|
|
|
99
|
-
-
|
|
100
|
-
-
|
|
99
|
+
- "## 本章目标" 不超过 50 字
|
|
100
|
+
- "## 关联线索" 用 Markdown 列表写从输入 pending_hooks/subplot_board 中挑出的 id;没有就写"无"
|
|
101
101
|
- 每个二级标题(##)必须出现,内容不能为空
|
|
102
102
|
- 不要在 memo 里提方法论术语("情绪缺口"、"cyclePhase"、"蓄压"等)——直接用这本书的人物、地点、事件说事
|
|
103
103
|
- 不要产生正文片段或对话片段
|
|
@@ -130,18 +130,18 @@ Your working principles (internalize them — do not cite by number in the memo)
|
|
|
130
130
|
|
|
131
131
|
## Output format (strict)
|
|
132
132
|
|
|
133
|
-
Output
|
|
133
|
+
Output plain Markdown. Do NOT output YAML frontmatter. Do NOT wrap markdown in a JSON object. Do NOT add code-block fences.
|
|
134
134
|
|
|
135
135
|
Structure:
|
|
136
136
|
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
137
|
+
# Chapter 12 memo
|
|
138
|
+
|
|
139
|
+
## Chapter goal
|
|
140
|
+
Pin Door 7 tampering as live evidence
|
|
141
|
+
|
|
142
|
+
## Thread refs
|
|
143
|
+
- H03
|
|
144
|
+
- S004
|
|
145
145
|
|
|
146
146
|
## Current task
|
|
147
147
|
<one sentence: the concrete action the protagonist must complete this chapter — no abstractions>
|
|
@@ -199,8 +199,8 @@ defer:
|
|
|
199
199
|
|
|
200
200
|
## Output requirements
|
|
201
201
|
|
|
202
|
-
- goal
|
|
203
|
-
-
|
|
202
|
+
- "## Chapter goal" is no more than 50 characters
|
|
203
|
+
- "## Thread refs" is a Markdown bullet list of ids picked from the input pending_hooks / subplot_board; write "none" if empty
|
|
204
204
|
- Every level-2 heading (##) must appear; none may be empty
|
|
205
205
|
- Do NOT use methodology jargon ("emotional gap", "cyclePhase", "pressure buildup") in the memo — speak directly using this book's people, places, events
|
|
206
206
|
- Do NOT produce prose or dialogue fragments
|
|
@@ -239,7 +239,7 @@ export const PLANNER_MEMO_USER_TEMPLATE_EN = `# Chapter {{chapterNumber}} memo r
|
|
|
239
239
|
- Hard rules (excerpt of items this chapter may touch):
|
|
240
240
|
{{book_rules_relevant}}
|
|
241
241
|
|
|
242
|
-
Produce the memo for chapter {{chapterNumber}}. Strictly emit
|
|
242
|
+
Produce the memo for chapter {{chapterNumber}}. Strictly emit the plain Markdown section format above.`;
|
|
243
243
|
/**
|
|
244
244
|
* Phase hotfix 4: select the language-appropriate planner system prompt.
|
|
245
245
|
* Defaults to zh for backward compatibility — explicit "en" required for
|
|
@@ -285,7 +285,7 @@ export const PLANNER_MEMO_USER_TEMPLATE = `# 第 {{chapterNumber}} 章 memo 请
|
|
|
285
285
|
- 硬约束(摘取本章可能触碰的条目):
|
|
286
286
|
{{book_rules_relevant}}
|
|
287
287
|
|
|
288
|
-
请为第 {{chapterNumber}} 章产生 memo
|
|
288
|
+
请为第 {{chapterNumber}} 章产生 memo。严格按上面的普通 Markdown 小节格式输出。`;
|
|
289
289
|
export function buildPlannerUserMessage(input) {
|
|
290
290
|
const language = input.language ?? "zh";
|
|
291
291
|
const template = getPlannerMemoUserTemplate(language);
|
|
@@ -358,13 +358,13 @@ export function buildGoldenOpeningGuidance(chapterNumber, language = "zh") {
|
|
|
358
358
|
if (language === "en") {
|
|
359
359
|
return `## Golden Opening Guidance — Chapter ${chapterNumber}
|
|
360
360
|
|
|
361
|
-
This is chapter ${chapterNumber} of the opening three — the chapters that decide whether a reader stays. The Golden Three Chapters rule
|
|
361
|
+
This is chapter ${chapterNumber} of the opening three — the chapters that decide whether a reader stays. The Golden Three Chapters rule assigns each chapter a load-bearing slot: chapter 1 must throw the reader straight into the core conflict (the protagonist enters already facing the main contradiction — chase, dead-end, dispossession, transmigration-as-crisis), not a paragraph of background, family tree, weather, or dynastic preamble. Chapter 2 must put the protagonist's edge — the system, the power, the rebirth-memory, the information advantage — on the stage through one concrete event (not "he awakened a power" narrated, but "he used it for X and Y happened"). Chapter 3 must lock in a concrete short-term goal achievable within the next 3-10 chapters (build the first stake of capital, take down the small antagonist, save someone), giving the story forward pull.
|
|
362
362
|
|
|
363
363
|
The memo's goal field for this chapter must reflect the slot's verb — confront, demonstrate, or commit. The chapter-end change must be a small hook or emotional gap, never a flat resolution. Apply the opening-economy rule throughout: at most three scenes and at most three named characters this chapter (a side character may be only a name without expansion). Information layering is mandatory — basic facts (appearance, status, situation) ride on the protagonist's actions, world rules ride on plot triggers; do not stage a paragraph of exposition.`;
|
|
364
364
|
}
|
|
365
365
|
return `## 黄金三章规划指引 — 第 ${chapterNumber} 章
|
|
366
366
|
|
|
367
|
-
这是开篇三章中的第 ${chapterNumber}
|
|
367
|
+
这是开篇三章中的第 ${chapterNumber} 章——决定读者是否留下来的关键章节。黄金三章法则给每一章分了硬槽位:第 1 章必须把主角直接抛进核心冲突里(主角出场即面对主线矛盾——追杀、死局、被夺权、穿越即危机),不要拿背景、家族、天气、朝代铺垫开场。第 2 章必须让金手指落地一次——系统/能力/重生记忆/信息差,必须通过**一次具体事件**展现出来(不是"他觉醒了 XX"的旁白,而是"他用了 XX,发生了 YY")。第 3 章必须给主角钉下一个 3-10 章内可达成的具体短期目标(攒第一桶金、干翻某小反派、救某人),给故事一条往前拉的引力线。
|
|
368
368
|
|
|
369
369
|
本章 memo 的 goal 字段必须体现对应槽位的动词——抛出、展现、或锁定。章尾必须发生的改变要落在小钩子或情绪缺口上,不要写成平稳收束。开篇精简原则贯穿本章:场景 ≤ 3 个、人物 ≤ 3 个(配角可以只报名字,不展开)。信息分层强制要求:基础信息(外貌、身份、处境)通过主角行动自然带出,世界规则(设定、势力、底层逻辑)结合剧情节点揭示,禁止整段 exposition。`;
|
|
370
370
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"planner-prompts.js","sourceRoot":"","sources":["../../src/agents/planner-prompts.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,CAAC,MAAM,0BAA0B,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6BAgGb,CAAC;AAE9B,8EAA8E;AAC9E,oCAAoC;AACpC,0EAA0E;AAC1E,uEAAuE;AACvE,2DAA2D;AAC3D,8EAA8E;AAE9E,MAAM,CAAC,MAAM,6BAA6B,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wHAgG2E,CAAC;AAEzH,MAAM,CAAC,MAAM,6BAA6B,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"planner-prompts.js","sourceRoot":"","sources":["../../src/agents/planner-prompts.ts"],"names":[],"mappings":"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"}
|
package/dist/agents/planner.d.ts
CHANGED
|
@@ -21,13 +21,13 @@ export interface PlanChapterOutput {
|
|
|
21
21
|
* Produces:
|
|
22
22
|
* - a simplified ChapterIntent (goal + outline + keep/avoid/style) —
|
|
23
23
|
* still deterministic, used for retrieval hints and the intent markdown.
|
|
24
|
-
* - a full ChapterMemo (
|
|
25
|
-
*
|
|
24
|
+
* - a full ChapterMemo (plain markdown sections) via LLM call + strict
|
|
25
|
+
* parser.
|
|
26
26
|
*
|
|
27
27
|
* Retry policy: up to 3 attempts. Each failed parse appends an error
|
|
28
|
-
* feedback block to the user message and re-invokes the LLM.
|
|
29
|
-
*
|
|
30
|
-
*
|
|
28
|
+
* feedback block to the user message and re-invokes the LLM. If all attempts
|
|
29
|
+
* fail, the planner emits a degraded but valid memo with an explicit warning
|
|
30
|
+
* instead of crashing the whole chapter pipeline.
|
|
31
31
|
*/
|
|
32
32
|
export declare class PlannerAgent extends BaseAgent {
|
|
33
33
|
get name(): string;
|
|
@@ -50,6 +50,7 @@ export declare class PlannerAgent extends BaseAgent {
|
|
|
50
50
|
readonly recyclableHooks?: ReadonlyArray<StoredHook>;
|
|
51
51
|
readonly language?: "zh" | "en";
|
|
52
52
|
}): Promise<ChapterMemo>;
|
|
53
|
+
private buildFallbackMemoMarkdown;
|
|
53
54
|
private isGoldenOpeningChapter;
|
|
54
55
|
private buildArcContext;
|
|
55
56
|
private deriveGoal;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"planner.d.ts","sourceRoot":"","sources":["../../src/agents/planner.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,WAAW,EACjB,MAAM,+BAA+B,CAAC;AA4BvC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAExD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;CACnC;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAC9C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAID;;;;;;;;;;;;;GAaG;AACH,qBAAa,YAAa,SAAQ,SAAS;IACzC,IAAI,IAAI,IAAI,MAAM,CAEjB;IAEK,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAmGtE;;;;OAIG;IACG,eAAe,CAAC,KAAK,EAAE;QAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;QAC/B,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;QAClC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;QAC9B,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;QACrC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,MAAM,CAAC;QACxC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;QACjC,QAAQ,CAAC,eAAe,CAAC,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;QACrD,QAAQ,CAAC,QAAQ,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;KACjC,GAAG,OAAO,CAAC,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"planner.d.ts","sourceRoot":"","sources":["../../src/agents/planner.ts"],"names":[],"mappings":"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"}
|
package/dist/agents/planner.js
CHANGED
|
@@ -15,13 +15,13 @@ const MEMO_RETRY_LIMIT = 3;
|
|
|
15
15
|
* Produces:
|
|
16
16
|
* - a simplified ChapterIntent (goal + outline + keep/avoid/style) —
|
|
17
17
|
* still deterministic, used for retrieval hints and the intent markdown.
|
|
18
|
-
* - a full ChapterMemo (
|
|
19
|
-
*
|
|
18
|
+
* - a full ChapterMemo (plain markdown sections) via LLM call + strict
|
|
19
|
+
* parser.
|
|
20
20
|
*
|
|
21
21
|
* Retry policy: up to 3 attempts. Each failed parse appends an error
|
|
22
|
-
* feedback block to the user message and re-invokes the LLM.
|
|
23
|
-
*
|
|
24
|
-
*
|
|
22
|
+
* feedback block to the user message and re-invokes the LLM. If all attempts
|
|
23
|
+
* fail, the planner emits a degraded but valid memo with an explicit warning
|
|
24
|
+
* instead of crashing the whole chapter pipeline.
|
|
25
25
|
*/
|
|
26
26
|
export class PlannerAgent extends BaseAgent {
|
|
27
27
|
get name() {
|
|
@@ -163,7 +163,91 @@ export class PlannerAgent extends BaseAgent {
|
|
|
163
163
|
currentUserMessage = `${userMessage}\n\n${retryFeedbackHeader}\n${error.message}\n${retryFeedbackTrailer}`;
|
|
164
164
|
}
|
|
165
165
|
}
|
|
166
|
-
|
|
166
|
+
const fallbackError = lastError ?? new PlannerParseError("memo planner exhausted retries without a specific error");
|
|
167
|
+
this.log?.warn(`[planner] memo planner fell back after ${MEMO_RETRY_LIMIT} attempts: ${fallbackError.message}`);
|
|
168
|
+
return parseMemo(this.buildFallbackMemoMarkdown({
|
|
169
|
+
chapterNumber: input.chapterNumber,
|
|
170
|
+
isGoldenOpening: input.isGoldenOpening,
|
|
171
|
+
fallbackGoal: input.fallbackGoal,
|
|
172
|
+
errorMessage: fallbackError.message,
|
|
173
|
+
language,
|
|
174
|
+
}), input.chapterNumber, input.isGoldenOpening);
|
|
175
|
+
}
|
|
176
|
+
buildFallbackMemoMarkdown(input) {
|
|
177
|
+
if (input.language === "en") {
|
|
178
|
+
return [
|
|
179
|
+
`# Chapter ${input.chapterNumber} memo`,
|
|
180
|
+
"",
|
|
181
|
+
"## Chapter goal",
|
|
182
|
+
input.fallbackGoal || `Continue chapter ${input.chapterNumber} according to the current outline`,
|
|
183
|
+
"",
|
|
184
|
+
"## Thread refs",
|
|
185
|
+
"none",
|
|
186
|
+
"",
|
|
187
|
+
"## Current task",
|
|
188
|
+
`Use the current chapter goal and authoritative book context to continue chapter ${input.chapterNumber} without inventing a new direction.`,
|
|
189
|
+
"",
|
|
190
|
+
"## What the reader is waiting for right now",
|
|
191
|
+
"Keep the reader's active expectation from the outline and previous chapter in focus; do not replace it with a generic scene.",
|
|
192
|
+
"",
|
|
193
|
+
"## To pay off / to keep buried",
|
|
194
|
+
"Pay off only the near-term promises already supported by context; keep larger secrets buried unless the outline explicitly asks for them.",
|
|
195
|
+
"",
|
|
196
|
+
"## What the slow / transitional beats carry",
|
|
197
|
+
"If a slower beat is needed, make it carry pressure, evidence, relationship movement, or a concrete setup for the next action.",
|
|
198
|
+
"",
|
|
199
|
+
"## Three-question check on the key choice",
|
|
200
|
+
"The protagonist's main choice must have a reason, match current interest, and stay consistent with the established persona.",
|
|
201
|
+
"",
|
|
202
|
+
"## Required end-of-chapter change",
|
|
203
|
+
"End with a concrete change in information, pressure, relationship, objective, or risk so the chapter is not only summary.",
|
|
204
|
+
"",
|
|
205
|
+
"## Hook ledger for this chapter",
|
|
206
|
+
"advance: keep the active promise moving; resolve: only settle what has evidence; defer: preserve larger threads for later chapters.",
|
|
207
|
+
"",
|
|
208
|
+
"## Do not",
|
|
209
|
+
"Do not contradict established facts, ignore the user's current instruction, or turn the fallback memo into a new outline.",
|
|
210
|
+
"",
|
|
211
|
+
"## Planner warning",
|
|
212
|
+
`The model failed to produce a valid chapter memo after ${MEMO_RETRY_LIMIT} attempts. Last parser error: ${input.errorMessage}`,
|
|
213
|
+
].join("\n");
|
|
214
|
+
}
|
|
215
|
+
return [
|
|
216
|
+
`# 第 ${input.chapterNumber} 章 memo`,
|
|
217
|
+
"",
|
|
218
|
+
"## 本章目标",
|
|
219
|
+
input.fallbackGoal || `按当前大纲继续推进第 ${input.chapterNumber} 章`,
|
|
220
|
+
"",
|
|
221
|
+
"## 关联线索",
|
|
222
|
+
"无",
|
|
223
|
+
"",
|
|
224
|
+
"## 当前任务",
|
|
225
|
+
`沿用当前章节目标和权威设定推进第 ${input.chapterNumber} 章,不临时改方向,也不把章节写成泛泛过渡。`,
|
|
226
|
+
"",
|
|
227
|
+
"## 读者此刻在等什么",
|
|
228
|
+
"延续大纲和上一章形成的读者期待,优先回应当前已经建立的压力、证据、关系或目标变化。",
|
|
229
|
+
"",
|
|
230
|
+
"## 该兑现的 / 暂不掀的",
|
|
231
|
+
"只兑现已有上下文支撑的近端承诺;更大的秘密、身份、幕后主使或终局信息,除非大纲明确要求,否则继续压住。",
|
|
232
|
+
"",
|
|
233
|
+
"## 日常/过渡承担什么任务",
|
|
234
|
+
"如果需要日常或过渡,它必须承担压力、证据、人物关系、目标变化或下一步行动铺垫,不能只是闲聊和气氛。",
|
|
235
|
+
"",
|
|
236
|
+
"## 关键抉择过三连问",
|
|
237
|
+
"主角本章的关键选择必须有原因、符合当前利益,并且不背离已经建立的人设和行为逻辑。",
|
|
238
|
+
"",
|
|
239
|
+
"## 章尾必须发生的改变",
|
|
240
|
+
"章尾至少要在信息、压力、关系、目标或风险上发生一个明确变化,避免只有剧情摘要没有推进。",
|
|
241
|
+
"",
|
|
242
|
+
"## 本章 hook 账",
|
|
243
|
+
"advance: 推进当前活跃承诺;resolve: 只结清已有证据支撑的线索;defer: 大线继续保留到更合适的位置。",
|
|
244
|
+
"",
|
|
245
|
+
"## 不要做",
|
|
246
|
+
"不要违背既成事实,不要无视用户当前指令,不要把 fallback memo 当成新大纲重写整本书。",
|
|
247
|
+
"",
|
|
248
|
+
"## Planner warning",
|
|
249
|
+
`模型连续 ${MEMO_RETRY_LIMIT} 次没有产出合格章节 memo。最后一次解析错误:${input.errorMessage}`,
|
|
250
|
+
].join("\n");
|
|
167
251
|
}
|
|
168
252
|
isGoldenOpeningChapter(language, chapterNumber) {
|
|
169
253
|
const isZh = (language ?? "zh").toLowerCase().startsWith("zh");
|