codetree-claude 1.5.0 → 1.5.2

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 (123) hide show
  1. package/README.md +137 -121
  2. package/dist/cli.js +69 -83
  3. package/dist/cli.js.map +1 -1
  4. package/dist/config.d.ts +126 -0
  5. package/dist/config.d.ts.map +1 -1
  6. package/dist/config.js +22 -0
  7. package/dist/config.js.map +1 -1
  8. package/dist/diff.d.ts +37 -0
  9. package/dist/diff.d.ts.map +1 -0
  10. package/dist/diff.js +181 -0
  11. package/dist/diff.js.map +1 -0
  12. package/dist/doctor.d.ts +5 -0
  13. package/dist/doctor.d.ts.map +1 -0
  14. package/dist/doctor.js +139 -0
  15. package/dist/doctor.js.map +1 -0
  16. package/dist/hook/post-compact.js +1 -23
  17. package/dist/hook/post-compact.js.map +1 -1
  18. package/dist/hook/post-tool-use.js +11 -27
  19. package/dist/hook/post-tool-use.js.map +1 -1
  20. package/dist/hook/pre-compact.js +1 -22
  21. package/dist/hook/pre-compact.js.map +1 -1
  22. package/dist/hook/pre-tool-use.bundled.js +49 -77
  23. package/dist/hook/pre-tool-use.js +23 -90
  24. package/dist/hook/pre-tool-use.js.map +1 -1
  25. package/dist/hook/session-start.js +19 -23
  26. package/dist/hook/session-start.js.map +1 -1
  27. package/dist/index.d.ts +7 -1
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/index.js +8 -1
  30. package/dist/index.js.map +1 -1
  31. package/dist/indexer/extractor-registry.d.ts.map +1 -1
  32. package/dist/indexer/extractor-registry.js +6 -0
  33. package/dist/indexer/extractor-registry.js.map +1 -1
  34. package/dist/indexer/extractors/csharp.d.ts +12 -0
  35. package/dist/indexer/extractors/csharp.d.ts.map +1 -0
  36. package/dist/indexer/extractors/csharp.js +165 -0
  37. package/dist/indexer/extractors/csharp.js.map +1 -0
  38. package/dist/indexer/extractors/go.js +44 -1
  39. package/dist/indexer/extractors/go.js.map +1 -1
  40. package/dist/indexer/extractors/java.d.ts.map +1 -1
  41. package/dist/indexer/extractors/java.js +41 -3
  42. package/dist/indexer/extractors/java.js.map +1 -1
  43. package/dist/indexer/extractors/javascript.d.ts.map +1 -1
  44. package/dist/indexer/extractors/javascript.js +67 -3
  45. package/dist/indexer/extractors/javascript.js.map +1 -1
  46. package/dist/indexer/extractors/python.d.ts.map +1 -1
  47. package/dist/indexer/extractors/python.js +31 -2
  48. package/dist/indexer/extractors/python.js.map +1 -1
  49. package/dist/indexer/extractors/ruby.d.ts +10 -0
  50. package/dist/indexer/extractors/ruby.d.ts.map +1 -0
  51. package/dist/indexer/extractors/ruby.js +145 -0
  52. package/dist/indexer/extractors/ruby.js.map +1 -0
  53. package/dist/indexer/extractors/rust.d.ts +10 -0
  54. package/dist/indexer/extractors/rust.d.ts.map +1 -0
  55. package/dist/indexer/extractors/rust.js +194 -0
  56. package/dist/indexer/extractors/rust.js.map +1 -0
  57. package/dist/indexer/indexer.d.ts +15 -0
  58. package/dist/indexer/indexer.d.ts.map +1 -1
  59. package/dist/indexer/indexer.js +168 -4
  60. package/dist/indexer/indexer.js.map +1 -1
  61. package/dist/server/ipc.d.ts +10 -4
  62. package/dist/server/ipc.d.ts.map +1 -1
  63. package/dist/server/ipc.js +190 -109
  64. package/dist/server/ipc.js.map +1 -1
  65. package/dist/server/mcp-server.js +36 -27
  66. package/dist/server/mcp-server.js.map +1 -1
  67. package/dist/server/tools/codetree-find-refs.d.ts.map +1 -1
  68. package/dist/server/tools/codetree-find-refs.js +23 -14
  69. package/dist/server/tools/codetree-find-refs.js.map +1 -1
  70. package/dist/server/tools/codetree-memory.d.ts +3 -6
  71. package/dist/server/tools/codetree-memory.d.ts.map +1 -1
  72. package/dist/server/tools/codetree-memory.js +9 -10
  73. package/dist/server/tools/codetree-memory.js.map +1 -1
  74. package/dist/server/tools/codetree-outline.d.ts +57 -0
  75. package/dist/server/tools/codetree-outline.d.ts.map +1 -0
  76. package/dist/server/tools/codetree-outline.js +76 -0
  77. package/dist/server/tools/codetree-outline.js.map +1 -0
  78. package/dist/server/tools/codetree-probe.d.ts +53 -0
  79. package/dist/server/tools/codetree-probe.d.ts.map +1 -0
  80. package/dist/server/tools/codetree-probe.js +81 -0
  81. package/dist/server/tools/codetree-probe.js.map +1 -0
  82. package/dist/server/tools/codetree-read.d.ts +52 -3
  83. package/dist/server/tools/codetree-read.d.ts.map +1 -1
  84. package/dist/server/tools/codetree-read.js +237 -55
  85. package/dist/server/tools/codetree-read.js.map +1 -1
  86. package/dist/server/tools/codetree-search.d.ts +13 -1
  87. package/dist/server/tools/codetree-search.d.ts.map +1 -1
  88. package/dist/server/tools/codetree-search.js +80 -52
  89. package/dist/server/tools/codetree-search.js.map +1 -1
  90. package/dist/server/tools/codetree-structure.d.ts +25 -1
  91. package/dist/server/tools/codetree-structure.d.ts.map +1 -1
  92. package/dist/server/tools/codetree-structure.js +92 -42
  93. package/dist/server/tools/codetree-structure.js.map +1 -1
  94. package/dist/server/tools/codetree-summary.d.ts +2 -0
  95. package/dist/server/tools/codetree-summary.d.ts.map +1 -1
  96. package/dist/server/tools/codetree-summary.js +5 -0
  97. package/dist/server/tools/codetree-summary.js.map +1 -1
  98. package/dist/setup/install.d.ts +45 -1
  99. package/dist/setup/install.d.ts.map +1 -1
  100. package/dist/setup/install.js +163 -58
  101. package/dist/setup/install.js.map +1 -1
  102. package/dist/setup/template-load.d.ts +9 -0
  103. package/dist/setup/template-load.d.ts.map +1 -0
  104. package/dist/setup/template-load.js +39 -0
  105. package/dist/setup/template-load.js.map +1 -0
  106. package/dist/storage/database.d.ts +49 -0
  107. package/dist/storage/database.d.ts.map +1 -1
  108. package/dist/storage/database.js +383 -43
  109. package/dist/storage/database.js.map +1 -1
  110. package/dist/storage/disk-manager.d.ts.map +1 -1
  111. package/dist/storage/disk-manager.js +1 -5
  112. package/dist/storage/disk-manager.js.map +1 -1
  113. package/dist/utils.d.ts +23 -0
  114. package/dist/utils.d.ts.map +1 -0
  115. package/dist/utils.js +102 -0
  116. package/dist/utils.js.map +1 -0
  117. package/package.json +46 -10
  118. package/templates/README.md +15 -0
  119. package/templates/agents-codetree.snippet.md +24 -0
  120. package/templates/claude-md-codetree.snippet.md +22 -0
  121. package/templates/claude-rules-codetree.md +23 -0
  122. package/templates/cursor-codetree.mdc +31 -0
  123. package/templates/gemini-codetree.snippet.md +6 -0
@@ -5,20 +5,37 @@ export interface ReadParams {
5
5
  file_path: string;
6
6
  offset?: number;
7
7
  limit?: number;
8
+ outline_only?: boolean;
9
+ include_symbols?: boolean;
10
+ include_content?: boolean;
11
+ exported_symbols_only?: boolean;
12
+ symbols_limit?: number;
13
+ expected_hash?: string;
14
+ session_id?: string;
15
+ focus_symbol?: string;
8
16
  }
9
17
  export interface ReadResult {
10
- content: string;
11
- source: "memory_cache" | "disk_cache" | "direct_read";
18
+ content?: string;
19
+ /** When the file changed and the agent sent expected_hash, this contains a compact diff instead of full content */
20
+ diff?: string;
21
+ source: "memory_cache" | "disk_cache" | "direct_read" | "session_unchanged" | "outline" | "diff";
12
22
  path: string;
23
+ hash: string | null;
13
24
  lineCount: number;
14
25
  size: number;
15
26
  language: string | null;
16
- symbols: Array<{
27
+ symbols?: Array<{
17
28
  name: string;
18
29
  kind: string;
19
30
  line: number | null;
20
31
  signature: string | null;
21
32
  }>;
33
+ truncated?: boolean;
34
+ outline_only?: boolean;
35
+ /** True when the response intentionally omitted the file body (outline_only OR include_content=false OR auto-fallback). */
36
+ body_omitted?: boolean;
37
+ unchanged_since_last_read?: boolean;
38
+ message?: string;
22
39
  }
23
40
  export declare function createReadTool(config: CodeTreeConfig, indexer: Indexer, db: Database): {
24
41
  name: string;
@@ -38,6 +55,38 @@ export declare function createReadTool(config: CodeTreeConfig, indexer: Indexer,
38
55
  type: string;
39
56
  description: string;
40
57
  };
58
+ outline_only: {
59
+ type: string;
60
+ description: string;
61
+ };
62
+ include_symbols: {
63
+ type: string;
64
+ description: string;
65
+ };
66
+ include_content: {
67
+ type: string;
68
+ description: string;
69
+ };
70
+ exported_symbols_only: {
71
+ type: string;
72
+ description: string;
73
+ };
74
+ symbols_limit: {
75
+ type: string;
76
+ description: string;
77
+ };
78
+ expected_hash: {
79
+ type: string;
80
+ description: string;
81
+ };
82
+ session_id: {
83
+ type: string;
84
+ description: string;
85
+ };
86
+ focus_symbol: {
87
+ type: string;
88
+ description: string;
89
+ };
41
90
  };
42
91
  required: string[];
43
92
  };
@@ -1 +1 @@
1
- {"version":3,"file":"codetree-read.d.ts","sourceRoot":"","sources":["../../../src/server/tools/codetree-read.ts"],"names":[],"mappings":"AAEA,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACrE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAE1D,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,cAAc,GAAG,YAAY,GAAG,aAAa,CAAC;IACtD,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC,CAAC;CAC/F;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ;;;;;;;;;;;;;;;;;;;;;sBAyBzD,UAAU,KAAG,OAAO,CAAC,UAAU,CAAC;EA8F3D"}
1
+ {"version":3,"file":"codetree-read.d.ts","sourceRoot":"","sources":["../../../src/server/tools/codetree-read.ts"],"names":[],"mappings":"AAEA,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACrE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAG1D,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,UAAU,CAAC,EAAE,MAAM,CAAC;IAGpB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mHAAmH;IACnH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,cAAc,GAAG,YAAY,GAAG,aAAa,GAAG,mBAAmB,GAAG,SAAS,GAAG,MAAM,CAAC;IACjG,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC,CAAC;IAC/F,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,2HAA2H;IAC3H,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,yBAAyB,CAAC,EAAE,OAAO,CAAC;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sBA2BzD,UAAU,KAAG,OAAO,CAAC,UAAU,CAAC;EAgR3D"}
@@ -1,35 +1,40 @@
1
1
  import { resolve, relative } from "node:path";
2
- import { readFileSync } from "node:fs";
2
+ import { readFileSync, statSync } from "node:fs";
3
3
  import { normalizePath } from "../../config.js";
4
+ import { computeDiff, isDiffWorthSending } from "../../diff.js";
4
5
  export function createReadTool(config, indexer, db) {
6
+ const tk = config.tokenSave.read;
5
7
  return {
6
8
  name: "codetree_read",
7
- description: "Read a file from the CodeTree cache. Much faster and more token-efficient than the native Read tool. " +
8
- "Returns the file content along with metadata (symbols, language, line count). " +
9
- "Use this instead of Read when CodeTree has cached the file.",
9
+ description: "Read a file from the CodeTree cache. Token-efficient: returns 'unchanged_since_last_read' " +
10
+ "when the same session already read the same content (no body re-sent), supports outline_only " +
11
+ "(symbols/metadata only, no body), and includes the file hash so the agent can avoid re-reads. " +
12
+ "Use offset/limit to paginate large files. Use outline_only=true for cheap browsing.",
10
13
  inputSchema: {
11
14
  type: "object",
12
15
  properties: {
13
- file_path: {
14
- type: "string",
15
- description: "Absolute or project-relative path to the file",
16
- },
17
- offset: {
18
- type: "number",
19
- description: "Line number to start reading from (0-indexed). Default: 0",
20
- },
21
- limit: {
22
- type: "number",
23
- description: "Number of lines to read. Default: all lines",
24
- },
16
+ file_path: { type: "string", description: "Absolute or project-relative path." },
17
+ offset: { type: "number", description: "Line number to start (0-indexed). Default: 0" },
18
+ limit: { type: "number", description: "Number of lines. Default: all" },
19
+ outline_only: { type: "boolean", description: "Return symbols + metadata only (no body). Default: false." },
20
+ include_symbols: { type: "boolean", description: `Include symbol metadata. Default: ${tk.includeSymbolsByDefault}.` },
21
+ include_content: { type: "boolean", description: "Include file content. Default: true. Set false for cheap probes." },
22
+ exported_symbols_only: { type: "boolean", description: `Return only exported symbols. Default: ${tk.exportedSymbolsOnlyByDefault}.` },
23
+ symbols_limit: { type: "number", description: `Cap symbols returned. Default: ${tk.maxSymbols}.` },
24
+ expected_hash: { type: "string", description: "If provided and matches current hash, returns unchanged with no body. If hash differs, returns a compact diff instead of full content." },
25
+ session_id: { type: "string", description: "If set, enables 'unchanged since you last read it' short-circuit." },
26
+ focus_symbol: { type: "string", description: "Auto-narrow to lines containing this symbol (function/class name). Returns only the symbol body + context. Huge token savings on large files." },
25
27
  },
26
28
  required: ["file_path"],
27
29
  },
28
30
  handler: async (params) => {
29
- // Resolve the path
31
+ if (!params.file_path) {
32
+ throw new Error("file_path is required. Use file_path (not file) to specify the file to read.");
33
+ }
34
+ // Resolve path
30
35
  let absPath;
31
36
  let relPath;
32
- if (params.file_path.startsWith("/") || params.file_path.match(/^[A-Za-z]:/)) {
37
+ if (params.file_path.startsWith("/") || /^[A-Za-z]:/.test(params.file_path)) {
33
38
  absPath = resolve(params.file_path);
34
39
  relPath = normalizePath(relative(config.projectRoot, absPath));
35
40
  }
@@ -37,73 +42,250 @@ export function createReadTool(config, indexer, db) {
37
42
  relPath = normalizePath(params.file_path);
38
43
  absPath = resolve(config.projectRoot, relPath);
39
44
  }
40
- // Try cache first
45
+ const fileRecord = db.getFile(relPath);
46
+ const includeSymbols = params.include_symbols ?? tk.includeSymbolsByDefault;
47
+ const includeContent = params.include_content ?? true;
48
+ const exportedOnly = params.exported_symbols_only ?? tk.exportedSymbolsOnlyByDefault;
49
+ const symbolsCap = params.symbols_limit ?? tk.maxSymbols;
50
+ const outlineOnly = params.outline_only === true;
51
+ // Helper to fetch + trim symbols
52
+ const buildSymbols = (rangeStart, rangeEnd) => {
53
+ if (!includeSymbols)
54
+ return undefined;
55
+ let symbols = db.getSymbolsForFile(relPath);
56
+ if (exportedOnly)
57
+ symbols = symbols.filter((s) => s.exported);
58
+ if (rangeStart !== undefined && rangeEnd !== undefined) {
59
+ symbols = symbols.filter((s) => s.line_start !== null && s.line_start >= rangeStart + 1 && s.line_start <= rangeEnd);
60
+ }
61
+ if (symbolsCap > 0 && symbols.length > symbolsCap)
62
+ symbols = symbols.slice(0, symbolsCap);
63
+ return symbols.map((s) => ({
64
+ name: s.name,
65
+ kind: s.kind,
66
+ line: s.line_start,
67
+ signature: s.signature,
68
+ }));
69
+ };
70
+ // ── Unchanged-since-last-read short-circuit (token-saver) ────
71
+ if (tk.unchangedShortCircuit &&
72
+ fileRecord &&
73
+ params.session_id &&
74
+ !outlineOnly && includeContent) {
75
+ try {
76
+ const lastReadAt = db.getLastSessionReadAt(params.session_id, relPath);
77
+ if (lastReadAt > 0 && lastReadAt >= fileRecord.mtime_ms) {
78
+ // Verify file still exists on disk and the mtime really matches what
79
+ // we have in the index — guards against stale fileRecord (e.g. file
80
+ // deleted or modified between watcher trigger and this call).
81
+ let stillValid = false;
82
+ try {
83
+ const st = statSync(absPath);
84
+ stillValid = Math.floor(st.mtimeMs) === fileRecord.mtime_ms;
85
+ }
86
+ catch {
87
+ stillValid = false;
88
+ }
89
+ if (stillValid) {
90
+ return {
91
+ source: "session_unchanged",
92
+ path: relPath,
93
+ hash: fileRecord.hash,
94
+ lineCount: fileRecord.line_count,
95
+ size: fileRecord.size,
96
+ language: fileRecord.language,
97
+ symbols: buildSymbols(),
98
+ unchanged_since_last_read: true,
99
+ message: "Unchanged since you last read it this session. Use prior content; no re-read needed.",
100
+ };
101
+ }
102
+ // Otherwise, fall through to a real read (will re-index as needed)
103
+ }
104
+ }
105
+ catch { /* ignore */ }
106
+ }
107
+ // ── expected_hash short-circuit ───────────────────────────────
108
+ if (fileRecord && params.expected_hash && params.expected_hash === fileRecord.hash) {
109
+ return {
110
+ source: "session_unchanged",
111
+ path: relPath,
112
+ hash: fileRecord.hash,
113
+ lineCount: fileRecord.line_count,
114
+ size: fileRecord.size,
115
+ language: fileRecord.language,
116
+ symbols: buildSymbols(),
117
+ unchanged_since_last_read: true,
118
+ message: "Hash matches expected_hash; content unchanged.",
119
+ };
120
+ }
121
+ // ── Diff-based read: file changed but agent has prior version ──
122
+ if (fileRecord &&
123
+ params.expected_hash &&
124
+ params.expected_hash !== fileRecord.hash &&
125
+ includeContent && !outlineOnly) {
126
+ // Agent sent a hash that doesn't match — file changed.
127
+ // Try to return a diff instead of the full content.
128
+ const newContent = indexer.readCached(relPath) || (() => {
129
+ try {
130
+ return readFileSync(absPath, "utf-8");
131
+ }
132
+ catch {
133
+ return null;
134
+ }
135
+ })();
136
+ if (newContent) {
137
+ // We need the old content to compute diff.
138
+ // Look up old content from the content cache by hash.
139
+ // If we can't get old content, fall through to full read.
140
+ const oldContent = db.getCachedContentByHash(params.expected_hash);
141
+ if (oldContent) {
142
+ const diffResult = computeDiff(oldContent, newContent);
143
+ const newBytes = Buffer.byteLength(newContent, "utf-8");
144
+ if (isDiffWorthSending(diffResult, newBytes)) {
145
+ // Log read for session memory
146
+ try {
147
+ const sid = params.session_id || db.getRecentSessions(1)[0]?.id;
148
+ if (sid)
149
+ db.logSessionRead(sid, relPath, "codetree_read");
150
+ }
151
+ catch { /* ignore */ }
152
+ const diffBytes = Buffer.byteLength(diffResult.compactDiff, "utf-8");
153
+ const pctSmaller = newBytes > 0
154
+ ? Math.max(0, Math.round((1 - diffBytes / newBytes) * 100))
155
+ : 0;
156
+ return {
157
+ diff: diffResult.compactDiff,
158
+ source: "diff",
159
+ path: relPath,
160
+ hash: fileRecord.hash,
161
+ lineCount: fileRecord.line_count,
162
+ size: fileRecord.size,
163
+ language: fileRecord.language,
164
+ symbols: buildSymbols(),
165
+ message: `File changed (${diffResult.totalChanged} lines). Diff sent instead of full content (${pctSmaller}% smaller).`,
166
+ };
167
+ }
168
+ }
169
+ }
170
+ // Fall through to full content read if diff isn't possible/worth it
171
+ }
172
+ // ── Outline-only path: return metadata + symbols, no body ───
173
+ if (outlineOnly || !includeContent) {
174
+ const symbols = buildSymbols();
175
+ // Log the read for session memory
176
+ try {
177
+ const sid = params.session_id || db.getRecentSessions(1)[0]?.id;
178
+ if (sid)
179
+ db.logSessionRead(sid, relPath, "codetree_read");
180
+ }
181
+ catch { /* ignore */ }
182
+ return {
183
+ source: "outline",
184
+ path: relPath,
185
+ hash: fileRecord?.hash ?? null,
186
+ lineCount: fileRecord?.line_count ?? 0,
187
+ size: fileRecord?.size ?? 0,
188
+ language: fileRecord?.language ?? null,
189
+ symbols,
190
+ // Only echo `outline_only` when the caller actually asked for it.
191
+ // Always set body_omitted so agents have one stable field to check.
192
+ outline_only: outlineOnly ? true : undefined,
193
+ body_omitted: true,
194
+ };
195
+ }
196
+ // ── Get content (cache → disk) ───────────────────────────────
41
197
  let content = indexer.readCached(relPath);
42
198
  let source = "memory_cache";
43
199
  if (!content) {
44
- // Direct read as fallback
45
200
  try {
46
201
  content = readFileSync(absPath, "utf-8");
47
202
  source = "direct_read";
48
- // Trigger background indexing of this file
49
203
  indexer.indexFile(absPath);
50
204
  }
51
- catch (err) {
205
+ catch {
52
206
  throw new Error(`Failed to read file: ${absPath}`);
53
207
  }
54
208
  }
55
- // Apply offset/limit
209
+ // ── focus_symbol: auto-narrow to a specific symbol's body ──
210
+ if (params.focus_symbol && !params.offset && !params.limit) {
211
+ const allSymbols = db.getSymbolsForFile(relPath);
212
+ const target = allSymbols.find((s) => s.name === params.focus_symbol || s.name.endsWith(`.${params.focus_symbol}`));
213
+ if (target && target.line_start !== null) {
214
+ const lines = content.split("\n");
215
+ const contextLines = 3;
216
+ const start = Math.max(0, target.line_start - 1 - contextLines);
217
+ const end = Math.min(lines.length, (target.line_end ?? target.line_start + 20) + contextLines);
218
+ const focused = lines.slice(start, end).join("\n");
219
+ // Log read
220
+ try {
221
+ const sid = params.session_id || db.getRecentSessions(1)[0]?.id;
222
+ if (sid)
223
+ db.logSessionRead(sid, relPath, "codetree_read", start, end);
224
+ }
225
+ catch { /* ignore */ }
226
+ return {
227
+ content: focused,
228
+ source,
229
+ path: relPath,
230
+ hash: fileRecord?.hash ?? null,
231
+ lineCount: end - start,
232
+ size: Buffer.byteLength(focused, "utf-8"),
233
+ language: fileRecord?.language ?? null,
234
+ symbols: [target].map((s) => ({
235
+ name: s.name, kind: s.kind, line: s.line_start, signature: s.signature,
236
+ })),
237
+ message: `Focused on ${target.kind} "${target.name}" (lines ${start + 1}-${end}). Full file: ${fileRecord?.line_count ?? lines.length} lines.`,
238
+ };
239
+ }
240
+ }
56
241
  const hasRange = params.offset !== undefined || params.limit !== undefined;
57
242
  let rangeStart = 0;
58
243
  let rangeEnd = Infinity;
59
244
  if (hasRange) {
60
245
  const lines = content.split("\n");
61
- rangeStart = params.offset ?? 0;
62
- rangeEnd = params.limit ? rangeStart + params.limit : lines.length;
246
+ rangeStart = Math.max(0, params.offset ?? 0);
247
+ // Cap any single-call slice so a runaway `limit` (e.g. 999_999) on a
248
+ // huge file can't bypass the outline-fallback budget.
249
+ const MAX_LINES_PER_CALL = 5000;
250
+ const requestedLimit = params.limit ?? (lines.length - rangeStart);
251
+ const safeLimit = Math.min(requestedLimit, MAX_LINES_PER_CALL);
252
+ rangeEnd = rangeStart + safeLimit;
63
253
  content = lines.slice(rangeStart, rangeEnd).join("\n");
64
254
  }
65
- // Log this read for session memory tracking
255
+ // Log read for session memory
66
256
  try {
67
- const latestSession = db.getRecentSessions(1);
68
- if (latestSession.length > 0 && latestSession[0].id) {
69
- db.logSessionRead(latestSession[0].id, relPath, "codetree_read", rangeStart || undefined, hasRange ? rangeEnd : undefined);
257
+ const sid = params.session_id || db.getRecentSessions(1)[0]?.id;
258
+ if (sid) {
259
+ db.logSessionRead(sid, relPath, "codetree_read", rangeStart || undefined, hasRange ? rangeEnd : undefined);
70
260
  }
71
261
  }
72
- catch { /* session logging should never break reads */ }
73
- // Get metadata
74
- const fileRecord = db.getFile(relPath);
75
- let symbols = db.getSymbolsForFile(relPath);
76
- // When reading a range, filter symbols to only those within the range
77
- if (hasRange) {
78
- symbols = symbols.filter((s) => s.line_start !== null && s.line_start >= rangeStart + 1 && s.line_start <= rangeEnd);
79
- }
80
- const slicedLineCount = content.split("\n").length;
262
+ catch { /* ignore */ }
81
263
  const slicedSize = Buffer.byteLength(content, "utf-8");
82
- // Guard: if response would exceed ~100KB, auto-truncate and warn
83
- const MAX_CONTENT_BYTES = 100 * 1024;
84
- let truncated = false;
85
- if (slicedSize > MAX_CONTENT_BYTES && !hasRange) {
86
- const lines = content.split("\n");
87
- const targetLines = Math.floor(lines.length * (MAX_CONTENT_BYTES / slicedSize));
88
- content = lines.slice(0, targetLines).join("\n");
89
- content += `\n\n--- TRUNCATED (showing ${targetLines} of ${lines.length} lines) ---\n--- Use offset/limit parameters to read specific portions ---`;
90
- truncated = true;
91
- // Also filter symbols to truncated range
92
- symbols = symbols.filter((s) => s.line_start !== null && s.line_start <= targetLines);
264
+ // ── Auto-degrade to outline if content is huge and no range ─
265
+ if (!hasRange && slicedSize > tk.outlineFallbackBytes) {
266
+ const symbols = buildSymbols();
267
+ return {
268
+ source: "outline",
269
+ path: relPath,
270
+ hash: fileRecord?.hash ?? null,
271
+ lineCount: fileRecord?.line_count ?? content.split("\n").length,
272
+ size: fileRecord?.size ?? slicedSize,
273
+ language: fileRecord?.language ?? null,
274
+ symbols,
275
+ body_omitted: true,
276
+ message: `[outline auto: file is ${(slicedSize / 1024).toFixed(0)}KB; pass offset/limit for content]`,
277
+ };
93
278
  }
279
+ const slicedLineCount = content.split("\n").length;
94
280
  return {
95
281
  content,
96
282
  source,
97
283
  path: relPath,
284
+ hash: fileRecord?.hash ?? null,
98
285
  lineCount: hasRange ? slicedLineCount : (fileRecord?.line_count ?? slicedLineCount),
99
286
  size: hasRange ? slicedSize : (fileRecord?.size ?? slicedSize),
100
287
  language: fileRecord?.language ?? null,
101
- symbols: symbols.map((s) => ({
102
- name: s.name,
103
- kind: s.kind,
104
- line: s.line_start,
105
- signature: s.signature,
106
- })),
288
+ symbols: buildSymbols(rangeStart, rangeEnd === Infinity ? undefined : rangeEnd),
107
289
  };
108
290
  },
109
291
  };
@@ -1 +1 @@
1
- {"version":3,"file":"codetree-read.js","sourceRoot":"","sources":["../../../src/server/tools/codetree-read.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"codetree-read.js","sourceRoot":"","sources":["../../../src/server/tools/codetree-read.ts"],"names":[],"mappings":"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"}
@@ -7,6 +7,8 @@ export interface SearchParams {
7
7
  file_pattern?: string;
8
8
  limit?: number;
9
9
  content_search?: boolean;
10
+ include_signature?: boolean;
11
+ cursor?: number;
10
12
  }
11
13
  export interface SearchResult {
12
14
  symbols: Array<{
@@ -14,7 +16,7 @@ export interface SearchResult {
14
16
  kind: string;
15
17
  file_path: string;
16
18
  line_start: number | null;
17
- signature: string | null;
19
+ signature?: string | null;
18
20
  exported: boolean;
19
21
  }>;
20
22
  content_matches?: Array<{
@@ -24,6 +26,8 @@ export interface SearchResult {
24
26
  }>;
25
27
  totalResults: number;
26
28
  source: "index";
29
+ next_cursor?: number;
30
+ truncated?: boolean;
27
31
  }
28
32
  export declare function createSearchTool(config: CodeTreeConfig, indexer: Indexer, db: Database): {
29
33
  name: string;
@@ -51,6 +55,14 @@ export declare function createSearchTool(config: CodeTreeConfig, indexer: Indexe
51
55
  type: string;
52
56
  description: string;
53
57
  };
58
+ include_signature: {
59
+ type: string;
60
+ description: string;
61
+ };
62
+ cursor: {
63
+ type: string;
64
+ description: string;
65
+ };
54
66
  };
55
67
  required: string[];
56
68
  };
@@ -1 +1 @@
1
- {"version":3,"file":"codetree-search.d.ts","sourceRoot":"","sources":["../../../src/server/tools/codetree-search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACrE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAE1D,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,KAAK,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;QAC1B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;QACzB,QAAQ,EAAE,OAAO,CAAC;KACnB,CAAC,CAAC;IACH,eAAe,CAAC,EAAE,KAAK,CAAC;QACtB,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC,CAAC;IACH,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sBAiC3D,YAAY,KAAG,OAAO,CAAC,YAAY,CAAC;EA2E/D"}
1
+ {"version":3,"file":"codetree-search.d.ts","sourceRoot":"","sources":["../../../src/server/tools/codetree-search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAG1D,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,KAAK,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;QAC1B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAC1B,QAAQ,EAAE,OAAO,CAAC;KACnB,CAAC,CAAC;IACH,eAAe,CAAC,EAAE,KAAK,CAAC;QACtB,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC,CAAC;IACH,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sBAsB3D,YAAY,KAAG,OAAO,CAAC,YAAY,CAAC;EA8G/D"}