chivgent 1.0.0 → 1.0.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 (177) hide show
  1. package/README.md +136 -907
  2. package/README.zh-CN.md +25 -2
  3. package/dist/agent.d.ts +14 -1
  4. package/dist/agent.d.ts.map +1 -1
  5. package/dist/agent.js +195 -28
  6. package/dist/agent.js.map +1 -1
  7. package/dist/cli-options.d.ts +2 -0
  8. package/dist/cli-options.d.ts.map +1 -1
  9. package/dist/cli-options.js +12 -2
  10. package/dist/cli-options.js.map +1 -1
  11. package/dist/cli-runtime.d.ts +24 -0
  12. package/dist/cli-runtime.d.ts.map +1 -0
  13. package/dist/cli-runtime.js +64 -0
  14. package/dist/cli-runtime.js.map +1 -0
  15. package/dist/cli.js +20 -72
  16. package/dist/cli.js.map +1 -1
  17. package/dist/context/compaction.d.ts +5 -2
  18. package/dist/context/compaction.d.ts.map +1 -1
  19. package/dist/context/compaction.js +58 -32
  20. package/dist/context/compaction.js.map +1 -1
  21. package/dist/context/context-manager.d.ts +2 -0
  22. package/dist/context/context-manager.d.ts.map +1 -1
  23. package/dist/context/context-manager.js +4 -3
  24. package/dist/context/context-manager.js.map +1 -1
  25. package/dist/context/project-instructions.d.ts +17 -0
  26. package/dist/context/project-instructions.d.ts.map +1 -0
  27. package/dist/context/project-instructions.js +191 -0
  28. package/dist/context/project-instructions.js.map +1 -0
  29. package/dist/evals/baseline.d.ts +41 -0
  30. package/dist/evals/baseline.d.ts.map +1 -0
  31. package/dist/evals/baseline.js +121 -0
  32. package/dist/evals/baseline.js.map +1 -0
  33. package/dist/evals/cli.js +27 -1
  34. package/dist/evals/cli.js.map +1 -1
  35. package/dist/evals/parse-args.d.ts +2 -0
  36. package/dist/evals/parse-args.d.ts.map +1 -1
  37. package/dist/evals/parse-args.js +5 -0
  38. package/dist/evals/parse-args.js.map +1 -1
  39. package/dist/evals/report.d.ts +2 -0
  40. package/dist/evals/report.d.ts.map +1 -1
  41. package/dist/evals/report.js +12 -8
  42. package/dist/evals/report.js.map +1 -1
  43. package/dist/evals/runner.d.ts +3 -0
  44. package/dist/evals/runner.d.ts.map +1 -1
  45. package/dist/evals/runner.js +5 -1
  46. package/dist/evals/runner.js.map +1 -1
  47. package/dist/evals/task.d.ts.map +1 -1
  48. package/dist/evals/task.js +1 -0
  49. package/dist/evals/task.js.map +1 -1
  50. package/dist/evals/tools.d.ts +4 -1
  51. package/dist/evals/tools.d.ts.map +1 -1
  52. package/dist/evals/tools.js +11 -4
  53. package/dist/evals/tools.js.map +1 -1
  54. package/dist/events.d.ts +7 -1
  55. package/dist/events.d.ts.map +1 -1
  56. package/dist/events.js.map +1 -1
  57. package/dist/patch/parse.d.ts +26 -0
  58. package/dist/patch/parse.d.ts.map +1 -0
  59. package/dist/patch/parse.js +117 -0
  60. package/dist/patch/parse.js.map +1 -0
  61. package/dist/prompts.d.ts +2 -2
  62. package/dist/prompts.d.ts.map +1 -1
  63. package/dist/prompts.js +4 -3
  64. package/dist/prompts.js.map +1 -1
  65. package/dist/repl.d.ts +12 -1
  66. package/dist/repl.d.ts.map +1 -1
  67. package/dist/repl.js +305 -4
  68. package/dist/repl.js.map +1 -1
  69. package/dist/session-store.d.ts +6 -2
  70. package/dist/session-store.d.ts.map +1 -1
  71. package/dist/session-store.js +5 -1
  72. package/dist/session-store.js.map +1 -1
  73. package/dist/session.d.ts +1 -0
  74. package/dist/session.d.ts.map +1 -1
  75. package/dist/session.js +38 -12
  76. package/dist/session.js.map +1 -1
  77. package/dist/shell/approval.d.ts +15 -0
  78. package/dist/shell/approval.d.ts.map +1 -0
  79. package/dist/shell/approval.js +25 -0
  80. package/dist/shell/approval.js.map +1 -0
  81. package/dist/shell/docker.d.ts +18 -0
  82. package/dist/shell/docker.d.ts.map +1 -0
  83. package/dist/shell/docker.js +83 -0
  84. package/dist/shell/docker.js.map +1 -0
  85. package/dist/shell/local.d.ts +1 -1
  86. package/dist/shell/local.d.ts.map +1 -1
  87. package/dist/shell/local.js +1 -1
  88. package/dist/shell/local.js.map +1 -1
  89. package/dist/tools/apply-patch.d.ts +18 -0
  90. package/dist/tools/apply-patch.d.ts.map +1 -0
  91. package/dist/tools/apply-patch.js +53 -0
  92. package/dist/tools/apply-patch.js.map +1 -0
  93. package/dist/tools/bash.d.ts +4 -0
  94. package/dist/tools/bash.d.ts.map +1 -1
  95. package/dist/tools/bash.js +28 -3
  96. package/dist/tools/bash.js.map +1 -1
  97. package/dist/tools/parallel.d.ts +14 -0
  98. package/dist/tools/parallel.d.ts.map +1 -0
  99. package/dist/tools/parallel.js +20 -0
  100. package/dist/tools/parallel.js.map +1 -0
  101. package/dist/tools/tool.d.ts +7 -0
  102. package/dist/tools/tool.d.ts.map +1 -1
  103. package/dist/tools/tool.js +7 -1
  104. package/dist/tools/tool.js.map +1 -1
  105. package/dist/tools/update-plan.d.ts +57 -0
  106. package/dist/tools/update-plan.d.ts.map +1 -0
  107. package/dist/tools/update-plan.js +99 -0
  108. package/dist/tools/update-plan.js.map +1 -0
  109. package/dist/tui/activity.d.ts +17 -0
  110. package/dist/tui/activity.d.ts.map +1 -0
  111. package/dist/tui/activity.js +188 -0
  112. package/dist/tui/activity.js.map +1 -0
  113. package/dist/tui/diff.d.ts +14 -0
  114. package/dist/tui/diff.d.ts.map +1 -0
  115. package/dist/tui/diff.js +57 -0
  116. package/dist/tui/diff.js.map +1 -0
  117. package/dist/tui/editor-input.d.ts +53 -0
  118. package/dist/tui/editor-input.d.ts.map +1 -0
  119. package/dist/tui/editor-input.js +353 -0
  120. package/dist/tui/editor-input.js.map +1 -0
  121. package/dist/tui/editor.d.ts +72 -0
  122. package/dist/tui/editor.d.ts.map +1 -0
  123. package/dist/tui/editor.js +321 -0
  124. package/dist/tui/editor.js.map +1 -0
  125. package/dist/tui/git-diff.d.ts +7 -0
  126. package/dist/tui/git-diff.d.ts.map +1 -0
  127. package/dist/tui/git-diff.js +48 -0
  128. package/dist/tui/git-diff.js.map +1 -0
  129. package/dist/tui/input.d.ts +14 -0
  130. package/dist/tui/input.d.ts.map +1 -1
  131. package/dist/tui/input.js +77 -1
  132. package/dist/tui/input.js.map +1 -1
  133. package/dist/tui/live.d.ts +8 -0
  134. package/dist/tui/live.d.ts.map +1 -1
  135. package/dist/tui/live.js +37 -5
  136. package/dist/tui/live.js.map +1 -1
  137. package/dist/tui/markdown.d.ts +7 -0
  138. package/dist/tui/markdown.d.ts.map +1 -0
  139. package/dist/tui/markdown.js +55 -0
  140. package/dist/tui/markdown.js.map +1 -0
  141. package/dist/tui/menu.js +1 -1
  142. package/dist/tui/review.d.ts +27 -0
  143. package/dist/tui/review.d.ts.map +1 -0
  144. package/dist/tui/review.js +114 -0
  145. package/dist/tui/review.js.map +1 -0
  146. package/dist/tui/slash.d.ts +11 -0
  147. package/dist/tui/slash.d.ts.map +1 -0
  148. package/dist/tui/slash.js +13 -0
  149. package/dist/tui/slash.js.map +1 -0
  150. package/dist/tui/state.d.ts +5 -0
  151. package/dist/tui/state.d.ts.map +1 -1
  152. package/dist/tui/state.js +10 -1
  153. package/dist/tui/state.js.map +1 -1
  154. package/dist/tui/syntax.d.ts +6 -0
  155. package/dist/tui/syntax.d.ts.map +1 -0
  156. package/dist/tui/syntax.js +48 -0
  157. package/dist/tui/syntax.js.map +1 -0
  158. package/dist/tui/view.d.ts +1 -1
  159. package/dist/tui/view.d.ts.map +1 -1
  160. package/dist/tui/view.js +21 -9
  161. package/dist/tui/view.js.map +1 -1
  162. package/dist/tui/welcome.d.ts +5 -0
  163. package/dist/tui/welcome.d.ts.map +1 -1
  164. package/dist/tui/welcome.js +35 -20
  165. package/dist/tui/welcome.js.map +1 -1
  166. package/dist/workspace/patch.d.ts +11 -0
  167. package/dist/workspace/patch.d.ts.map +1 -0
  168. package/dist/workspace/patch.js +124 -0
  169. package/dist/workspace/patch.js.map +1 -0
  170. package/dist/workspace/types.d.ts +7 -0
  171. package/dist/workspace/types.d.ts.map +1 -1
  172. package/dist/workspace/types.js.map +1 -1
  173. package/dist/workspace.d.ts +2 -1
  174. package/dist/workspace.d.ts.map +1 -1
  175. package/dist/workspace.js +5 -0
  176. package/dist/workspace.js.map +1 -1
  177. package/package.json +1 -1
@@ -0,0 +1,57 @@
1
+ import type { Tool, ToolContext, ToolOutput } from "./tool.js";
2
+ /** A bounded, structured task checklist. It never grants permission to act. */
3
+ export type PlanStepStatus = "pending" | "in_progress" | "completed";
4
+ export interface PlanStep {
5
+ readonly step: string;
6
+ readonly status: PlanStepStatus;
7
+ }
8
+ export interface PlanUpdate {
9
+ readonly plan: readonly PlanStep[];
10
+ readonly explanation?: string;
11
+ }
12
+ /** Parsed snapshots are immutable to callers, loggers and event listeners. */
13
+ export declare function parsePlanUpdate(value: unknown): PlanUpdate | undefined;
14
+ /**
15
+ * Similar to Codex's update_plan checklist tool, NOT Codex's separate Plan Mode.
16
+ * The whole plan is replaced only after strict validation succeeds.
17
+ */
18
+ export declare class UpdatePlanTool implements Tool {
19
+ readonly name = "update_plan";
20
+ readonly description = "Publish or update a concise checklist for a multi-step task. Supply all steps and their statuses. Only one may be in_progress. Do not use for trivial tasks; this tool cannot change files or grant permissions.";
21
+ readonly inputSchema: {
22
+ readonly type: "object";
23
+ readonly properties: {
24
+ readonly explanation: {
25
+ readonly type: "string";
26
+ readonly maxLength: 400;
27
+ readonly description: "Optional brief reason for changing the plan.";
28
+ };
29
+ readonly plan: {
30
+ readonly type: "array";
31
+ readonly minItems: 1;
32
+ readonly maxItems: 8;
33
+ readonly items: {
34
+ readonly type: "object";
35
+ readonly properties: {
36
+ readonly step: {
37
+ readonly type: "string";
38
+ readonly minLength: 1;
39
+ readonly maxLength: 160;
40
+ };
41
+ readonly status: {
42
+ readonly type: "string";
43
+ readonly enum: readonly ["pending", "in_progress", "completed"];
44
+ };
45
+ };
46
+ readonly required: readonly ["step", "status"];
47
+ readonly additionalProperties: false;
48
+ };
49
+ readonly description: "Complete current checklist; at most one step in_progress.";
50
+ };
51
+ };
52
+ readonly required: readonly ["plan"];
53
+ readonly additionalProperties: false;
54
+ };
55
+ execute(value: unknown, context: ToolContext): Promise<ToolOutput>;
56
+ }
57
+ //# sourceMappingURL=update-plan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-plan.d.ts","sourceRoot":"","sources":["../../src/tools/update-plan.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAE/D,+EAA+E;AAC/E,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,aAAa,GAAG,WAAW,CAAC;AAErE,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;CACjC;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,SAAS,QAAQ,EAAE,CAAC;IACnC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAMD,8EAA8E;AAC9E,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,UAAU,GAAG,SAAS,CAgCtE;AA8BD;;;GAGG;AACH,qBAAa,cAAe,YAAW,IAAI;IACzC,QAAQ,CAAC,IAAI,iBAAiB;IAC9B,QAAQ,CAAC,WAAW,sNAAsN;IAC1O,QAAQ,CAAC,WAAW;uBAlCd,QAAQ;;qBAEZ,WAAW;yBACT,IAAI,EAAE,QAAQ;yBACd,SAAS;yBACT,WAAW,EAAE,8CAA8C;;qBAE7D,IAAI;yBACF,IAAI,EAAE,OAAO;yBAAE,QAAQ,EAAE,CAAC;yBAAE,QAAQ;yBACpC,KAAK;6BACH,IAAI,EAAE,QAAQ;6BACd,UAAU;iCACR,IAAI;qCAAI,IAAI,EAAE,QAAQ;qCAAE,SAAS,EAAE,CAAC;qCAAE,SAAS;;iCAC/C,MAAM;qCACJ,IAAI,EAAE,QAAQ;qCAAE,IAAI,YAAG,SAAS,EAAE,aAAa,EAAE,WAAW;;;6BAGhE,QAAQ,YAAG,MAAM,EAAE,QAAQ;6BAC3B,oBAAoB;;yBAEtB,WAAW,EAAE,2DAA2D;;;qCAGjE,MAAM;;MAWkB;IAE7B,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAYvE;CACF"}
@@ -0,0 +1,99 @@
1
+ const MAX_STEPS = 8;
2
+ const MAX_STEP_LENGTH = 160;
3
+ const MAX_EXPLANATION_LENGTH = 400;
4
+ /** Parsed snapshots are immutable to callers, loggers and event listeners. */
5
+ export function parsePlanUpdate(value) {
6
+ if (typeof value !== "object" || value === null || Array.isArray(value))
7
+ return undefined;
8
+ const record = value;
9
+ if (Object.keys(record).some(key => key !== "plan" && key !== "explanation"))
10
+ return undefined;
11
+ const plan = record.plan;
12
+ if (!Array.isArray(plan) || plan.length < 1 || plan.length > MAX_STEPS)
13
+ return undefined;
14
+ const explanation = record.explanation;
15
+ if (explanation !== undefined &&
16
+ (typeof explanation !== "string" || explanation.length > MAX_EXPLANATION_LENGTH ||
17
+ /[\x00-\x1f\x7f]/.test(explanation)))
18
+ return undefined;
19
+ const steps = [];
20
+ const unique = new Set();
21
+ let active = 0;
22
+ for (const value of plan) {
23
+ if (typeof value !== "object" || value === null || Array.isArray(value))
24
+ return undefined;
25
+ const row = value;
26
+ if (Object.keys(row).some(key => key !== "step" && key !== "status"))
27
+ return undefined;
28
+ if (typeof row.step !== "string" || row.step.trim().length === 0 ||
29
+ row.step.length > MAX_STEP_LENGTH || /[\x00-\x1f\x7f]/.test(row.step))
30
+ return undefined;
31
+ if (row.status !== "pending" && row.status !== "in_progress" && row.status !== "completed")
32
+ return undefined;
33
+ const step = row.step.trim();
34
+ const key = step.toLocaleLowerCase("en");
35
+ if (unique.has(key))
36
+ return undefined;
37
+ unique.add(key);
38
+ if (row.status === "in_progress")
39
+ active += 1;
40
+ if (active > 1)
41
+ return undefined;
42
+ steps.push({ step, status: row.status });
43
+ }
44
+ return {
45
+ plan: steps,
46
+ ...(explanation === undefined ? {} : { explanation: explanation }),
47
+ };
48
+ }
49
+ const inputSchema = {
50
+ type: "object",
51
+ properties: {
52
+ explanation: {
53
+ type: "string",
54
+ maxLength: MAX_EXPLANATION_LENGTH,
55
+ description: "Optional brief reason for changing the plan.",
56
+ },
57
+ plan: {
58
+ type: "array", minItems: 1, maxItems: MAX_STEPS,
59
+ items: {
60
+ type: "object",
61
+ properties: {
62
+ step: { type: "string", minLength: 1, maxLength: MAX_STEP_LENGTH },
63
+ status: {
64
+ type: "string", enum: ["pending", "in_progress", "completed"],
65
+ },
66
+ },
67
+ required: ["step", "status"],
68
+ additionalProperties: false,
69
+ },
70
+ description: "Complete current checklist; at most one step in_progress.",
71
+ },
72
+ },
73
+ required: ["plan"],
74
+ additionalProperties: false,
75
+ };
76
+ /**
77
+ * Similar to Codex's update_plan checklist tool, NOT Codex's separate Plan Mode.
78
+ * The whole plan is replaced only after strict validation succeeds.
79
+ */
80
+ export class UpdatePlanTool {
81
+ name = "update_plan";
82
+ description = "Publish or update a concise checklist for a multi-step task. Supply all steps and their statuses. Only one may be in_progress. Do not use for trivial tasks; this tool cannot change files or grant permissions.";
83
+ inputSchema = inputSchema;
84
+ async execute(value, context) {
85
+ if (context.signal?.aborted)
86
+ return { content: "Plan update cancelled.", isError: true };
87
+ const update = parsePlanUpdate(value);
88
+ if (update === undefined) {
89
+ return {
90
+ content: "Invalid plan. Supply 1–8 unique nonempty steps (max 160 characters each), allowed statuses pending/in_progress/completed, and at most one in_progress. No extra fields or control characters.",
91
+ isError: true,
92
+ };
93
+ }
94
+ context.onPlanUpdate?.(structuredClone(update));
95
+ const completed = update.plan.filter(step => step.status === "completed").length;
96
+ return { content: `Plan updated: ${completed}/${update.plan.length} steps completed.`, isError: false };
97
+ }
98
+ }
99
+ //# sourceMappingURL=update-plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-plan.js","sourceRoot":"","sources":["../../src/tools/update-plan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { ToolCall, ToolResultMessage } from "../messages.js";
2
+ /** A bounded, outcome-oriented summary of one completed tool batch. */
3
+ export declare function toolTranscript(calls: readonly ToolCall[], results: readonly ToolResultMessage[], width?: number): readonly string[];
4
+ /** Display Shell approvals as bounded, control-safe content instead of raw commands. */
5
+ export declare function approvalPreview(command: string, columns: number): string;
6
+ /**
7
+ * Apply theme colors *after* sanitizing untrusted tool text. Keep this outside
8
+ * the pure layout model, so the Painter's line diffing and terminal widths
9
+ * are never based on escape sequences supplied by a tool.
10
+ */
11
+ export declare function colorizeActivity(lines: readonly string[], enabled: boolean): string;
12
+ /**
13
+ * Review must show the *entire* command. Truncating potentially dangerous
14
+ * suffixes while still offering "y" would make the approval meaningless.
15
+ */
16
+ export declare function commandReviewable(command: string, columns: number): boolean;
17
+ //# sourceMappingURL=activity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activity.d.ts","sourceRoot":"","sources":["../../src/tui/activity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAyFlE,uEAAuE;AACvE,wBAAgB,cAAc,CAC5B,KAAK,EAAE,SAAS,QAAQ,EAAE,EAC1B,OAAO,EAAE,SAAS,iBAAiB,EAAE,EACrC,KAAK,SAAkB,GACtB,SAAS,MAAM,EAAE,CAmDnB;AAED,wFAAwF;AACxF,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAaxE;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,CAanF;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAM3E"}
@@ -0,0 +1,188 @@
1
+ import { parsePatch } from "../patch/parse.js";
2
+ import { callTarget } from "../tools/target.js";
3
+ import { fitLine, terminalText } from "./text.js";
4
+ const MAX_DIFF_LINES = 6;
5
+ const MAX_DIFF_SNIPPET_LINES = 4;
6
+ const MAX_DETAIL_LINE = 120;
7
+ function short(value, width) {
8
+ return fitLine(terminalText(value), Math.max(1, width));
9
+ }
10
+ function briefFailure(result) {
11
+ const lines = result.content.split("\n").filter(line => line.trim().length > 0);
12
+ const status = result.toolName === "bash"
13
+ ? [...lines].reverse().find(line => /(?:Command exited with code|timed out|unavailable)/i.test(line))
14
+ : undefined;
15
+ return short(status ?? lines[0] ?? "failed", 100);
16
+ }
17
+ function isReadTool(name) {
18
+ return name === "read_file" || name === "list_files" || name === "search_text";
19
+ }
20
+ function displayName(name) {
21
+ const names = {
22
+ read_file: "Read", list_files: "Listed", search_text: "Searched",
23
+ edit_file: "Edited", write_file: "Wrote", apply_patch: "Patched",
24
+ bash: "Shell",
25
+ };
26
+ return names[name] ?? name;
27
+ }
28
+ function recordLine(call, result, width) {
29
+ const target = callTarget(call?.arguments);
30
+ const description = target === undefined
31
+ ? displayName(result.toolName)
32
+ : `${displayName(result.toolName)} ${target}`;
33
+ const text = result.isError
34
+ ? ` ! ${description} — ${briefFailure(result)}`
35
+ : ` ✓ ${description}`;
36
+ return short(text, width);
37
+ }
38
+ function patchDetails(call, width) {
39
+ if (typeof call.arguments !== "object" || call.arguments === null || Array.isArray(call.arguments)) {
40
+ return [];
41
+ }
42
+ const args = call.arguments;
43
+ if (typeof args.patch !== "string")
44
+ return [];
45
+ try {
46
+ const changes = parsePatch(args.patch);
47
+ const results = [];
48
+ let added = 0;
49
+ let removed = 0;
50
+ for (const change of changes) {
51
+ if (change.kind === "add") {
52
+ added += change.lines.length;
53
+ results.push(` + ${change.path} (new file, +${change.lines.length})`);
54
+ }
55
+ else if (change.kind === "delete") {
56
+ results.push(` - ${change.path} (deleted)`);
57
+ }
58
+ else {
59
+ const plus = change.hunks.reduce((sum, hunk) => sum + hunk.added, 0);
60
+ const minus = change.hunks.reduce((sum, hunk) => sum + hunk.removed, 0);
61
+ added += plus;
62
+ removed += minus;
63
+ results.push(` ~ ${change.path} (+${plus}/-${minus})`);
64
+ }
65
+ }
66
+ const header = ` ${changes.length} file${changes.length === 1 ? "" : "s"} · +${added}/-${removed}`;
67
+ const diff = args.patch.split("\n").filter(line => line.startsWith("+") || line.startsWith("-"));
68
+ const snippet = diff.slice(0, MAX_DIFF_SNIPPET_LINES).map(line => short(` ${line}`, width));
69
+ return [
70
+ short(header, width),
71
+ ...results.slice(0, MAX_DIFF_LINES).map(line => short(line, width)),
72
+ ...(results.length > MAX_DIFF_LINES
73
+ ? [short(` … and ${results.length - MAX_DIFF_LINES} more files`, width)]
74
+ : []),
75
+ ...snippet,
76
+ ...(diff.length > MAX_DIFF_SNIPPET_LINES
77
+ ? [short(` … ${diff.length - MAX_DIFF_SNIPPET_LINES} more diff lines`, width)]
78
+ : []),
79
+ ];
80
+ }
81
+ catch {
82
+ return [];
83
+ }
84
+ }
85
+ /** A bounded, outcome-oriented summary of one completed tool batch. */
86
+ export function toolTranscript(calls, results, width = MAX_DETAIL_LINE) {
87
+ const byId = new Map(calls.map(call => [call.id, call]));
88
+ const lines = [];
89
+ let readCount = 0;
90
+ let readFailures = 0;
91
+ const flushReadGroup = () => {
92
+ if (readCount === 0)
93
+ return;
94
+ if (readCount >= 3 && readFailures === 0) {
95
+ lines.push(short(` ✓ Explored ${readCount} locations`, width));
96
+ }
97
+ else {
98
+ for (const read of pendingReads)
99
+ lines.push(recordLine(byId.get(read.toolCallId), read, width));
100
+ }
101
+ pendingReads.length = 0;
102
+ readCount = 0;
103
+ readFailures = 0;
104
+ };
105
+ const pendingReads = [];
106
+ for (const result of results) {
107
+ if (isReadTool(result.toolName)) {
108
+ pendingReads.push(result);
109
+ readCount += 1;
110
+ if (result.isError)
111
+ readFailures += 1;
112
+ continue;
113
+ }
114
+ flushReadGroup();
115
+ const call = byId.get(result.toolCallId);
116
+ lines.push(recordLine(call, result, width));
117
+ if (!result.isError && result.toolName === "apply_patch" && call !== undefined) {
118
+ lines.push(...patchDetails(call, width));
119
+ }
120
+ if (!result.isError && result.toolName === "bash") {
121
+ const candidates = result.content.split("\n").filter(line => line.trim().length > 0);
122
+ const summary = [...candidates].reverse().find(line => /(?:tests? passed|passing|test suites|build succeeded|successfully)/i.test(line))
123
+ ?? candidates.at(-1);
124
+ if (summary !== undefined && summary.trim() !== "(no output)") {
125
+ lines.push(short(` ↳ ${summary}`, width));
126
+ }
127
+ }
128
+ if (!result.isError && result.toolName === "edit_file" && call?.arguments !== null &&
129
+ typeof call?.arguments === "object" && !Array.isArray(call.arguments)) {
130
+ const args = call.arguments;
131
+ if (typeof args.old_text === "string" && typeof args.new_text === "string") {
132
+ const oldLines = args.old_text.split("\n").length;
133
+ const newLines = args.new_text.split("\n").length;
134
+ lines.push(short(` updated selection · ${oldLines} → ${newLines} lines`, width));
135
+ }
136
+ }
137
+ }
138
+ flushReadGroup();
139
+ return lines;
140
+ }
141
+ /** Display Shell approvals as bounded, control-safe content instead of raw commands. */
142
+ export function approvalPreview(command, columns) {
143
+ const width = Math.max(12, columns - 1);
144
+ const visibleLines = terminalText(command).split("\n");
145
+ const truncated = visibleLines.length > 8;
146
+ const lines = [
147
+ " Shell command · Docker sandbox · network disabled",
148
+ " ──────────────────────────────────────────",
149
+ ...visibleLines.slice(0, 8).map(line => ` │ ${line}`),
150
+ ...(truncated ? [` │ … ${visibleLines.length - 8} more lines hidden`] : []),
151
+ " ──────────────────────────────────────────",
152
+ " Approve once? [y/N] · Enter deny · Ctrl+C cancel",
153
+ ];
154
+ return `\n${lines.map(line => short(line, width)).join("\n")}\n`;
155
+ }
156
+ /**
157
+ * Apply theme colors *after* sanitizing untrusted tool text. Keep this outside
158
+ * the pure layout model, so the Painter's line diffing and terminal widths
159
+ * are never based on escape sequences supplied by a tool.
160
+ */
161
+ export function colorizeActivity(lines, enabled) {
162
+ const safe = lines.map(line => terminalText(line));
163
+ if (!enabled)
164
+ return safe.join("\n");
165
+ const paint = (line) => {
166
+ const trimmed = line.trimStart();
167
+ const code = trimmed.startsWith("!") ? "31"
168
+ : trimmed.startsWith("✓") || trimmed.startsWith("+") ? "32"
169
+ : trimmed.startsWith("~") ? "36"
170
+ : trimmed.startsWith("-") ? "31"
171
+ : "2";
172
+ return `\u001b[${code}m${line}\u001b[0m`;
173
+ };
174
+ return safe.map(paint).join("\n");
175
+ }
176
+ /**
177
+ * Review must show the *entire* command. Truncating potentially dangerous
178
+ * suffixes while still offering "y" would make the approval meaningless.
179
+ */
180
+ export function commandReviewable(command, columns) {
181
+ if (command !== terminalText(command))
182
+ return false;
183
+ const width = Math.max(12, columns - 1);
184
+ const lines = command.split("\n");
185
+ return lines.length <= 8 &&
186
+ lines.every(line => fitLine(` │ ${line}`, width) === ` │ ${line}`);
187
+ }
188
+ //# sourceMappingURL=activity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activity.js","sourceRoot":"","sources":["../../src/tui/activity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { Message } from "../messages.js";
2
+ export declare const DIFF_PAGE_LINES = 28;
3
+ export declare function mostRecentSuccessfulPatch(messages: readonly Message[]): string | undefined;
4
+ export interface DiffPage {
5
+ readonly text: string;
6
+ readonly page: number;
7
+ readonly pageCount: number;
8
+ }
9
+ /**
10
+ * Never execute a pager or trust terminal control bytes in a model-provided
11
+ * patch. All pages are bounded and can be navigated with /diff N.
12
+ */
13
+ export declare function formatDiffPage(patch: string, requestedPage?: number, width?: number, color?: boolean): DiffPage;
14
+ //# sourceMappingURL=diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/tui/diff.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAY,MAAM,gBAAgB,CAAC;AAGxD,eAAO,MAAM,eAAe,KAAK,CAAC;AAElC,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,GAAG,MAAM,GAAG,SAAS,CAuB1F;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,MAAM,EACb,aAAa,SAAI,EACjB,KAAK,SAAK,EACV,KAAK,UAAQ,GACZ,QAAQ,CAmBV"}
@@ -0,0 +1,57 @@
1
+ import { terminalText, fitLine } from "./text.js";
2
+ export const DIFF_PAGE_LINES = 28;
3
+ export function mostRecentSuccessfulPatch(messages) {
4
+ // Each result follows the assistant call that produced it. Walk backwards,
5
+ // searching only the nearest preceding assistant (not unrelated older calls
6
+ // whose IDs a Provider might have reused).
7
+ for (let i = messages.length - 1; i >= 0; i -= 1) {
8
+ const message = messages[i];
9
+ if (message?.role !== "tool" || message.toolName !== "apply_patch" || message.isError)
10
+ continue;
11
+ for (let j = i - 1; j >= 0; j -= 1) {
12
+ const earlier = messages[j];
13
+ if (earlier?.role === "assistant") {
14
+ const call = earlier.toolCalls.find((tool) => tool.id === message.toolCallId && tool.name === "apply_patch");
15
+ if (call !== undefined && typeof call.arguments === "object" && call.arguments !== null &&
16
+ !Array.isArray(call.arguments)) {
17
+ const patch = call.arguments.patch;
18
+ if (typeof patch === "string")
19
+ return patch;
20
+ }
21
+ break;
22
+ }
23
+ if (earlier?.role === "user")
24
+ break;
25
+ }
26
+ }
27
+ return undefined;
28
+ }
29
+ /**
30
+ * Never execute a pager or trust terminal control bytes in a model-provided
31
+ * patch. All pages are bounded and can be navigated with /diff N.
32
+ */
33
+ export function formatDiffPage(patch, requestedPage = 1, width = 80, color = false) {
34
+ const lines = terminalText(patch).split("\n");
35
+ const pageCount = Math.max(1, Math.ceil(lines.length / DIFF_PAGE_LINES));
36
+ const page = Number.isSafeInteger(requestedPage)
37
+ ? Math.max(1, Math.min(requestedPage, pageCount))
38
+ : 1;
39
+ const start = (page - 1) * DIFF_PAGE_LINES;
40
+ const bound = Math.max(1, width - 1);
41
+ const chunk = lines.slice(start, start + DIFF_PAGE_LINES).map(line => {
42
+ const safe = fitLine(line, bound);
43
+ if (!color)
44
+ return safe;
45
+ if (line.startsWith("+"))
46
+ return `\u001b[32m${safe}\u001b[0m`;
47
+ if (line.startsWith("-"))
48
+ return `\u001b[31m${safe}\u001b[0m`;
49
+ if (line.startsWith("***"))
50
+ return `\u001b[36m${safe}\u001b[0m`;
51
+ return safe;
52
+ });
53
+ const title = fitLine(`Last applied patch · page ${page}/${pageCount} · ${lines.length} lines`, bound);
54
+ const next = page < pageCount ? `/diff ${page + 1} for next page` : "End of patch";
55
+ return { text: `${title}\n${chunk.join("\n")}\n${fitLine(next, bound)}\n`, page, pageCount };
56
+ }
57
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/tui/diff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ import { EditorDocument, type EditorOutput } from "./editor.js";
2
+ import { type SlashSuggestion } from "./slash.js";
3
+ /**
4
+ * Key parser for the modal editor. The active TuiInput raw hook gives this
5
+ * parser exclusive ownership; neither readline nor slash completion sees the
6
+ * editor's keystrokes.
7
+ */
8
+ export declare class EditorController {
9
+ private readonly output;
10
+ private readonly done;
11
+ private readonly options;
12
+ readonly document: EditorDocument;
13
+ private readonly decoder;
14
+ private readonly painter;
15
+ private pending;
16
+ private pasting;
17
+ private escapeTimer?;
18
+ private completed;
19
+ private previousCR;
20
+ private completionIndex;
21
+ private dismissedCommand?;
22
+ private lastFrame?;
23
+ private originRow?;
24
+ private mouseDragging;
25
+ private searching;
26
+ private searchQuery;
27
+ private searchOffset;
28
+ readonly exitRequested: {
29
+ value: boolean;
30
+ };
31
+ private readonly maxWidth;
32
+ private readonly maxHeight;
33
+ constructor(output: EditorOutput, done: (text: string | undefined) => void, options?: {
34
+ readonly submitOnEnter?: boolean;
35
+ readonly history?: readonly string[];
36
+ readonly slashCommands?: readonly SlashSuggestion[];
37
+ readonly mouse?: boolean;
38
+ });
39
+ begin(): void;
40
+ private painterMouse;
41
+ private outputWrite;
42
+ private suggestions;
43
+ private insertSelectedCompletion;
44
+ private processMouse;
45
+ resized(): void;
46
+ receive(chunk: Buffer): void;
47
+ private updateSearch;
48
+ private parse;
49
+ private draw;
50
+ cancel(): void;
51
+ private finish;
52
+ }
53
+ //# sourceMappingURL=editor-input.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editor-input.d.ts","sourceRoot":"","sources":["../../src/tui/editor-input.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAA8B,KAAK,YAAY,EAAoB,MAAM,aAAa,CAAC;AAC9G,OAAO,EAAoB,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AAEpE;;;;GAIG;AACH,qBAAa,gBAAgB;IAsBzB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAvB1B,QAAQ,CAAC,QAAQ,iBAAwB;IACzC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA6B;IACrD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgB;IACxC,OAAO,CAAC,OAAO,CAAM;IACrB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,WAAW,CAAC,CAAiB;IACrC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,gBAAgB,CAAC,CAAS;IAClC,OAAO,CAAC,SAAS,CAAC,CAAc;IAChC,OAAO,CAAC,SAAS,CAAC,CAAS;IAC3B,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,WAAW,CAAM;IACzB,OAAO,CAAC,YAAY,CAAK;IACzB,QAAQ,CAAC,aAAa;QAAK,KAAK;MAAU;IAC1C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAe;IACxC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAe;IAEzC,YACmB,MAAM,EAAE,YAAY,EACpB,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,EACxC,OAAO,GAAE;QAAE,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;QAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,eAAe,EAAE,CAAC;QAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAO,EAKzL;IAED,KAAK,IAAI,IAAI,CAGZ;IAED,OAAO,CAAC,YAAY;IAKpB,OAAO,CAAC,WAAW;IAEnB,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,wBAAwB;IAUhC,OAAO,CAAC,YAAY;IA8BpB,OAAO,IAAI,IAAI,CAEd;IAED,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAS3B;IAED,OAAO,CAAC,YAAY;IAapB,OAAO,CAAC,KAAK;IAoLb,OAAO,CAAC,IAAI;IAUZ,MAAM,IAAI,IAAI,CAEb;IAED,OAAO,CAAC,MAAM;CASf"}