@smartledger.technology/openai-claw 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 (107) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +134 -0
  3. package/dist/agent.js +262 -0
  4. package/dist/agent.js.map +1 -0
  5. package/dist/autopr/index.js +127 -0
  6. package/dist/autopr/index.js.map +1 -0
  7. package/dist/client.js +199 -0
  8. package/dist/client.js.map +1 -0
  9. package/dist/commands/index.js +624 -0
  10. package/dist/commands/index.js.map +1 -0
  11. package/dist/config.js +71 -0
  12. package/dist/config.js.map +1 -0
  13. package/dist/cost.js +97 -0
  14. package/dist/cost.js.map +1 -0
  15. package/dist/eval/cli.js +32 -0
  16. package/dist/eval/cli.js.map +1 -0
  17. package/dist/eval/index.js +134 -0
  18. package/dist/eval/index.js.map +1 -0
  19. package/dist/hooks/index.js +69 -0
  20. package/dist/hooks/index.js.map +1 -0
  21. package/dist/index.js +246 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/input.js +96 -0
  24. package/dist/input.js.map +1 -0
  25. package/dist/mcp/index.js +135 -0
  26. package/dist/mcp/index.js.map +1 -0
  27. package/dist/memory/compaction.js +70 -0
  28. package/dist/memory/compaction.js.map +1 -0
  29. package/dist/memory/index.js +56 -0
  30. package/dist/memory/index.js.map +1 -0
  31. package/dist/notifications/index.js +80 -0
  32. package/dist/notifications/index.js.map +1 -0
  33. package/dist/permissions/index.js +104 -0
  34. package/dist/permissions/index.js.map +1 -0
  35. package/dist/planmode.js +12 -0
  36. package/dist/planmode.js.map +1 -0
  37. package/dist/plugins/index.js +239 -0
  38. package/dist/plugins/index.js.map +1 -0
  39. package/dist/prompts/system.js +148 -0
  40. package/dist/prompts/system.js.map +1 -0
  41. package/dist/rag/index.js +158 -0
  42. package/dist/rag/index.js.map +1 -0
  43. package/dist/self-review/index.js +157 -0
  44. package/dist/self-review/index.js.map +1 -0
  45. package/dist/session.js +113 -0
  46. package/dist/session.js.map +1 -0
  47. package/dist/skills/index.js +39 -0
  48. package/dist/skills/index.js.map +1 -0
  49. package/dist/subagent.js +128 -0
  50. package/dist/subagent.js.map +1 -0
  51. package/dist/subagents/index.js +61 -0
  52. package/dist/subagents/index.js.map +1 -0
  53. package/dist/tools/bash.js +94 -0
  54. package/dist/tools/bash.js.map +1 -0
  55. package/dist/tools/edit.js +64 -0
  56. package/dist/tools/edit.js.map +1 -0
  57. package/dist/tools/glob.js +34 -0
  58. package/dist/tools/glob.js.map +1 -0
  59. package/dist/tools/grep.js +87 -0
  60. package/dist/tools/grep.js.map +1 -0
  61. package/dist/tools/index.js +44 -0
  62. package/dist/tools/index.js.map +1 -0
  63. package/dist/tools/ls.js +39 -0
  64. package/dist/tools/ls.js.map +1 -0
  65. package/dist/tools/read.js +126 -0
  66. package/dist/tools/read.js.map +1 -0
  67. package/dist/tools/semantic.js +40 -0
  68. package/dist/tools/semantic.js.map +1 -0
  69. package/dist/tools/shell.js +131 -0
  70. package/dist/tools/shell.js.map +1 -0
  71. package/dist/tools/task.js +91 -0
  72. package/dist/tools/task.js.map +1 -0
  73. package/dist/tools/todo.js +64 -0
  74. package/dist/tools/todo.js.map +1 -0
  75. package/dist/tools/types.js +7 -0
  76. package/dist/tools/types.js.map +1 -0
  77. package/dist/tools/webfetch.js +62 -0
  78. package/dist/tools/webfetch.js.map +1 -0
  79. package/dist/tools/websearch.js +82 -0
  80. package/dist/tools/websearch.js.map +1 -0
  81. package/dist/tools/write.js +39 -0
  82. package/dist/tools/write.js.map +1 -0
  83. package/dist/ui/repl.js +203 -0
  84. package/dist/ui/repl.js.map +1 -0
  85. package/dist/ui/tui/App.js +234 -0
  86. package/dist/ui/tui/App.js.map +1 -0
  87. package/dist/ui/tui/Diff.js +38 -0
  88. package/dist/ui/tui/Diff.js.map +1 -0
  89. package/dist/ui/tui/MessageView.js +50 -0
  90. package/dist/ui/tui/MessageView.js.map +1 -0
  91. package/dist/ui/tui/PermissionPrompt.js +47 -0
  92. package/dist/ui/tui/PermissionPrompt.js.map +1 -0
  93. package/dist/ui/tui/SlashSuggest.js +36 -0
  94. package/dist/ui/tui/SlashSuggest.js.map +1 -0
  95. package/dist/ui/tui/StatusBar.js +31 -0
  96. package/dist/ui/tui/StatusBar.js.map +1 -0
  97. package/dist/ui/tui/highlight.js +66 -0
  98. package/dist/ui/tui/highlight.js.map +1 -0
  99. package/dist/ui/tui/index.js +12 -0
  100. package/dist/ui/tui/index.js.map +1 -0
  101. package/dist/ui/tui/markdown.js +46 -0
  102. package/dist/ui/tui/markdown.js.map +1 -0
  103. package/dist/ui/tui/types.js +2 -0
  104. package/dist/ui/tui/types.js.map +1 -0
  105. package/dist/web/index.js +195 -0
  106. package/dist/web/index.js.map +1 -0
  107. package/package.json +79 -0
@@ -0,0 +1,203 @@
1
+ import readline from "node:readline";
2
+ import chalk from "chalk";
3
+ import { findCommand, builtinCommands } from "../commands/index.js";
4
+ import { HookRunner } from "../hooks/index.js";
5
+ import { prepareUserMessage } from "../input.js";
6
+ import { saveSession } from "../session.js";
7
+ import { notify } from "../notifications/index.js";
8
+ export async function startRepl({ agent, config, permissions }) {
9
+ const completer = (line) => {
10
+ if (!line.startsWith("/"))
11
+ return [[], line];
12
+ const prefix = line.slice(1).split(/\s+/)[0] ?? "";
13
+ const matches = builtinCommands
14
+ .map((c) => `/${c.name}`)
15
+ .filter((n) => n.slice(1).startsWith(prefix));
16
+ return [matches, line];
17
+ };
18
+ const rl = readline.createInterface({
19
+ input: process.stdin,
20
+ output: process.stdout,
21
+ terminal: true,
22
+ historySize: 500,
23
+ completer,
24
+ });
25
+ // Multi-line input: a single trailing backslash on a line continues to the next.
26
+ let multilineBuffer = null;
27
+ const hooks = new HookRunner(config);
28
+ const sessionRef = {};
29
+ await hooks.run("SessionStart", { workdir: config.workdir });
30
+ banner(config);
31
+ let aborter = null;
32
+ let exiting = false;
33
+ const exit = () => {
34
+ if (exiting)
35
+ return;
36
+ exiting = true;
37
+ hooks.run("SessionEnd", {}).finally(() => {
38
+ rl.close();
39
+ process.exit(0);
40
+ });
41
+ };
42
+ rl.on("SIGINT", () => {
43
+ if (aborter) {
44
+ aborter.abort();
45
+ console.log(chalk.yellow("\n[aborted]"));
46
+ }
47
+ else {
48
+ console.log(chalk.dim("\n(press Ctrl-C again or type /exit to quit)"));
49
+ let next = false;
50
+ rl.once("SIGINT", () => {
51
+ if (!next)
52
+ exit();
53
+ });
54
+ setTimeout(() => (next = true), 1000);
55
+ }
56
+ });
57
+ const prompt = () => {
58
+ rl.setPrompt(chalk.cyan("> "));
59
+ rl.prompt();
60
+ };
61
+ prompt();
62
+ for await (const line of rl) {
63
+ if (exiting)
64
+ break;
65
+ // Multi-line continuation: a trailing backslash means "more lines follow".
66
+ if (multilineBuffer || line.endsWith("\\")) {
67
+ const trimmed = line.endsWith("\\") ? line.slice(0, -1) : line;
68
+ if (!multilineBuffer)
69
+ multilineBuffer = [];
70
+ multilineBuffer.push(trimmed);
71
+ if (line.endsWith("\\")) {
72
+ rl.setPrompt(chalk.cyan("» "));
73
+ rl.prompt();
74
+ continue;
75
+ }
76
+ }
77
+ const input = (multilineBuffer ? multilineBuffer.join("\n") : line).trim();
78
+ multilineBuffer = null;
79
+ if (!input) {
80
+ prompt();
81
+ continue;
82
+ }
83
+ if (input.startsWith("/")) {
84
+ const [head, ...rest] = input.slice(1).split(/\s+/);
85
+ const args = rest.join(" ");
86
+ const cmd = findCommand(head, config);
87
+ if (!cmd) {
88
+ console.log(chalk.red(`unknown command: /${head}`));
89
+ }
90
+ else {
91
+ await cmd.run(args, { agent, config, permissions, exit, sessionRef });
92
+ }
93
+ prompt();
94
+ continue;
95
+ }
96
+ if (input.startsWith("!")) {
97
+ // Shell escape (one-shot)
98
+ const cmd = input.slice(1).trim();
99
+ console.log(chalk.dim(`$ ${cmd}`));
100
+ const { spawnSync } = await import("node:child_process");
101
+ const res = spawnSync("bash", ["-c", cmd], { stdio: "inherit", cwd: config.workdir });
102
+ if (res.status !== 0)
103
+ console.log(chalk.red(`[exit ${res.status}]`));
104
+ prompt();
105
+ continue;
106
+ }
107
+ // UserPromptSubmit hooks
108
+ const hookResults = await hooks.run("UserPromptSubmit", { user_prompt: input });
109
+ const blocked = hookResults.find((h) => h.blocked);
110
+ if (blocked) {
111
+ console.log(chalk.red(`[blocked by hook] ${blocked.stderr.trim()}`));
112
+ prompt();
113
+ continue;
114
+ }
115
+ const prepared = prepareUserMessage(input, config);
116
+ if (prepared.attachments.length) {
117
+ console.log(chalk.dim(` attached: ${prepared.attachments.join(", ")}`));
118
+ }
119
+ agent.pushUser(prepared.content);
120
+ aborter = new AbortController();
121
+ const handler = makeEventHandler(hooks);
122
+ const turnStart = Date.now();
123
+ try {
124
+ await agent.run(handler, aborter.signal);
125
+ }
126
+ catch (e) {
127
+ console.log(chalk.red(`error: ${e?.message ?? String(e)}`));
128
+ }
129
+ finally {
130
+ aborter = null;
131
+ try {
132
+ const { id } = saveSession(config, agent.conversation, sessionRef.current);
133
+ sessionRef.current = id;
134
+ }
135
+ catch { }
136
+ const durationSec = (Date.now() - turnStart) / 1000;
137
+ notify(config, {
138
+ kind: "Stop",
139
+ title: "turn complete",
140
+ body: `${input.slice(0, 100)} (${durationSec.toFixed(1)}s)`,
141
+ durationSec,
142
+ }).catch(() => { });
143
+ }
144
+ process.stdout.write("\n");
145
+ prompt();
146
+ }
147
+ exit();
148
+ }
149
+ function banner(config) {
150
+ console.log(chalk.bold.cyan("openai-claw") +
151
+ chalk.dim(` v0.1.0 • model=${config.model} • mode=${config.permissionMode}`));
152
+ console.log(chalk.dim(`workdir: ${config.workdir}`));
153
+ console.log(chalk.dim('type /help for commands, /exit to quit, ! <cmd> for one-shot shell\n'));
154
+ }
155
+ function makeEventHandler(hooks) {
156
+ let textBuffered = false;
157
+ return (evt) => {
158
+ switch (evt.type) {
159
+ case "text_delta":
160
+ if (!textBuffered) {
161
+ process.stdout.write(chalk.dim("\n"));
162
+ textBuffered = true;
163
+ }
164
+ process.stdout.write(evt.data);
165
+ break;
166
+ case "text":
167
+ if (!textBuffered)
168
+ process.stdout.write(evt.data);
169
+ textBuffered = false;
170
+ break;
171
+ case "tool_call": {
172
+ const d = evt.data;
173
+ process.stdout.write("\n" + chalk.blue(`▸ ${d.preview ?? d.name}`) + "\n");
174
+ break;
175
+ }
176
+ case "tool_result": {
177
+ const d = evt.data;
178
+ const head = d.content.split("\n").slice(0, 8).join("\n");
179
+ const tail = d.content.split("\n").length > 8 ? chalk.dim("\n …") : "";
180
+ const color = d.isError ? chalk.red : chalk.dim;
181
+ process.stdout.write(color(" " + head.split("\n").join("\n ")) + tail + "\n");
182
+ break;
183
+ }
184
+ case "compaction": {
185
+ const d = evt.data;
186
+ if (d.skipped) {
187
+ process.stdout.write("\n" + chalk.dim(`▼ compaction skipped: ${d.skipped}`) + "\n");
188
+ }
189
+ else {
190
+ process.stdout.write("\n" + chalk.dim(`▼ context compacted ${d.beforeTokens}→${d.afterTokens} tokens`) + "\n");
191
+ }
192
+ break;
193
+ }
194
+ case "error":
195
+ process.stdout.write("\n" + chalk.red(`error: ${evt.data}`) + "\n");
196
+ break;
197
+ case "done":
198
+ hooks.run("Stop", {});
199
+ break;
200
+ }
201
+ };
202
+ }
203
+ //# sourceMappingURL=repl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repl.js","sourceRoot":"","sources":["../../src/ui/repl.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,234 @@
1
+ import React, { useEffect, useRef, useState } from "react";
2
+ import { Box, Static, Text, useApp, useInput } from "ink";
3
+ import TextInput from "ink-text-input";
4
+ import { findCommand } from "../../commands/index.js";
5
+ import { prepareUserMessage } from "../../input.js";
6
+ import { saveSession } from "../../session.js";
7
+ import { notify } from "../../notifications/index.js";
8
+ import { MessageView } from "./MessageView.js";
9
+ import { PermissionPrompt } from "./PermissionPrompt.js";
10
+ import { StatusBar } from "./StatusBar.js";
11
+ import { SlashSuggest, firstMatch } from "./SlashSuggest.js";
12
+ let idCounter = 0;
13
+ const nextId = () => `id-${++idCounter}`;
14
+ export function App({ agent, config, permissions, hooks }) {
15
+ const { exit } = useApp();
16
+ const [history, setHistory] = useState([
17
+ { kind: "system", id: nextId(), text: `workdir: ${config.workdir}` },
18
+ { kind: "system", id: nextId(), text: "type /help for commands, /exit to quit, Ctrl-C to abort" },
19
+ ]);
20
+ const [streamingItem, setStreamingItem] = useState(null);
21
+ const [liveTool, setLiveTool] = useState(null);
22
+ const liveToolRef = useRef(null);
23
+ const [input, setInput] = useState("");
24
+ const [busy, setBusy] = useState(false);
25
+ const [pending, setPending] = useState(null);
26
+ const [totalTokens, setTotalTokens] = useState(0);
27
+ const [totalCostUSD, setTotalCostUSD] = useState(0);
28
+ const aborterRef = useRef(null);
29
+ // Wire the permission manager to prompt us via state.
30
+ useEffect(() => {
31
+ permissions.setPrompter((req) => new Promise((resolve) => {
32
+ setPending({ ...req, resolve: (answer) => { setPending(null); resolve(answer); } });
33
+ }));
34
+ }, [permissions]);
35
+ useInput((inputChar, key) => {
36
+ if (pending)
37
+ return; // PermissionPrompt owns input while open
38
+ if (key.ctrl && inputChar === "c") {
39
+ if (aborterRef.current) {
40
+ aborterRef.current.abort();
41
+ push({ kind: "error", id: nextId(), text: "aborted" });
42
+ }
43
+ else {
44
+ exit();
45
+ }
46
+ return;
47
+ }
48
+ if (key.tab && input.startsWith("/")) {
49
+ const match = firstMatch(input, config);
50
+ if (match)
51
+ setInput("/" + match + " ");
52
+ }
53
+ });
54
+ function push(item) {
55
+ setHistory((h) => [...h, item]);
56
+ }
57
+ const sessionRef = useRef({});
58
+ async function submit(text) {
59
+ setInput("");
60
+ if (!text.trim())
61
+ return;
62
+ if (text.startsWith("/")) {
63
+ const [head, ...rest] = text.slice(1).split(/\s+/);
64
+ const args = rest.join(" ");
65
+ const cmd = findCommand(head, config);
66
+ if (!cmd) {
67
+ push({ kind: "error", id: nextId(), text: `unknown command: /${head}` });
68
+ return;
69
+ }
70
+ // Capture console.log output from slash commands.
71
+ const buf = [];
72
+ const original = console.log;
73
+ console.log = (...a) => buf.push(a.map(String).join(" "));
74
+ try {
75
+ await cmd.run(args, { agent, config, permissions, exit, sessionRef: sessionRef.current });
76
+ }
77
+ finally {
78
+ console.log = original;
79
+ }
80
+ if (buf.length)
81
+ push({ kind: "system", id: nextId(), text: buf.join("\n") });
82
+ return;
83
+ }
84
+ if (text.startsWith("!")) {
85
+ const cmd = text.slice(1).trim();
86
+ const { spawnSync } = await import("node:child_process");
87
+ const res = spawnSync("bash", ["-c", cmd], { cwd: config.workdir, encoding: "utf8" });
88
+ push({ kind: "system", id: nextId(), text: `$ ${cmd}` });
89
+ push({
90
+ kind: "tool_result",
91
+ id: nextId(),
92
+ tool: "shell",
93
+ content: (res.stdout ?? "") + (res.stderr ? "\n[stderr]\n" + res.stderr : ""),
94
+ isError: res.status !== 0,
95
+ });
96
+ return;
97
+ }
98
+ const hookOutcomes = await hooks.run("UserPromptSubmit", { user_prompt: text });
99
+ const blocked = hookOutcomes.find((h) => h.blocked);
100
+ if (blocked) {
101
+ push({ kind: "error", id: nextId(), text: `[blocked by hook] ${blocked.stderr.trim()}` });
102
+ return;
103
+ }
104
+ const prepared = prepareUserMessage(text, config);
105
+ const userLine = prepared.attachments.length
106
+ ? `${text}\n attached: ${prepared.attachments.join(", ")}`
107
+ : text;
108
+ push({ kind: "user", id: nextId(), text: userLine });
109
+ agent.pushUser(prepared.content);
110
+ setBusy(true);
111
+ aborterRef.current = new AbortController();
112
+ let streamBuffer = "";
113
+ const streamId = nextId();
114
+ const handler = (evt) => {
115
+ switch (evt.type) {
116
+ case "text_delta":
117
+ streamBuffer += evt.data;
118
+ setStreamingItem({ kind: "assistant", id: streamId, text: streamBuffer, streaming: true });
119
+ break;
120
+ case "text":
121
+ if (streamBuffer) {
122
+ push({ kind: "assistant", id: streamId, text: streamBuffer });
123
+ streamBuffer = "";
124
+ setStreamingItem(null);
125
+ }
126
+ else {
127
+ push({ kind: "assistant", id: nextId(), text: evt.data });
128
+ }
129
+ break;
130
+ case "tool_call": {
131
+ if (streamBuffer) {
132
+ push({ kind: "assistant", id: streamId, text: streamBuffer });
133
+ streamBuffer = "";
134
+ setStreamingItem(null);
135
+ }
136
+ const d = evt.data;
137
+ const item = {
138
+ kind: "tool_call",
139
+ id: nextId(),
140
+ tool: d.name,
141
+ preview: d.preview ?? d.name,
142
+ callId: d.callId,
143
+ progress: "",
144
+ };
145
+ push(item);
146
+ liveToolRef.current = item;
147
+ setLiveTool(null);
148
+ break;
149
+ }
150
+ case "tool_progress": {
151
+ const d = evt.data;
152
+ const live = liveToolRef.current;
153
+ if (live && live.kind === "tool_call" && live.callId === d.callId) {
154
+ live.progress = ((live.progress ?? "") + d.chunk).slice(-4000);
155
+ setLiveTool({ ...live });
156
+ }
157
+ break;
158
+ }
159
+ case "tool_result": {
160
+ const d = evt.data;
161
+ liveToolRef.current = null;
162
+ setLiveTool(null);
163
+ push({
164
+ kind: "tool_result",
165
+ id: nextId(),
166
+ tool: d.name,
167
+ content: d.content,
168
+ isError: !!d.isError,
169
+ display: d.display,
170
+ });
171
+ break;
172
+ }
173
+ case "usage": {
174
+ const u = evt.data;
175
+ setTotalTokens((t) => t + u.total_tokens);
176
+ if (typeof u.totalCostUSD === "number")
177
+ setTotalCostUSD(u.totalCostUSD);
178
+ break;
179
+ }
180
+ case "compaction": {
181
+ const d = evt.data;
182
+ const text = d.skipped
183
+ ? `▼ compaction skipped: ${d.skipped}`
184
+ : `▼ context compacted ${d.beforeTokens}→${d.afterTokens} tokens`;
185
+ push({ kind: "system", id: nextId(), text });
186
+ break;
187
+ }
188
+ case "error":
189
+ push({ kind: "error", id: nextId(), text: String(evt.data) });
190
+ break;
191
+ case "done":
192
+ hooks.run("Stop", {});
193
+ break;
194
+ }
195
+ };
196
+ const turnStart = Date.now();
197
+ try {
198
+ await agent.run(handler, aborterRef.current.signal);
199
+ }
200
+ catch (e) {
201
+ push({ kind: "error", id: nextId(), text: e?.message ?? String(e) });
202
+ }
203
+ finally {
204
+ if (streamBuffer)
205
+ push({ kind: "assistant", id: streamId, text: streamBuffer });
206
+ setStreamingItem(null);
207
+ aborterRef.current = null;
208
+ setBusy(false);
209
+ try {
210
+ const { id } = saveSession(config, agent.conversation, sessionRef.current.current);
211
+ sessionRef.current.current = id;
212
+ }
213
+ catch { }
214
+ const durationSec = (Date.now() - turnStart) / 1000;
215
+ notify(config, {
216
+ kind: "Stop",
217
+ title: "turn complete",
218
+ body: `(${durationSec.toFixed(1)}s)`,
219
+ durationSec,
220
+ }).catch(() => { });
221
+ }
222
+ }
223
+ return (React.createElement(Box, { flexDirection: "column" },
224
+ React.createElement(Static, { items: history }, (item) => React.createElement(MessageView, { key: item.id, item: item })),
225
+ liveTool && React.createElement(MessageView, { item: liveTool }),
226
+ streamingItem && React.createElement(MessageView, { item: streamingItem }),
227
+ pending && React.createElement(PermissionPrompt, { pending: pending }),
228
+ React.createElement(SlashSuggest, { input: input, config: config }),
229
+ React.createElement(StatusBar, { config: config, busy: busy, totalTokens: totalTokens, totalCostUSD: totalCostUSD }),
230
+ React.createElement(Box, { marginTop: 1 },
231
+ React.createElement(Text, { color: "cyan", bold: true }, "❯ "),
232
+ React.createElement(TextInput, { value: input, onChange: setInput, onSubmit: submit, placeholder: busy ? "(thinking… input queues)" : "ask anything or /help" }))));
233
+ }
234
+ //# sourceMappingURL=App.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"App.js","sourceRoot":"","sources":["../../../src/ui/tui/App.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import React from "react";
2
+ import { Box, Text } from "ink";
3
+ /**
4
+ * Render a unified diff (as produced by `diff.createPatch`) with color.
5
+ * Skips the leading `Index:` / `===` / file header lines.
6
+ */
7
+ export function Diff({ patch }) {
8
+ const lines = patch.split("\n");
9
+ // Trim the standard header lines from `diff` package.
10
+ let start = 0;
11
+ for (let i = 0; i < lines.length; i++) {
12
+ if (lines[i].startsWith("@@")) {
13
+ start = i;
14
+ break;
15
+ }
16
+ }
17
+ const body = lines.slice(start);
18
+ const MAX = 40;
19
+ const trimmed = body.slice(0, MAX);
20
+ return (React.createElement(Box, { flexDirection: "column", marginLeft: 2 },
21
+ trimmed.map((line, i) => {
22
+ let color;
23
+ if (line.startsWith("@@"))
24
+ color = "cyan";
25
+ else if (line.startsWith("+"))
26
+ color = "green";
27
+ else if (line.startsWith("-"))
28
+ color = "red";
29
+ else
30
+ color = "gray";
31
+ return (React.createElement(Text, { key: i, color: color }, line || " "));
32
+ }),
33
+ body.length > MAX && React.createElement(Text, { color: "gray" },
34
+ " \u2026 (",
35
+ body.length - MAX,
36
+ " more diff lines)")));
37
+ }
38
+ //# sourceMappingURL=Diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Diff.js","sourceRoot":"","sources":["../../../src/ui/tui/Diff.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAEhC;;;GAGG;AACH,MAAM,UAAU,IAAI,CAAC,EAAE,KAAK,EAAqB;IAC/C,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAChC,sDAAsD;IACtD,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9B,KAAK,GAAG,CAAC,CAAC;YACV,MAAM;QACR,CAAC;IACH,CAAC;IACD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAChC,MAAM,GAAG,GAAG,EAAE,CAAC;IACf,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACnC,OAAO,CACL,oBAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,UAAU,EAAE,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;YACvB,IAAI,KAAyB,CAAC;YAC9B,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;gBAAE,KAAK,GAAG,MAAM,CAAC;iBACrC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;gBAAE,KAAK,GAAG,OAAO,CAAC;iBAC1C,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;gBAAE,KAAK,GAAG,KAAK,CAAC;;gBACxC,KAAK,GAAG,MAAM,CAAC;YACpB,OAAO,CACL,oBAAC,IAAI,IAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,IACvB,IAAI,IAAI,GAAG,CACP,CACR,CAAC;QACJ,CAAC,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,GAAG,IAAI,oBAAC,IAAI,IAAC,KAAK,EAAC,MAAM;;YAAO,IAAI,CAAC,MAAM,GAAG,GAAG;gCAAyB,CACrF,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,50 @@
1
+ import React from "react";
2
+ import { Box, Text } from "ink";
3
+ import { Diff } from "./Diff.js";
4
+ import { renderMarkdown, renderStreamingMarkdown } from "./markdown.js";
5
+ import { highlightToolOutput } from "./highlight.js";
6
+ function renderAssistant(text, streaming) {
7
+ if (streaming)
8
+ return renderStreamingMarkdown(text);
9
+ return renderMarkdown(text);
10
+ }
11
+ export function MessageView({ item }) {
12
+ switch (item.kind) {
13
+ case "user":
14
+ return (React.createElement(Box, { marginTop: 1 },
15
+ React.createElement(Text, { color: "cyan", bold: true }, "> "),
16
+ React.createElement(Text, null, item.text)));
17
+ case "assistant":
18
+ return (React.createElement(Box, { marginTop: 1, flexDirection: "column" },
19
+ React.createElement(Text, null, renderAssistant(item.text, item.streaming))));
20
+ case "tool_call": {
21
+ const progressLines = (item.progress ?? "").split("\n").slice(-6);
22
+ return (React.createElement(Box, { flexDirection: "column", marginTop: 1 },
23
+ React.createElement(Box, null,
24
+ React.createElement(Text, { color: "blue" }, "\u25B8 "),
25
+ React.createElement(Text, { color: "blue" }, item.preview)),
26
+ item.progress && (React.createElement(Box, { flexDirection: "column", marginLeft: 2 }, progressLines.map((line, i) => (React.createElement(Text, { key: i, dimColor: true }, line)))))));
27
+ }
28
+ case "tool_result": {
29
+ if (item.display && (item.tool === "Write" || item.tool === "Edit")) {
30
+ return React.createElement(Diff, { patch: item.display });
31
+ }
32
+ const rendered = item.isError ? item.content : highlightToolOutput(item.tool, item.content);
33
+ const lines = rendered.split("\n");
34
+ const limit = 12;
35
+ const shown = lines.slice(0, limit);
36
+ const more = lines.length > shown.length ? lines.length - shown.length : 0;
37
+ return (React.createElement(Box, { flexDirection: "column" },
38
+ shown.map((line, i) => (React.createElement(Text, { key: i, color: item.isError ? "red" : undefined, dimColor: !item.isError }, " " + line))),
39
+ more > 0 && React.createElement(Text, { color: "gray" }, ` … (${more} more lines — /last to expand)`)));
40
+ }
41
+ case "system":
42
+ return React.createElement(Text, { color: "magenta" }, item.text);
43
+ case "error":
44
+ return (React.createElement(Box, { marginTop: 1 },
45
+ React.createElement(Text, { color: "red" },
46
+ "! ",
47
+ item.text)));
48
+ }
49
+ }
50
+ //# sourceMappingURL=MessageView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MessageView.js","sourceRoot":"","sources":["../../../src/ui/tui/MessageView.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ import React, { useState } from "react";
2
+ import { Box, Text, useInput } from "ink";
3
+ export function PermissionPrompt({ pending }) {
4
+ const [selected, setSelected] = useState(0);
5
+ const choices = [
6
+ { key: "y", label: "Yes (once)", value: "yes" },
7
+ { key: "a", label: "Always (this session)", value: "always" },
8
+ { key: "s", label: "Save to settings (allowlist)", value: "save" },
9
+ { key: "n", label: "No (deny)", value: "no" },
10
+ ];
11
+ useInput((input, key) => {
12
+ if (key.upArrow)
13
+ setSelected((s) => (s - 1 + choices.length) % choices.length);
14
+ else if (key.downArrow)
15
+ setSelected((s) => (s + 1) % choices.length);
16
+ else if (key.return)
17
+ pending.resolve(choices[selected].value);
18
+ else {
19
+ const c = choices.find((c) => c.key === input.toLowerCase());
20
+ if (c)
21
+ pending.resolve(c.value);
22
+ }
23
+ });
24
+ return (React.createElement(Box, { borderStyle: "round", borderColor: "yellow", flexDirection: "column", paddingX: 1, marginY: 1 },
25
+ React.createElement(Text, { color: "yellow", bold: true }, "Permission required"),
26
+ React.createElement(Text, null,
27
+ "Tool: ",
28
+ React.createElement(Text, { color: "cyan" }, pending.tool),
29
+ " (",
30
+ pending.key,
31
+ ")"),
32
+ React.createElement(Box, { marginTop: 1, flexDirection: "column" },
33
+ React.createElement(Text, { dimColor: true }, "Input:"),
34
+ React.createElement(Text, null, truncate(JSON.stringify(pending.input, null, 2), 400))),
35
+ React.createElement(Box, { marginTop: 1, flexDirection: "column" }, choices.map((c, i) => (React.createElement(Text, { key: c.value, color: i === selected ? "green" : undefined },
36
+ i === selected ? "› " : " ",
37
+ "[",
38
+ c.key,
39
+ "] ",
40
+ c.label)))),
41
+ React.createElement(Box, { marginTop: 1 },
42
+ React.createElement(Text, { dimColor: true }, "\u2191/\u2193 to choose, Enter to confirm, or press the letter directly."))));
43
+ }
44
+ function truncate(s, n) {
45
+ return s.length > n ? s.slice(0, n) + "\n…" : s;
46
+ }
47
+ //# sourceMappingURL=PermissionPrompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PermissionPrompt.js","sourceRoot":"","sources":["../../../src/ui/tui/PermissionPrompt.tsx"],"names":[],"mappings":"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"}