codetree-claude 1.4.7 → 1.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 (138) hide show
  1. package/README.md +144 -86
  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 +15 -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 -69
  23. package/dist/hook/pre-tool-use.js +23 -80
  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/extractors/types.d.ts.map +1 -1
  58. package/dist/indexer/extractors/types.js +6 -0
  59. package/dist/indexer/extractors/types.js.map +1 -1
  60. package/dist/indexer/indexer.d.ts +23 -0
  61. package/dist/indexer/indexer.d.ts.map +1 -1
  62. package/dist/indexer/indexer.js +233 -14
  63. package/dist/indexer/indexer.js.map +1 -1
  64. package/dist/indexer/watcher.d.ts +3 -0
  65. package/dist/indexer/watcher.d.ts.map +1 -1
  66. package/dist/indexer/watcher.js +33 -1
  67. package/dist/indexer/watcher.js.map +1 -1
  68. package/dist/server/ipc.d.ts +10 -4
  69. package/dist/server/ipc.d.ts.map +1 -1
  70. package/dist/server/ipc.js +190 -109
  71. package/dist/server/ipc.js.map +1 -1
  72. package/dist/server/mcp-server.js +38 -29
  73. package/dist/server/mcp-server.js.map +1 -1
  74. package/dist/server/tools/codetree-edit.d.ts +2 -1
  75. package/dist/server/tools/codetree-edit.d.ts.map +1 -1
  76. package/dist/server/tools/codetree-edit.js +24 -6
  77. package/dist/server/tools/codetree-edit.js.map +1 -1
  78. package/dist/server/tools/codetree-find-refs.d.ts.map +1 -1
  79. package/dist/server/tools/codetree-find-refs.js +29 -15
  80. package/dist/server/tools/codetree-find-refs.js.map +1 -1
  81. package/dist/server/tools/codetree-memory.d.ts +3 -6
  82. package/dist/server/tools/codetree-memory.d.ts.map +1 -1
  83. package/dist/server/tools/codetree-memory.js +9 -10
  84. package/dist/server/tools/codetree-memory.js.map +1 -1
  85. package/dist/server/tools/codetree-outline.d.ts +57 -0
  86. package/dist/server/tools/codetree-outline.d.ts.map +1 -0
  87. package/dist/server/tools/codetree-outline.js +76 -0
  88. package/dist/server/tools/codetree-outline.js.map +1 -0
  89. package/dist/server/tools/codetree-probe.d.ts +53 -0
  90. package/dist/server/tools/codetree-probe.d.ts.map +1 -0
  91. package/dist/server/tools/codetree-probe.js +81 -0
  92. package/dist/server/tools/codetree-probe.js.map +1 -0
  93. package/dist/server/tools/codetree-read.d.ts +52 -3
  94. package/dist/server/tools/codetree-read.d.ts.map +1 -1
  95. package/dist/server/tools/codetree-read.js +249 -38
  96. package/dist/server/tools/codetree-read.js.map +1 -1
  97. package/dist/server/tools/codetree-search.d.ts +13 -1
  98. package/dist/server/tools/codetree-search.d.ts.map +1 -1
  99. package/dist/server/tools/codetree-search.js +89 -49
  100. package/dist/server/tools/codetree-search.js.map +1 -1
  101. package/dist/server/tools/codetree-structure.d.ts +25 -1
  102. package/dist/server/tools/codetree-structure.d.ts.map +1 -1
  103. package/dist/server/tools/codetree-structure.js +99 -31
  104. package/dist/server/tools/codetree-structure.js.map +1 -1
  105. package/dist/server/tools/codetree-summary.d.ts +2 -0
  106. package/dist/server/tools/codetree-summary.d.ts.map +1 -1
  107. package/dist/server/tools/codetree-summary.js +5 -0
  108. package/dist/server/tools/codetree-summary.js.map +1 -1
  109. package/dist/server/tools/codetree-write.d.ts +2 -1
  110. package/dist/server/tools/codetree-write.d.ts.map +1 -1
  111. package/dist/server/tools/codetree-write.js +9 -1
  112. package/dist/server/tools/codetree-write.js.map +1 -1
  113. package/dist/setup/install.d.ts +45 -1
  114. package/dist/setup/install.d.ts.map +1 -1
  115. package/dist/setup/install.js +163 -58
  116. package/dist/setup/install.js.map +1 -1
  117. package/dist/setup/template-load.d.ts +9 -0
  118. package/dist/setup/template-load.d.ts.map +1 -0
  119. package/dist/setup/template-load.js +39 -0
  120. package/dist/setup/template-load.js.map +1 -0
  121. package/dist/storage/database.d.ts +49 -0
  122. package/dist/storage/database.d.ts.map +1 -1
  123. package/dist/storage/database.js +398 -53
  124. package/dist/storage/database.js.map +1 -1
  125. package/dist/storage/disk-manager.d.ts.map +1 -1
  126. package/dist/storage/disk-manager.js +1 -5
  127. package/dist/storage/disk-manager.js.map +1 -1
  128. package/dist/utils.d.ts +23 -0
  129. package/dist/utils.d.ts.map +1 -0
  130. package/dist/utils.js +102 -0
  131. package/dist/utils.js.map +1 -0
  132. package/package.json +63 -5
  133. package/templates/README.md +15 -0
  134. package/templates/agents-codetree.snippet.md +24 -0
  135. package/templates/claude-md-codetree.snippet.md +22 -0
  136. package/templates/claude-rules-codetree.md +23 -0
  137. package/templates/cursor-codetree.mdc +31 -0
  138. package/templates/gemini-codetree.snippet.md +6 -0
@@ -0,0 +1,53 @@
1
+ import { type CodeTreeConfig } from "../../config.js";
2
+ import type { Indexer } from "../../indexer/indexer.js";
3
+ import type { Database } from "../../storage/database.js";
4
+ export interface ProbeParams {
5
+ query: string;
6
+ files?: string[];
7
+ file_pattern?: string;
8
+ limit?: number;
9
+ }
10
+ export interface ProbeResult {
11
+ query: string;
12
+ hits: Array<{
13
+ file_path: string;
14
+ line_numbers: number[];
15
+ }>;
16
+ filesScanned: number;
17
+ truncated: boolean;
18
+ }
19
+ /**
20
+ * Cheap presence probe — "does X mention Y?". Returns line numbers only,
21
+ * NEVER returns line content. Massively cheaper than search/read for triage.
22
+ */
23
+ export declare function createProbeTool(_config: CodeTreeConfig, indexer: Indexer, db: Database): {
24
+ name: string;
25
+ description: string;
26
+ inputSchema: {
27
+ type: "object";
28
+ properties: {
29
+ query: {
30
+ type: string;
31
+ description: string;
32
+ };
33
+ files: {
34
+ type: string;
35
+ items: {
36
+ type: string;
37
+ };
38
+ description: string;
39
+ };
40
+ file_pattern: {
41
+ type: string;
42
+ description: string;
43
+ };
44
+ limit: {
45
+ type: string;
46
+ description: string;
47
+ };
48
+ };
49
+ required: string[];
50
+ };
51
+ handler: (params: ProbeParams) => Promise<ProbeResult>;
52
+ };
53
+ //# sourceMappingURL=codetree-probe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codetree-probe.d.ts","sourceRoot":"","sources":["../../../src/server/tools/codetree-probe.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;AAE1D,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IAC3D,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;sBAiB3D,WAAW,KAAG,OAAO,CAAC,WAAW,CAAC;EAuD7D"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Cheap presence probe — "does X mention Y?". Returns line numbers only,
3
+ * NEVER returns line content. Massively cheaper than search/read for triage.
4
+ */
5
+ export function createProbeTool(_config, indexer, db) {
6
+ return {
7
+ name: "codetree_probe",
8
+ description: "Cheap presence probe. Returns ONLY file paths + line numbers where the query appears. " +
9
+ "No content snippets. Use to answer 'does file X mention Y?' or 'where is Y referenced?' " +
10
+ "without paying the token cost of content snippets or full reads.",
11
+ inputSchema: {
12
+ type: "object",
13
+ properties: {
14
+ query: { type: "string", description: "Substring/identifier to look for (case-insensitive)." },
15
+ files: { type: "array", items: { type: "string" }, description: "Optional: restrict to these file paths." },
16
+ file_pattern: { type: "string", description: "Optional: substring pattern on file path." },
17
+ limit: { type: "number", description: "Max files in response (default 30)." },
18
+ },
19
+ required: ["query"],
20
+ },
21
+ handler: async (params) => {
22
+ const limit = params.limit ?? 30;
23
+ const q = params.query;
24
+ const qLower = q.toLowerCase();
25
+ // Candidate file set
26
+ const MAX_FALLBACK_FILES = 500;
27
+ let candidatePaths;
28
+ if (params.files && params.files.length > 0) {
29
+ candidatePaths = params.files;
30
+ }
31
+ else if (q.length >= 3) {
32
+ const candidates = indexer.filesContainingAny([q]);
33
+ if (candidates.size === 0) {
34
+ // Postings may be cold for non-identifier queries — fall back, but
35
+ // bounded to avoid full-corpus scans.
36
+ candidatePaths = db.getAllFiles().slice(0, MAX_FALLBACK_FILES).map((f) => f.path);
37
+ }
38
+ else {
39
+ candidatePaths = Array.from(candidates);
40
+ }
41
+ }
42
+ else {
43
+ // Too short for postings — bounded scan only.
44
+ candidatePaths = db.getAllFiles().slice(0, MAX_FALLBACK_FILES).map((f) => f.path);
45
+ }
46
+ if (params.file_pattern) {
47
+ const p = params.file_pattern.toLowerCase();
48
+ candidatePaths = candidatePaths.filter((fp) => fp.toLowerCase().includes(p));
49
+ }
50
+ const hits = [];
51
+ let filesScanned = 0;
52
+ let truncated = false;
53
+ for (const fp of candidatePaths) {
54
+ if (hits.length >= limit) {
55
+ truncated = true;
56
+ break;
57
+ }
58
+ filesScanned++;
59
+ const content = indexer.readCached(fp);
60
+ if (!content)
61
+ continue;
62
+ if (!content.toLowerCase().includes(qLower))
63
+ continue;
64
+ const lines = content.split("\n");
65
+ const lineNumbers = [];
66
+ for (let i = 0; i < lines.length; i++) {
67
+ if (lines[i].toLowerCase().includes(qLower)) {
68
+ lineNumbers.push(i + 1);
69
+ if (lineNumbers.length >= 20)
70
+ break; // cap per file
71
+ }
72
+ }
73
+ if (lineNumbers.length > 0) {
74
+ hits.push({ file_path: fp, line_numbers: lineNumbers });
75
+ }
76
+ }
77
+ return { query: q, hits, filesScanned, truncated };
78
+ },
79
+ };
80
+ }
81
+ //# sourceMappingURL=codetree-probe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codetree-probe.js","sourceRoot":"","sources":["../../../src/server/tools/codetree-probe.ts"],"names":[],"mappings":"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"}
@@ -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;EAyD3D"}
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,44 +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
56
- if (params.offset !== undefined || params.limit !== undefined) {
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
+ }
241
+ const hasRange = params.offset !== undefined || params.limit !== undefined;
242
+ let rangeStart = 0;
243
+ let rangeEnd = Infinity;
244
+ if (hasRange) {
57
245
  const lines = content.split("\n");
58
- const start = params.offset ?? 0;
59
- const end = params.limit ? start + params.limit : lines.length;
60
- content = lines.slice(start, end).join("\n");
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;
253
+ content = lines.slice(rangeStart, rangeEnd).join("\n");
61
254
  }
62
- // Get metadata
63
- const fileRecord = db.getFile(relPath);
64
- const symbols = db.getSymbolsForFile(relPath);
255
+ // Log read for session memory
256
+ try {
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);
260
+ }
261
+ }
262
+ catch { /* ignore */ }
263
+ const slicedSize = Buffer.byteLength(content, "utf-8");
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
+ };
278
+ }
279
+ const slicedLineCount = content.split("\n").length;
65
280
  return {
66
281
  content,
67
282
  source,
68
283
  path: relPath,
69
- lineCount: fileRecord?.line_count ?? content.split("\n").length,
70
- size: fileRecord?.size ?? Buffer.byteLength(content, "utf-8"),
284
+ hash: fileRecord?.hash ?? null,
285
+ lineCount: hasRange ? slicedLineCount : (fileRecord?.line_count ?? slicedLineCount),
286
+ size: hasRange ? slicedSize : (fileRecord?.size ?? slicedSize),
71
287
  language: fileRecord?.language ?? null,
72
- symbols: symbols.map((s) => ({
73
- name: s.name,
74
- kind: s.kind,
75
- line: s.line_start,
76
- signature: s.signature,
77
- })),
288
+ symbols: buildSymbols(rangeStart, rangeEnd === Infinity ? undefined : rangeEnd),
78
289
  };
79
290
  },
80
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;EA+D/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"}