@actalk/inkos-core 0.5.0 → 0.5.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/agents/base.d.ts +4 -4
- package/dist/agents/base.d.ts.map +1 -1
- package/dist/agents/base.js +52 -9
- package/dist/agents/base.js.map +1 -1
- package/dist/agents/consolidator.d.ts +23 -0
- package/dist/agents/consolidator.d.ts.map +1 -0
- package/dist/agents/consolidator.js +132 -0
- package/dist/agents/consolidator.js.map +1 -0
- package/dist/agents/continuity.d.ts.map +1 -1
- package/dist/agents/continuity.js +17 -9
- package/dist/agents/continuity.js.map +1 -1
- package/dist/agents/observer-prompts.d.ts +10 -0
- package/dist/agents/observer-prompts.d.ts.map +1 -0
- package/dist/agents/observer-prompts.js +113 -0
- package/dist/agents/observer-prompts.js.map +1 -0
- package/dist/agents/settler-prompts.d.ts +1 -0
- package/dist/agents/settler-prompts.d.ts.map +1 -1
- package/dist/agents/settler-prompts.js +4 -1
- package/dist/agents/settler-prompts.js.map +1 -1
- package/dist/agents/state-validator.d.ts +21 -0
- package/dist/agents/state-validator.d.ts.map +1 -0
- package/dist/agents/state-validator.js +100 -0
- package/dist/agents/state-validator.js.map +1 -0
- package/dist/agents/writer.d.ts.map +1 -1
- package/dist/agents/writer.js +45 -12
- package/dist/agents/writer.js.map +1 -1
- package/dist/index.d.ts +6 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -1
- package/dist/index.js.map +1 -1
- package/dist/llm/provider.d.ts +1 -0
- package/dist/llm/provider.d.ts.map +1 -1
- package/dist/llm/provider.js +14 -8
- package/dist/llm/provider.js.map +1 -1
- 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/runner.d.ts +1 -0
- package/dist/pipeline/runner.d.ts.map +1 -1
- package/dist/pipeline/runner.js +70 -38
- package/dist/pipeline/runner.js.map +1 -1
- package/dist/pipeline/scheduler.d.ts +4 -0
- package/dist/pipeline/scheduler.d.ts.map +1 -1
- package/dist/pipeline/scheduler.js +31 -3
- package/dist/pipeline/scheduler.js.map +1 -1
- package/dist/state/manager.d.ts.map +1 -1
- package/dist/state/manager.js +19 -8
- package/dist/state/manager.js.map +1 -1
- package/dist/state/memory-db.d.ts +60 -0
- package/dist/state/memory-db.d.ts.map +1 -0
- package/dist/state/memory-db.js +129 -0
- package/dist/state/memory-db.js.map +1 -0
- package/dist/utils/config-loader.d.ts.map +1 -1
- package/dist/utils/config-loader.js +27 -0
- package/dist/utils/config-loader.js.map +1 -1
- package/dist/utils/context-filter.d.ts +20 -0
- package/dist/utils/context-filter.d.ts.map +1 -0
- package/dist/utils/context-filter.js +133 -0
- package/dist/utils/context-filter.js.map +1 -0
- package/dist/utils/pov-filter.d.ts +30 -0
- package/dist/utils/pov-filter.d.ts.map +1 -0
- package/dist/utils/pov-filter.js +129 -0
- package/dist/utils/pov-filter.js.map +1 -0
- package/dist/utils/web-search.d.ts +14 -4
- package/dist/utils/web-search.d.ts.map +1 -1
- package/dist/utils/web-search.js +36 -5
- package/dist/utils/web-search.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* POV-aware context filtering.
|
|
3
|
+
*
|
|
4
|
+
* Filters truth file content based on the current POV character's
|
|
5
|
+
* information boundaries. Characters should only "see" information
|
|
6
|
+
* they've actually witnessed or been told about.
|
|
7
|
+
*
|
|
8
|
+
* Works with markdown-based truth files (no DB dependency).
|
|
9
|
+
* When MemoryDB is available, can do more precise queries.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Extract the POV character from the volume outline for a given chapter.
|
|
13
|
+
* Looks for patterns like "POV: 角色名" or "视角: 角色名" or "POV: CharacterName"
|
|
14
|
+
* in the chapter's section of the outline.
|
|
15
|
+
*/
|
|
16
|
+
export function extractPOVFromOutline(volumeOutline, chapterNumber) {
|
|
17
|
+
// Find the section for this chapter
|
|
18
|
+
const lines = volumeOutline.split("\n");
|
|
19
|
+
// Look for chapter reference near the chapter number
|
|
20
|
+
const chapterPatterns = [
|
|
21
|
+
new RegExp(`第${chapterNumber}章`),
|
|
22
|
+
new RegExp(`Chapter\\s+${chapterNumber}\\b`),
|
|
23
|
+
new RegExp(`\\b${chapterNumber}\\b.*章`),
|
|
24
|
+
];
|
|
25
|
+
let inChapterSection = false;
|
|
26
|
+
for (const line of lines) {
|
|
27
|
+
// Check if we're in the right chapter section
|
|
28
|
+
if (chapterPatterns.some((p) => p.test(line))) {
|
|
29
|
+
inChapterSection = true;
|
|
30
|
+
}
|
|
31
|
+
else if (inChapterSection && /^[#-]/.test(line) && !line.includes(String(chapterNumber))) {
|
|
32
|
+
// Left the chapter section
|
|
33
|
+
break;
|
|
34
|
+
}
|
|
35
|
+
if (inChapterSection) {
|
|
36
|
+
// Look for POV declaration
|
|
37
|
+
const povMatch = line.match(/(?:POV|视角|pov)[::\s]+([^\s,,。.、]+)/i);
|
|
38
|
+
if (povMatch)
|
|
39
|
+
return povMatch[1];
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Filter character_matrix information boundaries for the POV character.
|
|
46
|
+
* Returns only what the POV character knows — strips other characters' "known info".
|
|
47
|
+
*/
|
|
48
|
+
export function filterMatrixByPOV(characterMatrix, povCharacter) {
|
|
49
|
+
if (!characterMatrix || characterMatrix === "(文件尚未创建)")
|
|
50
|
+
return characterMatrix;
|
|
51
|
+
if (!povCharacter)
|
|
52
|
+
return characterMatrix;
|
|
53
|
+
// Find the 信息边界 / Information Boundaries section
|
|
54
|
+
const sections = characterMatrix.split(/(?=^###)/m);
|
|
55
|
+
const filtered = sections.map((section) => {
|
|
56
|
+
const isInfoBoundary = /信息边界|Information\s+Boundar/i.test(section);
|
|
57
|
+
if (!isInfoBoundary)
|
|
58
|
+
return section;
|
|
59
|
+
// In the info boundary table, keep only the POV character's row
|
|
60
|
+
// and add a note about what other characters know
|
|
61
|
+
const lines = section.split("\n");
|
|
62
|
+
const headerLines = lines.filter((l) => l.startsWith("|") && (l.includes("---") || l.includes("角色") || l.includes("Character") || l.includes("已知") || l.includes("Known")));
|
|
63
|
+
const dataLines = lines.filter((l) => l.startsWith("|") && !l.includes("---") && !l.includes("角色") && !l.includes("Character") && !l.includes("已知") && !l.includes("Known"));
|
|
64
|
+
// Keep POV character's row + a summary note
|
|
65
|
+
const povRows = dataLines.filter((l) => l.includes(povCharacter));
|
|
66
|
+
const otherCharCount = dataLines.length - povRows.length;
|
|
67
|
+
const sectionHeader = lines.find((l) => l.startsWith("###"));
|
|
68
|
+
const result = [
|
|
69
|
+
sectionHeader ?? "### 信息边界",
|
|
70
|
+
`(当前视角:${povCharacter},其他 ${otherCharCount} 个角色的信息边界已隐藏)`,
|
|
71
|
+
...headerLines,
|
|
72
|
+
...povRows,
|
|
73
|
+
];
|
|
74
|
+
return result.join("\n");
|
|
75
|
+
});
|
|
76
|
+
return filtered.join("\n");
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Filter pending_hooks by POV character's knowledge.
|
|
80
|
+
* Hooks planted in scenes where the POV character was NOT present are hidden.
|
|
81
|
+
*
|
|
82
|
+
* This is a heuristic: if the hook's chapter summary mentions the POV character,
|
|
83
|
+
* they likely know about it.
|
|
84
|
+
*/
|
|
85
|
+
export function filterHooksByPOV(hooks, povCharacter, chapterSummaries) {
|
|
86
|
+
if (!hooks || hooks === "(文件尚未创建)")
|
|
87
|
+
return hooks;
|
|
88
|
+
if (!povCharacter)
|
|
89
|
+
return hooks;
|
|
90
|
+
const lines = hooks.split("\n");
|
|
91
|
+
const headerLines = lines.filter((l) => l.startsWith("|") && (l.includes("hook_id") || l.includes("---")));
|
|
92
|
+
const dataLines = lines.filter((l) => l.startsWith("|") && !l.includes("hook_id") && !l.includes("---"));
|
|
93
|
+
// Parse summary rows to find which chapters the POV character appeared in
|
|
94
|
+
const povChapters = new Set();
|
|
95
|
+
if (chapterSummaries) {
|
|
96
|
+
for (const line of chapterSummaries.split("\n")) {
|
|
97
|
+
if (line.includes(povCharacter)) {
|
|
98
|
+
const match = line.match(/\|\s*(\d+)\s*\|/);
|
|
99
|
+
if (match)
|
|
100
|
+
povChapters.add(parseInt(match[1], 10));
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
// Keep hooks where:
|
|
105
|
+
// 1. The POV character was present in the source chapter, OR
|
|
106
|
+
// 2. The hook mentions the POV character directly, OR
|
|
107
|
+
// 3. We can't determine (keep to be safe)
|
|
108
|
+
const filtered = dataLines.filter((row) => {
|
|
109
|
+
// If hook directly mentions POV character, keep it
|
|
110
|
+
if (row.includes(povCharacter))
|
|
111
|
+
return true;
|
|
112
|
+
// Extract source chapter from hook row
|
|
113
|
+
const chapterMatch = row.match(/\|\s*(\d+)\s*\|/);
|
|
114
|
+
if (!chapterMatch)
|
|
115
|
+
return true; // can't determine, keep
|
|
116
|
+
const sourceChapter = parseInt(chapterMatch[1], 10);
|
|
117
|
+
// If POV was in that chapter, they know about the hook
|
|
118
|
+
if (povChapters.has(sourceChapter))
|
|
119
|
+
return true;
|
|
120
|
+
// POV wasn't in that chapter — hide this hook
|
|
121
|
+
return false;
|
|
122
|
+
});
|
|
123
|
+
// Fallback: if filtering removes everything, return original
|
|
124
|
+
if (filtered.length === 0 && dataLines.length > 0)
|
|
125
|
+
return hooks;
|
|
126
|
+
const nonTableLines = lines.filter((l) => !l.startsWith("|"));
|
|
127
|
+
return [...nonTableLines, ...headerLines, ...filtered].join("\n");
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=pov-filter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pov-filter.js","sourceRoot":"","sources":["../../src/utils/pov-filter.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,20 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Web search + URL fetch utilities.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* the agent loop needs to read a specific page.
|
|
4
|
+
* searchWeb(): Tavily API search (requires TAVILY_API_KEY env var).
|
|
5
|
+
* fetchUrl(): Fetch a specific URL and return plain text.
|
|
7
6
|
*/
|
|
7
|
+
export interface SearchResult {
|
|
8
|
+
readonly title: string;
|
|
9
|
+
readonly url: string;
|
|
10
|
+
readonly snippet: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Search the web via Tavily API.
|
|
14
|
+
* Requires TAVILY_API_KEY environment variable.
|
|
15
|
+
* Throws if key is not set — caller should catch and fall back to regular chat.
|
|
16
|
+
*/
|
|
17
|
+
export declare function searchWeb(query: string, maxResults?: number): Promise<ReadonlyArray<SearchResult>>;
|
|
8
18
|
/**
|
|
9
19
|
* Fetch a URL and return its text content.
|
|
10
20
|
* HTML is stripped to plain text. Output is truncated to maxChars.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web-search.d.ts","sourceRoot":"","sources":["../../src/utils/web-search.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"web-search.d.ts","sourceRoot":"","sources":["../../src/utils/web-search.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED;;;;GAIG;AACH,wBAAsB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,SAAI,GAAG,OAAO,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,CA8BnG;AAED;;;GAGG;AACH,wBAAsB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,SAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CA2B5E"}
|
package/dist/utils/web-search.js
CHANGED
|
@@ -1,10 +1,42 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Web search + URL fetch utilities.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* the agent loop needs to read a specific page.
|
|
4
|
+
* searchWeb(): Tavily API search (requires TAVILY_API_KEY env var).
|
|
5
|
+
* fetchUrl(): Fetch a specific URL and return plain text.
|
|
7
6
|
*/
|
|
7
|
+
/**
|
|
8
|
+
* Search the web via Tavily API.
|
|
9
|
+
* Requires TAVILY_API_KEY environment variable.
|
|
10
|
+
* Throws if key is not set — caller should catch and fall back to regular chat.
|
|
11
|
+
*/
|
|
12
|
+
export async function searchWeb(query, maxResults = 5) {
|
|
13
|
+
const apiKey = process.env.TAVILY_API_KEY;
|
|
14
|
+
if (!apiKey) {
|
|
15
|
+
throw new Error("TAVILY_API_KEY not set. Set this env var to enable web search, or use OpenAI which has native search.");
|
|
16
|
+
}
|
|
17
|
+
const res = await fetch("https://api.tavily.com/search", {
|
|
18
|
+
method: "POST",
|
|
19
|
+
headers: {
|
|
20
|
+
"Content-Type": "application/json",
|
|
21
|
+
},
|
|
22
|
+
body: JSON.stringify({
|
|
23
|
+
api_key: apiKey,
|
|
24
|
+
query,
|
|
25
|
+
max_results: maxResults,
|
|
26
|
+
search_depth: "basic",
|
|
27
|
+
}),
|
|
28
|
+
signal: AbortSignal.timeout(15000),
|
|
29
|
+
});
|
|
30
|
+
if (!res.ok) {
|
|
31
|
+
throw new Error(`Tavily search failed: ${res.status} ${await res.text().catch(() => "")}`);
|
|
32
|
+
}
|
|
33
|
+
const data = await res.json();
|
|
34
|
+
return (data.results ?? []).map((r) => ({
|
|
35
|
+
title: r.title ?? "",
|
|
36
|
+
url: r.url ?? "",
|
|
37
|
+
snippet: r.content ?? "",
|
|
38
|
+
}));
|
|
39
|
+
}
|
|
8
40
|
/**
|
|
9
41
|
* Fetch a URL and return its text content.
|
|
10
42
|
* HTML is stripped to plain text. Output is truncated to maxChars.
|
|
@@ -22,7 +54,6 @@ export async function fetchUrl(url, maxChars = 8000) {
|
|
|
22
54
|
}
|
|
23
55
|
const contentType = res.headers.get("content-type") ?? "";
|
|
24
56
|
const text = await res.text();
|
|
25
|
-
// If HTML, strip tags and collapse whitespace
|
|
26
57
|
if (contentType.includes("html")) {
|
|
27
58
|
return text
|
|
28
59
|
.replace(/<script[\s\S]*?<\/script>/gi, "")
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web-search.js","sourceRoot":"","sources":["../../src/utils/web-search.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"web-search.js","sourceRoot":"","sources":["../../src/utils/web-search.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,KAAa,EAAE,UAAU,GAAG,CAAC;IAC3D,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IAC1C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,uGAAuG,CAAC,CAAC;IAC3H,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,+BAA+B,EAAE;QACvD,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;SACnC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,OAAO,EAAE,MAAM;YACf,KAAK;YACL,WAAW,EAAE,UAAU;YACvB,YAAY,EAAE,OAAO;SACtB,CAAC;QACF,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC;KACnC,CAAC,CAAC;IAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,yBAAyB,GAAG,CAAC,MAAM,IAAI,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAC7F,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAA6E,CAAC;IACzG,OAAO,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACtC,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,EAAE;QACpB,GAAG,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE;QAChB,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,EAAE;KACzB,CAAC,CAAC,CAAC;AACN,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,GAAW,EAAE,QAAQ,GAAG,IAAI;IACzD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAC3B,OAAO,EAAE;YACP,YAAY,EAAE,oEAAoE;YAClF,QAAQ,EAAE,yCAAyC;SACpD;QACD,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC;KACnC,CAAC,CAAC;IAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,iBAAiB,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;IACnE,CAAC;IAED,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;IAC1D,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;IAE9B,IAAI,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACjC,OAAO,IAAI;aACR,OAAO,CAAC,6BAA6B,EAAE,EAAE,CAAC;aAC1C,OAAO,CAAC,2BAA2B,EAAE,EAAE,CAAC;aACxC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC;aACxB,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;aACpB,IAAI,EAAE;aACN,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IACxB,CAAC;IAED,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;AACjC,CAAC"}
|