kimi-code-memory-mcp-server 0.1.0

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 (74) hide show
  1. package/AGENTS.md +144 -0
  2. package/CHANGELOG.md +26 -0
  3. package/LICENSE +21 -0
  4. package/README.md +227 -0
  5. package/README.zh-CN.md +227 -0
  6. package/dist/config.d.ts +36 -0
  7. package/dist/config.js +63 -0
  8. package/dist/config.js.map +1 -0
  9. package/dist/context/wire-context.d.ts +171 -0
  10. package/dist/context/wire-context.js +586 -0
  11. package/dist/context/wire-context.js.map +1 -0
  12. package/dist/dao/index.d.ts +76 -0
  13. package/dist/dao/index.js +490 -0
  14. package/dist/dao/index.js.map +1 -0
  15. package/dist/dao/memory-store.d.ts +24 -0
  16. package/dist/dao/memory-store.js +112 -0
  17. package/dist/dao/memory-store.js.map +1 -0
  18. package/dist/refined-manager.d.ts +70 -0
  19. package/dist/refined-manager.js +369 -0
  20. package/dist/refined-manager.js.map +1 -0
  21. package/dist/server.d.ts +8 -0
  22. package/dist/server.js +71 -0
  23. package/dist/server.js.map +1 -0
  24. package/dist/theme-manager.d.ts +40 -0
  25. package/dist/theme-manager.js +88 -0
  26. package/dist/theme-manager.js.map +1 -0
  27. package/dist/tools/context-tools.d.ts +56 -0
  28. package/dist/tools/context-tools.js +332 -0
  29. package/dist/tools/context-tools.js.map +1 -0
  30. package/dist/tools/index.d.ts +835 -0
  31. package/dist/tools/index.js +370 -0
  32. package/dist/tools/index.js.map +1 -0
  33. package/dist/tools/memory-tools.d.ts +62 -0
  34. package/dist/tools/memory-tools.js +292 -0
  35. package/dist/tools/memory-tools.js.map +1 -0
  36. package/dist/tools/system-tools.d.ts +37 -0
  37. package/dist/tools/system-tools.js +195 -0
  38. package/dist/tools/system-tools.js.map +1 -0
  39. package/dist/tools/theme-tools.d.ts +34 -0
  40. package/dist/tools/theme-tools.js +186 -0
  41. package/dist/tools/theme-tools.js.map +1 -0
  42. package/dist/types.d.ts +93 -0
  43. package/dist/types.js +5 -0
  44. package/dist/types.js.map +1 -0
  45. package/dist/utils/frontmatter.d.ts +10 -0
  46. package/dist/utils/frontmatter.js +61 -0
  47. package/dist/utils/frontmatter.js.map +1 -0
  48. package/dist/utils/mutex.d.ts +11 -0
  49. package/dist/utils/mutex.js +17 -0
  50. package/dist/utils/mutex.js.map +1 -0
  51. package/dist/utils/paths.d.ts +19 -0
  52. package/dist/utils/paths.js +54 -0
  53. package/dist/utils/paths.js.map +1 -0
  54. package/dist/utils/validation.d.ts +15 -0
  55. package/dist/utils/validation.js +40 -0
  56. package/dist/utils/validation.js.map +1 -0
  57. package/dist/version.d.ts +9 -0
  58. package/dist/version.js +10 -0
  59. package/dist/version.js.map +1 -0
  60. package/docs/ARCHITECTURE.md +144 -0
  61. package/docs/CONTRIBUTING.md +83 -0
  62. package/docs/CONTRIBUTING.zh-CN.md +83 -0
  63. package/docs/search-logic.md +157 -0
  64. package/docs/search-logic.zh-CN.md +157 -0
  65. package/examples/README.md +34 -0
  66. package/examples/sample-workspace/essence/essence.md +26 -0
  67. package/examples/sample-workspace/index.json +36 -0
  68. package/examples/sample-workspace/memory/decisions/sample-decision.md +30 -0
  69. package/examples/sample-workspace/memory/knowledge/sample-knowledge.md +24 -0
  70. package/examples/sample-workspace/memory/reference/sample-reference.md +20 -0
  71. package/examples/sample-workspace/memory/rules/sample-rule.md +31 -0
  72. package/examples/sample-workspace/themes/cache-design.json +15 -0
  73. package/package.json +72 -0
  74. package/skills/memory-manage/SKILL.md +43 -0
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Theme association storage (theme -> turns / memories).
3
+ */
4
+ export interface ThemeTurnRef {
5
+ sessionId: string;
6
+ turnId: number;
7
+ timestamp: string;
8
+ }
9
+ export interface ThemeMemoryRef {
10
+ key: string;
11
+ folder: string;
12
+ title: string;
13
+ timestamp: string;
14
+ }
15
+ export interface ThemeAssociation {
16
+ theme: string;
17
+ displayName: string;
18
+ createdAt: string;
19
+ updatedAt: string;
20
+ turns: ThemeTurnRef[];
21
+ memories: ThemeMemoryRef[];
22
+ }
23
+ export interface ThemeRefInput {
24
+ sessionId?: string;
25
+ turnId?: number;
26
+ timestamp?: string;
27
+ memoryKey?: string;
28
+ folder?: string;
29
+ title?: string;
30
+ }
31
+ export declare class ThemeManager {
32
+ themesRoot: string;
33
+ private mutex;
34
+ constructor(themesRoot: string);
35
+ themeFilePath(theme: string): string;
36
+ loadTheme(theme: string): ThemeAssociation | null;
37
+ saveTheme(theme: string, association: ThemeAssociation): void;
38
+ listThemes(): string[];
39
+ addThemeAssociation(theme: string, ref: ThemeRefInput): Promise<void>;
40
+ }
@@ -0,0 +1,88 @@
1
+ /**
2
+ * Theme association storage (theme -> turns / memories).
3
+ */
4
+ import fs from 'fs';
5
+ import path from 'path';
6
+ import { sanitizeKey, toTitle } from './utils/validation.js';
7
+ import { Mutex } from './utils/mutex.js';
8
+ export class ThemeManager {
9
+ themesRoot;
10
+ mutex;
11
+ constructor(themesRoot) {
12
+ this.themesRoot = themesRoot;
13
+ this.mutex = new Mutex();
14
+ }
15
+ themeFilePath(theme) {
16
+ return path.join(this.themesRoot, `${sanitizeKey(theme)}.json`);
17
+ }
18
+ loadTheme(theme) {
19
+ const filePath = this.themeFilePath(theme);
20
+ if (!fs.existsSync(filePath))
21
+ return null;
22
+ try {
23
+ return JSON.parse(fs.readFileSync(filePath, 'utf8'));
24
+ }
25
+ catch {
26
+ return null;
27
+ }
28
+ }
29
+ saveTheme(theme, association) {
30
+ const filePath = this.themeFilePath(theme);
31
+ fs.mkdirSync(path.dirname(filePath), { recursive: true });
32
+ const tmpPath = filePath + '.tmp';
33
+ fs.writeFileSync(tmpPath, JSON.stringify(association, null, 2), 'utf8');
34
+ fs.renameSync(tmpPath, filePath);
35
+ }
36
+ listThemes() {
37
+ if (!fs.existsSync(this.themesRoot))
38
+ return [];
39
+ return fs
40
+ .readdirSync(this.themesRoot)
41
+ .filter((name) => name.endsWith('.json'))
42
+ .map((name) => path.basename(name, '.json'))
43
+ .sort();
44
+ }
45
+ async addThemeAssociation(theme, ref) {
46
+ return this.mutex.runExclusive(() => {
47
+ const safeTheme = sanitizeKey(theme);
48
+ let association = this.loadTheme(safeTheme);
49
+ const now = new Date().toISOString();
50
+ if (!association) {
51
+ association = {
52
+ theme: safeTheme,
53
+ displayName: theme,
54
+ createdAt: now,
55
+ updatedAt: now,
56
+ turns: [],
57
+ memories: [],
58
+ };
59
+ }
60
+ if (ref.sessionId !== undefined && ref.turnId !== undefined) {
61
+ const exists = association.turns.some((t) => t.sessionId === ref.sessionId && t.turnId === ref.turnId);
62
+ if (!exists) {
63
+ association.turns.push({
64
+ sessionId: ref.sessionId,
65
+ turnId: ref.turnId,
66
+ timestamp: ref.timestamp || now,
67
+ });
68
+ association.updatedAt = now;
69
+ }
70
+ }
71
+ if (ref.memoryKey && ref.folder) {
72
+ const memId = `${ref.folder}/${ref.memoryKey}`;
73
+ const exists = association.memories.some((m) => `${m.folder}/${m.key}` === memId);
74
+ if (!exists) {
75
+ association.memories.push({
76
+ key: ref.memoryKey,
77
+ folder: ref.folder,
78
+ title: ref.title || toTitle(ref.memoryKey),
79
+ timestamp: ref.timestamp || now,
80
+ });
81
+ association.updatedAt = now;
82
+ }
83
+ }
84
+ this.saveTheme(safeTheme, association);
85
+ });
86
+ }
87
+ }
88
+ //# sourceMappingURL=theme-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme-manager.js","sourceRoot":"","sources":["../src/theme-manager.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAiCzC,MAAM,OAAO,YAAY;IACvB,UAAU,CAAS;IACX,KAAK,CAAQ;IAErB,YAAY,UAAkB;QAC5B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC;IAC3B,CAAC;IAED,aAAa,CAAC,KAAa;QACzB,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAClE,CAAC;IAED,SAAS,CAAC,KAAa;QACrB,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC3C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;YAAE,OAAO,IAAI,CAAC;QAC1C,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAqB,CAAC;QAC3E,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,SAAS,CAAC,KAAa,EAAE,WAA6B;QACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC3C,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,MAAM,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;QAClC,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QACxE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACnC,CAAC;IAED,UAAU;QACR,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC;YAAE,OAAO,EAAE,CAAC;QAC/C,OAAO,EAAE;aACN,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC;aAC5B,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;aACxC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;aAC3C,IAAI,EAAE,CAAC;IACZ,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,KAAa,EAAE,GAAkB;QACzD,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,EAAE;YAClC,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;YACrC,IAAI,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YAC5C,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YACrC,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,WAAW,GAAG;oBACZ,KAAK,EAAE,SAAS;oBAChB,WAAW,EAAE,KAAK;oBAClB,SAAS,EAAE,GAAG;oBACd,SAAS,EAAE,GAAG;oBACd,KAAK,EAAE,EAAE;oBACT,QAAQ,EAAE,EAAE;iBACb,CAAC;YACJ,CAAC;YAED,IAAI,GAAG,CAAC,SAAS,KAAK,SAAS,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBAC5D,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CACnC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,GAAG,CAAC,SAAS,IAAI,CAAC,CAAC,MAAM,KAAK,GAAG,CAAC,MAAM,CAChE,CAAC;gBACF,IAAI,CAAC,MAAM,EAAE,CAAC;oBACZ,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC;wBACrB,SAAS,EAAE,GAAG,CAAC,SAAS;wBACxB,MAAM,EAAE,GAAG,CAAC,MAAM;wBAClB,SAAS,EAAE,GAAG,CAAC,SAAS,IAAI,GAAG;qBAChC,CAAC,CAAC;oBACH,WAAW,CAAC,SAAS,GAAG,GAAG,CAAC;gBAC9B,CAAC;YACH,CAAC;YAED,IAAI,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;gBAChC,MAAM,KAAK,GAAG,GAAG,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;gBAC/C,MAAM,MAAM,GAAG,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,EAAE,KAAK,KAAK,CAAC,CAAC;gBAClF,IAAI,CAAC,MAAM,EAAE,CAAC;oBACZ,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC;wBACxB,GAAG,EAAE,GAAG,CAAC,SAAS;wBAClB,MAAM,EAAE,GAAG,CAAC,MAAM;wBAClB,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC;wBAC1C,SAAS,EAAE,GAAG,CAAC,SAAS,IAAI,GAAG;qBAChC,CAAC,CAAC;oBACH,WAAW,CAAC,SAAS,GAAG,GAAG,CAAC;gBAC9B,CAAC;YACH,CAAC;YAED,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Context recovery tools: load_workspace_context, load_more_context, search_context, load_turn_context.
3
+ */
4
+ import type { ListSearchViewsArgs, LoadMoreContextArgs, LoadTurnContextArgs, LoadWorkspaceContextArgs, SearchContextArgs } from '../types.js';
5
+ import type { Ctx } from '../types.js';
6
+ export declare function createContextTools(ctx: Ctx): {
7
+ buildWorkspaceContext: (args?: LoadWorkspaceContextArgs) => Promise<{
8
+ workspace: {
9
+ cwd: string;
10
+ workspaceId: string;
11
+ storePath: string;
12
+ };
13
+ recentContext: {
14
+ sessionId: string;
15
+ totalTurns: number;
16
+ detailedRounds: import("../context/wire-context.js").DetailedRound[];
17
+ summaryRounds: import("../context/wire-context.js").SummaryRound[];
18
+ compactionSummaries: import("../context/wire-context.js").CompactionSummary[];
19
+ } | null;
20
+ }>;
21
+ handleLoadWorkspaceContext: (args: LoadWorkspaceContextArgs) => Promise<{
22
+ content: {
23
+ type: string;
24
+ text: string;
25
+ }[];
26
+ isError: boolean;
27
+ }>;
28
+ handleLoadMoreContext: (args: LoadMoreContextArgs) => Promise<{
29
+ content: {
30
+ type: string;
31
+ text: string;
32
+ }[];
33
+ isError: boolean;
34
+ }>;
35
+ handleSearchContext: (args: SearchContextArgs) => Promise<{
36
+ content: {
37
+ type: string;
38
+ text: string;
39
+ }[];
40
+ isError: boolean;
41
+ }>;
42
+ handleListSearchViews: (args?: ListSearchViewsArgs) => {
43
+ content: {
44
+ type: string;
45
+ text: string;
46
+ }[];
47
+ isError: boolean;
48
+ };
49
+ handleLoadTurnContext: (args: LoadTurnContextArgs) => Promise<{
50
+ content: {
51
+ type: string;
52
+ text: string;
53
+ }[];
54
+ isError: boolean;
55
+ }>;
56
+ };
@@ -0,0 +1,332 @@
1
+ /**
2
+ * Context recovery tools: load_workspace_context, load_more_context, search_context, load_turn_context.
3
+ */
4
+ import { getCurrentSessionWirePath, findAllWorkspaceSessions, parseWireFile, buildContextWindow, loadMoreRounds, searchWireContext, loadTurnContext, } from '../context/wire-context.js';
5
+ import fs from 'fs';
6
+ import path from 'path';
7
+ import crypto from 'crypto';
8
+ import { DEFAULT_CLUSTER_GAP_SECONDS } from '../config.js';
9
+ function toolResult(data, isError = false) {
10
+ return {
11
+ content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
12
+ isError,
13
+ };
14
+ }
15
+ export function createContextTools(ctx) {
16
+ const { cwd, workspaceId, storeRoot, refinedManager } = ctx;
17
+ function getTurnTime(turn) {
18
+ return turn.timestamp ? new Date(turn.timestamp).getTime() : null;
19
+ }
20
+ function resolveClusterGapSeconds(args) {
21
+ if (typeof args.cluster_gap_seconds === 'number' && args.cluster_gap_seconds > 0) {
22
+ return args.cluster_gap_seconds;
23
+ }
24
+ return DEFAULT_CLUSTER_GAP_SECONDS;
25
+ }
26
+ function groupHitsIntoBlocks(hits) {
27
+ const sorted = [...hits].sort((a, b) => parseInt(a.turnId, 10) - parseInt(b.turnId, 10));
28
+ const blocks = [];
29
+ let current = [];
30
+ for (const hit of sorted) {
31
+ const turnId = parseInt(hit.turnId, 10);
32
+ if (current.length === 0 ||
33
+ turnId === parseInt(current[current.length - 1].turnId, 10) + 1) {
34
+ current.push(hit);
35
+ }
36
+ else {
37
+ blocks.push(current);
38
+ current = [hit];
39
+ }
40
+ }
41
+ if (current.length > 0)
42
+ blocks.push(current);
43
+ return blocks;
44
+ }
45
+ function expandCluster(sessionId, sessionTurns, blockHitIds, gapSeconds, occupied, maxClusterSize) {
46
+ const gapMs = gapSeconds * 1000;
47
+ const sorted = [...sessionTurns].sort((a, b) => parseInt(a.turnId, 10) - parseInt(b.turnId, 10));
48
+ const indexMap = new Map(sorted.map((t, i) => [parseInt(t.turnId, 10), i]));
49
+ const memberIds = new Set(blockHitIds);
50
+ const minHitId = Math.min(...blockHitIds);
51
+ const maxHitId = Math.max(...blockHitIds);
52
+ const minIndex = indexMap.get(minHitId);
53
+ const maxIndex = indexMap.get(maxHitId);
54
+ if (minIndex === undefined || maxIndex === undefined) {
55
+ return { sessionId, hitTurnId: minHitId, members: [] };
56
+ }
57
+ // Expand backward from the leftmost hit, then forward from the rightmost hit.
58
+ // Both multi-hit and single-hit blocks use the same time-window logic.
59
+ // Expansion stops when the cluster would exceed maxClusterSize.
60
+ // Expand backward.
61
+ let idx = minIndex;
62
+ while (idx > 0 && memberIds.size < maxClusterSize) {
63
+ const prev = sorted[idx - 1];
64
+ const curr = sorted[idx];
65
+ const prevId = parseInt(prev.turnId, 10);
66
+ if (occupied.has(prevId))
67
+ break;
68
+ const prevTime = getTurnTime(prev);
69
+ const currTime = getTurnTime(curr);
70
+ if (prevTime && currTime && currTime - prevTime <= gapMs) {
71
+ memberIds.add(prevId);
72
+ idx--;
73
+ }
74
+ else {
75
+ break;
76
+ }
77
+ }
78
+ // Expand forward.
79
+ idx = maxIndex;
80
+ while (idx < sorted.length - 1 && memberIds.size < maxClusterSize) {
81
+ const curr = sorted[idx];
82
+ const next = sorted[idx + 1];
83
+ const nextId = parseInt(next.turnId, 10);
84
+ if (occupied.has(nextId))
85
+ break;
86
+ const currTime = getTurnTime(curr);
87
+ const nextTime = getTurnTime(next);
88
+ if (currTime && nextTime && nextTime - currTime <= gapMs) {
89
+ memberIds.add(nextId);
90
+ idx++;
91
+ }
92
+ else {
93
+ break;
94
+ }
95
+ }
96
+ return {
97
+ sessionId,
98
+ hitTurnId: minHitId,
99
+ members: Array.from(memberIds)
100
+ .sort((a, b) => a - b)
101
+ .map((turnId) => ({ sessionId, turnId })),
102
+ };
103
+ }
104
+ async function buildWorkspaceContext(args = {}) {
105
+ const overrides = {};
106
+ if (typeof args.detailed_rounds === 'number') {
107
+ overrides.detailedRounds = Math.max(0, Math.floor(args.detailed_rounds));
108
+ }
109
+ if (typeof args.summary_rounds === 'number') {
110
+ overrides.summaryRounds = Math.max(0, Math.floor(args.summary_rounds));
111
+ }
112
+ const session = getCurrentSessionWirePath();
113
+ let recentContext = null;
114
+ if (session) {
115
+ const { turns, compactionSummaries } = await parseWireFile(session.wire);
116
+ const window = buildContextWindow(turns, overrides);
117
+ recentContext = {
118
+ sessionId: session.sessionId,
119
+ totalTurns: window.totalTurns,
120
+ detailedRounds: window.detailedRounds,
121
+ summaryRounds: window.summaryRounds,
122
+ compactionSummaries: compactionSummaries.slice(-3),
123
+ };
124
+ }
125
+ return {
126
+ workspace: {
127
+ cwd,
128
+ workspaceId,
129
+ storePath: storeRoot,
130
+ },
131
+ recentContext,
132
+ };
133
+ }
134
+ function handleLoadWorkspaceContext(args) {
135
+ return buildWorkspaceContext(args).then((data) => toolResult(data));
136
+ }
137
+ async function handleLoadMoreContext(args) {
138
+ const beforeTurnId = typeof args.before_turn_id === 'number' ? Math.floor(args.before_turn_id) : null;
139
+ if (beforeTurnId === null || beforeTurnId === undefined || beforeTurnId <= 0) {
140
+ return toolResult({ error: 'Missing or invalid "before_turn_id"' }, true);
141
+ }
142
+ const session = getCurrentSessionWirePath();
143
+ if (!session) {
144
+ return toolResult({ beforeTurnId, rounds: [], hasMore: false });
145
+ }
146
+ const limit = typeof args.limit === 'number' ? Math.max(1, Math.floor(args.limit)) : undefined;
147
+ const { turns } = await parseWireFile(session.wire);
148
+ const rounds = loadMoreRounds(turns, beforeTurnId, limit);
149
+ const olderCount = turns.filter((t) => parseInt(t.turnId, 10) < beforeTurnId).length;
150
+ return toolResult({
151
+ sessionId: session.sessionId,
152
+ totalTurns: turns.length,
153
+ beforeTurnId,
154
+ rounds,
155
+ hasMore: olderCount > rounds.length,
156
+ });
157
+ }
158
+ async function handleSearchContext(args) {
159
+ const query = typeof args.query === 'string' ? args.query.trim() : '';
160
+ if (!query) {
161
+ return toolResult({ query, matches: [], clusters: [], refinedCount: 0 });
162
+ }
163
+ const clusterGapSeconds = resolveClusterGapSeconds(args);
164
+ const maxClusterSize = typeof args.max_cluster_size === 'number' && args.max_cluster_size > 0
165
+ ? Math.max(2, Math.floor(args.max_cluster_size))
166
+ : 15;
167
+ const { matches, hits, skippedSessionIds } = await searchWireContext(query, {
168
+ limit: args.limit,
169
+ dateFrom: args.date_from,
170
+ dateTo: args.date_to,
171
+ refinedManager,
172
+ });
173
+ // Build clusters around each hit and refine any unrefined turns in them.
174
+ const hitsBySession = new Map();
175
+ for (const { sessionId, turn } of hits) {
176
+ hitsBySession.set(sessionId, [...(hitsBySession.get(sessionId) || []), turn]);
177
+ }
178
+ const clusters = [];
179
+ const refinedCountByCluster = [];
180
+ const refinedIdsBySession = new Map();
181
+ let refinedCount = 0;
182
+ // First pass: build all clusters and aggregate per-session turn ids to refine.
183
+ const toRefineBySession = new Map();
184
+ const skippedSessions = skippedSessionIds ? [...skippedSessionIds] : [];
185
+ for (const [sessionId, sessionHits] of hitsBySession.entries()) {
186
+ const wirePath = getCurrentSessionWirePath()?.sessionId === sessionId
187
+ ? getCurrentSessionWirePath().wire
188
+ : findSessionWirePath(sessionId);
189
+ if (!wirePath) {
190
+ skippedSessions.push(sessionId);
191
+ continue;
192
+ }
193
+ const { turns } = await parseWireFile(wirePath);
194
+ const existing = refinedManager.loadRefinedTurns(sessionId);
195
+ const existingIds = new Set(existing.map((t) => t.turnId));
196
+ refinedIdsBySession.set(sessionId, existingIds);
197
+ const turnById = new Map(turns.map((t) => [parseInt(t.turnId, 10), t]));
198
+ const sessionToRefine = new Map();
199
+ toRefineBySession.set(sessionId, sessionToRefine);
200
+ // Group adjacent hits into blocks to avoid one-cluster-per-hit overlap.
201
+ const blocks = groupHitsIntoBlocks(sessionHits);
202
+ const occupied = new Set();
203
+ for (const block of blocks) {
204
+ const blockHitIds = block.map((h) => parseInt(h.turnId, 10));
205
+ const cluster = expandCluster(sessionId, turns, blockHitIds, clusterGapSeconds, occupied, maxClusterSize);
206
+ clusters.push(cluster);
207
+ let clusterRefined = 0;
208
+ for (const m of cluster.members) {
209
+ occupied.add(m.turnId);
210
+ if (existingIds.has(m.turnId))
211
+ continue;
212
+ const turn = turnById.get(m.turnId);
213
+ if (!turn)
214
+ continue;
215
+ sessionToRefine.set(m.turnId, turn);
216
+ clusterRefined++;
217
+ }
218
+ refinedCountByCluster.push(clusterRefined);
219
+ }
220
+ }
221
+ // Second pass: batch refine per session to avoid repeated saves and redundant work.
222
+ for (const [sessionId, sessionToRefine] of toRefineBySession.entries()) {
223
+ if (sessionToRefine.size === 0)
224
+ continue;
225
+ const refinedTurns = Array.from(sessionToRefine.values())
226
+ .map((turn) => refinedManager.refineTurn({ ...turn, timestamp: turn.timestamp || undefined }, sessionId))
227
+ .filter((t) => t !== null);
228
+ if (refinedTurns.length > 0) {
229
+ await refinedManager.saveRefinedTurns(sessionId, refinedTurns);
230
+ refinedCount += refinedTurns.length;
231
+ }
232
+ }
233
+ // Save the search view (only references, no content).
234
+ saveSearchView(query, clusters, refinedCountByCluster, matches.length, refinedCount, clusterGapSeconds, maxClusterSize, skippedSessions);
235
+ return toolResult({
236
+ query,
237
+ totalMatches: matches.length,
238
+ matches,
239
+ clusterGapSeconds,
240
+ maxClusterSize,
241
+ skippedSessions,
242
+ clusters: clusters.map((c, i) => ({
243
+ sessionId: c.sessionId,
244
+ hitTurnId: c.hitTurnId,
245
+ memberCount: c.members.length,
246
+ refinedCount: refinedCountByCluster[i] || 0,
247
+ members: c.members,
248
+ })),
249
+ refinedCount,
250
+ });
251
+ }
252
+ function findSessionWirePath(sessionId) {
253
+ const sessions = findAllWorkspaceSessions();
254
+ const session = sessions.find((s) => s.sessionId === sessionId);
255
+ return session ? session.wire : null;
256
+ }
257
+ function saveSearchView(query, clusters, refinedCountByCluster = [], totalMatches = 0, totalRefined = 0, gapSeconds = DEFAULT_CLUSTER_GAP_SECONDS, maxClusterSize = 15, skippedSessions = []) {
258
+ const normalized = query
259
+ .toLowerCase()
260
+ .split(/\s+/)
261
+ .filter((t) => t.length > 0)
262
+ .sort()
263
+ .join('-');
264
+ const hash = crypto.createHash('md5').update(normalized).digest('hex').slice(0, 12);
265
+ const fileName = `search-${hash}.json`;
266
+ const dir = path.join(storeRoot, 'searches');
267
+ fs.mkdirSync(dir, { recursive: true });
268
+ const view = {
269
+ query,
270
+ createdAt: new Date().toISOString(),
271
+ totalMatches,
272
+ totalRefined,
273
+ gapSeconds,
274
+ maxClusterSize,
275
+ skippedSessions,
276
+ clusters: clusters.map((c, i) => ({
277
+ sessionId: c.sessionId,
278
+ hitTurnId: c.hitTurnId,
279
+ memberCount: c.members.length,
280
+ refinedCount: refinedCountByCluster[i] || 0,
281
+ members: c.members,
282
+ })),
283
+ };
284
+ const tmpPath = path.join(dir, `${fileName}.tmp`);
285
+ fs.writeFileSync(tmpPath, JSON.stringify(view, null, 2), 'utf8');
286
+ fs.renameSync(tmpPath, path.join(dir, fileName));
287
+ }
288
+ function handleListSearchViews(args = {}) {
289
+ const dir = path.join(storeRoot, 'searches');
290
+ if (!fs.existsSync(dir)) {
291
+ return toolResult({ views: [] });
292
+ }
293
+ const limit = typeof args.limit === 'number' ? Math.max(1, Math.floor(args.limit)) : 20;
294
+ const files = fs
295
+ .readdirSync(dir)
296
+ .filter((f) => f.startsWith('search-') && f.endsWith('.json'))
297
+ .map((fileName) => {
298
+ const filePath = path.join(dir, fileName);
299
+ const stat = fs.statSync(filePath);
300
+ const content = JSON.parse(fs.readFileSync(filePath, 'utf8'));
301
+ return {
302
+ fileName,
303
+ query: content.query || '',
304
+ createdAt: content.createdAt || stat.mtime.toISOString(),
305
+ clusterCount: content.clusters?.length || 0,
306
+ };
307
+ })
308
+ .sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime())
309
+ .slice(0, limit);
310
+ return toolResult({ views: files });
311
+ }
312
+ async function handleLoadTurnContext(args) {
313
+ const references = Array.isArray(args.references) ? args.references : [];
314
+ const result = await loadTurnContext(references);
315
+ if (result.error) {
316
+ return toolResult({ error: result.error, rounds: [], notFound: [] }, true);
317
+ }
318
+ return toolResult({
319
+ rounds: result.rounds,
320
+ notFound: result.notFound,
321
+ });
322
+ }
323
+ return {
324
+ buildWorkspaceContext,
325
+ handleLoadWorkspaceContext,
326
+ handleLoadMoreContext,
327
+ handleSearchContext,
328
+ handleListSearchViews,
329
+ handleLoadTurnContext,
330
+ };
331
+ }
332
+ //# sourceMappingURL=context-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-tools.js","sourceRoot":"","sources":["../../src/tools/context-tools.ts"],"names":[],"mappings":"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"}