@arts1234567/arc-code 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.
- package/LICENSE +21 -0
- package/README.md +109 -0
- package/bin/arc.js +5 -0
- package/dist/agent/executor.js +78 -0
- package/dist/agent/executor.js.map +1 -0
- package/dist/agent/memory.js +57 -0
- package/dist/agent/memory.js.map +1 -0
- package/dist/agent/orchestrator.js +153 -0
- package/dist/agent/orchestrator.js.map +1 -0
- package/dist/agent/planner.js +26 -0
- package/dist/agent/planner.js.map +1 -0
- package/dist/agent/retriever.js +151 -0
- package/dist/agent/retriever.js.map +1 -0
- package/dist/agent/verifier.js +24 -0
- package/dist/agent/verifier.js.map +1 -0
- package/dist/cli.js +33 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.js +47 -0
- package/dist/config.js.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/llm/compaction.js +108 -0
- package/dist/llm/compaction.js.map +1 -0
- package/dist/llm/provider.js +201 -0
- package/dist/llm/provider.js.map +1 -0
- package/dist/llm/system.js +40 -0
- package/dist/llm/system.js.map +1 -0
- package/dist/llm/types.js +4 -0
- package/dist/llm/types.js.map +1 -0
- package/dist/run-interactive.js +22 -0
- package/dist/run-interactive.js.map +1 -0
- package/dist/run-single.js +72 -0
- package/dist/run-single.js.map +1 -0
- package/dist/state.js +75 -0
- package/dist/state.js.map +1 -0
- package/dist/tools/delete.js +63 -0
- package/dist/tools/delete.js.map +1 -0
- package/dist/tools/edit.js +67 -0
- package/dist/tools/edit.js.map +1 -0
- package/dist/tools/execute.js +85 -0
- package/dist/tools/execute.js.map +1 -0
- package/dist/tools/index.js +36 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/list.js +66 -0
- package/dist/tools/list.js.map +1 -0
- package/dist/tools/move.js +56 -0
- package/dist/tools/move.js.map +1 -0
- package/dist/tools/read.js +84 -0
- package/dist/tools/read.js.map +1 -0
- package/dist/tools/read_image.js +67 -0
- package/dist/tools/read_image.js.map +1 -0
- package/dist/tools/search.js +177 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/tools/websearch.js +106 -0
- package/dist/tools/websearch.js.map +1 -0
- package/dist/tools/write.js +47 -0
- package/dist/tools/write.js.map +1 -0
- package/dist/ui/ChatWindow.js +143 -0
- package/dist/ui/ChatWindow.js.map +1 -0
- package/dist/ui/InputBar.js +136 -0
- package/dist/ui/InputBar.js.map +1 -0
- package/dist/ui/ThinkingIndicator.js +67 -0
- package/dist/ui/ThinkingIndicator.js.map +1 -0
- package/dist/ui/commands.js +395 -0
- package/dist/ui/commands.js.map +1 -0
- package/dist/ui/mascot.js +41 -0
- package/dist/ui/mascot.js.map +1 -0
- package/dist/ui/theme.js +43 -0
- package/dist/ui/theme.js.map +1 -0
- package/dist/ui/tui.js +297 -0
- package/dist/ui/tui.js.map +1 -0
- package/dist/ui/words.js +161 -0
- package/dist/ui/words.js.map +1 -0
- package/package.json +64 -0
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
// read_image - read an image file and return it as a base64 data URI.
|
|
2
|
+
// Supports JPEG, PNG, GIF, WebP. The executor detects the ARC_IMAGE:: prefix
|
|
3
|
+
// and upgrades the tool-result message to a multimodal ContentBlock[] so the
|
|
4
|
+
// model receives the image in the OpenAI vision format.
|
|
5
|
+
import { promises as fs } from "fs";
|
|
6
|
+
import * as path from "path";
|
|
7
|
+
// Sentinel prefix the executor looks for to detect image results.
|
|
8
|
+
export const IMAGE_SENTINEL = "ARC_IMAGE::";
|
|
9
|
+
const SUPPORTED = {
|
|
10
|
+
".png": "image/png",
|
|
11
|
+
".jpg": "image/jpeg",
|
|
12
|
+
".jpeg": "image/jpeg",
|
|
13
|
+
".gif": "image/gif",
|
|
14
|
+
".webp": "image/webp",
|
|
15
|
+
};
|
|
16
|
+
// Max image size to send (4 MB encoded) — keeps token cost reasonable.
|
|
17
|
+
const MAX_BYTES = 4 * 1024 * 1024;
|
|
18
|
+
export const readImageTool = {
|
|
19
|
+
definition: {
|
|
20
|
+
type: "function",
|
|
21
|
+
function: {
|
|
22
|
+
name: "read_image",
|
|
23
|
+
description: "Read an image file (PNG, JPEG, GIF, WebP) and load it into your vision context so you can see and describe its contents. Use this for screenshots, diagrams, UI mockups, or any image the user wants you to analyse.",
|
|
24
|
+
parameters: {
|
|
25
|
+
type: "object",
|
|
26
|
+
properties: {
|
|
27
|
+
path: {
|
|
28
|
+
type: "string",
|
|
29
|
+
description: "Path to the image file. Relative paths resolve from cwd.",
|
|
30
|
+
},
|
|
31
|
+
},
|
|
32
|
+
required: ["path"],
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
execute: async (args, ctx) => {
|
|
37
|
+
if (!args.path || typeof args.path !== "string") {
|
|
38
|
+
return "Error: 'path' must be a non-empty string.";
|
|
39
|
+
}
|
|
40
|
+
const target = path.isAbsolute(args.path)
|
|
41
|
+
? args.path
|
|
42
|
+
: path.resolve(ctx.cwd, args.path);
|
|
43
|
+
const ext = path.extname(target).toLowerCase();
|
|
44
|
+
const mime = SUPPORTED[ext];
|
|
45
|
+
if (!mime) {
|
|
46
|
+
return `Error: Unsupported image format '${ext}'. Supported: ${Object.keys(SUPPORTED).join(", ")}.`;
|
|
47
|
+
}
|
|
48
|
+
let buf;
|
|
49
|
+
try {
|
|
50
|
+
buf = await fs.readFile(target);
|
|
51
|
+
}
|
|
52
|
+
catch (err) {
|
|
53
|
+
if (err.code === "ENOENT") {
|
|
54
|
+
return `Error: File '${args.path}' does not exist.`;
|
|
55
|
+
}
|
|
56
|
+
return `Error reading '${args.path}': ${err?.message ?? err}`;
|
|
57
|
+
}
|
|
58
|
+
if (buf.length > MAX_BYTES) {
|
|
59
|
+
return `Error: Image '${args.path}' is ${(buf.length / 1024 / 1024).toFixed(1)} MB — exceeds the 4 MB limit. Resize or compress the image first.`;
|
|
60
|
+
}
|
|
61
|
+
const b64 = buf.toString("base64");
|
|
62
|
+
const dataUri = `data:${mime};base64,${b64}`;
|
|
63
|
+
// Return the sentinel so the executor can upgrade this to a vision message.
|
|
64
|
+
return `${IMAGE_SENTINEL}${dataUri}`;
|
|
65
|
+
},
|
|
66
|
+
};
|
|
67
|
+
//# sourceMappingURL=read_image.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read_image.js","sourceRoot":"","sources":["../../src/tools/read_image.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,6EAA6E;AAC7E,6EAA6E;AAC7E,wDAAwD;AACxD,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAG7B,kEAAkE;AAClE,MAAM,CAAC,MAAM,cAAc,GAAG,aAAa,CAAC;AAE5C,MAAM,SAAS,GAA2B;IACxC,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,YAAY;IACpB,OAAO,EAAE,YAAY;IACrB,MAAM,EAAE,WAAW;IACnB,OAAO,EAAE,YAAY;CACtB,CAAC;AAEF,uEAAuE;AACvE,MAAM,SAAS,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;AAElC,MAAM,CAAC,MAAM,aAAa,GAAS;IACjC,UAAU,EAAE;QACV,IAAI,EAAE,UAAU;QAChB,QAAQ,EAAE;YACR,IAAI,EAAE,YAAY;YAClB,WAAW,EACT,sNAAsN;YACxN,UAAU,EAAE;gBACV,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,IAAI,EAAE;wBACJ,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,0DAA0D;qBACxE;iBACF;gBACD,QAAQ,EAAE,CAAC,MAAM,CAAC;aACnB;SACF;KACF;IACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;QAC3B,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAChD,OAAO,2CAA2C,CAAC;QACrD,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;YACvC,CAAC,CAAC,IAAI,CAAC,IAAI;YACX,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAErC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;QAC/C,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,oCAAoC,GAAG,iBAAiB,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;QACtG,CAAC;QAED,IAAI,GAAW,CAAC;QAChB,IAAI,CAAC;YACH,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAClC,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC1B,OAAO,gBAAgB,IAAI,CAAC,IAAI,mBAAmB,CAAC;YACtD,CAAC;YACD,OAAO,kBAAkB,IAAI,CAAC,IAAI,MAAM,GAAG,EAAE,OAAO,IAAI,GAAG,EAAE,CAAC;QAChE,CAAC;QAED,IAAI,GAAG,CAAC,MAAM,GAAG,SAAS,EAAE,CAAC;YAC3B,OAAO,iBAAiB,IAAI,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,mEAAmE,CAAC;QACpJ,CAAC;QAED,MAAM,GAAG,GAAG,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACnC,MAAM,OAAO,GAAG,QAAQ,IAAI,WAAW,GAAG,EAAE,CAAC;QAE7C,4EAA4E;QAC5E,OAAO,GAAG,cAAc,GAAG,OAAO,EAAE,CAAC;IACvC,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
// search_files - search the workspace for files or text matching a pattern.
|
|
2
|
+
// Uses ripgrep if available, falls back to a simple recursive walk + substring match.
|
|
3
|
+
import { promises as fs } from "fs";
|
|
4
|
+
import * as path from "path";
|
|
5
|
+
import { spawn } from "child_process";
|
|
6
|
+
const MAX_RESULTS = 100;
|
|
7
|
+
export const searchFilesTool = {
|
|
8
|
+
definition: {
|
|
9
|
+
type: "function",
|
|
10
|
+
function: {
|
|
11
|
+
name: "search_files",
|
|
12
|
+
description: "Search the workspace for files or text matching a pattern. If 'pattern' looks like a simple substring, do a literal substring search across file contents. If it contains regex characters, treat as a regex. Searches recursively from the given path (or cwd).",
|
|
13
|
+
parameters: {
|
|
14
|
+
type: "object",
|
|
15
|
+
properties: {
|
|
16
|
+
pattern: {
|
|
17
|
+
type: "string",
|
|
18
|
+
description: "Pattern to search for. Substring or regex.",
|
|
19
|
+
},
|
|
20
|
+
path: {
|
|
21
|
+
type: "string",
|
|
22
|
+
description: "Directory to search in. Defaults to the current working directory.",
|
|
23
|
+
},
|
|
24
|
+
file_glob: {
|
|
25
|
+
type: "string",
|
|
26
|
+
description: "Optional glob to limit the search to specific files (e.g. '*.ts').",
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
required: ["pattern"],
|
|
30
|
+
},
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
execute: async (args, ctx) => {
|
|
34
|
+
if (!args.pattern || typeof args.pattern !== "string") {
|
|
35
|
+
return `Error: 'pattern' is required and must be a string.`;
|
|
36
|
+
}
|
|
37
|
+
if (args.path !== undefined && (typeof args.path !== "string" || args.path.length === 0)) {
|
|
38
|
+
return `Error: 'path' must be a non-empty string if provided.`;
|
|
39
|
+
}
|
|
40
|
+
const root = args.path
|
|
41
|
+
? path.isAbsolute(args.path)
|
|
42
|
+
? args.path
|
|
43
|
+
: path.resolve(ctx.cwd, args.path)
|
|
44
|
+
: ctx.cwd;
|
|
45
|
+
// Try ripgrep first.
|
|
46
|
+
const rgResult = await tryRipgrep(args.pattern, root, args.file_glob);
|
|
47
|
+
if (rgResult !== null)
|
|
48
|
+
return rgResult;
|
|
49
|
+
// Fallback: walk directory and substring/regex match file contents.
|
|
50
|
+
return fallbackSearch(args.pattern, root, args.file_glob);
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
async function tryRipgrep(pattern, root, glob) {
|
|
54
|
+
return new Promise((resolve) => {
|
|
55
|
+
const rg = spawn("rg", [
|
|
56
|
+
"--no-heading",
|
|
57
|
+
"--line-number",
|
|
58
|
+
"--max-count",
|
|
59
|
+
"10",
|
|
60
|
+
...(glob ? ["--glob", glob] : []),
|
|
61
|
+
pattern,
|
|
62
|
+
root,
|
|
63
|
+
]);
|
|
64
|
+
let out = "";
|
|
65
|
+
let err = "";
|
|
66
|
+
rg.stdout.on("data", (d) => (out += d.toString()));
|
|
67
|
+
rg.stderr.on("data", (d) => (err += d.toString()));
|
|
68
|
+
// If rg is not installed, fall back to the JS implementation.
|
|
69
|
+
rg.on("error", () => resolve(null));
|
|
70
|
+
rg.on("close", (code) => {
|
|
71
|
+
if (code === null) {
|
|
72
|
+
// Process killed / crashed — fall back to JS search.
|
|
73
|
+
return resolve(null);
|
|
74
|
+
}
|
|
75
|
+
if (code === 1) {
|
|
76
|
+
// ripgrep exit 1 = no matches found.
|
|
77
|
+
return resolve("No matches found.");
|
|
78
|
+
}
|
|
79
|
+
if (code === 2) {
|
|
80
|
+
// ripgrep exit 2 = error (e.g. bad regex) — fall back.
|
|
81
|
+
return resolve(null);
|
|
82
|
+
}
|
|
83
|
+
// code === 0: matches found.
|
|
84
|
+
if (out.length === 0)
|
|
85
|
+
return resolve("No matches found.");
|
|
86
|
+
const allLines = out.trimEnd().split("\n");
|
|
87
|
+
const trimmed = allLines.slice(0, MAX_RESULTS);
|
|
88
|
+
let result = trimmed.join("\n");
|
|
89
|
+
if (allLines.length > MAX_RESULTS) {
|
|
90
|
+
result += `\n\n[... truncated to ${MAX_RESULTS} results]`;
|
|
91
|
+
}
|
|
92
|
+
resolve(result);
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
async function fallbackSearch(pattern, root, glob) {
|
|
97
|
+
const results = [];
|
|
98
|
+
const regex = safeRegex(pattern);
|
|
99
|
+
const matcher = regex
|
|
100
|
+
? (line) => regex.test(line)
|
|
101
|
+
: (line) => line.includes(pattern);
|
|
102
|
+
const globRe = glob ? globToRegex(glob) : null;
|
|
103
|
+
async function walk(dir, depth) {
|
|
104
|
+
if (depth > 8)
|
|
105
|
+
return;
|
|
106
|
+
if (results.length >= MAX_RESULTS)
|
|
107
|
+
return;
|
|
108
|
+
let entries;
|
|
109
|
+
try {
|
|
110
|
+
entries = await fs.readdir(dir, { withFileTypes: true });
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
for (const e of entries) {
|
|
116
|
+
if (results.length >= MAX_RESULTS)
|
|
117
|
+
return;
|
|
118
|
+
if (e.name === "node_modules" || e.name === ".git" || e.name === "dist")
|
|
119
|
+
continue;
|
|
120
|
+
const full = path.join(dir, e.name);
|
|
121
|
+
if (e.isDirectory()) {
|
|
122
|
+
await walk(full, depth + 1);
|
|
123
|
+
}
|
|
124
|
+
else if (e.isFile()) {
|
|
125
|
+
if (globRe && !globRe.test(e.name))
|
|
126
|
+
continue;
|
|
127
|
+
try {
|
|
128
|
+
const content = await fs.readFile(full, "utf-8");
|
|
129
|
+
const lines = content.split("\n");
|
|
130
|
+
let fileHits = 0;
|
|
131
|
+
for (let i = 0; i < lines.length; i++) {
|
|
132
|
+
if (matcher(lines[i])) {
|
|
133
|
+
results.push(`${full}:${i + 1}:${lines[i].slice(0, 200)}`);
|
|
134
|
+
fileHits++;
|
|
135
|
+
if (fileHits >= 3)
|
|
136
|
+
break;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
// skip unreadable files
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
await walk(root, 0);
|
|
147
|
+
if (results.length === 0)
|
|
148
|
+
return "No matches found.";
|
|
149
|
+
let out = results.join("\n");
|
|
150
|
+
if (results.length >= MAX_RESULTS) {
|
|
151
|
+
out += `\n\n[... truncated, more matches exist]`;
|
|
152
|
+
}
|
|
153
|
+
return out;
|
|
154
|
+
}
|
|
155
|
+
function safeRegex(p) {
|
|
156
|
+
try {
|
|
157
|
+
return new RegExp(p);
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
return null;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
function globToRegex(g) {
|
|
164
|
+
let re = "";
|
|
165
|
+
for (const ch of g) {
|
|
166
|
+
if (ch === "*")
|
|
167
|
+
re += "[^/]*";
|
|
168
|
+
else if (ch === "?")
|
|
169
|
+
re += "[^/]";
|
|
170
|
+
else if (ch === ".")
|
|
171
|
+
re += "\\.";
|
|
172
|
+
else
|
|
173
|
+
re += ch.replace(/[\\^$+(){}|[\]]/g, "\\$&");
|
|
174
|
+
}
|
|
175
|
+
return new RegExp("^" + re + "$");
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,sFAAsF;AACtF,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAGtC,MAAM,WAAW,GAAG,GAAG,CAAC;AAExB,MAAM,CAAC,MAAM,eAAe,GAAS;IACnC,UAAU,EAAE;QACV,IAAI,EAAE,UAAU;QAChB,QAAQ,EAAE;YACR,IAAI,EAAE,cAAc;YACpB,WAAW,EACT,kQAAkQ;YACpQ,UAAU,EAAE;gBACV,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,OAAO,EAAE;wBACP,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,4CAA4C;qBAC1D;oBACD,IAAI,EAAE;wBACJ,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,oEAAoE;qBAClF;oBACD,SAAS,EAAE;wBACT,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,oEAAoE;qBAClF;iBACF;gBACD,QAAQ,EAAE,CAAC,SAAS,CAAC;aACtB;SACF;KACF;IACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;QAC3B,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;YACtD,OAAO,oDAAoD,CAAC;QAC9D,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;YACzF,OAAO,uDAAuD,CAAC;QACjE,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI;YACpB,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;gBAC1B,CAAC,CAAC,IAAI,CAAC,IAAI;gBACX,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC;YACpC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;QAEZ,qBAAqB;QACrB,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QACtE,IAAI,QAAQ,KAAK,IAAI;YAAE,OAAO,QAAQ,CAAC;QAEvC,oEAAoE;QACpE,OAAO,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IAC5D,CAAC;CACF,CAAC;AAEF,KAAK,UAAU,UAAU,CACvB,OAAe,EACf,IAAY,EACZ,IAAa;IAEb,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE;YACrB,cAAc;YACd,eAAe;YACf,aAAa;YACb,IAAI;YACJ,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACjC,OAAO;YACP,IAAI;SACL,CAAC,CAAC;QACH,IAAI,GAAG,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,GAAG,EAAE,CAAC;QACb,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QACnD,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QACnD,8DAA8D;QAC9D,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QACpC,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACtB,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;gBAClB,qDAAqD;gBACrD,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC;YACvB,CAAC;YACD,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBACf,qCAAqC;gBACrC,OAAO,OAAO,CAAC,mBAAmB,CAAC,CAAC;YACtC,CAAC;YACD,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBACf,uDAAuD;gBACvD,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC;YACvB,CAAC;YACD,6BAA6B;YAC7B,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,OAAO,CAAC,mBAAmB,CAAC,CAAC;YAC1D,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC3C,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;YAC/C,IAAI,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAChC,IAAI,QAAQ,CAAC,MAAM,GAAG,WAAW,EAAE,CAAC;gBAClC,MAAM,IAAI,yBAAyB,WAAW,WAAW,CAAC;YAC5D,CAAC;YACD,OAAO,CAAC,MAAM,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,cAAc,CAC3B,OAAe,EACf,IAAY,EACZ,IAAa;IAEb,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IACjC,MAAM,OAAO,GAAG,KAAK;QACnB,CAAC,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;QACpC,CAAC,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAE/C,KAAK,UAAU,IAAI,CAAC,GAAW,EAAE,KAAa;QAC5C,IAAI,KAAK,GAAG,CAAC;YAAE,OAAO;QACtB,IAAI,OAAO,CAAC,MAAM,IAAI,WAAW;YAAE,OAAO;QAC1C,IAAI,OAAO,CAAC;QACZ,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3D,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;QACT,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,IAAI,OAAO,CAAC,MAAM,IAAI,WAAW;gBAAE,OAAO;YAC1C,IAAI,CAAC,CAAC,IAAI,KAAK,cAAc,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM;gBACrE,SAAS;YACX,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;YACpC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;gBACpB,MAAM,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;YAC9B,CAAC;iBAAM,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;gBACtB,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;oBAAE,SAAS;gBAC7C,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;oBACjD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBAClC,IAAI,QAAQ,GAAG,CAAC,CAAC;oBACjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;wBACtC,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;4BACtB,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;4BAC3D,QAAQ,EAAE,CAAC;4BACX,IAAI,QAAQ,IAAI,CAAC;gCAAE,MAAM;wBAC3B,CAAC;oBACH,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,wBAAwB;gBAC1B,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACpB,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,mBAAmB,CAAC;IACrD,IAAI,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7B,IAAI,OAAO,CAAC,MAAM,IAAI,WAAW,EAAE,CAAC;QAClC,GAAG,IAAI,yCAAyC,CAAC;IACnD,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,SAAS,CAAC,CAAS;IAC1B,IAAI,CAAC;QACH,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,CAAS;IAC5B,IAAI,EAAE,GAAG,EAAE,CAAC;IACZ,KAAK,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC;QACnB,IAAI,EAAE,KAAK,GAAG;YAAE,EAAE,IAAI,OAAO,CAAC;aACzB,IAAI,EAAE,KAAK,GAAG;YAAE,EAAE,IAAI,MAAM,CAAC;aAC7B,IAAI,EAAE,KAAK,GAAG;YAAE,EAAE,IAAI,KAAK,CAAC;;YAC5B,EAAE,IAAI,EAAE,CAAC,OAAO,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,IAAI,MAAM,CAAC,GAAG,GAAG,EAAE,GAAG,GAAG,CAAC,CAAC;AACpC,CAAC"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
const DDG_HTML_URL = "https://html.duckduckgo.com/html/";
|
|
2
|
+
const WIKI_URL = "https://en.wikipedia.org/api/rest_v1/page/summary/";
|
|
3
|
+
const MAX_RESULTS = 5;
|
|
4
|
+
export const webSearchTool = {
|
|
5
|
+
definition: {
|
|
6
|
+
type: "function",
|
|
7
|
+
function: {
|
|
8
|
+
name: "web_search",
|
|
9
|
+
description: "Search the web for current information. Queries DuckDuckGo for instant answers and top results, and fetches a Wikipedia summary when a matching article exists. Use for facts, documentation, current events, or anything outside the codebase.",
|
|
10
|
+
parameters: {
|
|
11
|
+
type: "object",
|
|
12
|
+
properties: {
|
|
13
|
+
query: {
|
|
14
|
+
type: "string",
|
|
15
|
+
description: "The search query.",
|
|
16
|
+
},
|
|
17
|
+
wikipedia: {
|
|
18
|
+
type: "boolean",
|
|
19
|
+
description: "If true, also fetch the Wikipedia summary for the top result title. Default: false.",
|
|
20
|
+
},
|
|
21
|
+
},
|
|
22
|
+
required: ["query"],
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
execute: async (args) => {
|
|
27
|
+
if (!args.query || typeof args.query !== "string") {
|
|
28
|
+
return "Error: 'query' must be a non-empty string.";
|
|
29
|
+
}
|
|
30
|
+
const query = args.query.trim();
|
|
31
|
+
const parts = [];
|
|
32
|
+
// ── 1. DuckDuckGo HTML Search ─────────────────────────────────────────────
|
|
33
|
+
try {
|
|
34
|
+
const ddgParams = new URLSearchParams({ q: query });
|
|
35
|
+
const ddgRes = await fetchWithTimeout(`${DDG_HTML_URL}?${ddgParams.toString()}`, { headers: { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" } }, 10000);
|
|
36
|
+
if (ddgRes.ok) {
|
|
37
|
+
const html = await ddgRes.text();
|
|
38
|
+
const resultRegex = /<a class="result__url" href="([^"]+)">([^<]+)<\/a>[\s\S]*?<a class="result__snippet[^>]*>([\s\S]*?)<\/a>/g;
|
|
39
|
+
let match;
|
|
40
|
+
const results = [];
|
|
41
|
+
while ((match = resultRegex.exec(html)) !== null && results.length < MAX_RESULTS) {
|
|
42
|
+
const url = match[1].startsWith("//") ? "https:" + match[1] : match[1];
|
|
43
|
+
const title = match[2].trim();
|
|
44
|
+
// Remove <b> tags from snippet
|
|
45
|
+
const snippet = match[3].replace(/<\/?b>/g, "").trim();
|
|
46
|
+
results.push(`• ${title}\n ${snippet}\n Source: ${url}`);
|
|
47
|
+
}
|
|
48
|
+
if (results.length > 0) {
|
|
49
|
+
parts.push(`## Search Results\n${results.join("\n\n")}`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
catch (err) {
|
|
54
|
+
parts.push(`DuckDuckGo error: ${err?.message ?? err}`);
|
|
55
|
+
}
|
|
56
|
+
// ── 2. Wikipedia summary (opt-in) ─────────────────────────────────────────
|
|
57
|
+
if (args.wikipedia === true) {
|
|
58
|
+
try {
|
|
59
|
+
// Try the query as a Wikipedia title (spaces → underscores)
|
|
60
|
+
const title = encodeURIComponent(query.replace(/\s+/g, "_"));
|
|
61
|
+
const wikiRes = await fetchWithTimeout(`${WIKI_URL}${title}`, { headers: { "User-Agent": "arc-code-cli/0.1 (educational tool)" } }, 6000);
|
|
62
|
+
if (wikiRes.ok) {
|
|
63
|
+
const wikiRaw = await wikiRes.text();
|
|
64
|
+
const wiki = safeParseJSON(wikiRaw);
|
|
65
|
+
if (wiki?.extract && wiki.type !== "disambiguation") {
|
|
66
|
+
const extract = wiki.extract.slice(0, 600);
|
|
67
|
+
parts.push(`## Wikipedia: ${wiki.title}\n${extract}${wiki.extract.length > 600 ? "…" : ""}`);
|
|
68
|
+
if (wiki.content_urls?.desktop?.page) {
|
|
69
|
+
parts.push(`Source: ${wiki.content_urls.desktop.page}`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
// Wikipedia is best-effort — silently skip on timeout/error
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
if (parts.length === 0) {
|
|
79
|
+
return `No results found for: "${query}". Try rephrasing or using a more specific query.`;
|
|
80
|
+
}
|
|
81
|
+
return parts.join("\n\n");
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
// ── Helpers ───────────────────────────────────────────────────────────────────
|
|
85
|
+
function safeParseJSON(text) {
|
|
86
|
+
const trimmed = text.trim();
|
|
87
|
+
if (!trimmed || !trimmed.startsWith("{"))
|
|
88
|
+
return null;
|
|
89
|
+
try {
|
|
90
|
+
return JSON.parse(trimmed);
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
async function fetchWithTimeout(url, opts, ms) {
|
|
97
|
+
const ctrl = new AbortController();
|
|
98
|
+
const tid = setTimeout(() => ctrl.abort(), ms);
|
|
99
|
+
try {
|
|
100
|
+
return await fetch(url, { ...opts, signal: ctrl.signal });
|
|
101
|
+
}
|
|
102
|
+
finally {
|
|
103
|
+
clearTimeout(tid);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=websearch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"websearch.js","sourceRoot":"","sources":["../../src/tools/websearch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
// write_file - create or overwrite a file.
|
|
2
|
+
import { promises as fs } from "fs";
|
|
3
|
+
import * as path from "path";
|
|
4
|
+
export const writeFileTool = {
|
|
5
|
+
definition: {
|
|
6
|
+
type: "function",
|
|
7
|
+
function: {
|
|
8
|
+
name: "write_file",
|
|
9
|
+
description: "Create a new file or overwrite an existing file with the given content. Parent directories are created automatically.",
|
|
10
|
+
parameters: {
|
|
11
|
+
type: "object",
|
|
12
|
+
properties: {
|
|
13
|
+
path: {
|
|
14
|
+
type: "string",
|
|
15
|
+
description: "Path to the file to write. Relative paths are resolved from the current working directory.",
|
|
16
|
+
},
|
|
17
|
+
content: {
|
|
18
|
+
type: "string",
|
|
19
|
+
description: "The full content to write to the file.",
|
|
20
|
+
},
|
|
21
|
+
},
|
|
22
|
+
required: ["path", "content"],
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
execute: async (args, ctx) => {
|
|
27
|
+
if (!args.path || typeof args.path !== "string") {
|
|
28
|
+
return `Error: 'path' is required and must be a string.`;
|
|
29
|
+
}
|
|
30
|
+
if (args.content !== undefined && typeof args.content !== "string") {
|
|
31
|
+
return `Error: 'content' must be a string.`;
|
|
32
|
+
}
|
|
33
|
+
const target = path.isAbsolute(args.path)
|
|
34
|
+
? args.path
|
|
35
|
+
: path.resolve(ctx.cwd, args.path);
|
|
36
|
+
try {
|
|
37
|
+
await fs.mkdir(path.dirname(target), { recursive: true });
|
|
38
|
+
await fs.writeFile(target, args.content ?? "", "utf-8");
|
|
39
|
+
const bytes = Buffer.byteLength(args.content ?? "", "utf-8");
|
|
40
|
+
return `Wrote ${bytes} bytes to '${args.path}'.`;
|
|
41
|
+
}
|
|
42
|
+
catch (err) {
|
|
43
|
+
return `Error writing file '${args.path}': ${err?.message ?? err}`;
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
//# sourceMappingURL=write.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"write.js","sourceRoot":"","sources":["../../src/tools/write.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAC3C,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAG7B,MAAM,CAAC,MAAM,aAAa,GAAS;IACjC,UAAU,EAAE;QACV,IAAI,EAAE,UAAU;QAChB,QAAQ,EAAE;YACR,IAAI,EAAE,YAAY;YAClB,WAAW,EACT,uHAAuH;YACzH,UAAU,EAAE;gBACV,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,IAAI,EAAE;wBACJ,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,4FAA4F;qBAC1G;oBACD,OAAO,EAAE;wBACP,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,wCAAwC;qBACtD;iBACF;gBACD,QAAQ,EAAE,CAAC,MAAM,EAAE,SAAS,CAAC;aAC9B;SACF;KACF;IACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;QAC3B,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAChD,OAAO,iDAAiD,CAAC;QAC3D,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;YACnE,OAAO,oCAAoC,CAAC;QAC9C,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;YACvC,CAAC,CAAC,IAAI,CAAC,IAAI;YACX,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC1D,MAAM,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC;YACxD,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC;YAC7D,OAAO,SAAS,KAAK,cAAc,IAAI,CAAC,IAAI,IAAI,CAAC;QACnD,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,OAAO,uBAAuB,IAAI,CAAC,IAAI,MAAM,GAAG,EAAE,OAAO,IAAI,GAAG,EAAE,CAAC;QACrE,CAAC;IACH,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
// Arc-code Chat Window
|
|
2
|
+
// Conversation log rendered permanently into the terminal's scrollback buffer
|
|
3
|
+
// via Ink's <Static>. Supports all message kinds including banner, commands,
|
|
4
|
+
// reasoning, tool calls, and compaction notices.
|
|
5
|
+
import React from "react";
|
|
6
|
+
import { Text, Box, Static } from "ink";
|
|
7
|
+
export const ChatWindow = ({ messages }) => {
|
|
8
|
+
if (messages.length === 0)
|
|
9
|
+
return null;
|
|
10
|
+
// We split messages into two groups:
|
|
11
|
+
// 1. All messages EXCEPT the last one go into <Static>. They are permanently rendered
|
|
12
|
+
// into the terminal scrollback buffer and will never re-render.
|
|
13
|
+
// 2. The very last message is rendered dynamically below <Static>. This allows
|
|
14
|
+
// streaming text and reasoning chunks to actually update live on the screen!
|
|
15
|
+
const staticItems = messages.slice(0, -1);
|
|
16
|
+
const activeItem = messages[messages.length - 1];
|
|
17
|
+
return React.createElement(React.Fragment, null, React.createElement(Static, {
|
|
18
|
+
items: staticItems,
|
|
19
|
+
children: (m) => renderMessage(m, false),
|
|
20
|
+
}), activeItem ? renderMessage(activeItem, true) : null);
|
|
21
|
+
};
|
|
22
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
23
|
+
// Message renderers
|
|
24
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
25
|
+
function renderMessage(m, isActive) {
|
|
26
|
+
switch (m.kind) {
|
|
27
|
+
// ── Startup banner ───────────────────────────────────────────────────────
|
|
28
|
+
case "banner":
|
|
29
|
+
return React.createElement(Box, { key: m.id, flexDirection: "column" }, ...m.content.split("\n").map((line, i) => React.createElement(Text, { key: i, color: "#FF6B35", bold: line.includes("✦") }, line)));
|
|
30
|
+
// ── Slash command echo ───────────────────────────────────────────────────
|
|
31
|
+
case "command":
|
|
32
|
+
return React.createElement(Box, { key: m.id, flexDirection: "row", marginTop: 1 }, React.createElement(Text, { color: "#FFB74D", bold: true }, "❯ "), React.createElement(Text, { color: "#FFD180", bold: true }, m.content));
|
|
33
|
+
// ── User prompt ──────────────────────────────────────────────────────────
|
|
34
|
+
case "user":
|
|
35
|
+
return React.createElement(Box, { key: m.id, flexDirection: "column", marginTop: 1 }, React.createElement(Box, { flexDirection: "row" }, React.createElement(Text, { color: "#FF6B35", bold: true }, "› You"), React.createElement(Text, { color: "#333" }, " ─────────────────")), React.createElement(Box, { marginLeft: 2, marginTop: 0 }, React.createElement(Text, { color: "#FFD180" }, m.content)));
|
|
36
|
+
// ── Assistant reply ──────────────────────────────────────────────────────
|
|
37
|
+
case "assistant":
|
|
38
|
+
return React.createElement(Box, { key: m.id, flexDirection: "column", marginTop: 1 }, React.createElement(Box, { flexDirection: "row" }, React.createElement(Text, { color: "#FF6B35", bold: true }, "◉ Arc 3.4 Ultra"), React.createElement(Text, { color: "#333" }, " ──────────────")), React.createElement(Box, { marginLeft: 2 }, React.createElement(Text, { color: "#F5F5F5" }, isActive ? tailLines(m.content, 15) : m.content)));
|
|
39
|
+
// ── Reasoning / thinking block ───────────────────────────────────────────
|
|
40
|
+
case "reasoning":
|
|
41
|
+
return React.createElement(Box, { key: m.id, flexDirection: "column", marginLeft: 2 }, React.createElement(Text, { color: "#444", dimColor: true }, " ┊ thinking"), React.createElement(Box, { marginLeft: 4, borderLeft: false }, React.createElement(Text, { color: "#555", dimColor: true }, isActive ? tailLines(m.content, 5) : truncate(m.content, 600))));
|
|
42
|
+
// ── Tool call ────────────────────────────────────────────────────────────
|
|
43
|
+
case "tool_call": {
|
|
44
|
+
const toolName = m.meta ?? "tool";
|
|
45
|
+
// read_image gets a purple camera icon; all others get the orange gear
|
|
46
|
+
const isImage = toolName === "read_image";
|
|
47
|
+
return React.createElement(Box, { key: m.id, marginLeft: 2, flexDirection: "row", marginTop: 0 }, React.createElement(Text, { color: isImage ? "#CE93D8" : "#FF6B35" }, isImage ? " 🖼 " : " ⚙ "), React.createElement(Text, { color: isImage ? "#CE93D8" : "#FFB74D", bold: true }, toolName), React.createElement(Text, { color: "#555" }, " → running"));
|
|
48
|
+
}
|
|
49
|
+
// ── Tool result ──────────────────────────────────────────────────────────
|
|
50
|
+
case "tool_result": {
|
|
51
|
+
// Route specialised tool results to dedicated renderers
|
|
52
|
+
if (m.meta === "web_search")
|
|
53
|
+
return renderWebSearch(m);
|
|
54
|
+
if (m.meta === "read_image")
|
|
55
|
+
return renderImageResult(m);
|
|
56
|
+
const preview = m.content ? truncate(m.content.trim(), 280) : "";
|
|
57
|
+
return React.createElement(Box, { key: m.id, marginLeft: 4, flexDirection: "column", marginBottom: 0 }, React.createElement(Box, { flexDirection: "row" }, React.createElement(Text, { color: "#4CAF50" }, " ✓ "), React.createElement(Text, { color: "#4CAF50", bold: true }, m.meta ?? "done")), preview
|
|
58
|
+
? React.createElement(Box, { marginLeft: 4 }, React.createElement(Text, { color: "#444", dimColor: true }, preview))
|
|
59
|
+
: null);
|
|
60
|
+
}
|
|
61
|
+
// ── Web search result (dedicated renderer) ───────────────────────────────
|
|
62
|
+
case "web_search":
|
|
63
|
+
return renderWebSearch(m);
|
|
64
|
+
// ── Context compaction notice ────────────────────────────────────────────
|
|
65
|
+
case "compaction":
|
|
66
|
+
return React.createElement(Box, { key: m.id, marginTop: 1, flexDirection: "column" }, React.createElement(Box, {
|
|
67
|
+
borderStyle: "single",
|
|
68
|
+
borderColor: "#FFB300",
|
|
69
|
+
paddingX: 2,
|
|
70
|
+
}, React.createElement(Text, { color: "#FFB300", bold: true }, "⟳ Context Compacted"), React.createElement(Text, { color: "#888" }, " " + m.content)));
|
|
71
|
+
// ── System / command output ──────────────────────────────────────────────
|
|
72
|
+
case "system":
|
|
73
|
+
default:
|
|
74
|
+
// System messages that are multi-line output from commands get rendered
|
|
75
|
+
// with each line preserved.
|
|
76
|
+
if (m.content.includes("\n")) {
|
|
77
|
+
const lines = m.content.split("\n");
|
|
78
|
+
return React.createElement(Box, { key: m.id, flexDirection: "column", marginTop: 0 }, ...lines.map((line, i) => React.createElement(Text, {
|
|
79
|
+
key: i,
|
|
80
|
+
color: line.startsWith("┌") || line.startsWith("│") || line.startsWith("└")
|
|
81
|
+
? "#FF6B35"
|
|
82
|
+
: line.startsWith(" ├") || line.startsWith(" └") || line.startsWith(" ─")
|
|
83
|
+
? "#555"
|
|
84
|
+
: "#888",
|
|
85
|
+
bold: line.startsWith("┌") || line.startsWith("│") && line.includes("─"),
|
|
86
|
+
}, line)));
|
|
87
|
+
}
|
|
88
|
+
return React.createElement(Box, { key: m.id, marginLeft: 2, marginTop: 0 }, React.createElement(Text, { color: "#666", dimColor: true }, " " + m.content));
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
function truncate(s, n) {
|
|
92
|
+
if (s.length <= n)
|
|
93
|
+
return s;
|
|
94
|
+
return s.slice(0, n) + "\n …[truncated]";
|
|
95
|
+
}
|
|
96
|
+
// Keep only the last N lines of a string (useful for live streaming view)
|
|
97
|
+
function tailLines(s, maxLines) {
|
|
98
|
+
const lines = s.split("\n");
|
|
99
|
+
if (lines.length <= maxLines)
|
|
100
|
+
return s;
|
|
101
|
+
return "...\n" + lines.slice(-maxLines).join("\n");
|
|
102
|
+
}
|
|
103
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
104
|
+
// Image result renderer
|
|
105
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
106
|
+
function renderImageResult(m) {
|
|
107
|
+
// m.content is "Image loaded: filename.png" from the executor
|
|
108
|
+
const label = typeof m.content === "string" ? m.content : "Image loaded";
|
|
109
|
+
return React.createElement(Box, { key: m.id, marginLeft: 2, flexDirection: "column", marginTop: 0 }, React.createElement(Box, { flexDirection: "row" }, React.createElement(Text, { color: "#CE93D8" }, " 🖼 "), React.createElement(Text, { color: "#CE93D8", bold: true }, "read_image"), React.createElement(Text, { color: "#555" }, " → done")), React.createElement(Box, { marginLeft: 5 }, React.createElement(Text, { color: "#BA68C8", dimColor: false }, label + " — image in context")));
|
|
110
|
+
}
|
|
111
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
112
|
+
// Web search result renderer
|
|
113
|
+
// Shows: 🌐 web_search header, then a compact 2-line snippet
|
|
114
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
115
|
+
function renderWebSearch(m) {
|
|
116
|
+
// Extract first non-empty non-heading line as the snippet, and first URL
|
|
117
|
+
const lines = m.content.split("\n").filter((l) => l.trim());
|
|
118
|
+
let snippet = "";
|
|
119
|
+
let source = "";
|
|
120
|
+
for (const line of lines) {
|
|
121
|
+
const t = line.trim();
|
|
122
|
+
if (!snippet && !t.startsWith("#") && !t.startsWith("Source:")) {
|
|
123
|
+
snippet = truncate(t, 160);
|
|
124
|
+
}
|
|
125
|
+
if (!source && t.startsWith("Source:")) {
|
|
126
|
+
source = t.replace("Source:", "").trim();
|
|
127
|
+
}
|
|
128
|
+
if (snippet && source)
|
|
129
|
+
break;
|
|
130
|
+
}
|
|
131
|
+
return React.createElement(Box, { key: m.id, marginLeft: 2, flexDirection: "column", marginTop: 0 },
|
|
132
|
+
// Header row: globe + "web_search" label
|
|
133
|
+
React.createElement(Box, { flexDirection: "row" }, React.createElement(Text, { color: "#26C6DA" }, " 🌐 "), React.createElement(Text, { color: "#26C6DA", bold: true }, "web_search"), React.createElement(Text, { color: "#555" }, " → done")),
|
|
134
|
+
// Snippet
|
|
135
|
+
snippet
|
|
136
|
+
? React.createElement(Box, { marginLeft: 5 }, React.createElement(Text, { color: "#4DD0E1", dimColor: false }, snippet))
|
|
137
|
+
: null,
|
|
138
|
+
// Source URL
|
|
139
|
+
source
|
|
140
|
+
? React.createElement(Box, { marginLeft: 5 }, React.createElement(Text, { color: "#444", dimColor: true }, "↳ " + source))
|
|
141
|
+
: null);
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=ChatWindow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChatWindow.js","sourceRoot":"","sources":["../../src/ui/ChatWindow.tsx"],"names":[],"mappings":"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"}
|