@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.
Files changed (69) hide show
  1. package/dist/agents/base.d.ts +4 -4
  2. package/dist/agents/base.d.ts.map +1 -1
  3. package/dist/agents/base.js +52 -9
  4. package/dist/agents/base.js.map +1 -1
  5. package/dist/agents/consolidator.d.ts +23 -0
  6. package/dist/agents/consolidator.d.ts.map +1 -0
  7. package/dist/agents/consolidator.js +132 -0
  8. package/dist/agents/consolidator.js.map +1 -0
  9. package/dist/agents/continuity.d.ts.map +1 -1
  10. package/dist/agents/continuity.js +17 -9
  11. package/dist/agents/continuity.js.map +1 -1
  12. package/dist/agents/observer-prompts.d.ts +10 -0
  13. package/dist/agents/observer-prompts.d.ts.map +1 -0
  14. package/dist/agents/observer-prompts.js +113 -0
  15. package/dist/agents/observer-prompts.js.map +1 -0
  16. package/dist/agents/settler-prompts.d.ts +1 -0
  17. package/dist/agents/settler-prompts.d.ts.map +1 -1
  18. package/dist/agents/settler-prompts.js +4 -1
  19. package/dist/agents/settler-prompts.js.map +1 -1
  20. package/dist/agents/state-validator.d.ts +21 -0
  21. package/dist/agents/state-validator.d.ts.map +1 -0
  22. package/dist/agents/state-validator.js +100 -0
  23. package/dist/agents/state-validator.js.map +1 -0
  24. package/dist/agents/writer.d.ts.map +1 -1
  25. package/dist/agents/writer.js +45 -12
  26. package/dist/agents/writer.js.map +1 -1
  27. package/dist/index.d.ts +6 -1
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/index.js +6 -1
  30. package/dist/index.js.map +1 -1
  31. package/dist/llm/provider.d.ts +1 -0
  32. package/dist/llm/provider.d.ts.map +1 -1
  33. package/dist/llm/provider.js +14 -8
  34. package/dist/llm/provider.js.map +1 -1
  35. package/dist/models/project.d.ts +8 -0
  36. package/dist/models/project.d.ts.map +1 -1
  37. package/dist/models/project.js +1 -0
  38. package/dist/models/project.js.map +1 -1
  39. package/dist/pipeline/runner.d.ts +1 -0
  40. package/dist/pipeline/runner.d.ts.map +1 -1
  41. package/dist/pipeline/runner.js +70 -38
  42. package/dist/pipeline/runner.js.map +1 -1
  43. package/dist/pipeline/scheduler.d.ts +4 -0
  44. package/dist/pipeline/scheduler.d.ts.map +1 -1
  45. package/dist/pipeline/scheduler.js +31 -3
  46. package/dist/pipeline/scheduler.js.map +1 -1
  47. package/dist/state/manager.d.ts.map +1 -1
  48. package/dist/state/manager.js +19 -8
  49. package/dist/state/manager.js.map +1 -1
  50. package/dist/state/memory-db.d.ts +60 -0
  51. package/dist/state/memory-db.d.ts.map +1 -0
  52. package/dist/state/memory-db.js +129 -0
  53. package/dist/state/memory-db.js.map +1 -0
  54. package/dist/utils/config-loader.d.ts.map +1 -1
  55. package/dist/utils/config-loader.js +27 -0
  56. package/dist/utils/config-loader.js.map +1 -1
  57. package/dist/utils/context-filter.d.ts +20 -0
  58. package/dist/utils/context-filter.d.ts.map +1 -0
  59. package/dist/utils/context-filter.js +133 -0
  60. package/dist/utils/context-filter.js.map +1 -0
  61. package/dist/utils/pov-filter.d.ts +30 -0
  62. package/dist/utils/pov-filter.d.ts.map +1 -0
  63. package/dist/utils/pov-filter.js +129 -0
  64. package/dist/utils/pov-filter.js.map +1 -0
  65. package/dist/utils/web-search.d.ts +14 -4
  66. package/dist/utils/web-search.d.ts.map +1 -1
  67. package/dist/utils/web-search.js +36 -5
  68. package/dist/utils/web-search.js.map +1 -1
  69. 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
- * URL fetch utility for agent loop.
2
+ * Web search + URL fetch utilities.
3
3
  *
4
- * Web search is handled natively by the LLM provider (OpenAI web_search_preview
5
- * or web_search_options). This module only provides URL fetching for cases where
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;;;;;;GAMG;AAEH;;;GAGG;AACH,wBAAsB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,SAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CA4B5E"}
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"}
@@ -1,10 +1,42 @@
1
1
  /**
2
- * URL fetch utility for agent loop.
2
+ * Web search + URL fetch utilities.
3
3
  *
4
- * Web search is handled natively by the LLM provider (OpenAI web_search_preview
5
- * or web_search_options). This module only provides URL fetching for cases where
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;;;;;;GAMG;AAEH;;;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,8CAA8C;IAC9C,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"}
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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@actalk/inkos-core",
3
- "version": "0.5.0",
3
+ "version": "0.5.1",
4
4
  "description": "InkOS core: models, agents, pipeline, LLM integration",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",