@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
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { generateImageFromPrompt, resolveCoverGenerationRequest, } from "../pipeline/short-fiction-runner.js";
|
|
4
|
+
/** Per-type task framing only; visual style must come from the world / visual contract. */
|
|
5
|
+
const SHOT_BY_TYPE = {
|
|
6
|
+
actor: "为这个角色生成配图",
|
|
7
|
+
location: "为这个地点生成配图",
|
|
8
|
+
item: "为这件物品生成配图",
|
|
9
|
+
evidence: "为这件证物生成配图",
|
|
10
|
+
clue: "为这条线索生成配图",
|
|
11
|
+
claim: "为这个主张生成配图",
|
|
12
|
+
proof_chain: "为这条证据链生成配图",
|
|
13
|
+
organization: "为这个组织生成配图",
|
|
14
|
+
};
|
|
15
|
+
function clamp(text, max) {
|
|
16
|
+
const trimmed = text.trim();
|
|
17
|
+
return trimmed.length > max ? `${trimmed.slice(0, max)}…` : trimmed;
|
|
18
|
+
}
|
|
19
|
+
function renderImageWorldContext(input) {
|
|
20
|
+
if (!input)
|
|
21
|
+
return "";
|
|
22
|
+
if (typeof input === "string") {
|
|
23
|
+
const premise = input.trim();
|
|
24
|
+
return premise ? `世界设定(决定时代、场景与整体美术风格,必须贴合):${clamp(premise, 600)}` : "";
|
|
25
|
+
}
|
|
26
|
+
const premise = input.premise?.trim();
|
|
27
|
+
const worldContract = input.worldContract?.trim();
|
|
28
|
+
const visualContract = input.visualContract?.trim();
|
|
29
|
+
return [
|
|
30
|
+
premise ? `世界设定(决定时代、场景与整体美术风格,必须贴合):${clamp(premise, 600)}` : "",
|
|
31
|
+
worldContract ? `世界契约(只遵守用户定义的规则,不要自行发明 RPG/数值/等级系统):${clamp(worldContract, 700)}` : "",
|
|
32
|
+
visualContract ? `视觉契约(图片必须按这条表达语义):${clamp(visualContract, 700)}` : "",
|
|
33
|
+
].filter(Boolean).join("\n");
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Build a style-consistent image prompt for a world entity. The world premise
|
|
37
|
+
* anchors era / setting / art style so every illustration in one run looks like
|
|
38
|
+
* it belongs to the same world.
|
|
39
|
+
*/
|
|
40
|
+
export function buildPlayEntityImagePrompt(entity, worldPremise) {
|
|
41
|
+
const worldContext = renderImageWorldContext(worldPremise);
|
|
42
|
+
const subject = SHOT_BY_TYPE[entity.type] ?? "为这个对象生成配图";
|
|
43
|
+
const summary = entity.summary?.trim();
|
|
44
|
+
return [
|
|
45
|
+
worldContext,
|
|
46
|
+
subject,
|
|
47
|
+
`对象:${entity.label}`,
|
|
48
|
+
summary ? `细节:${clamp(summary, 400)}` : "",
|
|
49
|
+
].filter(Boolean).join("\n");
|
|
50
|
+
}
|
|
51
|
+
/** Build a wide illustration prompt for the current moment from its scene prose. */
|
|
52
|
+
export function buildPlaySceneImagePrompt(sceneText, worldPremise) {
|
|
53
|
+
const worldContext = renderImageWorldContext(worldPremise);
|
|
54
|
+
return [
|
|
55
|
+
worldContext,
|
|
56
|
+
"为下面这一刻生成配图,捕捉当下的动作、氛围与情绪:",
|
|
57
|
+
clamp(sceneText, 900),
|
|
58
|
+
].filter(Boolean).join("\n");
|
|
59
|
+
}
|
|
60
|
+
function manifestPath(runDir) {
|
|
61
|
+
return join(runDir, "images", "manifest.json");
|
|
62
|
+
}
|
|
63
|
+
export async function readPlayImageManifest(runDir) {
|
|
64
|
+
try {
|
|
65
|
+
const raw = await readFile(manifestPath(runDir), "utf-8");
|
|
66
|
+
const parsed = JSON.parse(raw);
|
|
67
|
+
return parsed && typeof parsed === "object" ? parsed : {};
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
return {};
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
export async function writePlayImageManifest(runDir, manifest) {
|
|
74
|
+
await mkdir(join(runDir, "images"), { recursive: true });
|
|
75
|
+
await writeFile(manifestPath(runDir), JSON.stringify(manifest, null, 2), "utf-8");
|
|
76
|
+
}
|
|
77
|
+
/** Immutably set one manifest entry and persist it. Returns the new manifest. */
|
|
78
|
+
export async function setPlayImageEntry(runDir, key, entry) {
|
|
79
|
+
const current = await readPlayImageManifest(runDir);
|
|
80
|
+
const next = { ...current, [key]: entry };
|
|
81
|
+
await writePlayImageManifest(runDir, next);
|
|
82
|
+
return next;
|
|
83
|
+
}
|
|
84
|
+
export const DEFAULT_PLAY_IMAGE_SETTINGS = {
|
|
85
|
+
actors: false,
|
|
86
|
+
moments: false,
|
|
87
|
+
inventory: false,
|
|
88
|
+
};
|
|
89
|
+
function settingsPath(runDir) {
|
|
90
|
+
return join(runDir, "images", "settings.json");
|
|
91
|
+
}
|
|
92
|
+
export async function readPlayImageSettings(runDir) {
|
|
93
|
+
try {
|
|
94
|
+
const raw = JSON.parse(await readFile(settingsPath(runDir), "utf-8"));
|
|
95
|
+
return {
|
|
96
|
+
actors: Boolean(raw?.actors),
|
|
97
|
+
moments: Boolean(raw?.moments),
|
|
98
|
+
inventory: Boolean(raw?.inventory),
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
return DEFAULT_PLAY_IMAGE_SETTINGS;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
export async function writePlayImageSettings(runDir, settings) {
|
|
106
|
+
await mkdir(join(runDir, "images"), { recursive: true });
|
|
107
|
+
await writeFile(settingsPath(runDir), JSON.stringify(settings, null, 2), "utf-8");
|
|
108
|
+
}
|
|
109
|
+
/** Filesystem-safe leaf name derived from an entity id / scene key. */
|
|
110
|
+
export function playImageFileName(key, extension) {
|
|
111
|
+
const safe = key.replace(/[^a-zA-Z0-9_-]/g, "_").slice(0, 80) || "image";
|
|
112
|
+
return `${safe}.${extension}`;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Generate one image for a Play key (entity id or scene key), write it under
|
|
116
|
+
* run/images/, and record the result in the manifest. Never throws on a
|
|
117
|
+
* generation failure — it records {status:"failed"} so the caller/UI can
|
|
118
|
+
* surface it and retry. Throws only if cover generation is not configured.
|
|
119
|
+
*/
|
|
120
|
+
export async function generatePlayImage(input) {
|
|
121
|
+
// Resolution failure (no cover API configured) is a real misconfiguration —
|
|
122
|
+
// let it surface so the endpoint can return a clear "configure first".
|
|
123
|
+
const request = await resolveCoverGenerationRequest({ root: input.root });
|
|
124
|
+
try {
|
|
125
|
+
const { buffer, extension } = await generateImageFromPrompt(request, input.prompt, input.size ?? "1024x1024");
|
|
126
|
+
const file = playImageFileName(input.key, extension);
|
|
127
|
+
await mkdir(join(input.runDir, "images"), { recursive: true });
|
|
128
|
+
await writeFile(join(input.runDir, "images", file), buffer);
|
|
129
|
+
const entry = { status: "ready", file };
|
|
130
|
+
await setPlayImageEntry(input.runDir, input.key, entry);
|
|
131
|
+
return entry;
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
const entry = {
|
|
135
|
+
status: "failed",
|
|
136
|
+
error: error instanceof Error ? error.message : String(error),
|
|
137
|
+
};
|
|
138
|
+
await setPlayImageEntry(input.runDir, input.key, entry);
|
|
139
|
+
return entry;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=play-image.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"play-image.js","sourceRoot":"","sources":["../../src/play/play-image.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { type PlayEdgeInput, type PlayEntity, type PlayEntityInput, type PlayEvent, type PlayEventInput, type PlayMutationInput, type PlayStateSlot, type PlayStateSlotInput } from "../models/play.js";
|
|
2
|
+
import type { PlayGraphSnapshot } from "./play-file-db.js";
|
|
3
|
+
export interface PlayReducerDB {
|
|
4
|
+
readonly snapshot?: () => PlayGraphSnapshot;
|
|
5
|
+
readonly replaceWithSnapshot?: (snapshot: PlayGraphSnapshot) => void;
|
|
6
|
+
readonly transaction?: <T>(fn: () => T) => T;
|
|
7
|
+
readonly getEntity: (id: string) => PlayEntity | null;
|
|
8
|
+
readonly upsertEntity: (entity: PlayEntityInput) => void;
|
|
9
|
+
readonly upsertEdge: (edge: PlayEdgeInput) => void;
|
|
10
|
+
readonly expireEdge: (edgeId: string, validUntilEventId: string) => void;
|
|
11
|
+
readonly upsertStateSlot: (slot: PlayStateSlotInput) => void;
|
|
12
|
+
readonly getStateSlotsForEntity: (entityId: string) => PlayStateSlot[];
|
|
13
|
+
readonly recordEvent: (event: PlayEventInput) => void;
|
|
14
|
+
}
|
|
15
|
+
export interface ApplyPlayMutationInput {
|
|
16
|
+
readonly db: PlayReducerDB;
|
|
17
|
+
readonly mutation: PlayMutationInput;
|
|
18
|
+
readonly rawInput: string;
|
|
19
|
+
readonly createdAt?: string;
|
|
20
|
+
}
|
|
21
|
+
export interface ApplyPlayMutationResult {
|
|
22
|
+
readonly event: PlayEvent;
|
|
23
|
+
readonly blocked: boolean;
|
|
24
|
+
}
|
|
25
|
+
export declare function applyPlayMutation(input: ApplyPlayMutationInput): ApplyPlayMutationResult;
|
|
26
|
+
export interface SeedPlayGraphInput {
|
|
27
|
+
readonly db: PlayReducerDB;
|
|
28
|
+
readonly mutation: PlayMutationInput;
|
|
29
|
+
}
|
|
30
|
+
export declare function seedPlayGraph(input: SeedPlayGraphInput): void;
|
|
31
|
+
//# sourceMappingURL=play-reducer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"play-reducer.d.ts","sourceRoot":"","sources":["../../src/play/play-reducer.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,KAAK,eAAe,EACpB,KAAK,SAAS,EACd,KAAK,cAAc,EAEnB,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACxB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAE3D,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,iBAAiB,CAAC;IAC5C,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC,QAAQ,EAAE,iBAAiB,KAAK,IAAI,CAAC;IACrE,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7C,QAAQ,CAAC,SAAS,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,UAAU,GAAG,IAAI,CAAC;IACtD,QAAQ,CAAC,YAAY,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,IAAI,CAAC;IACzD,QAAQ,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,aAAa,KAAK,IAAI,CAAC;IACnD,QAAQ,CAAC,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,KAAK,IAAI,CAAC;IACzE,QAAQ,CAAC,eAAe,EAAE,CAAC,IAAI,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAC7D,QAAQ,CAAC,sBAAsB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,aAAa,EAAE,CAAC;IACvE,QAAQ,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC;CACvD;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,EAAE,EAAE,aAAa,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;IACrC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAgBD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,sBAAsB,GAAG,uBAAuB,CAyBxF;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,EAAE,aAAa,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;CACtC;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,IAAI,CAQ7D"}
|
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
import { PlayEventSchema, PlayMutationSchema, } from "../models/play.js";
|
|
2
|
+
const EVIDENCE_ORDER = [
|
|
3
|
+
"unknown",
|
|
4
|
+
"hinted",
|
|
5
|
+
"seen",
|
|
6
|
+
"collected",
|
|
7
|
+
"verified",
|
|
8
|
+
"weaponized",
|
|
9
|
+
"exposed",
|
|
10
|
+
"exhausted",
|
|
11
|
+
];
|
|
12
|
+
const PLAYER_ENTITY_ID = "actor_player";
|
|
13
|
+
const LEGACY_PLAYER_ENTITY_IDS = new Set(["player"]);
|
|
14
|
+
export function applyPlayMutation(input) {
|
|
15
|
+
const mutation = resolveEdgeEndpointLabels(input.db, canonicalizePlayerEntityIds(PlayMutationSchema.parse(input.mutation)));
|
|
16
|
+
const event = PlayEventSchema.parse({
|
|
17
|
+
id: mutation.eventId,
|
|
18
|
+
turn: mutation.turn,
|
|
19
|
+
actionKind: mutation.actionKind,
|
|
20
|
+
rawInput: input.rawInput,
|
|
21
|
+
outcomeSummary: mutation.summary || mutation.blockedReason,
|
|
22
|
+
timeAdvance: mutation.timeAdvance,
|
|
23
|
+
createdAt: input.createdAt ?? new Date().toISOString(),
|
|
24
|
+
});
|
|
25
|
+
validateMutation(input.db, mutation);
|
|
26
|
+
const apply = () => {
|
|
27
|
+
input.db.recordEvent(event);
|
|
28
|
+
if (!mutation.blocked) {
|
|
29
|
+
applyGraphChanges(input.db, mutation);
|
|
30
|
+
}
|
|
31
|
+
return { event, blocked: mutation.blocked };
|
|
32
|
+
};
|
|
33
|
+
return input.db.transaction ? input.db.transaction(apply) : apply();
|
|
34
|
+
}
|
|
35
|
+
export function seedPlayGraph(input) {
|
|
36
|
+
const mutation = resolveEdgeEndpointLabels(input.db, canonicalizePlayerEntityIds(PlayMutationSchema.parse(input.mutation)));
|
|
37
|
+
validateMutation(input.db, mutation);
|
|
38
|
+
const apply = () => {
|
|
39
|
+
if (!mutation.blocked)
|
|
40
|
+
applyGraphChanges(input.db, mutation);
|
|
41
|
+
};
|
|
42
|
+
if (input.db.transaction)
|
|
43
|
+
input.db.transaction(apply);
|
|
44
|
+
else
|
|
45
|
+
apply();
|
|
46
|
+
}
|
|
47
|
+
function canonicalizePlayerEntityIds(mutation) {
|
|
48
|
+
const canonicalize = (entityId) => LEGACY_PLAYER_ENTITY_IDS.has(entityId.trim()) ? PLAYER_ENTITY_ID : entityId;
|
|
49
|
+
return {
|
|
50
|
+
...mutation,
|
|
51
|
+
entities: {
|
|
52
|
+
...mutation.entities,
|
|
53
|
+
upsert: mutation.entities.upsert.map((entity) => ({
|
|
54
|
+
...entity,
|
|
55
|
+
id: canonicalize(entity.id),
|
|
56
|
+
})),
|
|
57
|
+
},
|
|
58
|
+
edges: {
|
|
59
|
+
...mutation.edges,
|
|
60
|
+
upsert: mutation.edges.upsert.map((edge) => ({
|
|
61
|
+
...edge,
|
|
62
|
+
fromId: canonicalize(edge.fromId),
|
|
63
|
+
toId: canonicalize(edge.toId),
|
|
64
|
+
})),
|
|
65
|
+
},
|
|
66
|
+
stateSlots: {
|
|
67
|
+
...mutation.stateSlots,
|
|
68
|
+
upsert: mutation.stateSlots.upsert.map((slot) => ({
|
|
69
|
+
...slot,
|
|
70
|
+
ownerEntityId: slot.ownerEntityId ? canonicalize(slot.ownerEntityId) : slot.ownerEntityId,
|
|
71
|
+
})),
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
function resolveEdgeEndpointLabels(db, mutation) {
|
|
76
|
+
if (mutation.edges.upsert.length === 0) {
|
|
77
|
+
return mutation;
|
|
78
|
+
}
|
|
79
|
+
const labelToId = buildEntityAliasMap(db, mutation.entities.upsert);
|
|
80
|
+
if (labelToId.size === 0) {
|
|
81
|
+
return mutation;
|
|
82
|
+
}
|
|
83
|
+
const resolve = (value) => labelToId.get(value.trim()) ?? value;
|
|
84
|
+
return {
|
|
85
|
+
...mutation,
|
|
86
|
+
edges: {
|
|
87
|
+
...mutation.edges,
|
|
88
|
+
upsert: mutation.edges.upsert.map((edge) => ({
|
|
89
|
+
...edge,
|
|
90
|
+
fromId: resolve(edge.fromId),
|
|
91
|
+
toId: resolve(edge.toId),
|
|
92
|
+
})),
|
|
93
|
+
},
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
function buildEntityAliasMap(db, turnEntities) {
|
|
97
|
+
const aliases = new Map();
|
|
98
|
+
const ambiguous = new Set();
|
|
99
|
+
const add = (alias, id) => {
|
|
100
|
+
const a = alias?.trim();
|
|
101
|
+
const entityId = id?.trim();
|
|
102
|
+
if (!a || !entityId)
|
|
103
|
+
return;
|
|
104
|
+
const existing = aliases.get(a);
|
|
105
|
+
if (existing && existing !== entityId) {
|
|
106
|
+
ambiguous.add(a);
|
|
107
|
+
aliases.delete(a);
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
if (!ambiguous.has(a))
|
|
111
|
+
aliases.set(a, entityId);
|
|
112
|
+
};
|
|
113
|
+
for (const entity of readExistingEntities(db)) {
|
|
114
|
+
add(entity.id, entity.id);
|
|
115
|
+
add(entity.label, entity.id);
|
|
116
|
+
}
|
|
117
|
+
for (const entity of turnEntities) {
|
|
118
|
+
add(entity.id, entity.id);
|
|
119
|
+
add(entity.label, entity.id);
|
|
120
|
+
}
|
|
121
|
+
return aliases;
|
|
122
|
+
}
|
|
123
|
+
function readExistingEntities(db) {
|
|
124
|
+
try {
|
|
125
|
+
return db.snapshot?.().entities ?? [];
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
return [];
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
function validateMutation(db, mutation) {
|
|
132
|
+
const upsertedEntityIds = new Set(mutation.entities.upsert.map((entity) => entity.id));
|
|
133
|
+
const entityExists = (entityId) => upsertedEntityIds.has(entityId) || db.getEntity(entityId) !== null;
|
|
134
|
+
// NB: relationship edges are validated fail-open at apply time (a dangling
|
|
135
|
+
// edge is skipped, not thrown) so one bad ref can't wipe the whole turn.
|
|
136
|
+
for (const slot of mutation.stateSlots.upsert) {
|
|
137
|
+
if (slot.ownerEntityId && !entityExists(slot.ownerEntityId)) {
|
|
138
|
+
throw new Error(`Play mutation references missing entity in state slot ${slot.id}: ${slot.ownerEntityId}`);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
for (const transition of mutation.evidence.transitions) {
|
|
142
|
+
const entity = upsertedEntityIds.has(transition.entityId)
|
|
143
|
+
? mutation.entities.upsert.find((candidate) => candidate.id === transition.entityId)
|
|
144
|
+
: db.getEntity(transition.entityId);
|
|
145
|
+
if (!entity) {
|
|
146
|
+
throw new Error(`Play mutation references missing entity in evidence transition: ${transition.entityId}`);
|
|
147
|
+
}
|
|
148
|
+
if (entity.type !== "evidence" && entity.type !== "clue") {
|
|
149
|
+
throw new Error(`Play evidence transition requires evidence or clue entity: ${transition.entityId}`);
|
|
150
|
+
}
|
|
151
|
+
const current = currentEvidenceStatus(db, transition.entityId);
|
|
152
|
+
if (transition.from && transition.from !== current) {
|
|
153
|
+
throw new Error(`Play evidence transition expected ${transition.from} but current status is ${current}`);
|
|
154
|
+
}
|
|
155
|
+
if (evidenceRank(transition.to) < evidenceRank(current)) {
|
|
156
|
+
throw new Error(`Play evidence transition cannot regress from ${current} to ${transition.to}`);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
function applyGraphChanges(db, mutation) {
|
|
161
|
+
for (const entity of mutation.entities.upsert) {
|
|
162
|
+
db.upsertEntity(entity);
|
|
163
|
+
}
|
|
164
|
+
for (const edge of mutation.edges.expire) {
|
|
165
|
+
db.expireEdge(edge.edgeId, edge.validUntilEventId);
|
|
166
|
+
}
|
|
167
|
+
// Relationship edges are fail-open: a single edge that points at an entity
|
|
168
|
+
// we never saw is skipped, not allowed to crash the whole turn (which used
|
|
169
|
+
// to wipe an entire turn's mutations and leave the relationship panel empty).
|
|
170
|
+
const upsertedEntityIds = new Set(mutation.entities.upsert.map((e) => e.id));
|
|
171
|
+
const endpointExists = (id) => upsertedEntityIds.has(id) || db.getEntity(id) !== null;
|
|
172
|
+
const findEntity = (id) => mutation.entities.upsert.find((entity) => entity.id === id) ?? db.getEntity(id);
|
|
173
|
+
for (const edge of mutation.edges.upsert) {
|
|
174
|
+
if (endpointExists(edge.fromId) && endpointExists(edge.toId)) {
|
|
175
|
+
db.upsertEdge(normalizeHoldingEdge(edge, findEntity(edge.toId)));
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
for (const slot of mutation.stateSlots.upsert) {
|
|
179
|
+
db.upsertStateSlot(normalizeStateSlot(slot));
|
|
180
|
+
}
|
|
181
|
+
for (const transition of mutation.evidence.transitions) {
|
|
182
|
+
db.upsertStateSlot({
|
|
183
|
+
id: evidenceStatusSlotId(transition.entityId),
|
|
184
|
+
ownerEntityId: transition.entityId,
|
|
185
|
+
kind: "evidence",
|
|
186
|
+
label: "证据状态",
|
|
187
|
+
value: {
|
|
188
|
+
previous: currentEvidenceStatus(db, transition.entityId),
|
|
189
|
+
status: transition.to,
|
|
190
|
+
reason: transition.reason,
|
|
191
|
+
},
|
|
192
|
+
updatedEventId: mutation.eventId,
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
function normalizeHoldingEdge(edge, target) {
|
|
197
|
+
if (!isRecord(edge.value) || edge.value.role !== "holding")
|
|
198
|
+
return edge;
|
|
199
|
+
if (isPhysicalHoldingTarget(target, edge.value))
|
|
200
|
+
return edge;
|
|
201
|
+
return {
|
|
202
|
+
...edge,
|
|
203
|
+
value: {
|
|
204
|
+
...edge.value,
|
|
205
|
+
role: "observed",
|
|
206
|
+
},
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
function isPhysicalHoldingTarget(target, value) {
|
|
210
|
+
if (!target)
|
|
211
|
+
return false;
|
|
212
|
+
if (target.type === "item")
|
|
213
|
+
return true;
|
|
214
|
+
if (value.physical === true || value.portable === true) {
|
|
215
|
+
return target.type === "evidence" || target.type === "clue" || target.type === "claim" || target.type === "proof_chain";
|
|
216
|
+
}
|
|
217
|
+
return false;
|
|
218
|
+
}
|
|
219
|
+
function normalizeStateSlot(slot) {
|
|
220
|
+
if (!isRecord(slot.value))
|
|
221
|
+
return slot;
|
|
222
|
+
const current = slot.value.current;
|
|
223
|
+
const min = slot.value.min;
|
|
224
|
+
const max = slot.value.max;
|
|
225
|
+
if (typeof current !== "number")
|
|
226
|
+
return slot;
|
|
227
|
+
let next = current;
|
|
228
|
+
if (typeof min === "number")
|
|
229
|
+
next = Math.max(min, next);
|
|
230
|
+
if (typeof max === "number")
|
|
231
|
+
next = Math.min(max, next);
|
|
232
|
+
if (next === current)
|
|
233
|
+
return slot;
|
|
234
|
+
return {
|
|
235
|
+
...slot,
|
|
236
|
+
value: {
|
|
237
|
+
...slot.value,
|
|
238
|
+
current: next,
|
|
239
|
+
},
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
function currentEvidenceStatus(db, entityId) {
|
|
243
|
+
const slot = db.getStateSlotsForEntity(entityId)
|
|
244
|
+
.find((candidate) => candidate.id === evidenceStatusSlotId(entityId) || candidate.kind === "evidence");
|
|
245
|
+
if (!slot || !isRecord(slot.value))
|
|
246
|
+
return "unknown";
|
|
247
|
+
const status = slot.value.status;
|
|
248
|
+
return typeof status === "string" && EVIDENCE_ORDER.includes(status)
|
|
249
|
+
? status
|
|
250
|
+
: "unknown";
|
|
251
|
+
}
|
|
252
|
+
function evidenceStatusSlotId(entityId) {
|
|
253
|
+
return `evidence:${entityId}:status`;
|
|
254
|
+
}
|
|
255
|
+
function evidenceRank(status) {
|
|
256
|
+
return EVIDENCE_ORDER.indexOf(status);
|
|
257
|
+
}
|
|
258
|
+
function isRecord(value) {
|
|
259
|
+
return !!value && typeof value === "object" && !Array.isArray(value);
|
|
260
|
+
}
|
|
261
|
+
//# sourceMappingURL=play-reducer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"play-reducer.js","sourceRoot":"","sources":["../../src/play/play-reducer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import type { AgentContext } from "../agents/base.js";
|
|
2
|
+
import { type PlayActionIntent, type PlayActionIntentInput, type PlayMutation, type PlayMutationInput } from "../models/play.js";
|
|
3
|
+
import { type PlaySceneRender } from "./play-agents.js";
|
|
4
|
+
import { type PlayReducerDB } from "./play-reducer.js";
|
|
5
|
+
import { PlayStore } from "./play-store.js";
|
|
6
|
+
export interface PlayActionInterpreterLike {
|
|
7
|
+
readonly interpret: (input: {
|
|
8
|
+
readonly input: string;
|
|
9
|
+
readonly sceneBrief: string;
|
|
10
|
+
readonly language?: "zh" | "en";
|
|
11
|
+
}) => Promise<PlayActionIntentInput>;
|
|
12
|
+
}
|
|
13
|
+
export interface PlayWorldMutatorLike {
|
|
14
|
+
readonly proposeMutation: (input: {
|
|
15
|
+
readonly turn: number;
|
|
16
|
+
readonly input: string;
|
|
17
|
+
readonly action: PlayActionIntentInput;
|
|
18
|
+
readonly context: string;
|
|
19
|
+
readonly language?: "zh" | "en";
|
|
20
|
+
}) => Promise<PlayMutationInput>;
|
|
21
|
+
}
|
|
22
|
+
export interface PlaySceneRendererLike {
|
|
23
|
+
readonly render: (input: {
|
|
24
|
+
readonly input: string;
|
|
25
|
+
readonly action: PlayActionIntentInput;
|
|
26
|
+
readonly mutationSummary: string;
|
|
27
|
+
readonly stateBrief: string;
|
|
28
|
+
readonly replayContext?: string;
|
|
29
|
+
readonly mode?: "open" | "guided";
|
|
30
|
+
readonly language?: "zh" | "en";
|
|
31
|
+
readonly worldPremise?: string;
|
|
32
|
+
}) => Promise<PlaySceneRender>;
|
|
33
|
+
}
|
|
34
|
+
export interface PlaySceneReconcilerLike {
|
|
35
|
+
readonly reconcile: (input: {
|
|
36
|
+
readonly turn: number;
|
|
37
|
+
readonly input: string;
|
|
38
|
+
readonly action: PlayActionIntentInput;
|
|
39
|
+
readonly mutation: PlayMutationInput;
|
|
40
|
+
readonly sceneText: string;
|
|
41
|
+
readonly context: string;
|
|
42
|
+
readonly stateBrief: string;
|
|
43
|
+
readonly language?: "zh" | "en";
|
|
44
|
+
readonly worldPremise?: string;
|
|
45
|
+
}) => Promise<PlayMutationInput>;
|
|
46
|
+
}
|
|
47
|
+
export interface PlayRunnerOptions {
|
|
48
|
+
readonly projectRoot: string;
|
|
49
|
+
readonly worldId: string;
|
|
50
|
+
readonly runId: string;
|
|
51
|
+
readonly ctx?: AgentContext;
|
|
52
|
+
readonly store?: PlayStore;
|
|
53
|
+
readonly db?: PlayReducerDB;
|
|
54
|
+
readonly agents?: {
|
|
55
|
+
readonly actionInterpreter?: PlayActionInterpreterLike;
|
|
56
|
+
readonly worldMutator?: PlayWorldMutatorLike;
|
|
57
|
+
readonly sceneRenderer?: PlaySceneRendererLike;
|
|
58
|
+
readonly sceneReconciler?: PlaySceneReconcilerLike;
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
export interface PlayStepResult extends PlaySceneRender {
|
|
62
|
+
readonly action: PlayActionIntent;
|
|
63
|
+
readonly mutation: PlayMutation;
|
|
64
|
+
}
|
|
65
|
+
export interface PlayReplayResult extends PlayStepResult {
|
|
66
|
+
readonly previousVariantId?: string;
|
|
67
|
+
readonly variantId?: string;
|
|
68
|
+
readonly replayedInput: string;
|
|
69
|
+
}
|
|
70
|
+
export interface PlayVariantRestoreResult {
|
|
71
|
+
readonly turn: number;
|
|
72
|
+
readonly variantId: string;
|
|
73
|
+
readonly sceneText: string;
|
|
74
|
+
}
|
|
75
|
+
export interface PlayOpeningSeedResult {
|
|
76
|
+
readonly mutation: PlayMutation;
|
|
77
|
+
}
|
|
78
|
+
export declare class PlayRunner {
|
|
79
|
+
private readonly options;
|
|
80
|
+
private readonly store;
|
|
81
|
+
private readonly db;
|
|
82
|
+
private readonly actionInterpreter;
|
|
83
|
+
private readonly worldMutator;
|
|
84
|
+
private readonly sceneRenderer;
|
|
85
|
+
private readonly sceneReconciler;
|
|
86
|
+
constructor(options: PlayRunnerOptions);
|
|
87
|
+
seedOpening(input: {
|
|
88
|
+
readonly sceneText: string;
|
|
89
|
+
readonly suggestedActions?: readonly string[];
|
|
90
|
+
}): Promise<PlayOpeningSeedResult | null>;
|
|
91
|
+
step(input: string, options?: {
|
|
92
|
+
readonly replayContext?: string;
|
|
93
|
+
}): Promise<PlayStepResult>;
|
|
94
|
+
regenerateLastTurn(input?: string): Promise<PlayReplayResult>;
|
|
95
|
+
restoreVariant(input: {
|
|
96
|
+
readonly turn: number;
|
|
97
|
+
readonly variantId: string;
|
|
98
|
+
}): Promise<PlayVariantRestoreResult>;
|
|
99
|
+
private buildContextBrief;
|
|
100
|
+
private readOptionalProjection;
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=play-runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"play-runner.d.ts","sourceRoot":"","sources":["../../src/play/play-runner.ts"],"names":[],"mappings":"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"}
|