@actalk/inkos-core 1.5.0 → 1.6.1-canary.49.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.
Files changed (187) hide show
  1. package/dist/agent/agent-session.d.ts +4 -0
  2. package/dist/agent/agent-session.d.ts.map +1 -1
  3. package/dist/agent/agent-session.js +78 -5
  4. package/dist/agent/agent-session.js.map +1 -1
  5. package/dist/agent/agent-system-prompt.d.ts +2 -0
  6. package/dist/agent/agent-system-prompt.d.ts.map +1 -1
  7. package/dist/agent/agent-system-prompt.js +181 -16
  8. package/dist/agent/agent-system-prompt.js.map +1 -1
  9. package/dist/agent/agent-tools.d.ts +97 -1
  10. package/dist/agent/agent-tools.d.ts.map +1 -1
  11. package/dist/agent/agent-tools.js +434 -3
  12. package/dist/agent/agent-tools.js.map +1 -1
  13. package/dist/agent/film-authoring-tools.d.ts +89 -0
  14. package/dist/agent/film-authoring-tools.d.ts.map +1 -0
  15. package/dist/agent/film-authoring-tools.js +336 -0
  16. package/dist/agent/film-authoring-tools.js.map +1 -0
  17. package/dist/agent/index.d.ts +2 -1
  18. package/dist/agent/index.d.ts.map +1 -1
  19. package/dist/agent/index.js +2 -1
  20. package/dist/agent/index.js.map +1 -1
  21. package/dist/agent/llm-stub.d.ts +19 -0
  22. package/dist/agent/llm-stub.d.ts.map +1 -0
  23. package/dist/agent/llm-stub.js +134 -0
  24. package/dist/agent/llm-stub.js.map +1 -0
  25. package/dist/agents/composer.d.ts.map +1 -1
  26. package/dist/agents/composer.js +24 -12
  27. package/dist/agents/composer.js.map +1 -1
  28. package/dist/agents/researcher.d.ts +38 -0
  29. package/dist/agents/researcher.d.ts.map +1 -0
  30. package/dist/agents/researcher.js +164 -0
  31. package/dist/agents/researcher.js.map +1 -0
  32. package/dist/agents/script-storyboard.d.ts +51 -0
  33. package/dist/agents/script-storyboard.d.ts.map +1 -0
  34. package/dist/agents/script-storyboard.js +368 -0
  35. package/dist/agents/script-storyboard.js.map +1 -0
  36. package/dist/index.d.ts +23 -2
  37. package/dist/index.d.ts.map +1 -1
  38. package/dist/index.js +24 -2
  39. package/dist/index.js.map +1 -1
  40. package/dist/interaction/action-envelope.d.ts +669 -1
  41. package/dist/interaction/action-envelope.d.ts.map +1 -1
  42. package/dist/interaction/action-envelope.js +87 -0
  43. package/dist/interaction/action-envelope.js.map +1 -1
  44. package/dist/interaction/edit-controller.d.ts.map +1 -1
  45. package/dist/interaction/edit-controller.js +91 -1
  46. package/dist/interaction/edit-controller.js.map +1 -1
  47. package/dist/interaction/intents.d.ts +2 -2
  48. package/dist/interaction/project-control.d.ts +1 -1
  49. package/dist/interaction/session-transcript-schema.d.ts +22 -22
  50. package/dist/interaction/session.d.ts +14 -14
  51. package/dist/interaction/session.d.ts.map +1 -1
  52. package/dist/interaction/session.js +1 -1
  53. package/dist/interaction/session.js.map +1 -1
  54. package/dist/interactive-film/authoring-generate.d.ts +4 -0
  55. package/dist/interactive-film/authoring-generate.d.ts.map +1 -0
  56. package/dist/interactive-film/authoring-generate.js +16 -0
  57. package/dist/interactive-film/authoring-generate.js.map +1 -0
  58. package/dist/interactive-film/authoring-store.d.ts +35 -0
  59. package/dist/interactive-film/authoring-store.d.ts.map +1 -0
  60. package/dist/interactive-film/authoring-store.js +114 -0
  61. package/dist/interactive-film/authoring-store.js.map +1 -0
  62. package/dist/interactive-film/authoring-tools.d.ts +9 -0
  63. package/dist/interactive-film/authoring-tools.d.ts.map +1 -0
  64. package/dist/interactive-film/authoring-tools.js +19 -0
  65. package/dist/interactive-film/authoring-tools.js.map +1 -0
  66. package/dist/interactive-film/delta.d.ts +591 -0
  67. package/dist/interactive-film/delta.d.ts.map +1 -0
  68. package/dist/interactive-film/delta.js +54 -0
  69. package/dist/interactive-film/delta.js.map +1 -0
  70. package/dist/interactive-film/emotion.d.ts +20 -0
  71. package/dist/interactive-film/emotion.d.ts.map +1 -0
  72. package/dist/interactive-film/emotion.js +57 -0
  73. package/dist/interactive-film/emotion.js.map +1 -0
  74. package/dist/interactive-film/evaluator.d.ts +7 -0
  75. package/dist/interactive-film/evaluator.d.ts.map +1 -0
  76. package/dist/interactive-film/evaluator.js +40 -0
  77. package/dist/interactive-film/evaluator.js.map +1 -0
  78. package/dist/interactive-film/export-html.d.ts +6 -0
  79. package/dist/interactive-film/export-html.d.ts.map +1 -0
  80. package/dist/interactive-film/export-html.js +84 -0
  81. package/dist/interactive-film/export-html.js.map +1 -0
  82. package/dist/interactive-film/export-ink.d.ts +3 -0
  83. package/dist/interactive-film/export-ink.d.ts.map +1 -0
  84. package/dist/interactive-film/export-ink.js +51 -0
  85. package/dist/interactive-film/export-ink.js.map +1 -0
  86. package/dist/interactive-film/film-context.d.ts +4 -0
  87. package/dist/interactive-film/film-context.d.ts.map +1 -0
  88. package/dist/interactive-film/film-context.js +30 -0
  89. package/dist/interactive-film/film-context.js.map +1 -0
  90. package/dist/interactive-film/generate.d.ts +13 -0
  91. package/dist/interactive-film/generate.d.ts.map +1 -0
  92. package/dist/interactive-film/generate.js +32 -0
  93. package/dist/interactive-film/generate.js.map +1 -0
  94. package/dist/interactive-film/graph-schema.d.ts +819 -0
  95. package/dist/interactive-film/graph-schema.d.ts.map +1 -0
  96. package/dist/interactive-film/graph-schema.js +84 -0
  97. package/dist/interactive-film/graph-schema.js.map +1 -0
  98. package/dist/interactive-film/graph-store.d.ts +5 -0
  99. package/dist/interactive-film/graph-store.d.ts.map +1 -0
  100. package/dist/interactive-film/graph-store.js +24 -0
  101. package/dist/interactive-film/graph-store.js.map +1 -0
  102. package/dist/interactive-film/memory-link.d.ts +9 -0
  103. package/dist/interactive-film/memory-link.d.ts.map +1 -0
  104. package/dist/interactive-film/memory-link.js +15 -0
  105. package/dist/interactive-film/memory-link.js.map +1 -0
  106. package/dist/interactive-film/node-image.d.ts +29 -0
  107. package/dist/interactive-film/node-image.d.ts.map +1 -0
  108. package/dist/interactive-film/node-image.js +52 -0
  109. package/dist/interactive-film/node-image.js.map +1 -0
  110. package/dist/interactive-film/paths.d.ts +14 -0
  111. package/dist/interactive-film/paths.d.ts.map +1 -0
  112. package/dist/interactive-film/paths.js +60 -0
  113. package/dist/interactive-film/paths.js.map +1 -0
  114. package/dist/interactive-film/validation.d.ts +14 -0
  115. package/dist/interactive-film/validation.d.ts.map +1 -0
  116. package/dist/interactive-film/validation.js +292 -0
  117. package/dist/interactive-film/validation.js.map +1 -0
  118. package/dist/llm/provider.d.ts.map +1 -1
  119. package/dist/llm/provider.js +53 -16
  120. package/dist/llm/provider.js.map +1 -1
  121. package/dist/models/book.d.ts +13 -0
  122. package/dist/models/book.d.ts.map +1 -1
  123. package/dist/models/book.js +3 -0
  124. package/dist/models/book.js.map +1 -1
  125. package/dist/models/input-governance.d.ts +14 -5
  126. package/dist/models/input-governance.d.ts.map +1 -1
  127. package/dist/models/input-governance.js +3 -0
  128. package/dist/models/input-governance.js.map +1 -1
  129. package/dist/models/project.d.ts +63 -10
  130. package/dist/models/project.d.ts.map +1 -1
  131. package/dist/models/project.js +11 -0
  132. package/dist/models/project.js.map +1 -1
  133. package/dist/pipeline/runner.js +1 -1
  134. package/dist/pipeline/runner.js.map +1 -1
  135. package/dist/pipeline/script-storyboard-runner.d.ts +127 -0
  136. package/dist/pipeline/script-storyboard-runner.d.ts.map +1 -0
  137. package/dist/pipeline/script-storyboard-runner.js +446 -0
  138. package/dist/pipeline/script-storyboard-runner.js.map +1 -0
  139. package/dist/play/play-agents.d.ts.map +1 -1
  140. package/dist/play/play-agents.js +5 -2
  141. package/dist/play/play-agents.js.map +1 -1
  142. package/dist/play/play-store.d.ts +2 -2
  143. package/dist/skills/builtin-prompts.d.ts +10 -0
  144. package/dist/skills/builtin-prompts.d.ts.map +1 -0
  145. package/dist/skills/builtin-prompts.js +152 -0
  146. package/dist/skills/builtin-prompts.js.map +1 -0
  147. package/dist/skills/builtin.d.ts +3 -0
  148. package/dist/skills/builtin.d.ts.map +1 -0
  149. package/dist/skills/builtin.js +252 -0
  150. package/dist/skills/builtin.js.map +1 -0
  151. package/dist/skills/context-planner.d.ts +17 -0
  152. package/dist/skills/context-planner.d.ts.map +1 -0
  153. package/dist/skills/context-planner.js +48 -0
  154. package/dist/skills/context-planner.js.map +1 -0
  155. package/dist/skills/external-loader.d.ts +20 -0
  156. package/dist/skills/external-loader.d.ts.map +1 -0
  157. package/dist/skills/external-loader.js +126 -0
  158. package/dist/skills/external-loader.js.map +1 -0
  159. package/dist/skills/index.d.ts +8 -0
  160. package/dist/skills/index.d.ts.map +1 -0
  161. package/dist/skills/index.js +8 -0
  162. package/dist/skills/index.js.map +1 -0
  163. package/dist/skills/prompt-pack.d.ts +33 -0
  164. package/dist/skills/prompt-pack.d.ts.map +1 -0
  165. package/dist/skills/prompt-pack.js +82 -0
  166. package/dist/skills/prompt-pack.js.map +1 -0
  167. package/dist/skills/registry.d.ts +6 -0
  168. package/dist/skills/registry.d.ts.map +1 -0
  169. package/dist/skills/registry.js +101 -0
  170. package/dist/skills/registry.js.map +1 -0
  171. package/dist/skills/types.d.ts +146 -0
  172. package/dist/skills/types.d.ts.map +1 -0
  173. package/dist/skills/types.js +32 -0
  174. package/dist/skills/types.js.map +1 -0
  175. package/dist/state/manager.d.ts +8 -2
  176. package/dist/state/manager.d.ts.map +1 -1
  177. package/dist/state/manager.js +58 -5
  178. package/dist/state/manager.js.map +1 -1
  179. package/dist/utils/context-assembly.d.ts +3 -0
  180. package/dist/utils/context-assembly.d.ts.map +1 -1
  181. package/dist/utils/context-assembly.js +3 -0
  182. package/dist/utils/context-assembly.js.map +1 -1
  183. package/dist/utils/web-search.d.ts +6 -1
  184. package/dist/utils/web-search.d.ts.map +1 -1
  185. package/dist/utils/web-search.js +8 -4
  186. package/dist/utils/web-search.js.map +1 -1
  187. package/package.json +14 -3
@@ -0,0 +1,336 @@
1
+ import { Type } from "@mariozechner/pi-ai";
2
+ import { applyGraphDelta } from "../interactive-film/authoring-store.js";
3
+ import { chatCompletion } from "../llm/provider.js";
4
+ import { loadStoryGraph } from "../interactive-film/graph-store.js";
5
+ import { buildFilmAuthoringContext } from "../interactive-film/film-context.js";
6
+ import { buildFillNodeDeltaFromLLMText, buildStructureDeltaFromLLMText } from "../interactive-film/authoring-generate.js";
7
+ import { buildWorldAnchorDelta, buildAddVariableDelta, buildDefineEndingDelta, buildUpsertCharactersDelta, buildConnectChoiceDelta, buildRemoveNodeDelta, } from "../interactive-film/authoring-tools.js";
8
+ import { StoryNodeSchema } from "../interactive-film/graph-schema.js";
9
+ import { writeCharacterFacts } from "../interactive-film/memory-link.js";
10
+ import { MemoryDB } from "../state/memory-db.js";
11
+ import { join } from "node:path";
12
+ import { generateNodeImage, defaultNodeImageDeps } from "../interactive-film/node-image.js";
13
+ import { appendPromptPackGuidance } from "../skills/prompt-pack.js";
14
+ function textResult(text, details) {
15
+ return { content: [{ type: "text", text }], details: details };
16
+ }
17
+ // ---------------------------------------------------------------------------
18
+ // set_world_anchor
19
+ // ---------------------------------------------------------------------------
20
+ const WorldAnchorParams = Type.Object({
21
+ storyCore: Type.Optional(Type.String({ description: "故事核心一句话" })),
22
+ theme: Type.Optional(Type.String({ description: "主题" })),
23
+ genre: Type.Optional(Type.String({ description: "题材" })),
24
+ worldRules: Type.Optional(Type.String({ description: "世界规则" })),
25
+ durationMinutes: Type.Optional(Type.Number({ description: "目标时长(分钟)" })),
26
+ });
27
+ export function createSetWorldAnchorTool(projectRoot, projectId) {
28
+ return {
29
+ name: "set_world_anchor",
30
+ description: "interactive-film authoring: set/update the world anchor (story core, theme, rules, duration). Applies immediately.",
31
+ label: "Set World Anchor",
32
+ parameters: WorldAnchorParams,
33
+ async execute(_id, params) {
34
+ const { graph, rev } = await applyGraphDelta({ projectRoot, projectId, delta: buildWorldAnchorDelta(params), phase: "world" });
35
+ return textResult(`World anchor updated (rev ${rev}). core=${graph.worldAnchor?.storyCore ?? ""}`, { kind: "graph_updated", rev });
36
+ },
37
+ };
38
+ }
39
+ // ---------------------------------------------------------------------------
40
+ // add_variable
41
+ // ---------------------------------------------------------------------------
42
+ const AddVariableParams = Type.Object({
43
+ name: Type.String({ description: "variable name (unique key)" }),
44
+ type: Type.Union([Type.Literal("flag"), Type.Literal("counter"), Type.Literal("relationship"), Type.Literal("item")]),
45
+ default: Type.Union([Type.Number(), Type.String(), Type.Boolean()], { description: "default value" }),
46
+ desc: Type.Optional(Type.String({ description: "what it tracks" })),
47
+ });
48
+ export function createAddVariableTool(projectRoot, projectId) {
49
+ return {
50
+ name: "add_variable",
51
+ description: "interactive-film authoring: add/update a variable. Applies immediately.",
52
+ label: "Add Variable",
53
+ parameters: AddVariableParams,
54
+ async execute(_id, params) {
55
+ const { rev } = await applyGraphDelta({
56
+ projectRoot,
57
+ projectId,
58
+ delta: buildAddVariableDelta({ name: params.name, type: params.type, default: params.default, desc: params.desc ?? "" }),
59
+ });
60
+ return textResult(`Variable "${params.name}" added (rev ${rev}).`, { kind: "graph_updated", rev });
61
+ },
62
+ };
63
+ }
64
+ // ---------------------------------------------------------------------------
65
+ // define_ending
66
+ // ---------------------------------------------------------------------------
67
+ const DefineEndingParams = Type.Object({
68
+ id: Type.String({ description: "ending id" }),
69
+ nodeId: Type.String({ description: "the ending node this describes (must exist)" }),
70
+ title: Type.String(),
71
+ type: Type.Union([Type.Literal("good"), Type.Literal("bad"), Type.Literal("neutral"), Type.Literal("secret")]),
72
+ description: Type.Optional(Type.String()),
73
+ });
74
+ export function createDefineEndingTool(projectRoot, projectId) {
75
+ return {
76
+ name: "define_ending",
77
+ description: "interactive-film authoring: define/update an ending (its nodeId must exist). Applies immediately.",
78
+ label: "Define Ending",
79
+ parameters: DefineEndingParams,
80
+ async execute(_id, params) {
81
+ const { rev } = await applyGraphDelta({
82
+ projectRoot,
83
+ projectId,
84
+ delta: buildDefineEndingDelta({ id: params.id, nodeId: params.nodeId, title: params.title, type: params.type, description: params.description ?? "" }),
85
+ });
86
+ return textResult(`Ending "${params.title}" defined (rev ${rev}).`, { kind: "graph_updated", rev });
87
+ },
88
+ };
89
+ }
90
+ // ---------------------------------------------------------------------------
91
+ // upsert_characters
92
+ // ---------------------------------------------------------------------------
93
+ const UpsertCharactersParams = Type.Object({
94
+ characters: Type.Array(Type.Object({
95
+ id: Type.String(),
96
+ name: Type.String(),
97
+ role: Type.Optional(Type.Union([Type.Literal("protagonist"), Type.Literal("antagonist"), Type.Literal("support"), Type.Literal("other")])),
98
+ motivation: Type.Optional(Type.String()),
99
+ voiceProfile: Type.Optional(Type.Object({
100
+ speakingRhythm: Type.Optional(Type.String()),
101
+ vocabulary: Type.Optional(Type.String()),
102
+ sampleLines: Type.Optional(Type.Array(Type.String())),
103
+ })),
104
+ })),
105
+ });
106
+ export function createUpsertCharactersTool(projectRoot, projectId) {
107
+ return {
108
+ name: "upsert_characters",
109
+ description: "interactive-film authoring: add/update characters with voice profiles. Applies immediately and records them to memory for cross-node voice consistency.",
110
+ label: "Upsert Characters",
111
+ parameters: UpsertCharactersParams,
112
+ async execute(_id, params) {
113
+ const chars = params.characters.map((c) => ({
114
+ id: c.id,
115
+ name: c.name,
116
+ role: c.role ?? "other",
117
+ motivation: c.motivation ?? "",
118
+ voiceProfile: c.voiceProfile
119
+ ? {
120
+ speakingRhythm: c.voiceProfile.speakingRhythm ?? "",
121
+ vocabulary: c.voiceProfile.vocabulary ?? "",
122
+ sampleLines: c.voiceProfile.sampleLines ?? [],
123
+ }
124
+ : undefined,
125
+ }));
126
+ const { rev } = await applyGraphDelta({ projectRoot, projectId, delta: buildUpsertCharactersDelta(chars) });
127
+ const db = new MemoryDB(join(projectRoot, "interactive-films", projectId));
128
+ try {
129
+ writeCharacterFacts(db, chars, rev);
130
+ }
131
+ finally {
132
+ db.close();
133
+ }
134
+ return textResult(`Upserted ${chars.length} character(s) (rev ${rev}).`, { kind: "graph_updated", rev });
135
+ },
136
+ };
137
+ }
138
+ function defaultChat(client, model) {
139
+ return async (system, user) => {
140
+ const res = await chatCompletion(client, model, [
141
+ { role: "system", content: system },
142
+ { role: "user", content: user },
143
+ ], { temperature: 0.6, maxTokens: 4000 });
144
+ return res.content;
145
+ };
146
+ }
147
+ const FillNodeParams = Type.Object({
148
+ nodeId: Type.String({ description: "the node to fill/rewrite" }),
149
+ instruction: Type.String({ description: "what this scene should contain (beats, who speaks, choices)" }),
150
+ });
151
+ const NODE_SYSTEM = `你是互动影游编剧。根据当前图上下文和指令,为指定节点生成 JSON(单个 StoryNode:type/title/sceneDesc/dialogue[]/choices[]),只输出 JSON。choices[].targetNodeId 必须指向已存在的节点 id。`;
152
+ const INTERACTIVE_FILM_AUTHORING_SKILL = "interactive-film-authoring";
153
+ function graphUpdatedDetails(rev, promptId, extra = {}) {
154
+ return {
155
+ kind: "graph_updated",
156
+ rev,
157
+ usedSkills: [INTERACTIVE_FILM_AUTHORING_SKILL],
158
+ promptPacks: [promptId],
159
+ ...extra,
160
+ };
161
+ }
162
+ export function createFillNodeTool(projectRoot, projectId, deps) {
163
+ return {
164
+ name: "fill_node",
165
+ description: "interactive-film authoring: write/rewrite one node's scene, dialogue and choices via the model. Applies immediately.",
166
+ label: "Fill Node",
167
+ parameters: FillNodeParams,
168
+ async execute(_id, params) {
169
+ const graph = await loadStoryGraph(projectRoot, projectId);
170
+ const context = graph ? buildFilmAuthoringContext(graph) : "(empty graph)";
171
+ const systemPrompt = await appendPromptPackGuidance(NODE_SYSTEM, {
172
+ promptId: "interactive-film.script",
173
+ projectRoot,
174
+ });
175
+ const text = await deps.chat(systemPrompt, `${context}\n\n要填的节点 id:${params.nodeId}\n指令:${params.instruction}`);
176
+ const { rev } = await applyGraphDelta({ projectRoot, projectId, delta: buildFillNodeDeltaFromLLMText(text, params.nodeId), phase: "workshop" });
177
+ return textResult(`Node ${params.nodeId} filled (rev ${rev}).`, graphUpdatedDetails(rev, "interactive-film.script"));
178
+ },
179
+ };
180
+ }
181
+ export function createReviseNodeTool(projectRoot, projectId, deps) {
182
+ return {
183
+ name: "revise_node",
184
+ description: "interactive-film authoring: revise one existing node per instruction. Applies immediately.",
185
+ label: "Revise Node",
186
+ parameters: FillNodeParams,
187
+ async execute(_id, params) {
188
+ const graph = await loadStoryGraph(projectRoot, projectId);
189
+ const context = graph ? buildFilmAuthoringContext(graph) : "(empty graph)";
190
+ const current = graph?.nodes.find((n) => n.id === params.nodeId);
191
+ const systemPrompt = await appendPromptPackGuidance(NODE_SYSTEM, {
192
+ promptId: "interactive-film.script",
193
+ projectRoot,
194
+ });
195
+ const text = await deps.chat(systemPrompt, `${context}\n\n要修改的节点 id:${params.nodeId}\n现有内容:${JSON.stringify(current ?? {})}\n修改指令:${params.instruction}`);
196
+ const { rev } = await applyGraphDelta({ projectRoot, projectId, delta: buildFillNodeDeltaFromLLMText(text, params.nodeId), phase: "workshop" });
197
+ return textResult(`Node ${params.nodeId} revised (rev ${rev}).`, graphUpdatedDetails(rev, "interactive-film.script"));
198
+ },
199
+ };
200
+ }
201
+ export function filmLLMDepsFromClient(client, model) {
202
+ return { chat: defaultChat(client, model) };
203
+ }
204
+ // ---------------------------------------------------------------------------
205
+ // draft_structure — confirm-class: LLM → buildStructureDeltaFromLLMText → apply
206
+ // ---------------------------------------------------------------------------
207
+ const DraftStructureParams = Type.Object({
208
+ instruction: Type.String({ description: "what skeleton to draft (acts, branch points, endings)" }),
209
+ });
210
+ const STRUCT_SYSTEM = `你是互动影游编剧。根据上下文与指令,生成分支骨架 JSON:{ "nodes": [StoryNode...] }。恰好 1 个 type=start,至少 2 个 branch,至少 2 个差异化 ending 节点;每条路径都能到某个 ending;只输出 JSON。`;
211
+ export function createDraftStructureTool(projectRoot, projectId, deps) {
212
+ return {
213
+ name: "draft_structure",
214
+ description: "interactive-film authoring: draft the branching node skeleton + topology. Structural — requires user confirmation.",
215
+ label: "Draft Structure",
216
+ parameters: DraftStructureParams,
217
+ async execute(_id, params) {
218
+ const graph = await loadStoryGraph(projectRoot, projectId);
219
+ const context = graph ? buildFilmAuthoringContext(graph) : "(empty graph)";
220
+ const systemPrompt = await appendPromptPackGuidance(STRUCT_SYSTEM, {
221
+ promptId: "interactive-film.story-graph",
222
+ projectRoot,
223
+ });
224
+ const text = await deps.chat(systemPrompt, `${context}\n\n骨架指令:${params.instruction}`);
225
+ const { graph: next, rev } = await applyGraphDelta({ projectRoot, projectId, delta: buildStructureDeltaFromLLMText(text), phase: "structure" });
226
+ return textResult(`Structure drafted: ${next.nodes.length} nodes (rev ${rev}).`, graphUpdatedDetails(rev, "interactive-film.story-graph"));
227
+ },
228
+ };
229
+ }
230
+ // ---------------------------------------------------------------------------
231
+ // connect_choice — confirm-class: full StoryNode → buildConnectChoiceDelta → apply
232
+ // ---------------------------------------------------------------------------
233
+ const ConnectChoiceParams = Type.Object({
234
+ node: Type.Unsafe({ description: "the full StoryNode (with updated choices) to upsert" }),
235
+ });
236
+ export function createConnectChoiceTool(projectRoot, projectId) {
237
+ return {
238
+ name: "connect_choice",
239
+ description: "interactive-film authoring: add/rewire a node's choices (topology). Structural — requires user confirmation.",
240
+ label: "Connect Choice",
241
+ parameters: ConnectChoiceParams,
242
+ async execute(_id, params) {
243
+ const node = StoryNodeSchema.parse(params.node);
244
+ const { rev } = await applyGraphDelta({ projectRoot, projectId, delta: buildConnectChoiceDelta(node) });
245
+ return textResult(`Choices updated on node ${node.id} (rev ${rev}).`, { kind: "graph_updated", rev });
246
+ },
247
+ };
248
+ }
249
+ // ---------------------------------------------------------------------------
250
+ // remove_node — confirm-class: nodeId → buildRemoveNodeDelta → apply
251
+ // ---------------------------------------------------------------------------
252
+ const RemoveNodeParams = Type.Object({
253
+ nodeId: Type.String({ description: "node id to remove" }),
254
+ });
255
+ export function createRemoveNodeTool(projectRoot, projectId) {
256
+ return {
257
+ name: "remove_node",
258
+ description: "interactive-film authoring: delete a node. Destructive — requires user confirmation.",
259
+ label: "Remove Node",
260
+ parameters: RemoveNodeParams,
261
+ async execute(_id, params) {
262
+ const { rev } = await applyGraphDelta({ projectRoot, projectId, delta: buildRemoveNodeDelta(params.nodeId) });
263
+ return textResult(`Node ${params.nodeId} removed (rev ${rev}).`, { kind: "graph_updated", rev });
264
+ },
265
+ };
266
+ }
267
+ // ---------------------------------------------------------------------------
268
+ // generate_node_image
269
+ // ---------------------------------------------------------------------------
270
+ const GenerateNodeImageParams = Type.Object({
271
+ nodeId: Type.String({ description: "the node to generate a shot image for (uses its imageSlot.prompt or sceneDesc)" }),
272
+ });
273
+ export function createGenerateNodeImageTool(projectRoot, projectId, deps) {
274
+ return {
275
+ name: "generate_node_image",
276
+ description: "interactive-film authoring: generate a shot image for a node (from its imageSlot.prompt or sceneDesc) and attach it. Applies immediately.",
277
+ label: "Generate Node Image",
278
+ parameters: GenerateNodeImageParams,
279
+ async execute(_id, params) {
280
+ const graph = await loadStoryGraph(projectRoot, projectId);
281
+ if (!graph)
282
+ throw new Error(`interactive-film project ${projectId} has no story graph`);
283
+ const node = graph.nodes.find((n) => n.id === params.nodeId);
284
+ if (!node)
285
+ throw new Error(`node ${params.nodeId} not found`);
286
+ const imageDeps = deps ?? (await defaultNodeImageDeps(projectRoot));
287
+ const { assetRef, delta } = await generateNodeImage({ projectRoot, projectId, node, deps: imageDeps });
288
+ const { rev } = await applyGraphDelta({ projectRoot, projectId, delta });
289
+ return textResult(`Generated image for node ${params.nodeId} (rev ${rev}).`, { kind: "graph_updated", rev, assetRef });
290
+ },
291
+ };
292
+ }
293
+ // ---------------------------------------------------------------------------
294
+ // Tool set selection + factory
295
+ // ---------------------------------------------------------------------------
296
+ /**
297
+ * Returns the tool names that the interactive-film-authoring session should
298
+ * provide given the current `confirmedIntent`.
299
+ *
300
+ * - No confirmed intent → direct-write tools + propose_action (let the agent
301
+ * surface high-cost operations for explicit user confirmation).
302
+ * - Confirmed intent → exactly that one tool (already confirmed, execute it).
303
+ */
304
+ export function buildFilmAuthoringToolNames(confirmedIntent) {
305
+ if (confirmedIntent === "draft_structure")
306
+ return ["draft_structure"];
307
+ if (confirmedIntent === "connect_choice")
308
+ return ["connect_choice"];
309
+ if (confirmedIntent === "remove_node")
310
+ return ["remove_node"];
311
+ return ["set_world_anchor", "upsert_characters", "add_variable", "define_ending", "fill_node", "revise_node", "generate_node_image", "propose_action"];
312
+ }
313
+ /**
314
+ * Instantiates the AgentTool objects for an interactive-film-authoring
315
+ * session. Keeps tool construction out of agent-session.ts so it can be
316
+ * unit-tested independently.
317
+ */
318
+ export function createFilmAuthoringTools(params) {
319
+ const { projectRoot, projectId, llm } = params;
320
+ const names = buildFilmAuthoringToolNames(params.confirmedIntent);
321
+ const byName = {
322
+ set_world_anchor: () => createSetWorldAnchorTool(projectRoot, projectId),
323
+ upsert_characters: () => createUpsertCharactersTool(projectRoot, projectId),
324
+ add_variable: () => createAddVariableTool(projectRoot, projectId),
325
+ define_ending: () => createDefineEndingTool(projectRoot, projectId),
326
+ fill_node: () => createFillNodeTool(projectRoot, projectId, llm),
327
+ revise_node: () => createReviseNodeTool(projectRoot, projectId, llm),
328
+ generate_node_image: () => createGenerateNodeImageTool(projectRoot, projectId),
329
+ draft_structure: () => createDraftStructureTool(projectRoot, projectId, llm),
330
+ connect_choice: () => createConnectChoiceTool(projectRoot, projectId),
331
+ remove_node: () => createRemoveNodeTool(projectRoot, projectId),
332
+ propose_action: () => params.proposeActionTool,
333
+ };
334
+ return names.map((n) => byName[n]());
335
+ }
336
+ //# sourceMappingURL=film-authoring-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"film-authoring-tools.js","sourceRoot":"","sources":["../../src/agent/film-authoring-tools.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  export { buildAgentSystemPrompt } from "./agent-system-prompt.js";
2
- export { createSubAgentTool, createReadTool, createWriteTruthFileTool, createRenameEntityTool, createPatchChapterTextTool, createEditTool, createWriteFileTool, createShortFictionRunTool, createGenerateCoverTool, createPlayStartTool, createPlayReviseTool, createPlayStepTool, createGrepTool, createLsTool, } from "./agent-tools.js";
2
+ export { createSubAgentTool, createReadTool, createWriteTruthFileTool, createRenameEntityTool, createPatchChapterTextTool, createEditTool, createWriteFileTool, createShortFictionRunTool, createScriptCreationTool, createStoryboardCreationTool, createInteractiveFilmCreationTool, createResearchWebTool, createGenerateCoverTool, createPlayStartTool, createPlayReviseTool, createPlayStepTool, createGrepTool, createLsTool, } from "./agent-tools.js";
3
3
  export { runAgentSession, evictAgentCache, type AgentSessionConfig, type AgentSessionResult } from "./agent-session.js";
4
4
  export { createBookContextTransform } from "./context-transform.js";
5
+ export { createSetWorldAnchorTool, createUpsertCharactersTool, createAddVariableTool, createDefineEndingTool, createFillNodeTool, createReviseNodeTool, createGenerateNodeImageTool, createDraftStructureTool, createConnectChoiceTool, createRemoveNodeTool, filmLLMDepsFromClient, buildFilmAuthoringToolNames, createFilmAuthoringTools, type FilmLLMDeps, } from "./film-authoring-tools.js";
5
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/agent/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,wBAAwB,EACxB,sBAAsB,EACtB,0BAA0B,EAC1B,cAAc,EACd,mBAAmB,EACnB,yBAAyB,EACzB,uBAAuB,EACvB,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,EAClB,cAAc,EACd,YAAY,GACb,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,KAAK,kBAAkB,EAAE,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxH,OAAO,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/agent/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,wBAAwB,EACxB,sBAAsB,EACtB,0BAA0B,EAC1B,cAAc,EACd,mBAAmB,EACnB,yBAAyB,EACzB,wBAAwB,EACxB,4BAA4B,EAC5B,iCAAiC,EACjC,qBAAqB,EACrB,uBAAuB,EACvB,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,EAClB,cAAc,EACd,YAAY,GACb,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,KAAK,kBAAkB,EAAE,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxH,OAAO,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AACpE,OAAO,EACL,wBAAwB,EACxB,0BAA0B,EAC1B,qBAAqB,EACrB,sBAAsB,EACtB,kBAAkB,EAClB,oBAAoB,EACpB,2BAA2B,EAC3B,wBAAwB,EACxB,uBAAuB,EACvB,oBAAoB,EACpB,qBAAqB,EACrB,2BAA2B,EAC3B,wBAAwB,EACxB,KAAK,WAAW,GACjB,MAAM,2BAA2B,CAAC"}
@@ -1,5 +1,6 @@
1
1
  export { buildAgentSystemPrompt } from "./agent-system-prompt.js";
2
- export { createSubAgentTool, createReadTool, createWriteTruthFileTool, createRenameEntityTool, createPatchChapterTextTool, createEditTool, createWriteFileTool, createShortFictionRunTool, createGenerateCoverTool, createPlayStartTool, createPlayReviseTool, createPlayStepTool, createGrepTool, createLsTool, } from "./agent-tools.js";
2
+ export { createSubAgentTool, createReadTool, createWriteTruthFileTool, createRenameEntityTool, createPatchChapterTextTool, createEditTool, createWriteFileTool, createShortFictionRunTool, createScriptCreationTool, createStoryboardCreationTool, createInteractiveFilmCreationTool, createResearchWebTool, createGenerateCoverTool, createPlayStartTool, createPlayReviseTool, createPlayStepTool, createGrepTool, createLsTool, } from "./agent-tools.js";
3
3
  export { runAgentSession, evictAgentCache } from "./agent-session.js";
4
4
  export { createBookContextTransform } from "./context-transform.js";
5
+ export { createSetWorldAnchorTool, createUpsertCharactersTool, createAddVariableTool, createDefineEndingTool, createFillNodeTool, createReviseNodeTool, createGenerateNodeImageTool, createDraftStructureTool, createConnectChoiceTool, createRemoveNodeTool, filmLLMDepsFromClient, buildFilmAuthoringToolNames, createFilmAuthoringTools, } from "./film-authoring-tools.js";
5
6
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/agent/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,wBAAwB,EACxB,sBAAsB,EACtB,0BAA0B,EAC1B,cAAc,EACd,mBAAmB,EACnB,yBAAyB,EACzB,uBAAuB,EACvB,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,EAClB,cAAc,EACd,YAAY,GACb,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,eAAe,EAAoD,MAAM,oBAAoB,CAAC;AACxH,OAAO,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/agent/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,wBAAwB,EACxB,sBAAsB,EACtB,0BAA0B,EAC1B,cAAc,EACd,mBAAmB,EACnB,yBAAyB,EACzB,wBAAwB,EACxB,4BAA4B,EAC5B,iCAAiC,EACjC,qBAAqB,EACrB,uBAAuB,EACvB,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,EAClB,cAAc,EACd,YAAY,GACb,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,eAAe,EAAoD,MAAM,oBAAoB,CAAC;AACxH,OAAO,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AACpE,OAAO,EACL,wBAAwB,EACxB,0BAA0B,EAC1B,qBAAqB,EACrB,sBAAsB,EACtB,kBAAkB,EAClB,oBAAoB,EACpB,2BAA2B,EAC3B,wBAAwB,EACxB,uBAAuB,EACvB,oBAAoB,EACpB,qBAAqB,EACrB,2BAA2B,EAC3B,wBAAwB,GAEzB,MAAM,2BAA2B,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { AssistantMessageEventStream, Model, Api } from "@mariozechner/pi-ai";
2
+ import type { LLMMessage, LLMResponse } from "../llm/provider.js";
3
+ export declare function isLlmStubEnabled(): boolean;
4
+ /**
5
+ * Returns a deterministic AssistantMessageEventStream that either emits a
6
+ * propose_action toolCall (when the latest user text mentions "结构/骨架/structure"
7
+ * and propose_action hasn't run yet) or a plain "好的。" text reply.
8
+ *
9
+ * Mirrors localAssistantStopStream in agent-session.ts exactly — same
10
+ * createAssistantMessageEventStream() + queueMicrotask pattern.
11
+ */
12
+ export declare function stubAgentStream(model: Model<Api>, context: unknown): AssistantMessageEventStream;
13
+ /**
14
+ * Deterministic replacement for the chatCompletion network call.
15
+ * Returns STRUCTURE_JSON when the prompt mentions structure/骨架/nodes,
16
+ * otherwise a single node JSON.
17
+ */
18
+ export declare function stubChatCompletion(messages: ReadonlyArray<LLMMessage>, _model: string): LLMResponse;
19
+ //# sourceMappingURL=llm-stub.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-stub.d.ts","sourceRoot":"","sources":["../../src/agent/llm-stub.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,2BAA2B,EAC3B,KAAK,EACL,GAAG,EACJ,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAElE,wBAAgB,gBAAgB,IAAI,OAAO,CAE1C;AAmDD;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,OAAO,GAAG,2BAA2B,CA4ChG;AAkCD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,aAAa,CAAC,UAAU,CAAC,EACnC,MAAM,EAAE,MAAM,GACb,WAAW,CAOb"}
@@ -0,0 +1,134 @@
1
+ import { createAssistantMessageEventStream } from "@mariozechner/pi-ai";
2
+ export function isLlmStubEnabled() {
3
+ return Boolean(process.env.INKOS_AGENT_LLM_STUB);
4
+ }
5
+ // Mirrors EMPTY_USAGE in agent-session.ts exactly.
6
+ const EMPTY_USAGE = {
7
+ input: 0,
8
+ output: 0,
9
+ cacheRead: 0,
10
+ cacheWrite: 0,
11
+ totalTokens: 0,
12
+ cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },
13
+ };
14
+ function lastUserText(context) {
15
+ const msgs = context.messages ?? [];
16
+ for (let i = msgs.length - 1; i >= 0; i--) {
17
+ const m = msgs[i];
18
+ if (m.role === "user") {
19
+ return typeof m.content === "string" ? m.content : JSON.stringify(m.content);
20
+ }
21
+ }
22
+ return "";
23
+ }
24
+ function alreadyProposed(context) {
25
+ return (context.messages ?? []).some((m) => {
26
+ // Agent format (non-openai-completions): role="toolResult" with toolName
27
+ if (m.role === "toolResult" && m.toolName === "propose_action") {
28
+ return true;
29
+ }
30
+ // LLM format (openai-completions): assistant message with toolCall content
31
+ if (m.role === "assistant" && Array.isArray(m.content)) {
32
+ if (m.content.some((c) => c.type === "toolCall" && c.name === "propose_action")) {
33
+ return true;
34
+ }
35
+ }
36
+ // LLM format (openai-completions folded): tool result folded into user message string
37
+ if (m.role === "user" && typeof m.content === "string") {
38
+ if (/- propose_action \(/.test(m.content)) {
39
+ return true;
40
+ }
41
+ }
42
+ return false;
43
+ });
44
+ }
45
+ /**
46
+ * Returns a deterministic AssistantMessageEventStream that either emits a
47
+ * propose_action toolCall (when the latest user text mentions "结构/骨架/structure"
48
+ * and propose_action hasn't run yet) or a plain "好的。" text reply.
49
+ *
50
+ * Mirrors localAssistantStopStream in agent-session.ts exactly — same
51
+ * createAssistantMessageEventStream() + queueMicrotask pattern.
52
+ */
53
+ export function stubAgentStream(model, context) {
54
+ const stream = createAssistantMessageEventStream();
55
+ const text = lastUserText(context);
56
+ const proposed = alreadyProposed(context);
57
+ const wantStructure = !proposed && /结构|骨架|structure/i.test(text);
58
+ const content = wantStructure
59
+ ? [
60
+ {
61
+ type: "toolCall",
62
+ id: "stub-draft",
63
+ name: "propose_action",
64
+ arguments: {
65
+ action: "draft_structure",
66
+ title: "搭建结构",
67
+ summary: "确认后生成三幕骨架",
68
+ instruction: "搭建一个三幕分支结构",
69
+ draftStructure: { instruction: "三幕分支结构" },
70
+ },
71
+ },
72
+ ]
73
+ : [{ type: "text", text: "好的。" }];
74
+ const stopReason = wantStructure ? "toolUse" : "stop";
75
+ const message = {
76
+ role: "assistant",
77
+ content: content,
78
+ api: model.api,
79
+ provider: model.provider,
80
+ model: model.id,
81
+ usage: EMPTY_USAGE,
82
+ stopReason,
83
+ timestamp: Date.now(),
84
+ };
85
+ queueMicrotask(() => {
86
+ stream.push({ type: "done", reason: stopReason, message });
87
+ stream.end(message);
88
+ });
89
+ return stream;
90
+ }
91
+ const STRUCTURE_JSON = JSON.stringify({
92
+ nodes: [
93
+ {
94
+ id: "s",
95
+ type: "start",
96
+ title: "开场",
97
+ sceneDesc: "宫门前",
98
+ choices: [{ id: "c1", text: "查账", targetNodeId: "b" }],
99
+ },
100
+ {
101
+ id: "b",
102
+ type: "branch",
103
+ title: "抉择",
104
+ sceneDesc: "账房",
105
+ choices: [
106
+ { id: "c2", text: "公开", targetNodeId: "e1" },
107
+ { id: "c3", text: "隐瞒", targetNodeId: "e2" },
108
+ ],
109
+ },
110
+ { id: "e1", type: "ending", title: "真相", choices: [] },
111
+ { id: "e2", type: "ending", title: "沉沦", choices: [] },
112
+ ],
113
+ });
114
+ const NODE_JSON = JSON.stringify({
115
+ type: "branch",
116
+ title: "新场景",
117
+ sceneDesc: "夜色",
118
+ dialogue: [{ speaker: "阿梅", text: "账不能错", emotion: "坚定" }],
119
+ choices: [],
120
+ });
121
+ /**
122
+ * Deterministic replacement for the chatCompletion network call.
123
+ * Returns STRUCTURE_JSON when the prompt mentions structure/骨架/nodes,
124
+ * otherwise a single node JSON.
125
+ */
126
+ export function stubChatCompletion(messages, _model) {
127
+ const joined = messages.map((m) => m.content).join("\n");
128
+ const content = /骨架|nodes|结构/i.test(joined) ? STRUCTURE_JSON : NODE_JSON;
129
+ return {
130
+ content,
131
+ usage: { promptTokens: 0, completionTokens: 0, totalTokens: 0 },
132
+ };
133
+ }
134
+ //# sourceMappingURL=llm-stub.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-stub.js","sourceRoot":"","sources":["../../src/agent/llm-stub.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"composer.d.ts","sourceRoot":"","sources":["../../src/agents/composer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"composer.d.ts","sourceRoot":"","sources":["../../src/agents/composer.ts"],"names":[],"mappings":"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"}