@alexnetrebskii/hive-agent 1.5.0 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/dist/index.d.ts +2 -1
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +2 -1
  4. package/dist/index.js.map +1 -1
  5. package/dist/providers/llm/openrouter.d.ts +43 -0
  6. package/dist/providers/llm/openrouter.d.ts.map +1 -0
  7. package/dist/providers/llm/openrouter.js +281 -0
  8. package/dist/providers/llm/openrouter.js.map +1 -0
  9. package/dist/providers/workspace/file.d.ts +1 -0
  10. package/dist/providers/workspace/file.d.ts.map +1 -1
  11. package/dist/providers/workspace/file.js +9 -0
  12. package/dist/providers/workspace/file.js.map +1 -1
  13. package/dist/providers/workspace/memory.d.ts +1 -0
  14. package/dist/providers/workspace/memory.d.ts.map +1 -1
  15. package/dist/providers/workspace/memory.js +4 -0
  16. package/dist/providers/workspace/memory.js.map +1 -1
  17. package/dist/providers/workspace/types.d.ts +1 -0
  18. package/dist/providers/workspace/types.d.ts.map +1 -1
  19. package/dist/shell/commands/cat.d.ts.map +1 -1
  20. package/dist/shell/commands/cat.js +68 -7
  21. package/dist/shell/commands/cat.js.map +1 -1
  22. package/dist/shell/commands/grep.d.ts.map +1 -1
  23. package/dist/shell/commands/grep.js +33 -9
  24. package/dist/shell/commands/grep.js.map +1 -1
  25. package/dist/shell/commands/head.d.ts.map +1 -1
  26. package/dist/shell/commands/head.js +9 -3
  27. package/dist/shell/commands/head.js.map +1 -1
  28. package/dist/shell/commands/tail.d.ts.map +1 -1
  29. package/dist/shell/commands/tail.js +9 -3
  30. package/dist/shell/commands/tail.js.map +1 -1
  31. package/dist/shell/limits.d.ts +5 -0
  32. package/dist/shell/limits.d.ts.map +1 -0
  33. package/dist/shell/limits.js +5 -0
  34. package/dist/shell/limits.js.map +1 -0
  35. package/dist/shell/shell.test.js +130 -0
  36. package/dist/shell/shell.test.js.map +1 -1
  37. package/dist/tools/shell.d.ts.map +1 -1
  38. package/dist/tools/shell.js +26 -1
  39. package/dist/tools/shell.js.map +1 -1
  40. package/dist/trace/index.d.ts +1 -0
  41. package/dist/trace/index.d.ts.map +1 -1
  42. package/dist/trace/index.js +1 -0
  43. package/dist/trace/index.js.map +1 -1
  44. package/dist/trace/openrouter-pricing.d.ts +9 -0
  45. package/dist/trace/openrouter-pricing.d.ts.map +1 -0
  46. package/dist/trace/openrouter-pricing.js +321 -0
  47. package/dist/trace/openrouter-pricing.js.map +1 -0
  48. package/dist/trace/pricing.d.ts.map +1 -1
  49. package/dist/trace/pricing.js +3 -0
  50. package/dist/trace/pricing.js.map +1 -1
  51. package/package.json +1 -1
@@ -1,19 +1,29 @@
1
1
  /**
2
2
  * cat - Concatenate and print files
3
3
  */
4
+ import { MAX_FILE_SIZE, DEFAULT_LINE_LIMIT, MAX_LINE_LENGTH } from '../limits.js';
4
5
  export const catCommand = {
5
6
  name: 'cat',
6
7
  help: {
7
- usage: 'cat [FILE...]',
8
+ usage: 'cat [OPTIONS] [FILE...]',
8
9
  description: 'Concatenate and print files',
10
+ flags: [
11
+ { flag: '-n', description: 'Show line numbers' },
12
+ { flag: '--offset N', description: 'Start from line N (0-based)' },
13
+ { flag: '--limit N', description: `Max lines to show (default: ${DEFAULT_LINE_LIMIT})` }
14
+ ],
9
15
  examples: [
10
16
  { command: 'cat /data.json', description: 'Print file contents' },
17
+ { command: 'cat -n /data.json', description: 'Print with line numbers' },
18
+ { command: 'cat --offset 0 --limit 100 /big.txt', description: 'Read first 100 lines' },
11
19
  { command: 'cat /a /b', description: 'Concatenate multiple files' },
12
20
  { command: 'cat /*.json', description: 'Print all JSON files' }
13
21
  ],
14
22
  notes: [
15
23
  'Supports glob patterns (e.g. /*.json)',
16
- 'Reads from stdin when no files given and input is piped'
24
+ 'Reads from stdin when no files given and input is piped',
25
+ `Files over ${MAX_FILE_SIZE} bytes require --offset/--limit for paginated access`,
26
+ `Lines are truncated to ${MAX_LINE_LENGTH} characters`
17
27
  ]
18
28
  },
19
29
  async execute(args, ctx) {
@@ -21,22 +31,73 @@ export const catCommand = {
21
31
  if (args.length === 0 && ctx.stdin) {
22
32
  return { exitCode: 0, stdout: ctx.stdin, stderr: '' };
23
33
  }
24
- if (args.length === 0) {
34
+ let showLineNumbers = false;
35
+ let offset = null;
36
+ let limit = null;
37
+ const paths = [];
38
+ for (let i = 0; i < args.length; i++) {
39
+ const arg = args[i];
40
+ if (arg === '-n') {
41
+ showLineNumbers = true;
42
+ }
43
+ else if (arg === '--offset') {
44
+ offset = parseInt(args[++i], 10);
45
+ }
46
+ else if (arg === '--limit') {
47
+ limit = parseInt(args[++i], 10);
48
+ }
49
+ else {
50
+ paths.push(arg);
51
+ }
52
+ }
53
+ if (paths.length === 0) {
25
54
  return { exitCode: 1, stdout: '', stderr: 'cat: missing file operand' };
26
55
  }
27
- const outputs = [];
28
- for (const path of args) {
56
+ const hasPagination = offset !== null || limit !== null;
57
+ const effectiveLimit = limit ?? DEFAULT_LINE_LIMIT;
58
+ const parts = [];
59
+ for (const path of paths) {
29
60
  // Handle glob patterns
30
61
  const files = path.includes('*') ? await ctx.fs.glob(path) : [path];
31
62
  for (const file of files) {
63
+ // Size gate
64
+ if (ctx.fs.size) {
65
+ const fileSize = await ctx.fs.size(file);
66
+ if (fileSize === null) {
67
+ return { exitCode: 1, stdout: '', stderr: `cat: ${file}: No such file` };
68
+ }
69
+ if (fileSize > MAX_FILE_SIZE && !hasPagination) {
70
+ return {
71
+ exitCode: 1,
72
+ stdout: '',
73
+ stderr: `cat: ${file} (${fileSize} bytes) exceeds max size (${MAX_FILE_SIZE} bytes). Use \`head -n 2000 ${file}\` to read the first 2000 lines, \`tail -n 2000 ${file}\` for the last, or \`grep "pattern" ${file}\` to search.`
74
+ };
75
+ }
76
+ }
32
77
  const content = await ctx.fs.read(file);
33
78
  if (content === null) {
34
79
  return { exitCode: 1, stdout: '', stderr: `cat: ${file}: No such file` };
35
80
  }
36
- outputs.push(content);
81
+ const allLines = content.split('\n');
82
+ const totalLines = allLines.length;
83
+ const effectiveOffset = offset ?? 0;
84
+ const sliced = allLines.slice(effectiveOffset, effectiveOffset + effectiveLimit);
85
+ const truncated = sliced.map(line => line.length > MAX_LINE_LENGTH ? line.slice(0, MAX_LINE_LENGTH) + '...' : line);
86
+ if (offset !== null) {
87
+ const shown = truncated.length;
88
+ parts.push(`[Showing lines ${effectiveOffset + 1}-${effectiveOffset + shown} of ${totalLines}]\n`);
89
+ }
90
+ if (showLineNumbers) {
91
+ const startNum = effectiveOffset + 1;
92
+ const formatted = truncated.map((line, i) => `${startNum + i}\t${line}`);
93
+ parts.push(formatted.join('\n'));
94
+ }
95
+ else {
96
+ parts.push(truncated.join('\n'));
97
+ }
37
98
  }
38
99
  }
39
- return { exitCode: 0, stdout: outputs.join(''), stderr: '' };
100
+ return { exitCode: 0, stdout: parts.join(''), stderr: '' };
40
101
  }
41
102
  };
42
103
  //# sourceMappingURL=cat.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cat.js","sourceRoot":"","sources":["../../../src/shell/commands/cat.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,CAAC,MAAM,UAAU,GAAmB;IACxC,IAAI,EAAE,KAAK;IAEX,IAAI,EAAE;QACJ,KAAK,EAAE,eAAe;QACtB,WAAW,EAAE,6BAA6B;QAC1C,QAAQ,EAAE;YACR,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,qBAAqB,EAAE;YACjE,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,4BAA4B,EAAE;YACnE,EAAE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,sBAAsB,EAAE;SAChE;QACD,KAAK,EAAE;YACL,uCAAuC;YACvC,yDAAyD;SAC1D;KACF;IAED,KAAK,CAAC,OAAO,CAAC,IAAc,EAAE,GAAmB;QAC/C,qCAAqC;QACrC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;YACnC,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAAA;QACvD,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,2BAA2B,EAAE,CAAA;QACzE,CAAC;QAED,MAAM,OAAO,GAAa,EAAE,CAAA;QAE5B,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;YACxB,uBAAuB;YACvB,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;YAEnE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;gBACvC,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;oBACrB,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,IAAI,gBAAgB,EAAE,CAAA;gBAC1E,CAAC;gBACD,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YACvB,CAAC;QACH,CAAC;QAED,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAA;IAC9D,CAAC;CACF,CAAA"}
1
+ {"version":3,"file":"cat.js","sourceRoot":"","sources":["../../../src/shell/commands/cat.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"grep.d.ts","sourceRoot":"","sources":["../../../src/shell/commands/grep.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,cAAc,EAA+B,MAAM,aAAa,CAAA;AAE9E,eAAO,MAAM,WAAW,EAAE,cA4IzB,CAAA"}
1
+ {"version":3,"file":"grep.d.ts","sourceRoot":"","sources":["../../../src/shell/commands/grep.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,cAAc,EAA+B,MAAM,aAAa,CAAA;AAG9E,eAAO,MAAM,WAAW,EAAE,cAoKzB,CAAA"}
@@ -1,6 +1,7 @@
1
1
  /**
2
2
  * grep - Search for patterns
3
3
  */
4
+ import { MAX_LINE_LENGTH, MAX_OUTPUT_CHARS } from '../limits.js';
4
5
  export const grepCommand = {
5
6
  name: 'grep',
6
7
  help: {
@@ -22,7 +23,9 @@ export const grepCommand = {
22
23
  ],
23
24
  notes: [
24
25
  'Supports JavaScript regex syntax',
25
- 'Exit code 1 when no matches found'
26
+ 'Exit code 1 when no matches found',
27
+ `Lines are truncated to ${MAX_LINE_LENGTH} characters`,
28
+ `Total output is capped at ${MAX_OUTPUT_CHARS} characters`
26
29
  ]
27
30
  },
28
31
  async execute(args, ctx) {
@@ -80,6 +83,21 @@ export const grepCommand = {
80
83
  }
81
84
  const outputs = [];
82
85
  const matchingFiles = new Set();
86
+ let totalChars = 0;
87
+ let outputTruncated = false;
88
+ function truncateLine(line) {
89
+ return line.length > MAX_LINE_LENGTH ? line.slice(0, MAX_LINE_LENGTH) + '...' : line;
90
+ }
91
+ function addOutput(line) {
92
+ const truncated = truncateLine(line);
93
+ if (totalChars + truncated.length + 1 > MAX_OUTPUT_CHARS) {
94
+ outputTruncated = true;
95
+ return false;
96
+ }
97
+ outputs.push(truncated);
98
+ totalChars += truncated.length + 1; // +1 for newline
99
+ return true;
100
+ }
83
101
  // Search in stdin if no paths
84
102
  if (paths.length === 0 && ctx.stdin) {
85
103
  const lines = ctx.stdin.split('\n');
@@ -88,22 +106,23 @@ export const grepCommand = {
88
106
  const matches = regex.test(line);
89
107
  regex.lastIndex = 0; // Reset regex state
90
108
  if (matches !== invertMatch) {
91
- if (showLineNumbers) {
92
- outputs.push(`${i + 1}:${line}`);
93
- }
94
- else {
95
- outputs.push(line);
96
- }
109
+ const formatted = showLineNumbers ? `${i + 1}:${line}` : line;
110
+ if (!addOutput(formatted))
111
+ break;
97
112
  }
98
113
  }
99
114
  }
100
115
  else {
101
116
  // Search in files
102
117
  for (const path of paths) {
118
+ if (outputTruncated)
119
+ break;
103
120
  const files = path.includes('*') || recursive
104
121
  ? await ctx.fs.glob(recursive ? path.replace(/\/?$/, '/**/*') : path)
105
122
  : [path];
106
123
  for (const file of files) {
124
+ if (outputTruncated)
125
+ break;
107
126
  if (await ctx.fs.isDirectory(file))
108
127
  continue;
109
128
  const content = await ctx.fs.read(file);
@@ -121,7 +140,8 @@ export const grepCommand = {
121
140
  else {
122
141
  const prefix = paths.length > 1 || recursive ? `${file}:` : '';
123
142
  const lineNum = showLineNumbers ? `${i + 1}:` : '';
124
- outputs.push(`${prefix}${lineNum}${line}`);
143
+ if (!addOutput(`${prefix}${lineNum}${line}`))
144
+ break;
125
145
  }
126
146
  }
127
147
  }
@@ -135,9 +155,13 @@ export const grepCommand = {
135
155
  stderr: ''
136
156
  };
137
157
  }
158
+ let stdout = outputs.join('\n') + (outputs.length ? '\n' : '');
159
+ if (outputTruncated) {
160
+ stdout += `[Output truncated at ${MAX_OUTPUT_CHARS} characters. Narrow your search pattern or target specific files.]\n`;
161
+ }
138
162
  return {
139
163
  exitCode: outputs.length > 0 ? 0 : 1,
140
- stdout: outputs.join('\n') + (outputs.length ? '\n' : ''),
164
+ stdout,
141
165
  stderr: ''
142
166
  };
143
167
  }
@@ -1 +1 @@
1
- {"version":3,"file":"grep.js","sourceRoot":"","sources":["../../../src/shell/commands/grep.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"grep.js","sourceRoot":"","sources":["../../../src/shell/commands/grep.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"head.d.ts","sourceRoot":"","sources":["../../../src/shell/commands/head.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,cAAc,EAA+B,MAAM,aAAa,CAAA;AAE9E,eAAO,MAAM,WAAW,EAAE,cAkEzB,CAAA"}
1
+ {"version":3,"file":"head.d.ts","sourceRoot":"","sources":["../../../src/shell/commands/head.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,cAAc,EAA+B,MAAM,aAAa,CAAA;AAG9E,eAAO,MAAM,WAAW,EAAE,cAuEzB,CAAA"}
@@ -1,6 +1,7 @@
1
1
  /**
2
2
  * head - Output the first part of files
3
3
  */
4
+ import { MAX_LINE_LENGTH } from '../limits.js';
4
5
  export const headCommand = {
5
6
  name: 'head',
6
7
  help: {
@@ -16,7 +17,8 @@ export const headCommand = {
16
17
  ],
17
18
  notes: [
18
19
  'Also accepts -NUM shorthand (e.g. head -5 file)',
19
- 'Reads from stdin when no file given and input is piped'
20
+ 'Reads from stdin when no file given and input is piped',
21
+ `Lines are truncated to ${MAX_LINE_LENGTH} characters`
20
22
  ]
21
23
  },
22
24
  async execute(args, ctx) {
@@ -37,7 +39,9 @@ export const headCommand = {
37
39
  // Handle stdin
38
40
  if (paths.length === 0 && ctx.stdin) {
39
41
  const inputLines = ctx.stdin.split('\n');
40
- const output = inputLines.slice(0, lines).join('\n');
42
+ const output = inputLines.slice(0, lines)
43
+ .map(line => line.length > MAX_LINE_LENGTH ? line.slice(0, MAX_LINE_LENGTH) + '...' : line)
44
+ .join('\n');
41
45
  return { exitCode: 0, stdout: output + '\n', stderr: '' };
42
46
  }
43
47
  if (paths.length === 0) {
@@ -50,7 +54,9 @@ export const headCommand = {
50
54
  return { exitCode: 1, stdout: '', stderr: `head: ${path}: No such file` };
51
55
  }
52
56
  const fileLines = content.split('\n');
53
- const output = fileLines.slice(0, lines).join('\n');
57
+ const output = fileLines.slice(0, lines)
58
+ .map(line => line.length > MAX_LINE_LENGTH ? line.slice(0, MAX_LINE_LENGTH) + '...' : line)
59
+ .join('\n');
54
60
  if (paths.length > 1) {
55
61
  outputs.push(`==> ${path} <==`);
56
62
  }
@@ -1 +1 @@
1
- {"version":3,"file":"head.js","sourceRoot":"","sources":["../../../src/shell/commands/head.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"head.js","sourceRoot":"","sources":["../../../src/shell/commands/head.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAE9C,MAAM,CAAC,MAAM,WAAW,GAAmB;IACzC,IAAI,EAAE,MAAM;IAEZ,IAAI,EAAE;QACJ,KAAK,EAAE,0BAA0B;QACjC,WAAW,EAAE,gCAAgC;QAC7C,KAAK,EAAE;YACL,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,sCAAsC,EAAE;SACxE;QACD,QAAQ,EAAE;YACR,EAAE,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,qBAAqB,EAAE;YAChE,EAAE,OAAO,EAAE,qBAAqB,EAAE,WAAW,EAAE,oBAAoB,EAAE;YACrE,EAAE,OAAO,EAAE,4BAA4B,EAAE,WAAW,EAAE,+BAA+B,EAAE;SACxF;QACD,KAAK,EAAE;YACL,iDAAiD;YACjD,wDAAwD;YACxD,0BAA0B,eAAe,aAAa;SACvD;KACF;IAED,KAAK,CAAC,OAAO,CAAC,IAAc,EAAE,GAAmB;QAC/C,IAAI,KAAK,GAAG,EAAE,CAAA;QACd,MAAM,KAAK,GAAa,EAAE,CAAA;QAE1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;YAEnB,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;gBACjB,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;YACjC,CAAC;iBAAM,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC;gBACrE,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;YACpC,CAAC;iBAAM,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBAChC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YACjB,CAAC;QACH,CAAC;QAED,eAAe;QACf,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;YACpC,MAAM,UAAU,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YACxC,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;iBACtC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,eAAe,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;iBAC1F,IAAI,CAAC,IAAI,CAAC,CAAA;YACb,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAA;QAC3D,CAAC;QAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,4BAA4B,EAAE,CAAA;QAC1E,CAAC;QAED,MAAM,OAAO,GAAa,EAAE,CAAA;QAE5B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACvC,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;gBACrB,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,IAAI,gBAAgB,EAAE,CAAA;YAC3E,CAAC;YAED,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YACrC,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;iBACrC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,eAAe,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;iBAC1F,IAAI,CAAC,IAAI,CAAC,CAAA;YAEb,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACrB,OAAO,CAAC,IAAI,CAAC,OAAO,IAAI,MAAM,CAAC,CAAA;YACjC,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACtB,CAAC;QAED,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAA;IACvE,CAAC;CACF,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"tail.d.ts","sourceRoot":"","sources":["../../../src/shell/commands/tail.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,cAAc,EAA+B,MAAM,aAAa,CAAA;AAE9E,eAAO,MAAM,WAAW,EAAE,cAkEzB,CAAA"}
1
+ {"version":3,"file":"tail.d.ts","sourceRoot":"","sources":["../../../src/shell/commands/tail.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,cAAc,EAA+B,MAAM,aAAa,CAAA;AAG9E,eAAO,MAAM,WAAW,EAAE,cAuEzB,CAAA"}
@@ -1,6 +1,7 @@
1
1
  /**
2
2
  * tail - Output the last part of files
3
3
  */
4
+ import { MAX_LINE_LENGTH } from '../limits.js';
4
5
  export const tailCommand = {
5
6
  name: 'tail',
6
7
  help: {
@@ -16,7 +17,8 @@ export const tailCommand = {
16
17
  ],
17
18
  notes: [
18
19
  'Also accepts -NUM shorthand (e.g. tail -5 file)',
19
- 'Reads from stdin when no file given and input is piped'
20
+ 'Reads from stdin when no file given and input is piped',
21
+ `Lines are truncated to ${MAX_LINE_LENGTH} characters`
20
22
  ]
21
23
  },
22
24
  async execute(args, ctx) {
@@ -37,7 +39,9 @@ export const tailCommand = {
37
39
  // Handle stdin
38
40
  if (paths.length === 0 && ctx.stdin) {
39
41
  const inputLines = ctx.stdin.split('\n');
40
- const output = inputLines.slice(-lines).join('\n');
42
+ const output = inputLines.slice(-lines)
43
+ .map(line => line.length > MAX_LINE_LENGTH ? line.slice(0, MAX_LINE_LENGTH) + '...' : line)
44
+ .join('\n');
41
45
  return { exitCode: 0, stdout: output + '\n', stderr: '' };
42
46
  }
43
47
  if (paths.length === 0) {
@@ -50,7 +54,9 @@ export const tailCommand = {
50
54
  return { exitCode: 1, stdout: '', stderr: `tail: ${path}: No such file` };
51
55
  }
52
56
  const fileLines = content.split('\n');
53
- const output = fileLines.slice(-lines).join('\n');
57
+ const output = fileLines.slice(-lines)
58
+ .map(line => line.length > MAX_LINE_LENGTH ? line.slice(0, MAX_LINE_LENGTH) + '...' : line)
59
+ .join('\n');
54
60
  if (paths.length > 1) {
55
61
  outputs.push(`==> ${path} <==`);
56
62
  }
@@ -1 +1 @@
1
- {"version":3,"file":"tail.js","sourceRoot":"","sources":["../../../src/shell/commands/tail.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tail.js","sourceRoot":"","sources":["../../../src/shell/commands/tail.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare const MAX_FILE_SIZE = 262144;
2
+ export declare const DEFAULT_LINE_LIMIT = 2000;
3
+ export declare const MAX_LINE_LENGTH = 2000;
4
+ export declare const MAX_OUTPUT_CHARS = 30000;
5
+ //# sourceMappingURL=limits.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"limits.d.ts","sourceRoot":"","sources":["../../src/shell/limits.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,aAAa,SAAU,CAAA;AACpC,eAAO,MAAM,kBAAkB,OAAQ,CAAA;AACvC,eAAO,MAAM,eAAe,OAAQ,CAAA;AACpC,eAAO,MAAM,gBAAgB,QAAS,CAAA"}
@@ -0,0 +1,5 @@
1
+ export const MAX_FILE_SIZE = 262_144; // 256 KB
2
+ export const DEFAULT_LINE_LIMIT = 2_000; // lines per read
3
+ export const MAX_LINE_LENGTH = 2_000; // chars per line
4
+ export const MAX_OUTPUT_CHARS = 30_000; // shell tool output cap
5
+ //# sourceMappingURL=limits.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"limits.js","sourceRoot":"","sources":["../../src/shell/limits.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GAAG,OAAO,CAAA,CAAO,SAAS;AACpD,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,CAAA,CAAI,iBAAiB;AAC5D,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,CAAA,CAAO,iBAAiB;AAC5D,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAM,CAAA,CAAK,wBAAwB"}
@@ -1,6 +1,8 @@
1
1
  import { describe, it, expect, beforeEach, vi } from 'vitest';
2
2
  import { Shell } from './shell.js';
3
3
  import { commands } from './commands/index.js';
4
+ import { MAX_FILE_SIZE, MAX_LINE_LENGTH } from './limits.js';
5
+ import { createShellTool } from '../tools/shell.js';
4
6
  describe('Shell', () => {
5
7
  let shell;
6
8
  beforeEach(() => {
@@ -538,5 +540,133 @@ describe('Shell', () => {
538
540
  }
539
541
  });
540
542
  });
543
+ describe('large file handling', () => {
544
+ describe('cat size gate', () => {
545
+ it('rejects files over 256KB without offset/limit', async () => {
546
+ await shell.getFS().write('/big.txt', 'x'.repeat(MAX_FILE_SIZE + 1));
547
+ const result = await shell.execute('cat /big.txt');
548
+ expect(result.exitCode).toBe(1);
549
+ expect(result.stderr).toContain('exceeds max size');
550
+ expect(result.stderr).toContain('head -n 2000');
551
+ });
552
+ it('allows paginated access to large files with --offset/--limit', async () => {
553
+ const lines = Array.from({ length: 100 }, (_, i) => `line ${i + 1}`);
554
+ const bigContent = lines.join('\n');
555
+ // Make it exceed MAX_FILE_SIZE by padding lines
556
+ const padding = 'x'.repeat(Math.ceil(MAX_FILE_SIZE / 100));
557
+ const paddedLines = Array.from({ length: 100 }, (_, i) => `line ${i + 1} ${padding}`);
558
+ await shell.getFS().write('/big.txt', paddedLines.join('\n'));
559
+ const result = await shell.execute('cat --offset 0 --limit 10 /big.txt');
560
+ expect(result.exitCode).toBe(0);
561
+ expect(result.stdout).toContain('[Showing lines 1-10 of');
562
+ expect(result.stdout).toContain('line 1');
563
+ });
564
+ });
565
+ describe('cat pagination', () => {
566
+ it('paginates with --offset and --limit', async () => {
567
+ const lines = Array.from({ length: 20 }, (_, i) => `line ${i + 1}`);
568
+ await shell.getFS().write('/data.txt', lines.join('\n'));
569
+ const result = await shell.execute('cat --offset 5 --limit 5 /data.txt');
570
+ expect(result.exitCode).toBe(0);
571
+ expect(result.stdout).toContain('[Showing lines 6-10 of 20]');
572
+ expect(result.stdout).toContain('line 6');
573
+ expect(result.stdout).toContain('line 10');
574
+ expect(result.stdout).not.toContain('line 5\n');
575
+ expect(result.stdout).not.toContain('line 11');
576
+ });
577
+ it('defaults to 2000-line limit', async () => {
578
+ const lines = Array.from({ length: 2500 }, (_, i) => `L${i + 1}`);
579
+ await shell.getFS().write('/data.txt', lines.join('\n'));
580
+ const result = await shell.execute('cat /data.txt');
581
+ expect(result.exitCode).toBe(0);
582
+ // Should contain line 2000 but not line 2001
583
+ expect(result.stdout).toContain('L2000');
584
+ expect(result.stdout).not.toContain('L2001');
585
+ });
586
+ });
587
+ describe('cat line numbers', () => {
588
+ it('shows line numbers with -n flag', async () => {
589
+ await shell.getFS().write('/data.txt', 'alpha\nbeta\ngamma\n');
590
+ const result = await shell.execute('cat -n /data.txt');
591
+ expect(result.exitCode).toBe(0);
592
+ expect(result.stdout).toContain('1\talpha');
593
+ expect(result.stdout).toContain('2\tbeta');
594
+ expect(result.stdout).toContain('3\tgamma');
595
+ });
596
+ it('shows correct line numbers with offset', async () => {
597
+ const lines = Array.from({ length: 20 }, (_, i) => `line ${i + 1}`);
598
+ await shell.getFS().write('/data.txt', lines.join('\n'));
599
+ const result = await shell.execute('cat -n --offset 10 --limit 3 /data.txt');
600
+ expect(result.exitCode).toBe(0);
601
+ expect(result.stdout).toContain('11\tline 11');
602
+ expect(result.stdout).toContain('12\tline 12');
603
+ expect(result.stdout).toContain('13\tline 13');
604
+ });
605
+ });
606
+ describe('line truncation', () => {
607
+ it('cat truncates long lines', async () => {
608
+ const longLine = 'a'.repeat(MAX_LINE_LENGTH + 500);
609
+ await shell.getFS().write('/data.txt', longLine);
610
+ const result = await shell.execute('cat /data.txt');
611
+ expect(result.exitCode).toBe(0);
612
+ expect(result.stdout.length).toBeLessThan(longLine.length);
613
+ expect(result.stdout).toContain('...');
614
+ });
615
+ it('head truncates long lines', async () => {
616
+ const longLine = 'b'.repeat(MAX_LINE_LENGTH + 500);
617
+ await shell.getFS().write('/data.txt', `short\n${longLine}\nshort2`);
618
+ const result = await shell.execute('head -n 3 /data.txt');
619
+ expect(result.exitCode).toBe(0);
620
+ expect(result.stdout).toContain('short');
621
+ expect(result.stdout).toContain('...');
622
+ expect(result.stdout).not.toContain('b'.repeat(MAX_LINE_LENGTH + 1));
623
+ });
624
+ it('tail truncates long lines', async () => {
625
+ const longLine = 'c'.repeat(MAX_LINE_LENGTH + 500);
626
+ await shell.getFS().write('/data.txt', `short\n${longLine}\nshort2`);
627
+ const result = await shell.execute('tail -n 3 /data.txt');
628
+ expect(result.exitCode).toBe(0);
629
+ expect(result.stdout).toContain('...');
630
+ expect(result.stdout).not.toContain('c'.repeat(MAX_LINE_LENGTH + 1));
631
+ });
632
+ it('grep truncates long matching lines', async () => {
633
+ const longLine = 'MATCH' + 'd'.repeat(MAX_LINE_LENGTH + 500);
634
+ await shell.getFS().write('/data.txt', `short\n${longLine}\nshort2`);
635
+ const result = await shell.execute('grep MATCH /data.txt');
636
+ expect(result.exitCode).toBe(0);
637
+ expect(result.stdout).toContain('MATCH');
638
+ expect(result.stdout).toContain('...');
639
+ expect(result.stdout.length).toBeLessThan(longLine.length);
640
+ });
641
+ });
642
+ describe('grep output cap', () => {
643
+ it('caps output and appends truncation note', async () => {
644
+ // Create a file with many matching lines
645
+ const lines = Array.from({ length: 5000 }, (_, i) => `match line ${i + 1} with some extra content to fill space`);
646
+ await shell.getFS().write('/data.txt', lines.join('\n'));
647
+ const result = await shell.execute('grep match /data.txt');
648
+ expect(result.exitCode).toBe(0);
649
+ expect(result.stdout).toContain('[Output truncated at');
650
+ expect(result.stdout).toContain('Narrow your search');
651
+ });
652
+ });
653
+ describe('shell tool output truncation', () => {
654
+ it('spills large output to workspace file', async () => {
655
+ const tool = createShellTool(shell);
656
+ const ctx = { remainingTokens: 10000 };
657
+ // Build a big output via cat with --limit high enough
658
+ const bigLines = Array.from({ length: 500 }, (_, i) => `output line ${i + 1} ${'x'.repeat(100)}`);
659
+ await shell.getFS().write('/big-output.txt', bigLines.join('\n'));
660
+ const result = await tool.execute({ command: 'cat --limit 500 /big-output.txt' }, ctx);
661
+ expect(result.error).toContain('exceeds maximum');
662
+ expect(result.error).toContain('Saved to');
663
+ const data = result.data;
664
+ expect(data.spillPath).toBeTruthy();
665
+ // Verify the file was written
666
+ const spillContent = await shell.getFS().read(data.spillPath);
667
+ expect(spillContent).toBeTruthy();
668
+ });
669
+ });
670
+ });
541
671
  });
542
672
  //# sourceMappingURL=shell.test.js.map