@actalk/inkos-core 1.2.0 → 1.3.0-canary.26.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 (115) hide show
  1. package/dist/agent/agent-session.d.ts +48 -0
  2. package/dist/agent/agent-session.d.ts.map +1 -0
  3. package/dist/agent/agent-session.js +229 -0
  4. package/dist/agent/agent-session.js.map +1 -0
  5. package/dist/agent/agent-system-prompt.d.ts +2 -0
  6. package/dist/agent/agent-system-prompt.d.ts.map +1 -0
  7. package/dist/agent/agent-system-prompt.js +97 -0
  8. package/dist/agent/agent-system-prompt.js.map +1 -0
  9. package/dist/agent/agent-tools.d.ts +30 -0
  10. package/dist/agent/agent-tools.d.ts.map +1 -0
  11. package/dist/agent/agent-tools.js +280 -0
  12. package/dist/agent/agent-tools.js.map +1 -0
  13. package/dist/agent/index.d.ts +4 -0
  14. package/dist/agent/index.d.ts.map +1 -0
  15. package/dist/agent/index.js +4 -0
  16. package/dist/agent/index.js.map +1 -0
  17. package/dist/agents/architect.js +5 -5
  18. package/dist/agents/architect.js.map +1 -1
  19. package/dist/agents/chapter-analyzer.d.ts.map +1 -1
  20. package/dist/agents/chapter-analyzer.js +32 -4
  21. package/dist/agents/chapter-analyzer.js.map +1 -1
  22. package/dist/agents/consolidator.js +1 -1
  23. package/dist/agents/consolidator.js.map +1 -1
  24. package/dist/agents/continuity.js +1 -1
  25. package/dist/agents/continuity.js.map +1 -1
  26. package/dist/agents/fanfic-canon-importer.js +1 -1
  27. package/dist/agents/fanfic-canon-importer.js.map +1 -1
  28. package/dist/agents/foundation-reviewer.js +1 -1
  29. package/dist/agents/foundation-reviewer.js.map +1 -1
  30. package/dist/agents/radar.js +1 -1
  31. package/dist/agents/radar.js.map +1 -1
  32. package/dist/agents/settler-delta-parser.d.ts.map +1 -1
  33. package/dist/agents/settler-delta-parser.js +6 -1
  34. package/dist/agents/settler-delta-parser.js.map +1 -1
  35. package/dist/agents/state-validator.js +21 -3
  36. package/dist/agents/state-validator.js.map +1 -1
  37. package/dist/agents/writer-prompts.js +13 -13
  38. package/dist/agents/writer-prompts.js.map +1 -1
  39. package/dist/agents/writer.js +1 -1
  40. package/dist/agents/writer.js.map +1 -1
  41. package/dist/index.d.ts +9 -2
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js +10 -2
  44. package/dist/index.js.map +1 -1
  45. package/dist/interaction/book-session-store.d.ts +6 -0
  46. package/dist/interaction/book-session-store.d.ts.map +1 -0
  47. package/dist/interaction/book-session-store.js +59 -0
  48. package/dist/interaction/book-session-store.js.map +1 -0
  49. package/dist/interaction/draft-directive-parser.d.ts +38 -0
  50. package/dist/interaction/draft-directive-parser.d.ts.map +1 -0
  51. package/dist/interaction/draft-directive-parser.js +208 -0
  52. package/dist/interaction/draft-directive-parser.js.map +1 -0
  53. package/dist/interaction/nl-router.d.ts +1 -0
  54. package/dist/interaction/nl-router.d.ts.map +1 -1
  55. package/dist/interaction/nl-router.js +1 -1
  56. package/dist/interaction/nl-router.js.map +1 -1
  57. package/dist/interaction/project-session-store.d.ts +3 -1
  58. package/dist/interaction/project-session-store.d.ts.map +1 -1
  59. package/dist/interaction/project-session-store.js +19 -1
  60. package/dist/interaction/project-session-store.js.map +1 -1
  61. package/dist/interaction/project-tools.d.ts +2 -0
  62. package/dist/interaction/project-tools.d.ts.map +1 -1
  63. package/dist/interaction/project-tools.js +186 -126
  64. package/dist/interaction/project-tools.js.map +1 -1
  65. package/dist/interaction/runtime.d.ts.map +1 -1
  66. package/dist/interaction/runtime.js +14 -1
  67. package/dist/interaction/runtime.js.map +1 -1
  68. package/dist/interaction/session.d.ts +725 -6
  69. package/dist/interaction/session.d.ts.map +1 -1
  70. package/dist/interaction/session.js +65 -0
  71. package/dist/interaction/session.js.map +1 -1
  72. package/dist/llm/config-migration.d.ts +5 -0
  73. package/dist/llm/config-migration.d.ts.map +1 -0
  74. package/dist/llm/config-migration.js +51 -0
  75. package/dist/llm/config-migration.js.map +1 -0
  76. package/dist/llm/provider.d.ts +4 -4
  77. package/dist/llm/provider.d.ts.map +1 -1
  78. package/dist/llm/provider.js +472 -540
  79. package/dist/llm/provider.js.map +1 -1
  80. package/dist/llm/secrets.d.ts +9 -0
  81. package/dist/llm/secrets.d.ts.map +1 -0
  82. package/dist/llm/secrets.js +31 -0
  83. package/dist/llm/secrets.js.map +1 -0
  84. package/dist/llm/service-presets.d.ts +37 -0
  85. package/dist/llm/service-presets.d.ts.map +1 -0
  86. package/dist/llm/service-presets.js +123 -0
  87. package/dist/llm/service-presets.js.map +1 -0
  88. package/dist/llm/service-resolver.d.ts +10 -0
  89. package/dist/llm/service-resolver.d.ts.map +1 -0
  90. package/dist/llm/service-resolver.js +46 -0
  91. package/dist/llm/service-resolver.js.map +1 -0
  92. package/dist/models/project.d.ts +158 -30
  93. package/dist/models/project.d.ts.map +1 -1
  94. package/dist/models/project.js +13 -0
  95. package/dist/models/project.js.map +1 -1
  96. package/dist/pipeline/chapter-persistence.d.ts.map +1 -1
  97. package/dist/pipeline/chapter-persistence.js +5 -1
  98. package/dist/pipeline/chapter-persistence.js.map +1 -1
  99. package/dist/pipeline/chapter-truth-validation.d.ts.map +1 -1
  100. package/dist/pipeline/chapter-truth-validation.js +27 -1
  101. package/dist/pipeline/chapter-truth-validation.js.map +1 -1
  102. package/dist/pipeline/runner.d.ts.map +1 -1
  103. package/dist/pipeline/runner.js +9 -3
  104. package/dist/pipeline/runner.js.map +1 -1
  105. package/dist/state/manager.d.ts +2 -0
  106. package/dist/state/manager.d.ts.map +1 -1
  107. package/dist/state/manager.js +10 -3
  108. package/dist/state/manager.js.map +1 -1
  109. package/dist/state/state-validator.d.ts.map +1 -1
  110. package/dist/state/state-validator.js +44 -33
  111. package/dist/state/state-validator.js.map +1 -1
  112. package/dist/utils/config-loader.d.ts.map +1 -1
  113. package/dist/utils/config-loader.js +149 -32
  114. package/dist/utils/config-loader.js.map +1 -1
  115. package/package.json +4 -3
@@ -0,0 +1,48 @@
1
+ import type { AgentEvent } from "@mariozechner/pi-agent-core";
2
+ import type { Model, Api } from "@mariozechner/pi-ai";
3
+ import type { PipelineRunner } from "../pipeline/runner.js";
4
+ export interface AgentSessionConfig {
5
+ /** Unique session identifier (typically the BookSession id). */
6
+ sessionId: string;
7
+ /** Book ID, or null if in "new book" mode. */
8
+ bookId: string | null;
9
+ /** Language for the system prompt. */
10
+ language: string;
11
+ /** PipelineRunner for sub-agent tool delegation. */
12
+ pipeline: PipelineRunner;
13
+ /** Project root directory (books/ lives under this). */
14
+ projectRoot: string;
15
+ /** pi-ai Model to use, or provider+modelId to resolve via getModel. */
16
+ model: Model<Api> | {
17
+ provider: string;
18
+ modelId: string;
19
+ };
20
+ /** Optional API key. When omitted, falls back to env-based key lookup. */
21
+ apiKey?: string;
22
+ /** Optional listener for streaming events (for SSE forwarding). */
23
+ onEvent?: (event: AgentEvent) => void;
24
+ }
25
+ export interface AgentSessionResult {
26
+ /** Extracted text from the final assistant message. */
27
+ responseText: string;
28
+ /** Full conversation history for persistence. */
29
+ messages: Array<{
30
+ role: string;
31
+ content: string;
32
+ thinking?: string;
33
+ }>;
34
+ }
35
+ /**
36
+ * Run a single conversation turn within a cached Agent session.
37
+ *
38
+ * If the session already exists in the cache, reuses the Agent (with its full
39
+ * in-memory message history including tool calls). Otherwise creates a new
40
+ * Agent, optionally restoring messages from `initialMessages`.
41
+ */
42
+ export declare function runAgentSession(config: AgentSessionConfig, userMessage: string, initialMessages?: Array<{
43
+ role: string;
44
+ content: string;
45
+ }>): Promise<AgentSessionResult>;
46
+ /** Manually evict a cached Agent session. */
47
+ export declare function evictAgentCache(sessionId: string): boolean;
48
+ //# sourceMappingURL=agent-session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-session.d.ts","sourceRoot":"","sources":["../../src/agent/agent-session.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAgB,MAAM,6BAA6B,CAAC;AAE5E,OAAO,KAAK,EAAE,KAAK,EAAE,GAAG,EAAiC,MAAM,qBAAqB,CAAC;AACrF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAc5D,MAAM,WAAW,kBAAkB;IACjC,gEAAgE;IAChE,SAAS,EAAE,MAAM,CAAC;IAClB,8CAA8C;IAC9C,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,sCAAsC;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,oDAAoD;IACpD,QAAQ,EAAE,cAAc,CAAC;IACzB,wDAAwD;IACxD,WAAW,EAAE,MAAM,CAAC;IACpB,uEAAuE;IACvE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1D,0EAA0E;IAC1E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mEAAmE;IACnE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;CACvC;AAED,MAAM,WAAW,kBAAkB;IACjC,uDAAuD;IACvD,YAAY,EAAE,MAAM,CAAC;IACrB,iDAAiD;IACjD,QAAQ,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACvE;AAoJD;;;;;;GAMG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,kBAAkB,EAC1B,WAAW,EAAE,MAAM,EACnB,eAAe,CAAC,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,GACzD,OAAO,CAAC,kBAAkB,CAAC,CA+E7B;AAoBD,6CAA6C;AAC7C,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAE1D"}
@@ -0,0 +1,229 @@
1
+ import { Agent } from "@mariozechner/pi-agent-core";
2
+ import { streamSimple, getModel, getEnvApiKey } from "@mariozechner/pi-ai";
3
+ import { buildAgentSystemPrompt } from "./agent-system-prompt.js";
4
+ import { createSubAgentTool, createReadTool, createEditTool, createGrepTool, createLsTool, } from "./agent-tools.js";
5
+ const agentCache = new Map();
6
+ /** TTL for cached agents: 5 minutes. */
7
+ const CACHE_TTL_MS = 5 * 60 * 1000;
8
+ /** Cleanup interval handle (lazy-started). */
9
+ let cleanupTimer = null;
10
+ function ensureCleanupTimer() {
11
+ if (cleanupTimer)
12
+ return;
13
+ cleanupTimer = setInterval(() => {
14
+ const now = Date.now();
15
+ for (const [id, entry] of agentCache) {
16
+ if (now - entry.lastActive > CACHE_TTL_MS) {
17
+ agentCache.delete(id);
18
+ }
19
+ }
20
+ // Stop the timer when nothing left to watch.
21
+ if (agentCache.size === 0 && cleanupTimer) {
22
+ clearInterval(cleanupTimer);
23
+ cleanupTimer = null;
24
+ }
25
+ }, 60_000); // run every 60 s
26
+ // Allow the process to exit even if this timer is alive.
27
+ if (cleanupTimer && typeof cleanupTimer === "object" && "unref" in cleanupTimer) {
28
+ cleanupTimer.unref();
29
+ }
30
+ }
31
+ // ---------------------------------------------------------------------------
32
+ // Helpers
33
+ // ---------------------------------------------------------------------------
34
+ function resolveModel(spec) {
35
+ if (!spec) {
36
+ throw new Error("Model is required but was undefined. Check LLM configuration.");
37
+ }
38
+ if (typeof spec === "object" && "id" in spec && "api" in spec) {
39
+ // Already a Model object.
40
+ return spec;
41
+ }
42
+ const { provider, modelId } = spec;
43
+ if (!provider || !modelId) {
44
+ throw new Error(`Invalid model spec: provider=${provider}, modelId=${modelId}`);
45
+ }
46
+ return getModel(provider, modelId);
47
+ }
48
+ /**
49
+ * Extract readable text from an AssistantMessage's content array.
50
+ * Filters out tool-call blocks; concatenates text blocks.
51
+ */
52
+ function extractTextFromAssistant(msg) {
53
+ return msg.content
54
+ .filter((c) => c.type === "text")
55
+ .map((c) => c.text)
56
+ .join("");
57
+ }
58
+ /**
59
+ * Extract thinking/reasoning text from an AssistantMessage's content array.
60
+ */
61
+ function extractThinkingFromAssistant(msg) {
62
+ return msg.content
63
+ .filter((c) => c.type === "thinking")
64
+ .map((c) => c.thinking ?? "")
65
+ .join("");
66
+ }
67
+ /**
68
+ * Convert plain `{ role, content }` messages (from BookSession disk storage)
69
+ * back into pi-agent AgentMessage format so they can be loaded into an Agent.
70
+ */
71
+ function plainToAgentMessages(plain) {
72
+ return plain.map((m) => {
73
+ const ts = Date.now();
74
+ if (m.role === "user") {
75
+ return { role: "user", content: m.content, timestamp: ts };
76
+ }
77
+ // For stored assistant messages we only have the text.
78
+ // Re-wrap as a minimal AssistantMessage with a single TextContent.
79
+ return {
80
+ role: "assistant",
81
+ content: [{ type: "text", text: m.content }],
82
+ api: "anthropic-messages",
83
+ provider: "anthropic",
84
+ model: "unknown",
85
+ usage: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, totalTokens: 0, cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 } },
86
+ stopReason: "stop",
87
+ timestamp: ts,
88
+ };
89
+ });
90
+ }
91
+ /**
92
+ * Flatten the Agent's in-memory messages to plain `{ role, content }` pairs
93
+ * suitable for BookSession persistence.
94
+ */
95
+ function agentMessagesToPlain(messages) {
96
+ const out = [];
97
+ for (const msg of messages) {
98
+ if (!msg || typeof msg !== "object" || !("role" in msg))
99
+ continue;
100
+ const m = msg;
101
+ if (m.role === "user") {
102
+ const content = typeof m.content === "string"
103
+ ? m.content
104
+ : Array.isArray(m.content)
105
+ ? m.content
106
+ .filter((c) => c.type === "text")
107
+ .map((c) => c.text)
108
+ .join("")
109
+ : "";
110
+ if (content)
111
+ out.push({ role: "user", content });
112
+ }
113
+ else if (m.role === "assistant") {
114
+ const text = extractTextFromAssistant(m);
115
+ const thinking = extractThinkingFromAssistant(m);
116
+ if (text || thinking) {
117
+ const entry = { role: "assistant", content: text };
118
+ if (thinking)
119
+ entry.thinking = thinking;
120
+ out.push(entry);
121
+ }
122
+ }
123
+ // ToolResult messages are internal; skip them for persistence.
124
+ }
125
+ return out;
126
+ }
127
+ // ---------------------------------------------------------------------------
128
+ // Main entry point
129
+ // ---------------------------------------------------------------------------
130
+ /**
131
+ * Run a single conversation turn within a cached Agent session.
132
+ *
133
+ * If the session already exists in the cache, reuses the Agent (with its full
134
+ * in-memory message history including tool calls). Otherwise creates a new
135
+ * Agent, optionally restoring messages from `initialMessages`.
136
+ */
137
+ export async function runAgentSession(config, userMessage, initialMessages) {
138
+ const { sessionId, bookId, language, pipeline, projectRoot, onEvent } = config;
139
+ // ----- Resolve or create Agent -----
140
+ let cached = agentCache.get(sessionId);
141
+ if (cached) {
142
+ // Check if model changed — evict and rebuild if so
143
+ const currentModelId = cached.agent.state.model?.id;
144
+ const newModelId = typeof config.model === 'object' && 'id' in config.model
145
+ ? config.model.id
146
+ : undefined;
147
+ if (currentModelId && newModelId && currentModelId !== newModelId) {
148
+ // Preserve conversation messages for re-injection
149
+ const preservedMessages = agentMessagesToPlain(cached.agent.state.messages);
150
+ agentCache.delete(sessionId);
151
+ cached = undefined;
152
+ // Pass preserved messages as initialMessages if none were provided
153
+ if (!initialMessages || initialMessages.length === 0) {
154
+ initialMessages = preservedMessages;
155
+ }
156
+ }
157
+ }
158
+ if (!cached) {
159
+ const model = resolveModel(config.model);
160
+ const agent = new Agent({
161
+ initialState: {
162
+ model,
163
+ systemPrompt: buildAgentSystemPrompt(bookId, language),
164
+ tools: [
165
+ createSubAgentTool(pipeline, bookId),
166
+ createReadTool(projectRoot),
167
+ createEditTool(projectRoot),
168
+ createGrepTool(projectRoot),
169
+ createLsTool(projectRoot),
170
+ ],
171
+ },
172
+ streamFn: streamSimple,
173
+ getApiKey: (provider) => {
174
+ if (config.apiKey)
175
+ return config.apiKey;
176
+ return getEnvApiKey(provider);
177
+ },
178
+ });
179
+ // Restore prior conversation if provided.
180
+ if (initialMessages && initialMessages.length > 0) {
181
+ agent.state.messages = plainToAgentMessages(initialMessages);
182
+ }
183
+ cached = { agent, lastActive: Date.now() };
184
+ agentCache.set(sessionId, cached);
185
+ ensureCleanupTimer();
186
+ }
187
+ cached.lastActive = Date.now();
188
+ const { agent } = cached;
189
+ // ----- Subscribe to events (for SSE streaming to frontend) -----
190
+ let unsubscribe;
191
+ if (onEvent) {
192
+ unsubscribe = agent.subscribe((event) => {
193
+ onEvent(event);
194
+ });
195
+ }
196
+ // ----- Execute the turn -----
197
+ try {
198
+ await agent.prompt(userMessage);
199
+ }
200
+ finally {
201
+ unsubscribe?.();
202
+ }
203
+ // ----- Extract result -----
204
+ const allMessages = agent.state.messages;
205
+ const responseText = extractResponseText(allMessages);
206
+ const plainMessages = agentMessagesToPlain(allMessages);
207
+ return { responseText, messages: plainMessages };
208
+ }
209
+ /**
210
+ * Walk backward through messages to find the last assistant message and
211
+ * extract its text content.
212
+ */
213
+ function extractResponseText(messages) {
214
+ for (let i = messages.length - 1; i >= 0; i--) {
215
+ const msg = messages[i];
216
+ if (msg && typeof msg === "object" && "role" in msg && msg.role === "assistant") {
217
+ return extractTextFromAssistant(msg);
218
+ }
219
+ }
220
+ return "";
221
+ }
222
+ // ---------------------------------------------------------------------------
223
+ // Cache management
224
+ // ---------------------------------------------------------------------------
225
+ /** Manually evict a cached Agent session. */
226
+ export function evictAgentCache(sessionId) {
227
+ return agentCache.delete(sessionId);
228
+ }
229
+ //# sourceMappingURL=agent-session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-session.js","sourceRoot":"","sources":["../../src/agent/agent-session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function buildAgentSystemPrompt(bookId: string | null, language: string): string;
2
+ //# sourceMappingURL=agent-system-prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-system-prompt.d.ts","sourceRoot":"","sources":["../../src/agent/agent-system-prompt.ts"],"names":[],"mappings":"AAAA,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAiGtF"}
@@ -0,0 +1,97 @@
1
+ export function buildAgentSystemPrompt(bookId, language) {
2
+ const isZh = language === "zh";
3
+ if (!bookId) {
4
+ return isZh
5
+ ? `你是 InkOS 建书助手。你的任务是帮用户从零开始创建一本新书。
6
+
7
+ ## 工作流程
8
+
9
+ 1. **收集信息**(对话阶段)— 通过自然对话逐步了解:
10
+ - 题材/类型(如玄幻、都市、悬疑、言情等)
11
+ - 目标平台(番茄小说、起点中文网、飞卢等)
12
+ - 世界观设定(什么样的世界?有什么特殊规则?)
13
+ - 主角设定(谁?什么背景?什么性格?)
14
+ - 核心冲突(主线矛盾是什么?)
15
+ - 写作语言(中文/English)
16
+
17
+ 2. **确认建书**(调用阶段)— 当信息足够时,调用 sub_agent 工具委托 architect 子智能体建书:
18
+ - instruction 中包含收集到的所有信息(题材、世界观、主角、冲突等)
19
+ - architect 会生成完整的 foundation(世界观设定、卷纲规划、叙事规则等)
20
+
21
+ ## 对话风格
22
+
23
+ - 每次只问一个问题,不要一次问太多
24
+ - 用户回答模糊时,给出 2-3 个具体选项引导
25
+ - 当信息基本齐了,主动提议建书,不要无限追问
26
+ - 保持简短、自然
27
+ - **不要在回复中添加表情符号**`
28
+ : `You are the InkOS book creation assistant. Help the user create a new book from scratch.
29
+
30
+ ## Workflow
31
+
32
+ 1. **Collect information** — Through conversation, gradually learn:
33
+ - Genre (fantasy, urban, mystery, romance, etc.)
34
+ - Target platform
35
+ - World setting
36
+ - Protagonist
37
+ - Core conflict
38
+ - Writing language
39
+
40
+ 2. **Create book** — When you have enough info, call the sub_agent tool with agent="architect":
41
+ - Include all collected info in the instruction
42
+ - The architect will generate the complete foundation
43
+
44
+ ## Style
45
+
46
+ - Ask one question at a time
47
+ - Offer 2-3 concrete options when the user is vague
48
+ - Proactively suggest creating the book when enough info is collected
49
+ - Keep responses brief and natural
50
+ - **Do NOT use emoji in your responses**`;
51
+ }
52
+ return isZh
53
+ ? `你是 InkOS 写作助手,当前正在处理书籍「${bookId}」。
54
+
55
+ ## 可用工具
56
+
57
+ - **sub_agent** — 委托子智能体执行重操作:
58
+ - agent="writer" 写下一章
59
+ - agent="auditor" 审计章节质量
60
+ - agent="reviser" 修订章节
61
+ - agent="exporter" 导出书籍
62
+ - **read** — 读取书籍的设定文件或章节内容
63
+ - **edit** — 编辑设定文件(如修改角色名、调整世界观)
64
+ - **grep** — 搜索内容(如"哪一章提到了某个角色")
65
+ - **ls** — 列出文件或章节
66
+
67
+ ## 使用原则
68
+
69
+ - 写章节、修订、审计等重操作 → 使用 sub_agent 委托对应子智能体
70
+ - 用户问设定相关问题 → 先用 read 读取对应文件再回答
71
+ - 用户想做小修改(改名字、调设定)→ 用 edit 直接修改
72
+ - 其他情况 → 直接对话回答
73
+ - **注意:不要调用 architect,当前已有书籍,不需要建书**
74
+ - **不要在回复中添加表情符号**`
75
+ : `You are the InkOS writing assistant, working on book "${bookId}".
76
+
77
+ ## Available Tools
78
+
79
+ - **sub_agent** — Delegate to sub-agents:
80
+ - agent="writer" for writing next chapter
81
+ - agent="auditor" for chapter quality audit
82
+ - agent="reviser" for chapter revision
83
+ - agent="exporter" for book export
84
+ - **read** — Read truth files or chapter content
85
+ - **edit** — Edit truth files (rename characters, adjust world settings)
86
+ - **grep** — Search content across chapters
87
+ - **ls** — List files or chapters
88
+
89
+ ## Guidelines
90
+
91
+ - Use sub_agent for heavy operations (writing, revision, auditing)
92
+ - Use read/edit for settings inquiries and small changes
93
+ - Chat directly for other questions
94
+ - **Do NOT call architect — a book already exists**
95
+ - **Do NOT use emoji in your responses**`;
96
+ }
97
+ //# sourceMappingURL=agent-system-prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-system-prompt.js","sourceRoot":"","sources":["../../src/agent/agent-system-prompt.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,sBAAsB,CAAC,MAAqB,EAAE,QAAgB;IAC5E,MAAM,IAAI,GAAG,QAAQ,KAAK,IAAI,CAAC;IAE/B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,IAAI;YACT,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;;;mBAsBW;YACb,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;;;yCAsBiC,CAAC;IACxC,CAAC;IAED,OAAO,IAAI;QACT,CAAC,CAAC,0BAA0B,MAAM;;;;;;;;;;;;;;;;;;;;;mBAqBnB;QACf,CAAC,CAAC,yDAAyD,MAAM;;;;;;;;;;;;;;;;;;;;yCAoB5B,CAAC;AAC1C,CAAC"}
@@ -0,0 +1,30 @@
1
+ import type { AgentTool } from "@mariozechner/pi-agent-core";
2
+ import type { PipelineRunner } from "../pipeline/runner.js";
3
+ declare const SubAgentParams: import("@sinclair/typebox").TObject<{
4
+ agent: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"architect">, import("@sinclair/typebox").TLiteral<"writer">, import("@sinclair/typebox").TLiteral<"auditor">, import("@sinclair/typebox").TLiteral<"reviser">, import("@sinclair/typebox").TLiteral<"exporter">]>;
5
+ instruction: import("@sinclair/typebox").TString;
6
+ bookId: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
7
+ }>;
8
+ export declare function createSubAgentTool(pipeline: PipelineRunner, activeBookId: string | null): AgentTool<typeof SubAgentParams>;
9
+ declare const ReadParams: import("@sinclair/typebox").TObject<{
10
+ path: import("@sinclair/typebox").TString;
11
+ }>;
12
+ export declare function createReadTool(projectRoot: string): AgentTool<typeof ReadParams>;
13
+ declare const EditParams: import("@sinclair/typebox").TObject<{
14
+ path: import("@sinclair/typebox").TString;
15
+ old_string: import("@sinclair/typebox").TString;
16
+ new_string: import("@sinclair/typebox").TString;
17
+ }>;
18
+ export declare function createEditTool(projectRoot: string): AgentTool<typeof EditParams>;
19
+ declare const GrepParams: import("@sinclair/typebox").TObject<{
20
+ bookId: import("@sinclair/typebox").TString;
21
+ pattern: import("@sinclair/typebox").TString;
22
+ }>;
23
+ export declare function createGrepTool(projectRoot: string): AgentTool<typeof GrepParams>;
24
+ declare const LsParams: import("@sinclair/typebox").TObject<{
25
+ bookId: import("@sinclair/typebox").TString;
26
+ subdir: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
27
+ }>;
28
+ export declare function createLsTool(projectRoot: string): AgentTool<typeof LsParams>;
29
+ export {};
30
+ //# sourceMappingURL=agent-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-tools.d.ts","sourceRoot":"","sources":["../../src/agent/agent-tools.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAA4C,MAAM,6BAA6B,CAAC;AACvG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AA6B5D,QAAA,MAAM,cAAc;;;;EAUlB,CAAC;AAEH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,OAAO,cAAc,CAAC,CA0F1H;AAMD,QAAA,MAAM,UAAU;;EAEd,CAAC;AAEH,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC,OAAO,UAAU,CAAC,CAwBhF;AAMD,QAAA,MAAM,UAAU;;;;EAId,CAAC;AAEH,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC,OAAO,UAAU,CAAC,CAgChF;AAMD,QAAA,MAAM,UAAU;;;EAGd,CAAC;AAEH,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC,OAAO,UAAU,CAAC,CA8DhF;AAMD,QAAA,MAAM,QAAQ;;;EAKZ,CAAC;AAEH,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC,OAAO,QAAQ,CAAC,CAwC5E"}