compact-agent 1.8.2 → 1.8.3
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/dist/system-prompt.js +14 -1
- package/dist/system-prompt.js.map +1 -1
- package/dist/tools/bash.js +39 -2
- package/dist/tools/bash.js.map +1 -1
- package/dist/tools/edit.js +2 -2
- package/dist/tools/edit.js.map +1 -1
- package/dist/tools/glob.js +2 -2
- package/dist/tools/glob.js.map +1 -1
- package/dist/tools/grep.js +2 -2
- package/dist/tools/grep.js.map +1 -1
- package/dist/tools/list-dir.js +3 -2
- package/dist/tools/list-dir.js.map +1 -1
- package/dist/tools/path-utils.d.ts +1 -0
- package/dist/tools/path-utils.js +32 -0
- package/dist/tools/path-utils.js.map +1 -0
- package/dist/tools/read.js +2 -2
- package/dist/tools/read.js.map +1 -1
- package/dist/tools/write.js +8 -3
- package/dist/tools/write.js.map +1 -1
- package/package.json +1 -1
package/dist/system-prompt.js
CHANGED
|
@@ -30,7 +30,12 @@ function buildDesignHint(mode) {
|
|
|
30
30
|
}
|
|
31
31
|
export function buildSystemPrompt(config, cwd, mode = 'dev', userQuery) {
|
|
32
32
|
const os = `${platform()} ${release()}`;
|
|
33
|
-
|
|
33
|
+
// The shell label here MUST match what the bash tool actually runs.
|
|
34
|
+
// The bash tool picks cmd.exe on Windows by default (was a major source
|
|
35
|
+
// of "$USERPROFILE is empty" bugs when we used bash). Keep this in sync
|
|
36
|
+
// with src/tools/bash.ts:pickShell().
|
|
37
|
+
const shell = process.env.COMPACT_AGENT_SHELL
|
|
38
|
+
|| (process.platform === 'win32' ? 'cmd.exe' : '/bin/bash');
|
|
34
39
|
// Detect if cwd is a git repo
|
|
35
40
|
let isGit = false;
|
|
36
41
|
try {
|
|
@@ -98,6 +103,14 @@ IMPORTANT — tool-call rules:
|
|
|
98
103
|
- For shell-only operations: use \`bash\`. Do not use bash for tasks any other tool already covers.
|
|
99
104
|
- If a capability you want isn't in the list, work around it with the tools that exist. Don't pretend a tool exists.
|
|
100
105
|
|
|
106
|
+
# File operations — picking the right tool
|
|
107
|
+
- **Creating or overwriting a file**: always use \`write_file\`. Never use \`bash\` + \`echo > file\` for this. write_file takes the full content directly, handles multi-line strings without escaping, and resolves \`~/...\` paths to the user's actual home directory. \`bash\` + redirection is fragile across platforms — on Windows it routes through ${shell}, where \`$USERPROFILE\` / \`$HOME\` / bash-style paths may not behave the way you expect.
|
|
108
|
+
- **Modifying a specific section** of an existing file: use \`edit_file\` with an exact \`old_string\` → \`new_string\` substitution.
|
|
109
|
+
- **Reading**: use \`read_file\`.
|
|
110
|
+
- **Finding files by name pattern**: use \`glob\`. **Finding files by content**: use \`grep\`. **Listing a directory**: use \`list_dir\`.
|
|
111
|
+
- Tildes work in path arguments to file tools: \`~/Downloads/poem.txt\` resolves to the user's home directory on every platform. Don't try to expand it yourself via bash.
|
|
112
|
+
- The active shell is **${shell}**. Generate commands in that shell's syntax when you do use \`bash\` — don't mix POSIX bash idioms (\`$VAR\`, \`/c/...\`) into a cmd.exe command or vice versa.
|
|
113
|
+
|
|
101
114
|
# Guidelines
|
|
102
115
|
- Read files before editing them. Understand existing code before suggesting changes.
|
|
103
116
|
- Use the appropriate tool for the task. Don't use bash when read_file or edit_file is better.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"system-prompt.js","sourceRoot":"","sources":["../src/system-prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAErD,OAAO,EAAE,qBAAqB,EAAa,MAAM,YAAY,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE9C,SAAS,aAAa;IACpB,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAChC,MAAM,OAAO,GAAG,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7C,OAAO,OAAO,CAAC,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;IACrC,CAAC,CAAC,CAAC;IACH,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,2EAA2E;AAC3E,2EAA2E;AAC3E,6DAA6D;AAC7D,SAAS,eAAe,CAAC,IAAU;IACjC,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAC;IACtD,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,WAAW,IAAI,IAAI,KAAK,MAAM;QAAE,OAAO,EAAE,CAAC;IACzE,0EAA0E;IAC1E,wDAAwD;IACxD,MAAM,eAAe,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;IACnE,IAAI,CAAC,eAAe;QAAE,OAAO,EAAE,CAAC;IAChC,OAAO,yXAAyX,CAAC;AACnY,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,MAAuB,EACvB,GAAW,EACX,OAAa,KAAK,EAClB,SAAkB;IAElB,MAAM,EAAE,GAAG,GAAG,QAAQ,EAAE,IAAI,OAAO,EAAE,EAAE,CAAC;IACxC,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"system-prompt.js","sourceRoot":"","sources":["../src/system-prompt.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/bash.js
CHANGED
|
@@ -1,7 +1,43 @@
|
|
|
1
1
|
import { exec } from 'node:child_process';
|
|
2
|
+
/**
|
|
3
|
+
* Shell tool. Kept named `bash` for tool-call API compatibility, but on
|
|
4
|
+
* Windows we route through cmd.exe by default — the platform-native shell.
|
|
5
|
+
*
|
|
6
|
+
* Previously this tool forced `shell: 'bash'` on Windows, which picked
|
|
7
|
+
* up whichever bash was on PATH (Git Bash or WSL). WSL bash has its own
|
|
8
|
+
* /home/<user> namespace that doesn't contain the user's actual files,
|
|
9
|
+
* and neither variant inherits the Windows env vars the model typically
|
|
10
|
+
* wants to use. Result: every `echo "..." > "$USERPROFILE/Downloads/x"`
|
|
11
|
+
* failed with "No such file or directory" because $USERPROFILE was empty.
|
|
12
|
+
*
|
|
13
|
+
* On non-Windows platforms we keep /bin/bash since that's what shell
|
|
14
|
+
* conventions assume there.
|
|
15
|
+
*
|
|
16
|
+
* Override either platform's choice with the COMPACT_AGENT_SHELL env
|
|
17
|
+
* variable (e.g. COMPACT_AGENT_SHELL=pwsh, COMPACT_AGENT_SHELL=/bin/zsh).
|
|
18
|
+
*/
|
|
19
|
+
function pickShell() {
|
|
20
|
+
const override = process.env.COMPACT_AGENT_SHELL;
|
|
21
|
+
if (override && override.trim())
|
|
22
|
+
return override.trim();
|
|
23
|
+
return process.platform === 'win32' ? 'cmd.exe' : '/bin/bash';
|
|
24
|
+
}
|
|
25
|
+
function shellLabel() {
|
|
26
|
+
const s = pickShell();
|
|
27
|
+
const base = s.replace(/\\/g, '/').split('/').pop() || s;
|
|
28
|
+
return base.replace(/\.exe$/i, '');
|
|
29
|
+
}
|
|
2
30
|
export const BashTool = {
|
|
3
31
|
name: 'bash',
|
|
4
|
-
description:
|
|
32
|
+
description: `Execute a shell command and return stdout/stderr. ` +
|
|
33
|
+
`Active shell on this machine: ${shellLabel()} ` +
|
|
34
|
+
`(override via COMPACT_AGENT_SHELL). ` +
|
|
35
|
+
`Use for: running builds/tests, git commands, package installs, ` +
|
|
36
|
+
`process management, system inspection. ` +
|
|
37
|
+
`DO NOT use for creating or writing files — use write_file instead. ` +
|
|
38
|
+
`Piping multi-line content through echo > path is fragile across ` +
|
|
39
|
+
`platforms and shells; write_file handles content, paths, and ` +
|
|
40
|
+
`quoting uniformly on Windows/macOS/Linux.`,
|
|
5
41
|
parameters: {
|
|
6
42
|
type: 'object',
|
|
7
43
|
properties: {
|
|
@@ -21,12 +57,13 @@ export const BashTool = {
|
|
|
21
57
|
async call(input, cwd) {
|
|
22
58
|
const command = input.command;
|
|
23
59
|
const timeout = input.timeout || 120_000;
|
|
60
|
+
const shell = pickShell();
|
|
24
61
|
return new Promise((resolve) => {
|
|
25
62
|
exec(command, {
|
|
26
63
|
cwd,
|
|
27
64
|
timeout,
|
|
28
65
|
maxBuffer: 10 * 1024 * 1024, // 10MB
|
|
29
|
-
shell
|
|
66
|
+
shell,
|
|
30
67
|
}, (error, stdout, stderr) => {
|
|
31
68
|
if (error && !stdout && !stderr) {
|
|
32
69
|
resolve({ output: `Error: ${error.message}`, isError: true });
|
package/dist/tools/bash.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bash.js","sourceRoot":"","sources":["../../src/tools/bash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAG1C,MAAM,CAAC,MAAM,QAAQ,GAAS;IAC5B,IAAI,EAAE,MAAM;IACZ,WAAW,EACT,
|
|
1
|
+
{"version":3,"file":"bash.js","sourceRoot":"","sources":["../../src/tools/bash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAG1C;;;;;;;;;;;;;;;;GAgBG;AACH,SAAS,SAAS;IAChB,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;IACjD,IAAI,QAAQ,IAAI,QAAQ,CAAC,IAAI,EAAE;QAAE,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;IACxD,OAAO,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC;AAChE,CAAC;AAED,SAAS,UAAU;IACjB,MAAM,CAAC,GAAG,SAAS,EAAE,CAAC;IACtB,MAAM,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACzD,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,CAAC,MAAM,QAAQ,GAAS;IAC5B,IAAI,EAAE,MAAM;IACZ,WAAW,EACT,oDAAoD;QACpD,iCAAiC,UAAU,EAAE,GAAG;QAChD,sCAAsC;QACtC,iEAAiE;QACjE,yCAAyC;QACzC,qEAAqE;QACrE,kEAAkE;QAClE,+DAA+D;QAC/D,2CAA2C;IAC7C,UAAU,EAAE;QACV,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,OAAO,EAAE;gBACP,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,8BAA8B;aAC5C;YACD,OAAO,EAAE;gBACP,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,0CAA0C;aACxD;SACF;QACD,QAAQ,EAAE,CAAC,SAAS,CAAC;KACtB;IACD,UAAU,EAAE,KAAK;IACjB,aAAa,EAAE,IAAI;IAEnB,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG;QACnB,MAAM,OAAO,GAAG,KAAK,CAAC,OAAiB,CAAC;QACxC,MAAM,OAAO,GAAI,KAAK,CAAC,OAAkB,IAAI,OAAO,CAAC;QACrD,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;QAE1B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,IAAI,CACF,OAAO,EACP;gBACE,GAAG;gBACH,OAAO;gBACP,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,OAAO;gBACpC,KAAK;aACN,EACD,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;gBACxB,IAAI,KAAK,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;oBAChC,OAAO,CAAC,EAAE,MAAM,EAAE,UAAU,KAAK,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;oBAC9D,OAAO;gBACT,CAAC;gBACD,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACxD,MAAM,UAAU,GAAG,OAAO,CAAC;gBAC3B,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,GAAG,UAAU,CAAC;gBAC1C,MAAM,WAAW,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,IAAI,aAAa,CAAC;gBAE9D,OAAO,CAAC;oBACN,MAAM,EAAE,SAAS;wBACf,CAAC,CAAC,WAAW,GAAG,sCAAsC;wBACtD,CAAC,CAAC,WAAW;oBACf,OAAO,EAAE,CAAC,CAAC,KAAK;iBACjB,CAAC,CAAC;YACL,CAAC,CACF,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;CACF,CAAC"}
|
package/dist/tools/edit.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { readFileSync, writeFileSync } from 'node:fs';
|
|
2
|
-
import {
|
|
2
|
+
import { resolveUserPath } from './path-utils.js';
|
|
3
3
|
export const EditTool = {
|
|
4
4
|
name: 'edit_file',
|
|
5
5
|
description: 'Perform a find-and-replace edit on a file. Provide the exact old_string to find and the new_string to replace it with. The old_string must be unique in the file unless replace_all is true.',
|
|
@@ -29,7 +29,7 @@ export const EditTool = {
|
|
|
29
29
|
isDestructive: false,
|
|
30
30
|
async call(input, cwd) {
|
|
31
31
|
try {
|
|
32
|
-
const filePath =
|
|
32
|
+
const filePath = resolveUserPath(cwd, input.file_path);
|
|
33
33
|
const oldStr = input.old_string;
|
|
34
34
|
const newStr = input.new_string;
|
|
35
35
|
const replaceAll = input.replace_all || false;
|
package/dist/tools/edit.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"edit.js","sourceRoot":"","sources":["../../src/tools/edit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"edit.js","sourceRoot":"","sources":["../../src/tools/edit.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/glob.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { glob } from 'glob';
|
|
2
|
-
import {
|
|
2
|
+
import { resolveUserPath } from './path-utils.js';
|
|
3
3
|
export const GlobTool = {
|
|
4
4
|
name: 'glob',
|
|
5
5
|
description: 'Find files matching a glob pattern (e.g. "**/*.ts", "src/**/*.js"). Returns file paths sorted by modification time.',
|
|
@@ -26,7 +26,7 @@ export const GlobTool = {
|
|
|
26
26
|
async call(input, cwd) {
|
|
27
27
|
try {
|
|
28
28
|
const pattern = input.pattern;
|
|
29
|
-
const base = input.path ?
|
|
29
|
+
const base = input.path ? resolveUserPath(cwd, input.path) : cwd;
|
|
30
30
|
const maxResults = input.max_results || 200;
|
|
31
31
|
const files = await glob(pattern, {
|
|
32
32
|
cwd: base,
|
package/dist/tools/glob.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"glob.js","sourceRoot":"","sources":["../../src/tools/glob.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"glob.js","sourceRoot":"","sources":["../../src/tools/glob.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAGlD,MAAM,CAAC,MAAM,QAAQ,GAAS;IAC5B,IAAI,EAAE,MAAM;IACZ,WAAW,EACT,qHAAqH;IACvH,UAAU,EAAE;QACV,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,OAAO,EAAE;gBACP,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,mDAAmD;aACjE;YACD,IAAI,EAAE;gBACJ,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,4CAA4C;aAC1D;YACD,WAAW,EAAE;gBACX,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,mCAAmC;aACjD;SACF;QACD,QAAQ,EAAE,CAAC,SAAS,CAAC;KACtB;IACD,UAAU,EAAE,IAAI;IAChB,aAAa,EAAE,KAAK;IAEpB,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG;QACnB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,KAAK,CAAC,OAAiB,CAAC;YACxC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,GAAG,EAAE,KAAK,CAAC,IAAc,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;YAC3E,MAAM,UAAU,GAAI,KAAK,CAAC,WAAsB,IAAI,GAAG,CAAC;YAExD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE;gBAChC,GAAG,EAAE,IAAI;gBACT,KAAK,EAAE,IAAI;gBACX,QAAQ,EAAE,IAAI;gBACd,MAAM,EAAE,CAAC,oBAAoB,EAAE,YAAY,CAAC;gBAC5C,QAAQ,EAAE,EAAE;aACb,CAAC,CAAC;YAEH,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvB,OAAO,EAAE,MAAM,EAAE,+BAA+B,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;YACrE,CAAC;YAED,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACrD,IAAI,MAAM,GAAG,MAAM,CAAC;YACpB,IAAI,KAAK,CAAC,MAAM,GAAG,UAAU,EAAE,CAAC;gBAC9B,MAAM,IAAI,YAAY,KAAK,CAAC,MAAM,GAAG,UAAU,cAAc,CAAC;YAChE,CAAC;YACD,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QACpC,CAAC;QAAC,OAAO,CAAU,EAAE,CAAC;YACpB,MAAM,GAAG,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACvD,OAAO,EAAE,MAAM,EAAE,UAAU,GAAG,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACpD,CAAC;IACH,CAAC;CACF,CAAC"}
|
package/dist/tools/grep.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { exec } from 'node:child_process';
|
|
2
|
-
import {
|
|
2
|
+
import { resolveUserPath } from './path-utils.js';
|
|
3
3
|
export const GrepTool = {
|
|
4
4
|
name: 'grep',
|
|
5
5
|
description: 'Search file contents using a regex pattern (powered by ripgrep if available, else grep). Returns matching lines with file paths and line numbers.',
|
|
@@ -33,7 +33,7 @@ export const GrepTool = {
|
|
|
33
33
|
isDestructive: false,
|
|
34
34
|
async call(input, cwd) {
|
|
35
35
|
const pattern = input.pattern;
|
|
36
|
-
const searchPath = input.path ?
|
|
36
|
+
const searchPath = input.path ? resolveUserPath(cwd, input.path) : cwd;
|
|
37
37
|
const include = input.include;
|
|
38
38
|
const ignoreCase = input.ignore_case || false;
|
|
39
39
|
const maxResults = input.max_results || 100;
|
package/dist/tools/grep.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grep.js","sourceRoot":"","sources":["../../src/tools/grep.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"grep.js","sourceRoot":"","sources":["../../src/tools/grep.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/list-dir.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { readdirSync, statSync } from 'node:fs';
|
|
2
|
-
import {
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { resolveUserPath } from './path-utils.js';
|
|
3
4
|
export const ListDirTool = {
|
|
4
5
|
name: 'list_dir',
|
|
5
6
|
description: 'List files and directories at a given path. Shows type (file/dir), size, and name.',
|
|
@@ -17,7 +18,7 @@ export const ListDirTool = {
|
|
|
17
18
|
isDestructive: false,
|
|
18
19
|
async call(input, cwd) {
|
|
19
20
|
try {
|
|
20
|
-
const dirPath = input.path ?
|
|
21
|
+
const dirPath = input.path ? resolveUserPath(cwd, input.path) : cwd;
|
|
21
22
|
const entries = readdirSync(dirPath, { withFileTypes: true });
|
|
22
23
|
const lines = entries.slice(0, 500).map((entry) => {
|
|
23
24
|
const fullPath = join(dirPath, entry.name);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-dir.js","sourceRoot":"","sources":["../../src/tools/list-dir.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"list-dir.js","sourceRoot":"","sources":["../../src/tools/list-dir.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAGlD,MAAM,CAAC,MAAM,WAAW,GAAS;IAC/B,IAAI,EAAE,UAAU;IAChB,WAAW,EAAE,oFAAoF;IACjG,UAAU,EAAE;QACV,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,IAAI,EAAE;gBACJ,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,uCAAuC;aACrD;SACF;QACD,QAAQ,EAAE,EAAE;KACb;IACD,UAAU,EAAE,IAAI;IAChB,aAAa,EAAE,KAAK;IAEpB,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG;QACnB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,GAAG,EAAE,KAAK,CAAC,IAAc,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;YAC9E,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;YAE9D,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;gBAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC3C,IAAI,CAAC;oBACH,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;oBAChC,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;wBACxB,OAAO,UAAU,KAAK,CAAC,IAAI,GAAG,CAAC;oBACjC,CAAC;oBACD,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACnC,OAAO,UAAU,KAAK,CAAC,IAAI,KAAK,IAAI,GAAG,CAAC;gBAC1C,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,UAAU,KAAK,CAAC,IAAI,EAAE,CAAC;gBAChC,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,mBAAmB,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QAC7E,CAAC;QAAC,OAAO,CAAU,EAAE,CAAC;YACpB,MAAM,GAAG,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACvD,OAAO,EAAE,MAAM,EAAE,4BAA4B,GAAG,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACtE,CAAC;IACH,CAAC;CACF,CAAC;AAEF,SAAS,UAAU,CAAC,KAAa;IAC/B,IAAI,KAAK,GAAG,IAAI;QAAE,OAAO,GAAG,KAAK,GAAG,CAAC;IACrC,IAAI,KAAK,GAAG,IAAI,GAAG,IAAI;QAAE,OAAO,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;IACjE,OAAO,GAAG,CAAC,KAAK,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;AACjD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function resolveUserPath(cwd: string, input: string): string;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Path resolution for file-touching tools.
|
|
3
|
+
*
|
|
4
|
+
* Wraps node:path.resolve with two universally-expected behaviors:
|
|
5
|
+
* 1. `~/…` expands to the user's home directory (os.homedir()), which
|
|
6
|
+
* Node's resolve() does NOT do natively. Without this, the model's
|
|
7
|
+
* common idiom of `~/Downloads/foo.txt` resolves to a literal `~`
|
|
8
|
+
* directory inside cwd and fails with ENOENT.
|
|
9
|
+
* 2. `$VAR/…` / `%VAR%/…` are NOT expanded here — that's the shell's job
|
|
10
|
+
* and we don't want to leak env values into file paths silently.
|
|
11
|
+
*
|
|
12
|
+
* Returns an absolute path suitable for fs operations on any platform.
|
|
13
|
+
*/
|
|
14
|
+
import { resolve, isAbsolute } from 'node:path';
|
|
15
|
+
import { homedir } from 'node:os';
|
|
16
|
+
export function resolveUserPath(cwd, input) {
|
|
17
|
+
if (!input)
|
|
18
|
+
return cwd;
|
|
19
|
+
// Tilde expansion: `~`, `~/`, `~\` only — `~user/...` is intentionally
|
|
20
|
+
// unsupported because it requires resolving the OS user database and
|
|
21
|
+
// is rarely used in agent workflows. Anyone needing it can spell out
|
|
22
|
+
// the full path.
|
|
23
|
+
if (input === '~')
|
|
24
|
+
return homedir();
|
|
25
|
+
if (input.startsWith('~/') || input.startsWith('~\\')) {
|
|
26
|
+
return resolve(homedir(), input.slice(2));
|
|
27
|
+
}
|
|
28
|
+
if (isAbsolute(input))
|
|
29
|
+
return resolve(input);
|
|
30
|
+
return resolve(cwd, input);
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=path-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path-utils.js","sourceRoot":"","sources":["../../src/tools/path-utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,MAAM,UAAU,eAAe,CAAC,GAAW,EAAE,KAAa;IACxD,IAAI,CAAC,KAAK;QAAE,OAAO,GAAG,CAAC;IACvB,uEAAuE;IACvE,qEAAqE;IACrE,qEAAqE;IACrE,iBAAiB;IACjB,IAAI,KAAK,KAAK,GAAG;QAAE,OAAO,OAAO,EAAE,CAAC;IACpC,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QACtD,OAAO,OAAO,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC;IACD,IAAI,UAAU,CAAC,KAAK,CAAC;QAAE,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC;IAC7C,OAAO,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AAC7B,CAAC"}
|
package/dist/tools/read.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { readFileSync, statSync } from 'node:fs';
|
|
2
|
-
import {
|
|
2
|
+
import { resolveUserPath } from './path-utils.js';
|
|
3
3
|
export const ReadTool = {
|
|
4
4
|
name: 'read_file',
|
|
5
5
|
description: 'Read the contents of a file. Returns numbered lines. For large files, use offset and limit to read a portion.',
|
|
@@ -25,7 +25,7 @@ export const ReadTool = {
|
|
|
25
25
|
isDestructive: false,
|
|
26
26
|
async call(input, cwd) {
|
|
27
27
|
try {
|
|
28
|
-
const filePath =
|
|
28
|
+
const filePath = resolveUserPath(cwd, input.file_path);
|
|
29
29
|
const stat = statSync(filePath);
|
|
30
30
|
if (stat.isDirectory()) {
|
|
31
31
|
return { output: `Error: "${filePath}" is a directory, not a file.`, isError: true };
|
package/dist/tools/read.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"read.js","sourceRoot":"","sources":["../../src/tools/read.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACjD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"read.js","sourceRoot":"","sources":["../../src/tools/read.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAGlD,MAAM,CAAC,MAAM,QAAQ,GAAS;IAC5B,IAAI,EAAE,WAAW;IACjB,WAAW,EACT,+GAA+G;IACjH,UAAU,EAAE;QACV,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,SAAS,EAAE;gBACT,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,uCAAuC;aACrD;YACD,MAAM,EAAE;gBACN,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,gDAAgD;aAC9D;YACD,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,kCAAkC;aAChD;SACF;QACD,QAAQ,EAAE,CAAC,WAAW,CAAC;KACxB;IACD,UAAU,EAAE,IAAI;IAChB,aAAa,EAAE,KAAK;IAEpB,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG;QACnB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,eAAe,CAAC,GAAG,EAAE,KAAK,CAAC,SAAmB,CAAC,CAAC;YACjE,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAEhC,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;gBACvB,OAAO,EAAE,MAAM,EAAE,WAAW,QAAQ,+BAA+B,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YACvF,CAAC;YAED,IAAI,IAAI,CAAC,IAAI,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC;gBAChC,OAAO,EAAE,MAAM,EAAE,kBAAkB,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,mCAAmC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC9H,CAAC;YAED,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAChD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,MAAM,GAAI,KAAK,CAAC,MAAiB,IAAI,CAAC,CAAC;YAC7C,MAAM,KAAK,GAAI,KAAK,CAAC,KAAgB,IAAI,IAAI,CAAC;YAC9C,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC,CAAC;YAElD,MAAM,QAAQ,GAAG,KAAK;iBACnB,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;iBACvE,IAAI,CAAC,IAAI,CAAC,CAAC;YAEd,IAAI,MAAM,GAAG,QAAQ,CAAC;YACtB,IAAI,KAAK,CAAC,MAAM,GAAG,MAAM,GAAG,KAAK,EAAE,CAAC;gBAClC,MAAM,IAAI,YAAY,KAAK,CAAC,MAAM,GAAG,MAAM,GAAG,KAAK,cAAc,CAAC;YACpE,CAAC;YACD,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,cAAc,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QAC9D,CAAC;QAAC,OAAO,CAAU,EAAE,CAAC;YACpB,MAAM,GAAG,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACvD,OAAO,EAAE,MAAM,EAAE,uBAAuB,GAAG,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACjE,CAAC;IACH,CAAC;CACF,CAAC"}
|
package/dist/tools/write.js
CHANGED
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
import { writeFileSync, mkdirSync } from 'node:fs';
|
|
2
|
-
import {
|
|
2
|
+
import { dirname } from 'node:path';
|
|
3
|
+
import { resolveUserPath } from './path-utils.js';
|
|
3
4
|
export const WriteTool = {
|
|
4
5
|
name: 'write_file',
|
|
5
|
-
description: '
|
|
6
|
+
description: 'PREFERRED for creating or overwriting files. Provide the full content; ' +
|
|
7
|
+
'parent directories are created automatically; ~ in paths expands to the ' +
|
|
8
|
+
'user home directory; paths work natively on Windows/macOS/Linux. ' +
|
|
9
|
+
'Use this instead of `bash` + `echo > file` — no shell escaping, no path ' +
|
|
10
|
+
'translation, no quoting issues with multi-line content.',
|
|
6
11
|
parameters: {
|
|
7
12
|
type: 'object',
|
|
8
13
|
properties: {
|
|
@@ -21,7 +26,7 @@ export const WriteTool = {
|
|
|
21
26
|
isDestructive: true,
|
|
22
27
|
async call(input, cwd) {
|
|
23
28
|
try {
|
|
24
|
-
const filePath =
|
|
29
|
+
const filePath = resolveUserPath(cwd, input.file_path);
|
|
25
30
|
mkdirSync(dirname(filePath), { recursive: true });
|
|
26
31
|
writeFileSync(filePath, input.content, 'utf-8');
|
|
27
32
|
const lines = input.content.split('\n').length;
|
package/dist/tools/write.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"write.js","sourceRoot":"","sources":["../../src/tools/write.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"write.js","sourceRoot":"","sources":["../../src/tools/write.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAGlD,MAAM,CAAC,MAAM,SAAS,GAAS;IAC7B,IAAI,EAAE,YAAY;IAClB,WAAW,EACT,yEAAyE;QACzE,0EAA0E;QAC1E,mEAAmE;QACnE,0EAA0E;QAC1E,yDAAyD;IAC3D,UAAU,EAAE;QACV,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,SAAS,EAAE;gBACT,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,uCAAuC;aACrD;YACD,OAAO,EAAE;gBACP,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,2BAA2B;aACzC;SACF;QACD,QAAQ,EAAE,CAAC,WAAW,EAAE,SAAS,CAAC;KACnC;IACD,UAAU,EAAE,KAAK;IACjB,aAAa,EAAE,IAAI;IAEnB,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG;QACnB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,eAAe,CAAC,GAAG,EAAE,KAAK,CAAC,SAAmB,CAAC,CAAC;YACjE,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAClD,aAAa,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAiB,EAAE,OAAO,CAAC,CAAC;YAC1D,MAAM,KAAK,GAAI,KAAK,CAAC,OAAkB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;YAC3D,OAAO,EAAE,MAAM,EAAE,SAAS,KAAK,aAAa,QAAQ,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QAC3E,CAAC;QAAC,OAAO,CAAU,EAAE,CAAC;YACpB,MAAM,GAAG,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACvD,OAAO,EAAE,MAAM,EAAE,uBAAuB,GAAG,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACjE,CAAC;IACH,CAAC;CACF,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "compact-agent",
|
|
3
|
-
"version": "1.8.
|
|
3
|
+
"version": "1.8.3",
|
|
4
4
|
"description": "A dense, feature-rich AI coding agent for the terminal. Built-in voice dictation (Whisper) + TTS readout (ElevenLabs) + screen-reader mode for blind / low-vision users. 80+ slash commands, 9 modes including Hermes self-improving loop, multi-agent orchestration, bundled everything-claude-code skills library, learning system, and observable LLM transport. Works with OpenRouter, OpenAI, Anthropic-compatible, Ollama, LM Studio, DeepSeek, or any OpenAI-compatible API.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|