duocode 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 (220) hide show
  1. package/.env.example +36 -0
  2. package/LICENSE +21 -0
  3. package/README.md +52 -0
  4. package/dist/ast/context.d.ts +16 -0
  5. package/dist/ast/context.js +37 -0
  6. package/dist/ast/context.js.map +1 -0
  7. package/dist/ast/diff.d.ts +27 -0
  8. package/dist/ast/diff.js +44 -0
  9. package/dist/ast/diff.js.map +1 -0
  10. package/dist/ast/locks.d.ts +47 -0
  11. package/dist/ast/locks.js +88 -0
  12. package/dist/ast/locks.js.map +1 -0
  13. package/dist/ast/merge.d.ts +22 -0
  14. package/dist/ast/merge.js +120 -0
  15. package/dist/ast/merge.js.map +1 -0
  16. package/dist/ast/ownership.d.ts +31 -0
  17. package/dist/ast/ownership.js +111 -0
  18. package/dist/ast/ownership.js.map +1 -0
  19. package/dist/ast/parser.d.ts +44 -0
  20. package/dist/ast/parser.js +134 -0
  21. package/dist/ast/parser.js.map +1 -0
  22. package/dist/cli.d.ts +2 -0
  23. package/dist/cli.js +423 -0
  24. package/dist/cli.js.map +1 -0
  25. package/dist/commands/doctor.d.ts +5 -0
  26. package/dist/commands/doctor.js +63 -0
  27. package/dist/commands/doctor.js.map +1 -0
  28. package/dist/commands/duo.d.ts +9 -0
  29. package/dist/commands/duo.js +285 -0
  30. package/dist/commands/duo.js.map +1 -0
  31. package/dist/commands/github.d.ts +2 -0
  32. package/dist/commands/github.js +85 -0
  33. package/dist/commands/github.js.map +1 -0
  34. package/dist/commands/init.d.ts +2 -0
  35. package/dist/commands/init.js +33 -0
  36. package/dist/commands/init.js.map +1 -0
  37. package/dist/commands/negotiation.d.ts +2 -0
  38. package/dist/commands/negotiation.js +160 -0
  39. package/dist/commands/negotiation.js.map +1 -0
  40. package/dist/commands/repl_commands.d.ts +26 -0
  41. package/dist/commands/repl_commands.js +226 -0
  42. package/dist/commands/repl_commands.js.map +1 -0
  43. package/dist/commands/shell.d.ts +1 -0
  44. package/dist/commands/shell.js +110 -0
  45. package/dist/commands/shell.js.map +1 -0
  46. package/dist/commands/start.d.ts +2 -0
  47. package/dist/commands/start.js +231 -0
  48. package/dist/commands/start.js.map +1 -0
  49. package/dist/commands/task.d.ts +2 -0
  50. package/dist/commands/task.js +215 -0
  51. package/dist/commands/task.js.map +1 -0
  52. package/dist/config/loader.d.ts +193 -0
  53. package/dist/config/loader.js +106 -0
  54. package/dist/config/loader.js.map +1 -0
  55. package/dist/context/project_context.d.ts +79 -0
  56. package/dist/context/project_context.js +292 -0
  57. package/dist/context/project_context.js.map +1 -0
  58. package/dist/context/token_budget.d.ts +35 -0
  59. package/dist/context/token_budget.js +81 -0
  60. package/dist/context/token_budget.js.map +1 -0
  61. package/dist/db/queries.d.ts +121 -0
  62. package/dist/db/queries.js +109 -0
  63. package/dist/db/queries.js.map +1 -0
  64. package/dist/db/schema.d.ts +110 -0
  65. package/dist/db/schema.js +346 -0
  66. package/dist/db/schema.js.map +1 -0
  67. package/dist/duo/duo_orchestrator.d.ts +50 -0
  68. package/dist/duo/duo_orchestrator.js +510 -0
  69. package/dist/duo/duo_orchestrator.js.map +1 -0
  70. package/dist/duo/duo_session.d.ts +47 -0
  71. package/dist/duo/duo_session.js +127 -0
  72. package/dist/duo/duo_session.js.map +1 -0
  73. package/dist/duo/duo_types.d.ts +168 -0
  74. package/dist/duo/duo_types.js +53 -0
  75. package/dist/duo/duo_types.js.map +1 -0
  76. package/dist/duo/session_store.d.ts +71 -0
  77. package/dist/duo/session_store.js +177 -0
  78. package/dist/duo/session_store.js.map +1 -0
  79. package/dist/git/worktree.d.ts +21 -0
  80. package/dist/git/worktree.js +86 -0
  81. package/dist/git/worktree.js.map +1 -0
  82. package/dist/github/cache.d.ts +23 -0
  83. package/dist/github/cache.js +67 -0
  84. package/dist/github/cache.js.map +1 -0
  85. package/dist/github/issues.d.ts +17 -0
  86. package/dist/github/issues.js +93 -0
  87. package/dist/github/issues.js.map +1 -0
  88. package/dist/github/mcp_client.d.ts +57 -0
  89. package/dist/github/mcp_client.js +214 -0
  90. package/dist/github/mcp_client.js.map +1 -0
  91. package/dist/github/sync.d.ts +11 -0
  92. package/dist/github/sync.js +65 -0
  93. package/dist/github/sync.js.map +1 -0
  94. package/dist/github/webhook.d.ts +25 -0
  95. package/dist/github/webhook.js +197 -0
  96. package/dist/github/webhook.js.map +1 -0
  97. package/dist/negotiation/index.d.ts +1 -0
  98. package/dist/negotiation/index.js +2 -0
  99. package/dist/negotiation/index.js.map +1 -0
  100. package/dist/negotiation/protocol.d.ts +62 -0
  101. package/dist/negotiation/protocol.js +188 -0
  102. package/dist/negotiation/protocol.js.map +1 -0
  103. package/dist/orchestrator/complexity_scorer.d.ts +2 -0
  104. package/dist/orchestrator/complexity_scorer.js +79 -0
  105. package/dist/orchestrator/complexity_scorer.js.map +1 -0
  106. package/dist/orchestrator/dependency_graph.d.ts +7 -0
  107. package/dist/orchestrator/dependency_graph.js +73 -0
  108. package/dist/orchestrator/dependency_graph.js.map +1 -0
  109. package/dist/orchestrator/intent_parser.d.ts +11 -0
  110. package/dist/orchestrator/intent_parser.js +116 -0
  111. package/dist/orchestrator/intent_parser.js.map +1 -0
  112. package/dist/orchestrator/task_runner.d.ts +56 -0
  113. package/dist/orchestrator/task_runner.js +181 -0
  114. package/dist/orchestrator/task_runner.js.map +1 -0
  115. package/dist/orchestrator/types.d.ts +44 -0
  116. package/dist/orchestrator/types.js +21 -0
  117. package/dist/orchestrator/types.js.map +1 -0
  118. package/dist/providers/anthropic.d.ts +12 -0
  119. package/dist/providers/anthropic.js +258 -0
  120. package/dist/providers/anthropic.js.map +1 -0
  121. package/dist/providers/auction.d.ts +42 -0
  122. package/dist/providers/auction.js +190 -0
  123. package/dist/providers/auction.js.map +1 -0
  124. package/dist/providers/base.d.ts +103 -0
  125. package/dist/providers/base.js +2 -0
  126. package/dist/providers/base.js.map +1 -0
  127. package/dist/providers/cost_tracker.d.ts +45 -0
  128. package/dist/providers/cost_tracker.js +111 -0
  129. package/dist/providers/cost_tracker.js.map +1 -0
  130. package/dist/providers/duo_pair_router.d.ts +11 -0
  131. package/dist/providers/duo_pair_router.js +67 -0
  132. package/dist/providers/duo_pair_router.js.map +1 -0
  133. package/dist/providers/factory.d.ts +7 -0
  134. package/dist/providers/factory.js +130 -0
  135. package/dist/providers/factory.js.map +1 -0
  136. package/dist/providers/grading_rubric.d.ts +37 -0
  137. package/dist/providers/grading_rubric.js +238 -0
  138. package/dist/providers/grading_rubric.js.map +1 -0
  139. package/dist/providers/openai.d.ts +12 -0
  140. package/dist/providers/openai.js +229 -0
  141. package/dist/providers/openai.js.map +1 -0
  142. package/dist/providers/openrouter.d.ts +14 -0
  143. package/dist/providers/openrouter.js +178 -0
  144. package/dist/providers/openrouter.js.map +1 -0
  145. package/dist/providers/performance_tracker.d.ts +21 -0
  146. package/dist/providers/performance_tracker.js +63 -0
  147. package/dist/providers/performance_tracker.js.map +1 -0
  148. package/dist/providers/registry_loader.d.ts +6 -0
  149. package/dist/providers/registry_loader.js +54 -0
  150. package/dist/providers/registry_loader.js.map +1 -0
  151. package/dist/providers/retry.d.ts +66 -0
  152. package/dist/providers/retry.js +203 -0
  153. package/dist/providers/retry.js.map +1 -0
  154. package/dist/providers/role_scorer.d.ts +16 -0
  155. package/dist/providers/role_scorer.js +16 -0
  156. package/dist/providers/role_scorer.js.map +1 -0
  157. package/dist/providers/router.d.ts +84 -0
  158. package/dist/providers/router.js +542 -0
  159. package/dist/providers/router.js.map +1 -0
  160. package/dist/security/credentials.d.ts +6 -0
  161. package/dist/security/credentials.js +16 -0
  162. package/dist/security/credentials.js.map +1 -0
  163. package/dist/setup/browser.d.ts +1 -0
  164. package/dist/setup/browser.js +12 -0
  165. package/dist/setup/browser.js.map +1 -0
  166. package/dist/setup/global_config.d.ts +14 -0
  167. package/dist/setup/global_config.js +54 -0
  168. package/dist/setup/global_config.js.map +1 -0
  169. package/dist/setup/wizard.d.ts +2 -0
  170. package/dist/setup/wizard.js +206 -0
  171. package/dist/setup/wizard.js.map +1 -0
  172. package/dist/tools/agent_loop.d.ts +38 -0
  173. package/dist/tools/agent_loop.js +72 -0
  174. package/dist/tools/agent_loop.js.map +1 -0
  175. package/dist/tools/approval.d.ts +64 -0
  176. package/dist/tools/approval.js +172 -0
  177. package/dist/tools/approval.js.map +1 -0
  178. package/dist/tools/checkpoint.d.ts +65 -0
  179. package/dist/tools/checkpoint.js +342 -0
  180. package/dist/tools/checkpoint.js.map +1 -0
  181. package/dist/tools/definitions.d.ts +13 -0
  182. package/dist/tools/definitions.js +103 -0
  183. package/dist/tools/definitions.js.map +1 -0
  184. package/dist/tools/diff_display.d.ts +46 -0
  185. package/dist/tools/diff_display.js +298 -0
  186. package/dist/tools/diff_display.js.map +1 -0
  187. package/dist/tools/executor.d.ts +12 -0
  188. package/dist/tools/executor.js +340 -0
  189. package/dist/tools/executor.js.map +1 -0
  190. package/dist/tools/permissions.d.ts +17 -0
  191. package/dist/tools/permissions.js +139 -0
  192. package/dist/tools/permissions.js.map +1 -0
  193. package/dist/tools/tool_types.d.ts +48 -0
  194. package/dist/tools/tool_types.js +7 -0
  195. package/dist/tools/tool_types.js.map +1 -0
  196. package/dist/ui/banner.d.ts +4 -0
  197. package/dist/ui/banner.js +104 -0
  198. package/dist/ui/banner.js.map +1 -0
  199. package/dist/ui/callbacks.d.ts +30 -0
  200. package/dist/ui/callbacks.js +132 -0
  201. package/dist/ui/callbacks.js.map +1 -0
  202. package/dist/ui/colors.d.ts +14 -0
  203. package/dist/ui/colors.js +28 -0
  204. package/dist/ui/colors.js.map +1 -0
  205. package/dist/ui/dashboard.d.ts +51 -0
  206. package/dist/ui/dashboard.js +181 -0
  207. package/dist/ui/dashboard.js.map +1 -0
  208. package/dist/ui/leaderboard.d.ts +16 -0
  209. package/dist/ui/leaderboard.js +43 -0
  210. package/dist/ui/leaderboard.js.map +1 -0
  211. package/dist/ui/logger.d.ts +28 -0
  212. package/dist/ui/logger.js +117 -0
  213. package/dist/ui/logger.js.map +1 -0
  214. package/dist/ui/progress.d.ts +16 -0
  215. package/dist/ui/progress.js +62 -0
  216. package/dist/ui/progress.js.map +1 -0
  217. package/dist/ui/tokenizer.d.ts +5 -0
  218. package/dist/ui/tokenizer.js +54 -0
  219. package/dist/ui/tokenizer.js.map +1 -0
  220. package/package.json +63 -0
@@ -0,0 +1,103 @@
1
+ export const TOOL_READ_FILE = {
2
+ name: "read_file",
3
+ description: "Read the contents of a file. Returns the file text with line numbers. " +
4
+ "Use offset/limit for large files.",
5
+ inputSchema: {
6
+ type: "object",
7
+ properties: {
8
+ path: { type: "string", description: "Absolute or project-relative file path" },
9
+ offset: { type: "number", description: "Line number to start reading from (1-based)" },
10
+ limit: { type: "number", description: "Maximum number of lines to read" },
11
+ },
12
+ required: ["path"],
13
+ },
14
+ };
15
+ export const TOOL_WRITE_FILE = {
16
+ name: "write_file",
17
+ description: "Create or overwrite a file with the given content. " +
18
+ "Creates parent directories if they don't exist.",
19
+ inputSchema: {
20
+ type: "object",
21
+ properties: {
22
+ path: { type: "string", description: "Absolute or project-relative file path" },
23
+ content: { type: "string", description: "Full file content to write" },
24
+ },
25
+ required: ["path", "content"],
26
+ },
27
+ };
28
+ export const TOOL_EDIT_FILE = {
29
+ name: "edit_file",
30
+ description: "Edit a file by replacing an exact string match with new text. " +
31
+ "The old_string must appear exactly once in the file.",
32
+ inputSchema: {
33
+ type: "object",
34
+ properties: {
35
+ path: { type: "string", description: "Absolute or project-relative file path" },
36
+ old_string: {
37
+ type: "string",
38
+ description: "Exact text to find (must be unique in the file)",
39
+ },
40
+ new_string: { type: "string", description: "Replacement text" },
41
+ },
42
+ required: ["path", "old_string", "new_string"],
43
+ },
44
+ };
45
+ export const TOOL_LIST_DIRECTORY = {
46
+ name: "list_directory",
47
+ description: "List files and directories at a path. " +
48
+ "Returns names with type indicators (/ for directories).",
49
+ inputSchema: {
50
+ type: "object",
51
+ properties: {
52
+ path: { type: "string", description: "Directory path to list" },
53
+ recursive: {
54
+ type: "boolean",
55
+ description: "List recursively (default false, max depth 3)",
56
+ },
57
+ },
58
+ required: ["path"],
59
+ },
60
+ };
61
+ export const TOOL_SEARCH_FILES = {
62
+ name: "search_files",
63
+ description: "Search file contents using a regex pattern. " +
64
+ "Returns matching lines with file paths and line numbers.",
65
+ inputSchema: {
66
+ type: "object",
67
+ properties: {
68
+ path: { type: "string", description: "Directory to search in" },
69
+ pattern: { type: "string", description: "Regex pattern to search for" },
70
+ glob: { type: "string", description: "File glob filter (e.g. '*.ts', '*.py')" },
71
+ },
72
+ required: ["path", "pattern"],
73
+ },
74
+ };
75
+ export const TOOL_RUN_COMMAND = {
76
+ name: "run_command",
77
+ description: "Execute a shell command and return stdout, stderr, and exit code. " +
78
+ "Use for builds, tests, linting, and other CLI operations.",
79
+ inputSchema: {
80
+ type: "object",
81
+ properties: {
82
+ command: { type: "string", description: "Shell command to execute" },
83
+ cwd: {
84
+ type: "string",
85
+ description: "Working directory (default: project root)",
86
+ },
87
+ timeout: {
88
+ type: "number",
89
+ description: "Timeout in milliseconds (default: 30000, max: 120000)",
90
+ },
91
+ },
92
+ required: ["command"],
93
+ },
94
+ };
95
+ export const ALL_TOOLS = [
96
+ TOOL_READ_FILE,
97
+ TOOL_WRITE_FILE,
98
+ TOOL_EDIT_FILE,
99
+ TOOL_LIST_DIRECTORY,
100
+ TOOL_SEARCH_FILES,
101
+ TOOL_RUN_COMMAND,
102
+ ];
103
+ //# sourceMappingURL=definitions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"definitions.js","sourceRoot":"","sources":["../../src/tools/definitions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Diff display engine — renders colored unified diffs in the terminal.
3
+ * Supports file creates, edits, and deletes.
4
+ */
5
+ import type { FileChange } from "./tool_types.js";
6
+ export interface DiffHunk {
7
+ oldStart: number;
8
+ oldCount: number;
9
+ newStart: number;
10
+ newCount: number;
11
+ lines: DiffLine[];
12
+ }
13
+ export interface DiffLine {
14
+ type: "context" | "add" | "remove";
15
+ content: string;
16
+ oldLineNo?: number;
17
+ newLineNo?: number;
18
+ }
19
+ /**
20
+ * Compute unified diff hunks between two strings.
21
+ * Uses a simple LCS-based approach with configurable context lines.
22
+ */
23
+ export declare function computeDiff(oldText: string, newText: string, contextLines?: number): DiffHunk[];
24
+ export interface RenderOptions {
25
+ /** Show line numbers (default true) */
26
+ lineNumbers?: boolean;
27
+ /** Max lines per hunk before truncation (default 50) */
28
+ maxHunkLines?: number;
29
+ /** Colorize output (default true) */
30
+ color?: boolean;
31
+ }
32
+ /**
33
+ * Render a FileChange as a colored unified diff string.
34
+ */
35
+ export declare function renderFileChange(change: FileChange, opts?: RenderOptions): string;
36
+ /**
37
+ * Render a batch of file changes with a summary header.
38
+ */
39
+ export declare function renderChangeSummary(changes: FileChange[], opts?: RenderOptions): string;
40
+ /**
41
+ * Count net lines added/removed across a batch of changes.
42
+ */
43
+ export declare function countLineChanges(changes: FileChange[]): {
44
+ added: number;
45
+ removed: number;
46
+ };
@@ -0,0 +1,298 @@
1
+ const R = "\x1b[0m";
2
+ const B = "\x1b[1m";
3
+ const DM = "\x1b[2m";
4
+ const RED = "\x1b[91m";
5
+ const GRN = "\x1b[92m";
6
+ const CYN = "\x1b[96m";
7
+ const YLW = "\x1b[93m";
8
+ const BLU = "\x1b[94m";
9
+ /**
10
+ * Compute unified diff hunks between two strings.
11
+ * Uses a simple LCS-based approach with configurable context lines.
12
+ */
13
+ export function computeDiff(oldText, newText, contextLines = 3) {
14
+ const oldLines = oldText.split("\n");
15
+ const newLines = newText.split("\n");
16
+ // LCS table (Myers would be faster but this is clear and correct)
17
+ const m = oldLines.length;
18
+ const n = newLines.length;
19
+ const dp = Array.from({ length: m + 1 }, () => new Array(n + 1).fill(0));
20
+ for (let i = 1; i <= m; i++) {
21
+ for (let j = 1; j <= n; j++) {
22
+ if (oldLines[i - 1] === newLines[j - 1]) {
23
+ dp[i][j] = dp[i - 1][j - 1] + 1;
24
+ }
25
+ else {
26
+ dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
27
+ }
28
+ }
29
+ }
30
+ // Backtrack to produce diff ops
31
+ const ops = [];
32
+ let i = m;
33
+ let j = n;
34
+ while (i > 0 || j > 0) {
35
+ if (i > 0 && j > 0 && oldLines[i - 1] === newLines[j - 1]) {
36
+ ops.push({ type: "context", oldIdx: i - 1, newIdx: j - 1 });
37
+ i--;
38
+ j--;
39
+ }
40
+ else if (j > 0 && (i === 0 || dp[i][j - 1] >= dp[i - 1][j])) {
41
+ ops.push({ type: "add", newIdx: j - 1 });
42
+ j--;
43
+ }
44
+ else {
45
+ ops.push({ type: "remove", oldIdx: i - 1 });
46
+ i--;
47
+ }
48
+ }
49
+ ops.reverse();
50
+ // Mark which ops are "changed" (add or remove)
51
+ const changed = new Set();
52
+ for (let idx = 0; idx < ops.length; idx++) {
53
+ if (ops[idx].type !== "context")
54
+ changed.add(idx);
55
+ }
56
+ if (changed.size === 0)
57
+ return [];
58
+ // Group into hunks with context
59
+ const hunks = [];
60
+ let hunkStart = -1;
61
+ let hunkEnd = -1;
62
+ for (const idx of changed) {
63
+ const rangeStart = Math.max(0, idx - contextLines);
64
+ const rangeEnd = Math.min(ops.length - 1, idx + contextLines);
65
+ if (hunkStart === -1 || rangeStart > hunkEnd + 1) {
66
+ // New hunk
67
+ if (hunkStart !== -1) {
68
+ hunks.push(buildHunk(ops, oldLines, newLines, hunkStart, hunkEnd));
69
+ }
70
+ hunkStart = rangeStart;
71
+ hunkEnd = rangeEnd;
72
+ }
73
+ else {
74
+ hunkEnd = Math.max(hunkEnd, rangeEnd);
75
+ }
76
+ }
77
+ if (hunkStart !== -1) {
78
+ hunks.push(buildHunk(ops, oldLines, newLines, hunkStart, hunkEnd));
79
+ }
80
+ return hunks;
81
+ }
82
+ function buildHunk(ops, oldLines, newLines, start, end) {
83
+ const lines = [];
84
+ let oldStart = Infinity;
85
+ let newStart = Infinity;
86
+ let oldCount = 0;
87
+ let newCount = 0;
88
+ for (let idx = start; idx <= end; idx++) {
89
+ const op = ops[idx];
90
+ if (op.type === "context") {
91
+ const lineNo = op.oldIdx;
92
+ const newLineNo = op.newIdx;
93
+ if (lineNo < oldStart)
94
+ oldStart = lineNo;
95
+ if (newLineNo < newStart)
96
+ newStart = newLineNo;
97
+ oldCount++;
98
+ newCount++;
99
+ lines.push({
100
+ type: "context",
101
+ content: oldLines[lineNo],
102
+ oldLineNo: lineNo + 1,
103
+ newLineNo: newLineNo + 1,
104
+ });
105
+ }
106
+ else if (op.type === "remove") {
107
+ const lineNo = op.oldIdx;
108
+ if (lineNo < oldStart)
109
+ oldStart = lineNo;
110
+ oldCount++;
111
+ lines.push({
112
+ type: "remove",
113
+ content: oldLines[lineNo],
114
+ oldLineNo: lineNo + 1,
115
+ });
116
+ }
117
+ else {
118
+ const lineNo = op.newIdx;
119
+ if (lineNo < newStart)
120
+ newStart = lineNo;
121
+ newCount++;
122
+ lines.push({
123
+ type: "add",
124
+ content: newLines[lineNo],
125
+ newLineNo: lineNo + 1,
126
+ });
127
+ }
128
+ }
129
+ // Handle edge: if only adds, oldStart stays Infinity
130
+ if (oldStart === Infinity)
131
+ oldStart = 0;
132
+ if (newStart === Infinity)
133
+ newStart = 0;
134
+ return {
135
+ oldStart: oldStart + 1,
136
+ oldCount,
137
+ newStart: newStart + 1,
138
+ newCount,
139
+ lines,
140
+ };
141
+ }
142
+ /**
143
+ * Render a FileChange as a colored unified diff string.
144
+ */
145
+ export function renderFileChange(change, opts = {}) {
146
+ const color = opts.color !== false;
147
+ const lineNumbers = opts.lineNumbers !== false;
148
+ const maxHunkLines = opts.maxHunkLines ?? 50;
149
+ const parts = [];
150
+ // Header
151
+ if (change.type === "create") {
152
+ parts.push(color
153
+ ? `${GRN}${B}+++ new file: ${change.filePath}${R}`
154
+ : `+++ new file: ${change.filePath}`);
155
+ }
156
+ else if (change.type === "delete") {
157
+ parts.push(color
158
+ ? `${RED}${B}--- deleted: ${change.filePath}${R}`
159
+ : `--- deleted: ${change.filePath}`);
160
+ }
161
+ else {
162
+ parts.push(color
163
+ ? `${CYN}${B}--- a/${change.filePath}${R}`
164
+ : `--- a/${change.filePath}`);
165
+ parts.push(color
166
+ ? `${CYN}${B}+++ b/${change.filePath}${R}`
167
+ : `+++ b/${change.filePath}`);
168
+ }
169
+ if (change.editDescription) {
170
+ parts.push(color
171
+ ? `${DM} ${change.editDescription}${R}`
172
+ : ` ${change.editDescription}`);
173
+ }
174
+ // For creates, show a compact preview
175
+ if (change.type === "create" && change.newContent) {
176
+ const lines = change.newContent.split("\n");
177
+ const shown = lines.slice(0, maxHunkLines);
178
+ for (let i = 0; i < shown.length; i++) {
179
+ const ln = lineNumbers ? `${String(i + 1).padStart(4)} ` : "";
180
+ parts.push(color
181
+ ? `${GRN}+ ${ln}${shown[i]}${R}`
182
+ : `+ ${ln}${shown[i]}`);
183
+ }
184
+ if (lines.length > maxHunkLines) {
185
+ parts.push(color
186
+ ? `${DM} ... ${lines.length - maxHunkLines} more lines${R}`
187
+ : ` ... ${lines.length - maxHunkLines} more lines`);
188
+ }
189
+ return parts.join("\n");
190
+ }
191
+ // For deletes, show a compact preview
192
+ if (change.type === "delete" && change.oldContent) {
193
+ const lines = change.oldContent.split("\n");
194
+ const shown = lines.slice(0, maxHunkLines);
195
+ for (let i = 0; i < shown.length; i++) {
196
+ const ln = lineNumbers ? `${String(i + 1).padStart(4)} ` : "";
197
+ parts.push(color
198
+ ? `${RED}- ${ln}${shown[i]}${R}`
199
+ : `- ${ln}${shown[i]}`);
200
+ }
201
+ if (lines.length > maxHunkLines) {
202
+ parts.push(color
203
+ ? `${DM} ... ${lines.length - maxHunkLines} more lines${R}`
204
+ : ` ... ${lines.length - maxHunkLines} more lines`);
205
+ }
206
+ return parts.join("\n");
207
+ }
208
+ // For edits, compute and render hunks
209
+ if (change.type === "edit" && change.oldContent !== null && change.newContent !== null) {
210
+ const hunks = computeDiff(change.oldContent, change.newContent);
211
+ if (hunks.length === 0) {
212
+ parts.push(color ? `${DM} (no changes)${R}` : " (no changes)");
213
+ return parts.join("\n");
214
+ }
215
+ for (const hunk of hunks) {
216
+ // Hunk header
217
+ const header = `@@ -${hunk.oldStart},${hunk.oldCount} +${hunk.newStart},${hunk.newCount} @@`;
218
+ parts.push(color ? `${BLU}${header}${R}` : header);
219
+ const visibleLines = hunk.lines.slice(0, maxHunkLines);
220
+ for (const line of visibleLines) {
221
+ const ln = lineNumbers
222
+ ? `${String(line.oldLineNo ?? line.newLineNo ?? "").padStart(4)} `
223
+ : "";
224
+ if (line.type === "add") {
225
+ parts.push(color ? `${GRN}+ ${ln}${line.content}${R}` : `+ ${ln}${line.content}`);
226
+ }
227
+ else if (line.type === "remove") {
228
+ parts.push(color ? `${RED}- ${ln}${line.content}${R}` : `- ${ln}${line.content}`);
229
+ }
230
+ else {
231
+ parts.push(color ? `${DM} ${ln}${line.content}${R}` : ` ${ln}${line.content}`);
232
+ }
233
+ }
234
+ if (hunk.lines.length > maxHunkLines) {
235
+ parts.push(color
236
+ ? `${DM} ... ${hunk.lines.length - maxHunkLines} more lines in hunk${R}`
237
+ : ` ... ${hunk.lines.length - maxHunkLines} more lines in hunk`);
238
+ }
239
+ }
240
+ }
241
+ return parts.join("\n");
242
+ }
243
+ /**
244
+ * Render a batch of file changes with a summary header.
245
+ */
246
+ export function renderChangeSummary(changes, opts = {}) {
247
+ const color = opts.color !== false;
248
+ const parts = [];
249
+ const creates = changes.filter((c) => c.type === "create").length;
250
+ const edits = changes.filter((c) => c.type === "edit").length;
251
+ const deletes = changes.filter((c) => c.type === "delete").length;
252
+ parts.push(color
253
+ ? `${B}${CYN}Proposed changes${R} ${DM}(${changes.length} files)${R}`
254
+ : `Proposed changes (${changes.length} files)`);
255
+ const summary = [];
256
+ if (creates > 0)
257
+ summary.push(color ? `${GRN}+${creates} new${R}` : `+${creates} new`);
258
+ if (edits > 0)
259
+ summary.push(color ? `${YLW}~${edits} modified${R}` : `~${edits} modified`);
260
+ if (deletes > 0)
261
+ summary.push(color ? `${RED}-${deletes} deleted${R}` : `-${deletes} deleted`);
262
+ if (summary.length > 0)
263
+ parts.push(` ${summary.join(" ")}`);
264
+ parts.push("");
265
+ for (const change of changes) {
266
+ parts.push(renderFileChange(change, opts));
267
+ parts.push("");
268
+ }
269
+ return parts.join("\n");
270
+ }
271
+ /**
272
+ * Count net lines added/removed across a batch of changes.
273
+ */
274
+ export function countLineChanges(changes) {
275
+ let added = 0;
276
+ let removed = 0;
277
+ for (const change of changes) {
278
+ if (change.type === "create" && change.newContent) {
279
+ added += change.newContent.split("\n").length;
280
+ }
281
+ else if (change.type === "delete" && change.oldContent) {
282
+ removed += change.oldContent.split("\n").length;
283
+ }
284
+ else if (change.type === "edit" && change.oldContent !== null && change.newContent !== null) {
285
+ const hunks = computeDiff(change.oldContent, change.newContent);
286
+ for (const hunk of hunks) {
287
+ for (const line of hunk.lines) {
288
+ if (line.type === "add")
289
+ added++;
290
+ if (line.type === "remove")
291
+ removed++;
292
+ }
293
+ }
294
+ }
295
+ }
296
+ return { added, removed };
297
+ }
298
+ //# sourceMappingURL=diff_display.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff_display.js","sourceRoot":"","sources":["../../src/tools/diff_display.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { ToolCall } from "../providers/base.js";
2
+ import type { ToolResult, FileChange } from "./tool_types.js";
3
+ import type { PermissionConfig } from "./permissions.js";
4
+ export interface ExecutorContext {
5
+ projectRoot: string;
6
+ permissions: PermissionConfig;
7
+ /** Accumulates file changes for diff display / rollback */
8
+ fileChanges: FileChange[];
9
+ maxFileReadBytes?: number;
10
+ maxCommandOutputBytes?: number;
11
+ }
12
+ export declare function executeTool(ctx: ExecutorContext, call: ToolCall): Promise<ToolResult>;