@antaif3ng/til-work 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/README.md +573 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +7 -0
- package/dist/cli.js.map +1 -0
- package/dist/core/agent.d.ts +78 -0
- package/dist/core/agent.d.ts.map +1 -0
- package/dist/core/agent.js +372 -0
- package/dist/core/agent.js.map +1 -0
- package/dist/core/compaction.d.ts +40 -0
- package/dist/core/compaction.d.ts.map +1 -0
- package/dist/core/compaction.js +228 -0
- package/dist/core/compaction.js.map +1 -0
- package/dist/core/config.d.ts +54 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +257 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/llm.d.ts +29 -0
- package/dist/core/llm.d.ts.map +1 -0
- package/dist/core/llm.js +553 -0
- package/dist/core/llm.js.map +1 -0
- package/dist/core/markdown.d.ts +20 -0
- package/dist/core/markdown.d.ts.map +1 -0
- package/dist/core/markdown.js +173 -0
- package/dist/core/markdown.js.map +1 -0
- package/dist/core/memory.d.ts +30 -0
- package/dist/core/memory.d.ts.map +1 -0
- package/dist/core/memory.js +163 -0
- package/dist/core/memory.js.map +1 -0
- package/dist/core/pricing.d.ts +21 -0
- package/dist/core/pricing.d.ts.map +1 -0
- package/dist/core/pricing.js +70 -0
- package/dist/core/pricing.js.map +1 -0
- package/dist/core/session-manager.d.ts +83 -0
- package/dist/core/session-manager.d.ts.map +1 -0
- package/dist/core/session-manager.js +250 -0
- package/dist/core/session-manager.js.map +1 -0
- package/dist/core/session.d.ts +76 -0
- package/dist/core/session.d.ts.map +1 -0
- package/dist/core/session.js +270 -0
- package/dist/core/session.js.map +1 -0
- package/dist/core/skills.d.ts +49 -0
- package/dist/core/skills.d.ts.map +1 -0
- package/dist/core/skills.js +232 -0
- package/dist/core/skills.js.map +1 -0
- package/dist/core/system-prompt.d.ts +17 -0
- package/dist/core/system-prompt.d.ts.map +1 -0
- package/dist/core/system-prompt.js +77 -0
- package/dist/core/system-prompt.js.map +1 -0
- package/dist/core/tool-permissions.d.ts +12 -0
- package/dist/core/tool-permissions.d.ts.map +1 -0
- package/dist/core/tool-permissions.js +71 -0
- package/dist/core/tool-permissions.js.map +1 -0
- package/dist/core/types.d.ts +157 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +21 -0
- package/dist/core/types.js.map +1 -0
- package/dist/extensions/builtin/mcp.d.ts +61 -0
- package/dist/extensions/builtin/mcp.d.ts.map +1 -0
- package/dist/extensions/builtin/mcp.js +407 -0
- package/dist/extensions/builtin/mcp.js.map +1 -0
- package/dist/extensions/index.d.ts +4 -0
- package/dist/extensions/index.d.ts.map +1 -0
- package/dist/extensions/index.js +3 -0
- package/dist/extensions/index.js.map +1 -0
- package/dist/extensions/loader.d.ts +19 -0
- package/dist/extensions/loader.d.ts.map +1 -0
- package/dist/extensions/loader.js +118 -0
- package/dist/extensions/loader.js.map +1 -0
- package/dist/extensions/runner.d.ts +28 -0
- package/dist/extensions/runner.d.ts.map +1 -0
- package/dist/extensions/runner.js +77 -0
- package/dist/extensions/runner.js.map +1 -0
- package/dist/extensions/types.d.ts +84 -0
- package/dist/extensions/types.d.ts.map +1 -0
- package/dist/extensions/types.js +6 -0
- package/dist/extensions/types.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/main.d.ts +5 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +355 -0
- package/dist/main.js.map +1 -0
- package/dist/modes/interactive.d.ts +6 -0
- package/dist/modes/interactive.d.ts.map +1 -0
- package/dist/modes/interactive.js +961 -0
- package/dist/modes/interactive.js.map +1 -0
- package/dist/modes/oneshot.d.ts +8 -0
- package/dist/modes/oneshot.d.ts.map +1 -0
- package/dist/modes/oneshot.js +71 -0
- package/dist/modes/oneshot.js.map +1 -0
- package/dist/tools/bash.d.ts +3 -0
- package/dist/tools/bash.d.ts.map +1 -0
- package/dist/tools/bash.js +104 -0
- package/dist/tools/bash.js.map +1 -0
- package/dist/tools/edit.d.ts +3 -0
- package/dist/tools/edit.d.ts.map +1 -0
- package/dist/tools/edit.js +63 -0
- package/dist/tools/edit.js.map +1 -0
- package/dist/tools/file-manager.d.ts +3 -0
- package/dist/tools/file-manager.d.ts.map +1 -0
- package/dist/tools/file-manager.js +85 -0
- package/dist/tools/file-manager.js.map +1 -0
- package/dist/tools/index.d.ts +17 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +42 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/read.d.ts +3 -0
- package/dist/tools/read.d.ts.map +1 -0
- package/dist/tools/read.js +65 -0
- package/dist/tools/read.js.map +1 -0
- package/dist/tools/system-info.d.ts +3 -0
- package/dist/tools/system-info.d.ts.map +1 -0
- package/dist/tools/system-info.js +101 -0
- package/dist/tools/system-info.js.map +1 -0
- package/dist/tools/web-fetch.d.ts +3 -0
- package/dist/tools/web-fetch.d.ts.map +1 -0
- package/dist/tools/web-fetch.js +117 -0
- package/dist/tools/web-fetch.js.map +1 -0
- package/dist/tools/web-search.d.ts +9 -0
- package/dist/tools/web-search.d.ts.map +1 -0
- package/dist/tools/web-search.js +124 -0
- package/dist/tools/web-search.js.map +1 -0
- package/dist/tools/write.d.ts +3 -0
- package/dist/tools/write.d.ts.map +1 -0
- package/dist/tools/write.js +30 -0
- package/dist/tools/write.js.map +1 -0
- package/dist/utils/autocomplete.d.ts +23 -0
- package/dist/utils/autocomplete.d.ts.map +1 -0
- package/dist/utils/autocomplete.js +191 -0
- package/dist/utils/autocomplete.js.map +1 -0
- package/dist/utils/file-processor.d.ts +19 -0
- package/dist/utils/file-processor.d.ts.map +1 -0
- package/dist/utils/file-processor.js +86 -0
- package/dist/utils/file-processor.js.map +1 -0
- package/dist/utils/path.d.ts +8 -0
- package/dist/utils/path.d.ts.map +1 -0
- package/dist/utils/path.js +60 -0
- package/dist/utils/path.js.map +1 -0
- package/dist/utils/shell.d.ts +6 -0
- package/dist/utils/shell.d.ts.map +1 -0
- package/dist/utils/shell.js +64 -0
- package/dist/utils/shell.js.map +1 -0
- package/dist/utils/truncate.d.ts +12 -0
- package/dist/utils/truncate.d.ts.map +1 -0
- package/dist/utils/truncate.js +46 -0
- package/dist/utils/truncate.js.map +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Path autocomplete for @ file references in the interactive REPL.
|
|
3
|
+
* Uses `fd` for fuzzy search when available, falls back to readdirSync.
|
|
4
|
+
* Cross-platform: supports both Unix (/) and Windows (\) path separators.
|
|
5
|
+
*/
|
|
6
|
+
import { readdirSync, statSync } from "node:fs";
|
|
7
|
+
import { execSync } from "node:child_process";
|
|
8
|
+
import { join, dirname, basename, sep } from "node:path";
|
|
9
|
+
import { homedir } from "node:os";
|
|
10
|
+
const IS_WINDOWS = process.platform === "win32";
|
|
11
|
+
/** Check if a path string contains a directory separator (/ or \). */
|
|
12
|
+
function hasSep(p) {
|
|
13
|
+
return p.includes("/") || p.includes("\\");
|
|
14
|
+
}
|
|
15
|
+
let fdPath;
|
|
16
|
+
function detectFd() {
|
|
17
|
+
if (fdPath !== undefined)
|
|
18
|
+
return fdPath;
|
|
19
|
+
const locateCmd = IS_WINDOWS ? "where fd" : "which fd";
|
|
20
|
+
try {
|
|
21
|
+
const result = execSync(locateCmd, { encoding: "utf-8", timeout: 2000 }).trim();
|
|
22
|
+
// `where` on Windows may return multiple lines; take the first
|
|
23
|
+
fdPath = result.split(/\r?\n/)[0] || null;
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
if (!IS_WINDOWS) {
|
|
27
|
+
try {
|
|
28
|
+
const result = execSync("which fdfind", { encoding: "utf-8", timeout: 2000 }).trim();
|
|
29
|
+
fdPath = result || null;
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
fdPath = null;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
fdPath = null;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return fdPath;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Expand ~ to home directory. Keeps the original prefix for display purposes
|
|
43
|
+
* but returns a resolved version for filesystem operations.
|
|
44
|
+
*/
|
|
45
|
+
function expandTilde(p) {
|
|
46
|
+
if (p === "~")
|
|
47
|
+
return homedir();
|
|
48
|
+
if (p.startsWith("~/") || p.startsWith("~\\"))
|
|
49
|
+
return homedir() + p.slice(1);
|
|
50
|
+
return p;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Get file suggestions for an @ prefix.
|
|
54
|
+
* Supports relative paths, absolute paths (/...), and home paths (~/).
|
|
55
|
+
* @param prefix - The text after @, e.g. "src/co", "~/dev/", "/usr/local/"
|
|
56
|
+
* @param cwd - Working directory
|
|
57
|
+
*/
|
|
58
|
+
export function getFileSuggestions(prefix, cwd) {
|
|
59
|
+
const expanded = expandTilde(prefix);
|
|
60
|
+
const isHomeOrAbsolute = expanded !== prefix || prefix.startsWith("/");
|
|
61
|
+
const fd = detectFd();
|
|
62
|
+
if (fd && expanded.length > 0) {
|
|
63
|
+
const results = getFuzzyFileSuggestions(expanded, cwd, fd);
|
|
64
|
+
if (isHomeOrAbsolute)
|
|
65
|
+
return restoreDisplayPrefix(results, prefix, expanded);
|
|
66
|
+
return results;
|
|
67
|
+
}
|
|
68
|
+
const results = getDirectorySuggestions(expanded, cwd);
|
|
69
|
+
if (isHomeOrAbsolute)
|
|
70
|
+
return restoreDisplayPrefix(results, prefix, expanded);
|
|
71
|
+
return results;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* When the user typed ~/... or /abs/..., the internal search used the
|
|
75
|
+
* expanded path. We restore the display/value to show the original prefix
|
|
76
|
+
* form (e.g. ~/dev/foo instead of /Users/xxx/dev/foo).
|
|
77
|
+
*/
|
|
78
|
+
function restoreDisplayPrefix(items, originalPrefix, expandedPrefix) {
|
|
79
|
+
if (originalPrefix === expandedPrefix)
|
|
80
|
+
return items;
|
|
81
|
+
const expandedDir = expandedPrefix.endsWith("/") ? expandedPrefix.slice(0, -1) : dirname(expandedPrefix);
|
|
82
|
+
const originalDir = originalPrefix.endsWith("/") ? originalPrefix.slice(0, -1) : dirname(originalPrefix);
|
|
83
|
+
return items.map((item) => ({
|
|
84
|
+
...item,
|
|
85
|
+
display: item.display.replace(expandedDir, originalDir),
|
|
86
|
+
value: item.value.replace(expandedDir, originalDir),
|
|
87
|
+
}));
|
|
88
|
+
}
|
|
89
|
+
function getFuzzyFileSuggestions(query, cwd, fdBin) {
|
|
90
|
+
try {
|
|
91
|
+
if (query.endsWith("/") || query.endsWith("\\")) {
|
|
92
|
+
return getDirectorySuggestions(query, cwd);
|
|
93
|
+
}
|
|
94
|
+
const dirPart = hasSep(query) ? dirname(query) : "";
|
|
95
|
+
const searchDir = dirPart ? join(cwd, dirPart) : cwd;
|
|
96
|
+
const searchQuery = hasSep(query) ? basename(query) : query;
|
|
97
|
+
const cmd = `${fdBin} --max-results 20 --color never "${searchQuery}" "${searchDir}"`;
|
|
98
|
+
const output = execSync(cmd, {
|
|
99
|
+
encoding: "utf-8",
|
|
100
|
+
timeout: 3000,
|
|
101
|
+
cwd,
|
|
102
|
+
}).trim();
|
|
103
|
+
if (!output)
|
|
104
|
+
return getDirectorySuggestions(query, cwd);
|
|
105
|
+
const results = [];
|
|
106
|
+
for (const line of output.split(/\r?\n/)) {
|
|
107
|
+
const fullPath = line.trim();
|
|
108
|
+
if (!fullPath)
|
|
109
|
+
continue;
|
|
110
|
+
let relative = fullPath;
|
|
111
|
+
if (relative.startsWith(cwd)) {
|
|
112
|
+
relative = relative.slice(cwd.length);
|
|
113
|
+
if (relative.startsWith(sep))
|
|
114
|
+
relative = relative.slice(1);
|
|
115
|
+
}
|
|
116
|
+
// Normalize to forward slashes for consistent display
|
|
117
|
+
relative = relative.replace(/\\/g, "/");
|
|
118
|
+
let isDir = false;
|
|
119
|
+
try {
|
|
120
|
+
isDir = statSync(fullPath).isDirectory();
|
|
121
|
+
}
|
|
122
|
+
catch { }
|
|
123
|
+
const display = isDir ? relative + "/" : relative;
|
|
124
|
+
results.push({
|
|
125
|
+
value: `@${display}`,
|
|
126
|
+
display,
|
|
127
|
+
isDirectory: isDir,
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
return results.slice(0, 20);
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
return getDirectorySuggestions(query, cwd);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
function getDirectorySuggestions(prefix, cwd) {
|
|
137
|
+
const normalizedPrefix = prefix.replace(/\\/g, "/");
|
|
138
|
+
let dirPart;
|
|
139
|
+
let filePart;
|
|
140
|
+
if (normalizedPrefix.endsWith("/")) {
|
|
141
|
+
dirPart = normalizedPrefix.slice(0, -1);
|
|
142
|
+
filePart = "";
|
|
143
|
+
}
|
|
144
|
+
else if (hasSep(normalizedPrefix)) {
|
|
145
|
+
dirPart = dirname(normalizedPrefix);
|
|
146
|
+
filePart = basename(normalizedPrefix);
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
dirPart = "";
|
|
150
|
+
filePart = normalizedPrefix;
|
|
151
|
+
}
|
|
152
|
+
const searchDir = dirPart ? join(cwd, dirPart) : cwd;
|
|
153
|
+
try {
|
|
154
|
+
const entries = readdirSync(searchDir, { withFileTypes: true });
|
|
155
|
+
const results = [];
|
|
156
|
+
for (const entry of entries) {
|
|
157
|
+
if (entry.name.startsWith("."))
|
|
158
|
+
continue;
|
|
159
|
+
if (filePart && !entry.name.toLowerCase().startsWith(filePart.toLowerCase()))
|
|
160
|
+
continue;
|
|
161
|
+
// Always use forward slashes in display/value for consistency
|
|
162
|
+
const relativePath = dirPart ? `${dirPart}/${entry.name}` : entry.name;
|
|
163
|
+
const isDir = entry.isDirectory();
|
|
164
|
+
const display = isDir ? relativePath + "/" : relativePath;
|
|
165
|
+
results.push({
|
|
166
|
+
value: `@${display}`,
|
|
167
|
+
display,
|
|
168
|
+
isDirectory: isDir,
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
results.sort((a, b) => {
|
|
172
|
+
if (a.isDirectory !== b.isDirectory)
|
|
173
|
+
return a.isDirectory ? -1 : 1;
|
|
174
|
+
return a.display.localeCompare(b.display);
|
|
175
|
+
});
|
|
176
|
+
return results.slice(0, 30);
|
|
177
|
+
}
|
|
178
|
+
catch {
|
|
179
|
+
return [];
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Extract the @ prefix from a line for autocomplete purposes.
|
|
184
|
+
* Returns the text after @, or null if not in an @ context.
|
|
185
|
+
*/
|
|
186
|
+
export function extractAtPrefix(line) {
|
|
187
|
+
// Find last @ that is either at start of line or after whitespace
|
|
188
|
+
const match = line.match(/(?:^|(?<=\s))@([^\s]*)$/);
|
|
189
|
+
return match ? match[1] : null;
|
|
190
|
+
}
|
|
191
|
+
//# sourceMappingURL=autocomplete.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"autocomplete.js","sourceRoot":"","sources":["../../src/utils/autocomplete.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AACzD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC;AAEhD,sEAAsE;AACtE,SAAS,MAAM,CAAC,CAAS;IACxB,OAAO,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AAC5C,CAAC;AAED,IAAI,MAAiC,CAAC;AAEtC,SAAS,QAAQ;IAChB,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC;IACxC,MAAM,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC;IACvD,IAAI,CAAC;QACJ,MAAM,MAAM,GAAG,QAAQ,CAAC,SAAS,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAChF,+DAA+D;QAC/D,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACR,IAAI,CAAC,UAAU,EAAE,CAAC;YACjB,IAAI,CAAC;gBACJ,MAAM,MAAM,GAAG,QAAQ,CAAC,cAAc,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;gBACrF,MAAM,GAAG,MAAM,IAAI,IAAI,CAAC;YACzB,CAAC;YAAC,MAAM,CAAC;gBACR,MAAM,GAAG,IAAI,CAAC;YACf,CAAC;QACF,CAAC;aAAM,CAAC;YACP,MAAM,GAAG,IAAI,CAAC;QACf,CAAC;IACF,CAAC;IACD,OAAO,MAAM,CAAC;AACf,CAAC;AAQD;;;GAGG;AACH,SAAS,WAAW,CAAC,CAAS;IAC7B,IAAI,CAAC,KAAK,GAAG;QAAE,OAAO,OAAO,EAAE,CAAC;IAChC,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC;QAAE,OAAO,OAAO,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC7E,OAAO,CAAC,CAAC;AACV,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAc,EAAE,GAAW;IAC7D,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IACrC,MAAM,gBAAgB,GAAG,QAAQ,KAAK,MAAM,IAAI,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IAEvE,MAAM,EAAE,GAAG,QAAQ,EAAE,CAAC;IACtB,IAAI,EAAE,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,uBAAuB,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;QAC3D,IAAI,gBAAgB;YAAE,OAAO,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC7E,OAAO,OAAO,CAAC;IAChB,CAAC;IACD,MAAM,OAAO,GAAG,uBAAuB,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IACvD,IAAI,gBAAgB;QAAE,OAAO,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC7E,OAAO,OAAO,CAAC;AAChB,CAAC;AAED;;;;GAIG;AACH,SAAS,oBAAoB,CAAC,KAAuB,EAAE,cAAsB,EAAE,cAAsB;IACpG,IAAI,cAAc,KAAK,cAAc;QAAE,OAAO,KAAK,CAAC;IACpD,MAAM,WAAW,GAAG,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IACzG,MAAM,WAAW,GAAG,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IACzG,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC3B,GAAG,IAAI;QACP,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,WAAW,CAAC;QACvD,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,WAAW,CAAC;KACnD,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,uBAAuB,CAAC,KAAa,EAAE,GAAW,EAAE,KAAa;IACzE,IAAI,CAAC;QACJ,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACjD,OAAO,uBAAuB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC5C,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACpD,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QACrD,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QAE5D,MAAM,GAAG,GAAG,GAAG,KAAK,oCAAoC,WAAW,MAAM,SAAS,GAAG,CAAC;QACtF,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,EAAE;YAC5B,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE,IAAI;YACb,GAAG;SACH,CAAC,CAAC,IAAI,EAAE,CAAC;QAEV,IAAI,CAAC,MAAM;YAAE,OAAO,uBAAuB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAExD,MAAM,OAAO,GAAqB,EAAE,CAAC;QACrC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAC7B,IAAI,CAAC,QAAQ;gBAAE,SAAS;YAExB,IAAI,QAAQ,GAAG,QAAQ,CAAC;YACxB,IAAI,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC9B,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBACtC,IAAI,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC;oBAAE,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC5D,CAAC;YACD,sDAAsD;YACtD,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YAExC,IAAI,KAAK,GAAG,KAAK,CAAC;YAClB,IAAI,CAAC;gBAAC,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;YAE1D,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,QAAQ,GAAG,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC;YAClD,OAAO,CAAC,IAAI,CAAC;gBACZ,KAAK,EAAE,IAAI,OAAO,EAAE;gBACpB,OAAO;gBACP,WAAW,EAAE,KAAK;aAClB,CAAC,CAAC;QACJ,CAAC;QAED,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,uBAAuB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC5C,CAAC;AACF,CAAC;AAED,SAAS,uBAAuB,CAAC,MAAc,EAAE,GAAW;IAC3D,MAAM,gBAAgB,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAEpD,IAAI,OAAe,CAAC;IACpB,IAAI,QAAgB,CAAC;IAErB,IAAI,gBAAgB,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACpC,OAAO,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACxC,QAAQ,GAAG,EAAE,CAAC;IACf,CAAC;SAAM,IAAI,MAAM,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACrC,OAAO,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;QACpC,QAAQ,GAAG,QAAQ,CAAC,gBAAgB,CAAC,CAAC;IACvC,CAAC;SAAM,CAAC;QACP,OAAO,GAAG,EAAE,CAAC;QACb,QAAQ,GAAG,gBAAgB,CAAC;IAC7B,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IAErD,IAAI,CAAC;QACJ,MAAM,OAAO,GAAG,WAAW,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAChE,MAAM,OAAO,GAAqB,EAAE,CAAC;QAErC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC7B,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;gBAAE,SAAS;YACzC,IAAI,QAAQ,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;gBAAE,SAAS;YAEvF,8DAA8D;YAC9D,MAAM,YAAY,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;YACvE,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;YAClC,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,YAAY,GAAG,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC;YAE1D,OAAO,CAAC,IAAI,CAAC;gBACZ,KAAK,EAAE,IAAI,OAAO,EAAE;gBACpB,OAAO;gBACP,WAAW,EAAE,KAAK;aAClB,CAAC,CAAC;QACJ,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACrB,IAAI,CAAC,CAAC,WAAW,KAAK,CAAC,CAAC,WAAW;gBAAE,OAAO,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACnE,OAAO,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;QAEH,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,EAAE,CAAC;IACX,CAAC;AACF,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY;IAC3C,kEAAkE;IAClE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;IACpD,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAChC,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Process @file CLI arguments into text content for injection into user messages.
|
|
3
|
+
* Text files are wrapped in <file> XML blocks; binary/unsupported files are skipped.
|
|
4
|
+
*/
|
|
5
|
+
export interface ProcessedFiles {
|
|
6
|
+
text: string;
|
|
7
|
+
errors: string[];
|
|
8
|
+
}
|
|
9
|
+
export declare function processFileArguments(fileArgs: string[], cwd: string): ProcessedFiles;
|
|
10
|
+
/**
|
|
11
|
+
* Parse a user input string and extract @path references.
|
|
12
|
+
* Returns { expandedText, fileArgs } where expandedText has @refs resolved
|
|
13
|
+
* and fileArgs contains the extracted paths.
|
|
14
|
+
*/
|
|
15
|
+
export declare function extractAtReferences(input: string, cwd: string): {
|
|
16
|
+
expandedText: string;
|
|
17
|
+
fileContent: string;
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=file-processor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-processor.d.ts","sourceRoot":"","sources":["../../src/utils/file-processor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,MAAM,WAAW,cAAc;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,EAAE,CAAC;CACjB;AAgBD,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,cAAc,CAwCpF;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAwB7G"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Process @file CLI arguments into text content for injection into user messages.
|
|
3
|
+
* Text files are wrapped in <file> XML blocks; binary/unsupported files are skipped.
|
|
4
|
+
*/
|
|
5
|
+
import { readFileSync, statSync } from "node:fs";
|
|
6
|
+
import { resolve } from "node:path";
|
|
7
|
+
import { resolveReadPath } from "./path.js";
|
|
8
|
+
const IMAGE_EXTENSIONS = new Set([".png", ".jpg", ".jpeg", ".gif", ".webp", ".svg", ".bmp", ".ico"]);
|
|
9
|
+
const BINARY_EXTENSIONS = new Set([
|
|
10
|
+
".zip", ".tar", ".gz", ".bz2", ".7z", ".rar",
|
|
11
|
+
".exe", ".dll", ".so", ".dylib",
|
|
12
|
+
".pdf", ".doc", ".docx", ".xls", ".xlsx",
|
|
13
|
+
".mp3", ".mp4", ".avi", ".mov", ".wav",
|
|
14
|
+
".woff", ".woff2", ".ttf", ".otf", ".eot",
|
|
15
|
+
]);
|
|
16
|
+
function getExtension(path) {
|
|
17
|
+
const dot = path.lastIndexOf(".");
|
|
18
|
+
return dot >= 0 ? path.slice(dot).toLowerCase() : "";
|
|
19
|
+
}
|
|
20
|
+
export function processFileArguments(fileArgs, cwd) {
|
|
21
|
+
let text = "";
|
|
22
|
+
const errors = [];
|
|
23
|
+
for (const fileArg of fileArgs) {
|
|
24
|
+
const absolutePath = resolve(resolveReadPath(fileArg, cwd));
|
|
25
|
+
try {
|
|
26
|
+
const stats = statSync(absolutePath);
|
|
27
|
+
if (stats.isDirectory()) {
|
|
28
|
+
errors.push(`Skipping directory: ${absolutePath}`);
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
if (stats.size === 0) {
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
errors.push(`File not found: ${absolutePath}`);
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
const ext = getExtension(absolutePath);
|
|
40
|
+
if (BINARY_EXTENSIONS.has(ext)) {
|
|
41
|
+
errors.push(`Skipping binary file: ${absolutePath}`);
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
if (IMAGE_EXTENSIONS.has(ext)) {
|
|
45
|
+
text += `<file name="${absolutePath}">[Image file — use read tool to inspect if needed]</file>\n`;
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
try {
|
|
49
|
+
const content = readFileSync(absolutePath, "utf-8");
|
|
50
|
+
text += `<file name="${absolutePath}">\n${content}\n</file>\n`;
|
|
51
|
+
}
|
|
52
|
+
catch (err) {
|
|
53
|
+
errors.push(`Could not read ${absolutePath}: ${err.message}`);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return { text, errors };
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Parse a user input string and extract @path references.
|
|
60
|
+
* Returns { expandedText, fileArgs } where expandedText has @refs resolved
|
|
61
|
+
* and fileArgs contains the extracted paths.
|
|
62
|
+
*/
|
|
63
|
+
export function extractAtReferences(input, cwd) {
|
|
64
|
+
// Match @path patterns: @word or @"quoted path"
|
|
65
|
+
// Note: on Windows paths may contain backslashes, but we require
|
|
66
|
+
// quoted form for paths with spaces: @"C:\path with spaces\file.txt"
|
|
67
|
+
const atPattern = /(?:^|(?<=\s))@("(?:[^"\\]|\\.)*"|[^\s]+)/g;
|
|
68
|
+
const fileArgs = [];
|
|
69
|
+
const expandedText = input.replace(atPattern, (match, pathPart) => {
|
|
70
|
+
let filePath = pathPart;
|
|
71
|
+
if (filePath.startsWith('"') && filePath.endsWith('"')) {
|
|
72
|
+
filePath = filePath.slice(1, -1).replace(/\\"/g, '"');
|
|
73
|
+
}
|
|
74
|
+
fileArgs.push(filePath);
|
|
75
|
+
return "";
|
|
76
|
+
}).replace(/\s{2,}/g, " ").trim();
|
|
77
|
+
if (fileArgs.length === 0) {
|
|
78
|
+
return { expandedText: input, fileContent: "" };
|
|
79
|
+
}
|
|
80
|
+
const processed = processFileArguments(fileArgs, cwd);
|
|
81
|
+
return {
|
|
82
|
+
expandedText: expandedText || "请查看以下文件",
|
|
83
|
+
fileContent: processed.text,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=file-processor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-processor.js","sourceRoot":"","sources":["../../src/utils/file-processor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare function expandPath(filePath: string): string;
|
|
2
|
+
export declare function resolveToCwd(filePath: string, cwd: string): string;
|
|
3
|
+
/**
|
|
4
|
+
* Resolve a read path with fallback strategies for macOS quirks:
|
|
5
|
+
* AM/PM narrow no-break space, NFD normalization, curly quotes.
|
|
6
|
+
*/
|
|
7
|
+
export declare function resolveReadPath(filePath: string, cwd: string): string;
|
|
8
|
+
//# sourceMappingURL=path.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path.d.ts","sourceRoot":"","sources":["../../src/utils/path.ts"],"names":[],"mappings":"AAoBA,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAQnD;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAIlE;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAqBrE"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { accessSync, constants } from "node:fs";
|
|
2
|
+
import * as os from "node:os";
|
|
3
|
+
import { isAbsolute, resolve as resolvePath } from "node:path";
|
|
4
|
+
const UNICODE_SPACES = /[\u00A0\u2000-\u200A\u202F\u205F\u3000]/g;
|
|
5
|
+
const NARROW_NO_BREAK_SPACE = "\u202F";
|
|
6
|
+
function normalizeUnicodeSpaces(str) {
|
|
7
|
+
return str.replace(UNICODE_SPACES, " ");
|
|
8
|
+
}
|
|
9
|
+
function fileExists(filePath) {
|
|
10
|
+
try {
|
|
11
|
+
accessSync(filePath, constants.F_OK);
|
|
12
|
+
return true;
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export function expandPath(filePath) {
|
|
19
|
+
const normalized = normalizeUnicodeSpaces(filePath.startsWith("@") ? filePath.slice(1) : filePath);
|
|
20
|
+
if (normalized === "~")
|
|
21
|
+
return os.homedir();
|
|
22
|
+
// Handle both ~/path (Unix) and ~\path (Windows)
|
|
23
|
+
if (normalized.startsWith("~/") || normalized.startsWith("~\\")) {
|
|
24
|
+
return os.homedir() + normalized.slice(1);
|
|
25
|
+
}
|
|
26
|
+
return normalized;
|
|
27
|
+
}
|
|
28
|
+
export function resolveToCwd(filePath, cwd) {
|
|
29
|
+
const expanded = expandPath(filePath);
|
|
30
|
+
if (isAbsolute(expanded))
|
|
31
|
+
return expanded;
|
|
32
|
+
return resolvePath(cwd, expanded);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Resolve a read path with fallback strategies for macOS quirks:
|
|
36
|
+
* AM/PM narrow no-break space, NFD normalization, curly quotes.
|
|
37
|
+
*/
|
|
38
|
+
export function resolveReadPath(filePath, cwd) {
|
|
39
|
+
const resolved = resolveToCwd(filePath, cwd);
|
|
40
|
+
if (fileExists(resolved))
|
|
41
|
+
return resolved;
|
|
42
|
+
// macOS screenshot AM/PM with narrow no-break space
|
|
43
|
+
const amPmVariant = resolved.replace(/ (AM|PM)\./g, `${NARROW_NO_BREAK_SPACE}$1.`);
|
|
44
|
+
if (amPmVariant !== resolved && fileExists(amPmVariant))
|
|
45
|
+
return amPmVariant;
|
|
46
|
+
// macOS NFD normalization
|
|
47
|
+
const nfdVariant = resolved.normalize("NFD");
|
|
48
|
+
if (nfdVariant !== resolved && fileExists(nfdVariant))
|
|
49
|
+
return nfdVariant;
|
|
50
|
+
// macOS curly quote in screenshot names (e.g. French "Capture d'écran")
|
|
51
|
+
const curlyVariant = resolved.replace(/'/g, "\u2019");
|
|
52
|
+
if (curlyVariant !== resolved && fileExists(curlyVariant))
|
|
53
|
+
return curlyVariant;
|
|
54
|
+
// Combined NFD + curly
|
|
55
|
+
const nfdCurlyVariant = nfdVariant.replace(/'/g, "\u2019");
|
|
56
|
+
if (nfdCurlyVariant !== resolved && fileExists(nfdCurlyVariant))
|
|
57
|
+
return nfdCurlyVariant;
|
|
58
|
+
return resolved;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=path.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path.js","sourceRoot":"","sources":["../../src/utils/path.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,UAAU,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,WAAW,CAAC;AAE/D,MAAM,cAAc,GAAG,0CAA0C,CAAC;AAClE,MAAM,qBAAqB,GAAG,QAAQ,CAAC;AAEvC,SAAS,sBAAsB,CAAC,GAAW;IAC1C,OAAO,GAAG,CAAC,OAAO,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,UAAU,CAAC,QAAgB;IACnC,IAAI,CAAC;QACJ,UAAU,CAAC,QAAQ,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;QACrC,OAAO,IAAI,CAAC;IACb,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,KAAK,CAAC;IACd,CAAC;AACF,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,QAAgB;IAC1C,MAAM,UAAU,GAAG,sBAAsB,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IACnG,IAAI,UAAU,KAAK,GAAG;QAAE,OAAO,EAAE,CAAC,OAAO,EAAE,CAAC;IAC5C,iDAAiD;IACjD,IAAI,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QACjE,OAAO,EAAE,CAAC,OAAO,EAAE,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,UAAU,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,QAAgB,EAAE,GAAW;IACzD,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IACtC,IAAI,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC1C,OAAO,WAAW,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;AACnC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,QAAgB,EAAE,GAAW;IAC5D,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAC7C,IAAI,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,QAAQ,CAAC;IAE1C,oDAAoD;IACpD,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,qBAAqB,KAAK,CAAC,CAAC;IACnF,IAAI,WAAW,KAAK,QAAQ,IAAI,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,WAAW,CAAC;IAE5E,0BAA0B;IAC1B,MAAM,UAAU,GAAG,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC7C,IAAI,UAAU,KAAK,QAAQ,IAAI,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,UAAU,CAAC;IAEzE,wEAAwE;IACxE,MAAM,YAAY,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACtD,IAAI,YAAY,KAAK,QAAQ,IAAI,UAAU,CAAC,YAAY,CAAC;QAAE,OAAO,YAAY,CAAC;IAE/E,uBAAuB;IACvB,MAAM,eAAe,GAAG,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC3D,IAAI,eAAe,KAAK,QAAQ,IAAI,UAAU,CAAC,eAAe,CAAC;QAAE,OAAO,eAAe,CAAC;IAExF,OAAO,QAAQ,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../../src/utils/shell.ts"],"names":[],"mappings":"AAkBA,wBAAgB,cAAc,IAAI;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CA6BlE;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAYjD"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { spawn, spawnSync } from "node:child_process";
|
|
3
|
+
let cachedShellConfig = null;
|
|
4
|
+
function findBashOnPath() {
|
|
5
|
+
const cmd = process.platform === "win32" ? "where" : "which";
|
|
6
|
+
const arg = process.platform === "win32" ? "bash.exe" : "bash";
|
|
7
|
+
try {
|
|
8
|
+
const result = spawnSync(cmd, [arg], { encoding: "utf-8", timeout: 5000 });
|
|
9
|
+
if (result.status === 0 && result.stdout) {
|
|
10
|
+
const firstMatch = result.stdout.trim().split(/\r?\n/)[0];
|
|
11
|
+
if (firstMatch)
|
|
12
|
+
return firstMatch;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
catch { /* ignore */ }
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
export function getShellConfig() {
|
|
19
|
+
if (cachedShellConfig)
|
|
20
|
+
return cachedShellConfig;
|
|
21
|
+
if (process.platform === "win32") {
|
|
22
|
+
const paths = [
|
|
23
|
+
process.env.ProgramFiles && `${process.env.ProgramFiles}\\Git\\bin\\bash.exe`,
|
|
24
|
+
process.env["ProgramFiles(x86)"] && `${process.env["ProgramFiles(x86)"]}\\Git\\bin\\bash.exe`,
|
|
25
|
+
].filter(Boolean);
|
|
26
|
+
for (const p of paths) {
|
|
27
|
+
if (existsSync(p)) {
|
|
28
|
+
cachedShellConfig = { shell: p, args: ["-c"] };
|
|
29
|
+
return cachedShellConfig;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
if (existsSync("/bin/bash")) {
|
|
34
|
+
cachedShellConfig = { shell: "/bin/bash", args: ["-c"] };
|
|
35
|
+
return cachedShellConfig;
|
|
36
|
+
}
|
|
37
|
+
const bashOnPath = findBashOnPath();
|
|
38
|
+
if (bashOnPath) {
|
|
39
|
+
cachedShellConfig = { shell: bashOnPath, args: ["-c"] };
|
|
40
|
+
return cachedShellConfig;
|
|
41
|
+
}
|
|
42
|
+
cachedShellConfig = { shell: "sh", args: ["-c"] };
|
|
43
|
+
return cachedShellConfig;
|
|
44
|
+
}
|
|
45
|
+
export function killProcessTree(pid) {
|
|
46
|
+
if (process.platform === "win32") {
|
|
47
|
+
try {
|
|
48
|
+
spawn("taskkill", ["/F", "/T", "/PID", String(pid)], { stdio: "ignore", detached: true });
|
|
49
|
+
}
|
|
50
|
+
catch { /* ignore */ }
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
try {
|
|
54
|
+
process.kill(-pid, "SIGKILL");
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
try {
|
|
58
|
+
process.kill(pid, "SIGKILL");
|
|
59
|
+
}
|
|
60
|
+
catch { /* already dead */ }
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=shell.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shell.js","sourceRoot":"","sources":["../../src/utils/shell.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare const MAX_LINES = 2000;
|
|
2
|
+
export declare const MAX_BYTES: number;
|
|
3
|
+
export interface TruncationResult {
|
|
4
|
+
content: string;
|
|
5
|
+
truncated: boolean;
|
|
6
|
+
totalLines: number;
|
|
7
|
+
outputLines: number;
|
|
8
|
+
}
|
|
9
|
+
export declare function formatSize(bytes: number): string;
|
|
10
|
+
export declare function truncateHead(content: string): TruncationResult;
|
|
11
|
+
export declare function truncateTail(content: string): TruncationResult;
|
|
12
|
+
//# sourceMappingURL=truncate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"truncate.d.ts","sourceRoot":"","sources":["../../src/utils/truncate.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,SAAS,OAAO,CAAC;AAC9B,eAAO,MAAM,SAAS,QAAY,CAAC;AAEnC,MAAM,WAAW,gBAAgB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAIhD;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,CAmB9D;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,CAmB9D"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
export const MAX_LINES = 2000;
|
|
2
|
+
export const MAX_BYTES = 50 * 1024;
|
|
3
|
+
export function formatSize(bytes) {
|
|
4
|
+
if (bytes < 1024)
|
|
5
|
+
return `${bytes}B`;
|
|
6
|
+
if (bytes < 1024 * 1024)
|
|
7
|
+
return `${(bytes / 1024).toFixed(1)}KB`;
|
|
8
|
+
return `${(bytes / (1024 * 1024)).toFixed(1)}MB`;
|
|
9
|
+
}
|
|
10
|
+
export function truncateHead(content) {
|
|
11
|
+
const totalBytes = Buffer.byteLength(content, "utf-8");
|
|
12
|
+
const lines = content.split("\n");
|
|
13
|
+
const totalLines = lines.length;
|
|
14
|
+
if (totalLines <= MAX_LINES && totalBytes <= MAX_BYTES) {
|
|
15
|
+
return { content, truncated: false, totalLines, outputLines: totalLines };
|
|
16
|
+
}
|
|
17
|
+
const outputLines = [];
|
|
18
|
+
let byteCount = 0;
|
|
19
|
+
for (let i = 0; i < lines.length && i < MAX_LINES; i++) {
|
|
20
|
+
const lineBytes = Buffer.byteLength(lines[i], "utf-8") + (i > 0 ? 1 : 0);
|
|
21
|
+
if (byteCount + lineBytes > MAX_BYTES)
|
|
22
|
+
break;
|
|
23
|
+
outputLines.push(lines[i]);
|
|
24
|
+
byteCount += lineBytes;
|
|
25
|
+
}
|
|
26
|
+
return { content: outputLines.join("\n"), truncated: true, totalLines, outputLines: outputLines.length };
|
|
27
|
+
}
|
|
28
|
+
export function truncateTail(content) {
|
|
29
|
+
const totalBytes = Buffer.byteLength(content, "utf-8");
|
|
30
|
+
const lines = content.split("\n");
|
|
31
|
+
const totalLines = lines.length;
|
|
32
|
+
if (totalLines <= MAX_LINES && totalBytes <= MAX_BYTES) {
|
|
33
|
+
return { content, truncated: false, totalLines, outputLines: totalLines };
|
|
34
|
+
}
|
|
35
|
+
const outputLines = [];
|
|
36
|
+
let byteCount = 0;
|
|
37
|
+
for (let i = lines.length - 1; i >= 0 && outputLines.length < MAX_LINES; i--) {
|
|
38
|
+
const lineBytes = Buffer.byteLength(lines[i], "utf-8") + (outputLines.length > 0 ? 1 : 0);
|
|
39
|
+
if (byteCount + lineBytes > MAX_BYTES)
|
|
40
|
+
break;
|
|
41
|
+
outputLines.unshift(lines[i]);
|
|
42
|
+
byteCount += lineBytes;
|
|
43
|
+
}
|
|
44
|
+
return { content: outputLines.join("\n"), truncated: true, totalLines, outputLines: outputLines.length };
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=truncate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"truncate.js","sourceRoot":"","sources":["../../src/utils/truncate.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@antaif3ng/til-work",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "TIL Agent — 运行在终端里的个人 AI 助手 (Personal AI assistant CLI powered by LLM)",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"til": "dist/cli.js"
|
|
8
|
+
},
|
|
9
|
+
"main": "./dist/index.js",
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"files": [
|
|
12
|
+
"dist",
|
|
13
|
+
"README.md",
|
|
14
|
+
"LICENSE"
|
|
15
|
+
],
|
|
16
|
+
"scripts": {
|
|
17
|
+
"build": "tsc -p tsconfig.json && chmod +x dist/cli.js",
|
|
18
|
+
"dev": "tsc -p tsconfig.json --watch",
|
|
19
|
+
"start": "node dist/cli.js",
|
|
20
|
+
"test": "vitest run",
|
|
21
|
+
"test:watch": "vitest",
|
|
22
|
+
"prepublishOnly": "npm run build && npm test"
|
|
23
|
+
},
|
|
24
|
+
"keywords": [
|
|
25
|
+
"cli",
|
|
26
|
+
"agent",
|
|
27
|
+
"ai",
|
|
28
|
+
"assistant",
|
|
29
|
+
"llm",
|
|
30
|
+
"openai",
|
|
31
|
+
"anthropic",
|
|
32
|
+
"google",
|
|
33
|
+
"terminal",
|
|
34
|
+
"mcp"
|
|
35
|
+
],
|
|
36
|
+
"repository": {
|
|
37
|
+
"type": "git",
|
|
38
|
+
"url": ""
|
|
39
|
+
},
|
|
40
|
+
"author": "antaif3ng",
|
|
41
|
+
"publishConfig": {
|
|
42
|
+
"access": "public"
|
|
43
|
+
},
|
|
44
|
+
"dependencies": {
|
|
45
|
+
"chalk": "^5.5.0",
|
|
46
|
+
"cli-highlight": "^2.1.11",
|
|
47
|
+
"marked": "^17.0.4"
|
|
48
|
+
},
|
|
49
|
+
"devDependencies": {
|
|
50
|
+
"@types/node": "^22.0.0",
|
|
51
|
+
"typescript": "^5.7.3",
|
|
52
|
+
"vitest": "^4.1.0"
|
|
53
|
+
},
|
|
54
|
+
"engines": {
|
|
55
|
+
"node": ">=20.6.0"
|
|
56
|
+
},
|
|
57
|
+
"license": "MIT"
|
|
58
|
+
}
|