@x-code-cli/core 0.1.7 → 0.1.9
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/agent/file-ingest.d.ts +62 -0
- package/dist/agent/file-ingest.d.ts.map +1 -0
- package/dist/agent/file-ingest.js +390 -0
- package/dist/agent/file-ingest.js.map +1 -0
- package/dist/agent/light-compact.d.ts +13 -0
- package/dist/agent/light-compact.d.ts.map +1 -0
- package/dist/agent/light-compact.js +106 -0
- package/dist/agent/light-compact.js.map +1 -0
- package/dist/agent/loop-guard.d.ts +50 -0
- package/dist/agent/loop-guard.d.ts.map +1 -0
- package/dist/agent/loop-guard.js +107 -0
- package/dist/agent/loop-guard.js.map +1 -0
- package/dist/agent/loop-state.d.ts +11 -0
- package/dist/agent/loop-state.d.ts.map +1 -1
- package/dist/agent/loop-state.js +3 -1
- package/dist/agent/loop-state.js.map +1 -1
- package/dist/agent/loop.d.ts +2 -2
- package/dist/agent/loop.d.ts.map +1 -1
- package/dist/agent/loop.js +73 -8
- package/dist/agent/loop.js.map +1 -1
- package/dist/agent/messages.d.ts +5 -2
- package/dist/agent/messages.d.ts.map +1 -1
- package/dist/agent/messages.js.map +1 -1
- package/dist/agent/provider-compat.d.ts +7 -0
- package/dist/agent/provider-compat.d.ts.map +1 -1
- package/dist/agent/provider-compat.js +122 -0
- package/dist/agent/provider-compat.js.map +1 -1
- package/dist/agent/stream-utils.d.ts +7 -0
- package/dist/agent/stream-utils.d.ts.map +1 -1
- package/dist/agent/stream-utils.js.map +1 -1
- package/dist/agent/system-prompt.js +3 -3
- package/dist/agent/system-prompt.js.map +1 -1
- package/dist/agent/tool-execution.d.ts.map +1 -1
- package/dist/agent/tool-execution.js +68 -26
- package/dist/agent/tool-execution.js.map +1 -1
- package/dist/agent/tool-result-sanitize.d.ts +8 -0
- package/dist/agent/tool-result-sanitize.d.ts.map +1 -0
- package/dist/agent/tool-result-sanitize.js +77 -0
- package/dist/agent/tool-result-sanitize.js.map +1 -0
- package/dist/agent/vision-fallback.d.ts +22 -0
- package/dist/agent/vision-fallback.d.ts.map +1 -0
- package/dist/agent/vision-fallback.js +127 -0
- package/dist/agent/vision-fallback.js.map +1 -0
- package/dist/index.d.ts +10 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -1
- package/dist/index.js.map +1 -1
- package/dist/knowledge/session-usage.d.ts +24 -0
- package/dist/knowledge/session-usage.d.ts.map +1 -0
- package/dist/knowledge/session-usage.js +86 -0
- package/dist/knowledge/session-usage.js.map +1 -0
- package/dist/providers/cache-control.d.ts +29 -0
- package/dist/providers/cache-control.d.ts.map +1 -0
- package/dist/providers/cache-control.js +93 -0
- package/dist/providers/cache-control.js.map +1 -0
- package/dist/providers/capabilities.d.ts +15 -0
- package/dist/providers/capabilities.d.ts.map +1 -0
- package/dist/providers/capabilities.js +38 -0
- package/dist/providers/capabilities.js.map +1 -0
- package/dist/tools/index.d.ts +31 -5
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +1 -10
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/read-file.d.ts +29 -1
- package/dist/tools/read-file.d.ts.map +1 -1
- package/dist/tools/read-file.js +103 -10
- package/dist/tools/read-file.js.map +1 -1
- package/dist/tools/shell-provider.d.ts +13 -0
- package/dist/tools/shell-provider.d.ts.map +1 -0
- package/dist/tools/shell-provider.js +74 -0
- package/dist/tools/shell-provider.js.map +1 -0
- package/dist/tools/shell-utils.d.ts +1 -7
- package/dist/tools/shell-utils.d.ts.map +1 -1
- package/dist/tools/shell-utils.js +0 -17
- package/dist/tools/shell-utils.js.map +1 -1
- package/dist/tools/truncate.d.ts +36 -0
- package/dist/tools/truncate.d.ts.map +1 -0
- package/dist/tools/truncate.js +118 -0
- package/dist/tools/truncate.js.map +1 -0
- package/dist/tools/web-search.js +2 -2
- package/dist/tools/web-search.js.map +1 -1
- package/dist/types/index.d.ts +8 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/utils/shell-error.d.ts +12 -0
- package/dist/utils/shell-error.d.ts.map +1 -0
- package/dist/utils/shell-error.js +73 -0
- package/dist/utils/shell-error.js.map +1 -0
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +104 -10
- package/dist/utils.js.map +1 -1
- package/package.json +21 -12
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shell-utils.js","sourceRoot":"","sources":["../../src/tools/shell-utils.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"shell-utils.js","sourceRoot":"","sources":["../../src/tools/shell-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/** Default per-result line cap. Above this we keep a head/tail slice. */
|
|
2
|
+
export declare const MAX_TOOL_RESULT_LINES = 2000;
|
|
3
|
+
/** Default per-result byte cap (UTF-8). Covers both ASCII single-line
|
|
4
|
+
* minified dumps and non-ASCII content where a modest char count still adds
|
|
5
|
+
* up to a lot of wire bytes. */
|
|
6
|
+
export declare const MAX_TOOL_RESULT_BYTES: number;
|
|
7
|
+
/** Head:tail ratio when slicing. 0.2 keeps the first 20% + last 80%. */
|
|
8
|
+
export declare const DEFAULT_HEAD_RATIO = 0.2;
|
|
9
|
+
/** Per-turn aggregate cap across all tool results in one assistant message.
|
|
10
|
+
* Not enforced yet — tracked via agent loop state for future telemetry and
|
|
11
|
+
* eventual reactive compaction (mirrors claude-code's 200k-char ceiling). */
|
|
12
|
+
export declare const MAX_AGGREGATE_TOOL_RESULT_BYTES: number;
|
|
13
|
+
export interface TruncateOptions {
|
|
14
|
+
/** Max lines before truncation kicks in. Default {@link MAX_TOOL_RESULT_LINES}. */
|
|
15
|
+
maxLines?: number;
|
|
16
|
+
/** Max bytes (UTF-8). Default {@link MAX_TOOL_RESULT_BYTES}. */
|
|
17
|
+
maxBytes?: number;
|
|
18
|
+
/**
|
|
19
|
+
* Where to keep content when truncating:
|
|
20
|
+
* - `head-tail` (default): keep head 20% + tail 80%, drop middle.
|
|
21
|
+
* - `head`: keep first N bytes only, drop tail. Good for streamed shell
|
|
22
|
+
* output where the tail repeats noise (prompt, exit code).
|
|
23
|
+
* - `tail`: keep last N bytes only, drop head. Good for logs where the
|
|
24
|
+
* interesting part is the most recent.
|
|
25
|
+
*/
|
|
26
|
+
direction?: 'head-tail' | 'head' | 'tail';
|
|
27
|
+
/** Head ratio in head-tail mode. Default {@link DEFAULT_HEAD_RATIO}. */
|
|
28
|
+
headRatio?: number;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Truncate tool output to the line / byte budget. Returns the input unchanged
|
|
32
|
+
* if it fits both. Adds a one-line marker so the model can tell intentional
|
|
33
|
+
* omission from corrupted output.
|
|
34
|
+
*/
|
|
35
|
+
export declare function truncateToolResult(result: string, options?: TruncateOptions): string;
|
|
36
|
+
//# sourceMappingURL=truncate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"truncate.d.ts","sourceRoot":"","sources":["../../src/tools/truncate.ts"],"names":[],"mappings":"AAeA,yEAAyE;AACzE,eAAO,MAAM,qBAAqB,OAAO,CAAA;AAEzC;;iCAEiC;AACjC,eAAO,MAAM,qBAAqB,QAAY,CAAA;AAE9C,wEAAwE;AACxE,eAAO,MAAM,kBAAkB,MAAM,CAAA;AAErC;;8EAE8E;AAC9E,eAAO,MAAM,+BAA+B,QAAa,CAAA;AAEzD,MAAM,WAAW,eAAe;IAC9B,mFAAmF;IACnF,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,gEAAgE;IAChE,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;;;;;;;OAOG;IACH,SAAS,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,MAAM,CAAA;IACzC,wEAAwE;IACxE,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AA6ED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,eAAoB,GAAG,MAAM,CAgCxF"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
// @x-code-cli/core — Tool-output truncation
|
|
2
|
+
//
|
|
3
|
+
// Dual-budget truncation (lines OR bytes, whichever hits first). The 20/80
|
|
4
|
+
// head/tail split is from gemini-cli; the per-tool direction is from opencode.
|
|
5
|
+
// Shell output wants head-only (the tail repeats the prompt / exit line and
|
|
6
|
+
// the head carries the action), while file reads and grep results prefer
|
|
7
|
+
// head+tail so both the top-of-file context and the last section remain
|
|
8
|
+
// visible.
|
|
9
|
+
//
|
|
10
|
+
// Why not a separate char budget? For ASCII, chars == bytes, so a char budget
|
|
11
|
+
// is redundant with the byte budget. For non-ASCII (CJK code/comments), the
|
|
12
|
+
// byte budget is the one that actually matches how providers bill — they
|
|
13
|
+
// count UTF-8 bytes, not UTF-16 code units. Running two size axes (chars +
|
|
14
|
+
// bytes) made the slice logic three-pass and produced no behavioural win.
|
|
15
|
+
/** Default per-result line cap. Above this we keep a head/tail slice. */
|
|
16
|
+
export const MAX_TOOL_RESULT_LINES = 2000;
|
|
17
|
+
/** Default per-result byte cap (UTF-8). Covers both ASCII single-line
|
|
18
|
+
* minified dumps and non-ASCII content where a modest char count still adds
|
|
19
|
+
* up to a lot of wire bytes. */
|
|
20
|
+
export const MAX_TOOL_RESULT_BYTES = 50 * 1024;
|
|
21
|
+
/** Head:tail ratio when slicing. 0.2 keeps the first 20% + last 80%. */
|
|
22
|
+
export const DEFAULT_HEAD_RATIO = 0.2;
|
|
23
|
+
/** Per-turn aggregate cap across all tool results in one assistant message.
|
|
24
|
+
* Not enforced yet — tracked via agent loop state for future telemetry and
|
|
25
|
+
* eventual reactive compaction (mirrors claude-code's 200k-char ceiling). */
|
|
26
|
+
export const MAX_AGGREGATE_TOOL_RESULT_BYTES = 200 * 1024;
|
|
27
|
+
function byteLength(str) {
|
|
28
|
+
return Buffer.byteLength(str, 'utf-8');
|
|
29
|
+
}
|
|
30
|
+
/** Byte-aware slice that always cuts on a UTF-8 boundary so we don't produce
|
|
31
|
+
* a replacement char. Walks back up to 4 bytes to find a clean boundary. */
|
|
32
|
+
function sliceBytes(buf, bytes, direction) {
|
|
33
|
+
if (buf.length <= bytes)
|
|
34
|
+
return buf;
|
|
35
|
+
if (direction === 'head') {
|
|
36
|
+
let end = bytes;
|
|
37
|
+
// Back off to the last full codepoint start byte: continuation bytes in
|
|
38
|
+
// UTF-8 have the high bits `10xxxxxx`; we want to stop before them.
|
|
39
|
+
while (end > 0 && (buf[end] & 0xc0) === 0x80)
|
|
40
|
+
end--;
|
|
41
|
+
return buf.subarray(0, end);
|
|
42
|
+
}
|
|
43
|
+
let start = buf.length - bytes;
|
|
44
|
+
while (start < buf.length && (buf[start] & 0xc0) === 0x80)
|
|
45
|
+
start++;
|
|
46
|
+
return buf.subarray(start);
|
|
47
|
+
}
|
|
48
|
+
function applyLineSlice(result, maxLines, direction, headRatio) {
|
|
49
|
+
const lines = result.split('\n');
|
|
50
|
+
if (lines.length <= maxLines)
|
|
51
|
+
return { result: { sliced: result, headEnd: null }, linesDropped: 0 };
|
|
52
|
+
if (direction === 'head') {
|
|
53
|
+
return {
|
|
54
|
+
result: { sliced: lines.slice(0, maxLines).join('\n'), headEnd: null },
|
|
55
|
+
linesDropped: lines.length - maxLines,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
if (direction === 'tail') {
|
|
59
|
+
return {
|
|
60
|
+
result: { sliced: lines.slice(-maxLines).join('\n'), headEnd: null },
|
|
61
|
+
linesDropped: lines.length - maxLines,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
const headLines = Math.max(1, Math.floor(maxLines * headRatio));
|
|
65
|
+
const tailLines = maxLines - headLines;
|
|
66
|
+
const head = lines.slice(0, headLines).join('\n');
|
|
67
|
+
const tail = lines.slice(-tailLines).join('\n');
|
|
68
|
+
return { result: { sliced: head + '\n' + tail, headEnd: head.length }, linesDropped: lines.length - maxLines };
|
|
69
|
+
}
|
|
70
|
+
function applyByteSlice(input, maxBytes, direction, headRatio) {
|
|
71
|
+
const buf = Buffer.from(input.sliced, 'utf-8');
|
|
72
|
+
if (buf.length <= maxBytes)
|
|
73
|
+
return input;
|
|
74
|
+
if (direction === 'head')
|
|
75
|
+
return { sliced: sliceBytes(buf, maxBytes, 'head').toString('utf-8'), headEnd: null };
|
|
76
|
+
if (direction === 'tail')
|
|
77
|
+
return { sliced: sliceBytes(buf, maxBytes, 'tail').toString('utf-8'), headEnd: null };
|
|
78
|
+
const headBudget = Math.max(256, Math.floor(maxBytes * headRatio));
|
|
79
|
+
const tailBudget = maxBytes - headBudget;
|
|
80
|
+
const head = sliceBytes(buf, headBudget, 'head').toString('utf-8');
|
|
81
|
+
const tail = sliceBytes(buf, tailBudget, 'tail').toString('utf-8');
|
|
82
|
+
return { sliced: head + tail, headEnd: head.length };
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Truncate tool output to the line / byte budget. Returns the input unchanged
|
|
86
|
+
* if it fits both. Adds a one-line marker so the model can tell intentional
|
|
87
|
+
* omission from corrupted output.
|
|
88
|
+
*/
|
|
89
|
+
export function truncateToolResult(result, options = {}) {
|
|
90
|
+
const maxLines = options.maxLines ?? MAX_TOOL_RESULT_LINES;
|
|
91
|
+
const maxBytes = options.maxBytes ?? MAX_TOOL_RESULT_BYTES;
|
|
92
|
+
const direction = options.direction ?? 'head-tail';
|
|
93
|
+
const headRatio = options.headRatio ?? DEFAULT_HEAD_RATIO;
|
|
94
|
+
const origLines = (result.match(/\n/g)?.length ?? 0) + 1;
|
|
95
|
+
const origBytes = byteLength(result);
|
|
96
|
+
const origChars = result.length;
|
|
97
|
+
if (origLines <= maxLines && origBytes <= maxBytes)
|
|
98
|
+
return result;
|
|
99
|
+
// Line slice first: preserves structured chunking for line-oriented output
|
|
100
|
+
// (grep matches, listDir entries). After the line cut we may still be over
|
|
101
|
+
// the byte budget — a long single line or CJK-heavy content where the line
|
|
102
|
+
// count was fine — and the byte slice handles the remainder.
|
|
103
|
+
const lineSlice = applyLineSlice(result, maxLines, direction, headRatio);
|
|
104
|
+
const byteSlice = applyByteSlice(lineSlice.result, maxBytes, direction, headRatio);
|
|
105
|
+
const droppedChars = origChars - byteSlice.sliced.length;
|
|
106
|
+
const marker = lineSlice.linesDropped > 0
|
|
107
|
+
? `[truncated: ${lineSlice.linesDropped} lines / ${droppedChars.toLocaleString()} chars dropped — narrow the tool args or read specific ranges]`
|
|
108
|
+
: `[truncated: ${droppedChars.toLocaleString()} chars dropped — output exceeded byte budget]`;
|
|
109
|
+
if (direction === 'head')
|
|
110
|
+
return `${byteSlice.sliced}\n\n${marker}`;
|
|
111
|
+
if (direction === 'tail')
|
|
112
|
+
return `${marker}\n\n${byteSlice.sliced}`;
|
|
113
|
+
if (byteSlice.headEnd != null && byteSlice.headEnd > 0 && byteSlice.headEnd < byteSlice.sliced.length) {
|
|
114
|
+
return `${byteSlice.sliced.slice(0, byteSlice.headEnd)}\n\n${marker}\n\n${byteSlice.sliced.slice(byteSlice.headEnd)}`;
|
|
115
|
+
}
|
|
116
|
+
return `${marker}\n\n${byteSlice.sliced}`;
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=truncate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"truncate.js","sourceRoot":"","sources":["../../src/tools/truncate.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/web-search.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { tool } from 'ai';
|
|
3
3
|
import { z } from 'zod';
|
|
4
4
|
import { reportProgress } from './progress.js';
|
|
5
|
-
import {
|
|
5
|
+
import { getShellProvider } from './shell-provider.js';
|
|
6
6
|
const YEAR = new Date().getFullYear();
|
|
7
7
|
const BRAVE_TIMEOUT_MS = 15_000;
|
|
8
8
|
async function searchWithTavily(query, maxResults) {
|
|
@@ -29,7 +29,7 @@ async function searchWithBrave(query, maxResults) {
|
|
|
29
29
|
return (data.web?.results ?? []).map((r) => ({ title: r.title, url: r.url, content: r.description }));
|
|
30
30
|
}
|
|
31
31
|
function buildMissingKeyError() {
|
|
32
|
-
const { type } =
|
|
32
|
+
const { type } = getShellProvider();
|
|
33
33
|
let setupBlock;
|
|
34
34
|
if (type === 'powershell') {
|
|
35
35
|
setupBlock = [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web-search.js","sourceRoot":"","sources":["../../src/tools/web-search.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,CAAA;AAEzB,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAC9C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"web-search.js","sourceRoot":"","sources":["../../src/tools/web-search.ts"],"names":[],"mappings":"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"}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -4,6 +4,14 @@ export interface TokenUsage {
|
|
|
4
4
|
inputTokens: number;
|
|
5
5
|
outputTokens: number;
|
|
6
6
|
totalTokens: number;
|
|
7
|
+
/** Cached prompt tokens read (Anthropic cache_read, OpenAI cached_tokens, etc.).
|
|
8
|
+
* Billed at a fraction of normal input rate — ratio depends on the provider.
|
|
9
|
+
* Already counted in `inputTokens`; this field is purely informational. */
|
|
10
|
+
cacheReadTokens: number;
|
|
11
|
+
/** Tokens written to provider-side cache (Anthropic cache_creation_input_tokens).
|
|
12
|
+
* Billed at a premium over normal input rate but unlocks cheap reads on
|
|
13
|
+
* subsequent turns. Zero on providers that don't separate creation from read. */
|
|
14
|
+
cacheCreationTokens: number;
|
|
7
15
|
}
|
|
8
16
|
export interface DisplayMessage {
|
|
9
17
|
id: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,IAAI,CAAA;AAIrD,MAAM,MAAM,eAAe,GAAG,cAAc,GAAG,KAAK,GAAG,MAAM,CAAA;AAI7D,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,MAAM,CAAA;IACnB,YAAY,EAAE,MAAM,CAAA;IACpB,WAAW,EAAE,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
|
package/dist/types/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAkIA,wBAAwB;AAExB,MAAM,CAAC,MAAM,aAAa,GAA2B;IACnD,MAAM,EAAE,6BAA6B;IACrC,IAAI,EAAE,2BAA2B;IACjC,KAAK,EAAE,4BAA4B;IACnC,IAAI,EAAE,gBAAgB;IACtB,MAAM,EAAE,uBAAuB;IAC/B,QAAQ,EAAE,4BAA4B;IACtC,cAAc,EAAE,0BAA0B;IAC1C,IAAI,EAAE,kBAAkB;IACxB,GAAG,EAAE,kBAAkB;IACvB,IAAI,EAAE,sBAAsB;CAC7B,CAAA;AAED,wDAAwD;AAExD,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,EAAE,MAAM,EAAE,mBAAmB,EAAE,YAAY,EAAE,6BAA6B,EAAE;IAC5E,EAAE,MAAM,EAAE,gBAAgB,EAAE,YAAY,EAAE,gBAAgB,EAAE;IAC5D,EAAE,MAAM,EAAE,kBAAkB,EAAE,YAAY,EAAE,4BAA4B,EAAE;IAC1E,EAAE,MAAM,EAAE,iBAAiB,EAAE,YAAY,EAAE,kBAAkB,EAAE;IAC/D,EAAE,MAAM,EAAE,8BAA8B,EAAE,YAAY,EAAE,uBAAuB,EAAE;IACjF,EAAE,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE;IACrD,EAAE,MAAM,EAAE,eAAe,EAAE,YAAY,EAAE,kBAAkB,EAAE;IAC7D,EAAE,MAAM,EAAE,kBAAkB,EAAE,YAAY,EAAE,sBAAsB,EAAE;CAC5D,CAAA;AAaV;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,eAAe,GAA6C;IACvE,SAAS,EAAE;QACT;YACE,EAAE,EAAE,6BAA6B;YACjC,KAAK,EAAE,YAAY;YACnB,WAAW,EAAE,4DAA4D;SAC1E;QACD;YACE,EAAE,EAAE,2BAA2B;YAC/B,KAAK,EAAE,UAAU;YACjB,WAAW,EAAE,uDAAuD;SACrE;QACD,EAAE,EAAE,EAAE,4BAA4B,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,qCAAqC,EAAE;KAC7G;IACD,MAAM,EAAE;QACN,EAAE,EAAE,EAAE,gBAAgB,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,oCAAoC,EAAE;QAC7F,EAAE,EAAE,EAAE,qBAAqB,EAAE,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,iCAAiC,EAAE;QACpG,EAAE,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,qDAAqD,EAAE;QACpG,EAAE,EAAE,EAAE,gBAAgB,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,yBAAyB,EAAE;KACnF;IACD,QAAQ,EAAE;QACR;YACE,EAAE,EAAE,4BAA4B;YAChC,KAAK,EAAE,mBAAmB;YAC1B,WAAW,EAAE,6CAA6C;SAC3D;QACD;YACE,EAAE,EAAE,0BAA0B;YAC9B,KAAK,EAAE,iBAAiB;YACxB,WAAW,EAAE,0CAA0C;SACxD;KACF;IACD,OAAO,EAAE;QACP,EAAE,EAAE,EAAE,kBAAkB,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,sCAAsC,EAAE;QAClG,EAAE,EAAE,EAAE,mBAAmB,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,uBAAuB,EAAE;QACrF,EAAE,EAAE,EAAE,oBAAoB,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,gBAAgB,EAAE;QAChF,EAAE,EAAE,EAAE,mBAAmB,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,iBAAiB,EAAE;QAC/E,EAAE,EAAE,EAAE,0BAA0B,EAAE,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,wBAAwB,EAAE;QACpG,EAAE,EAAE,EAAE,kBAAkB,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,iBAAiB,EAAE;KAC9E;IACD,MAAM,EAAE;QACN,EAAE,EAAE,EAAE,uBAAuB,EAAE,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,sCAAsC,EAAE;QAC7G,EAAE,EAAE,EAAE,yBAAyB,EAAE,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,qBAAqB,EAAE;KACjG;IACD,GAAG,EAAE;QACH,EAAE,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,cAAc,EAAE;QAClE,EAAE,EAAE,EAAE,iBAAiB,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,yBAAyB,EAAE;KACxF;IACD,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,kBAAkB,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC;IACrF,UAAU,EAAE,CAAC,EAAE,EAAE,EAAE,sBAAsB,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC;CAC9F,CAAA;AAED,gCAAgC;AAEhC,MAAM,CAAC,MAAM,iBAAiB,GAA2B;IACvD,SAAS,EAAE,gCAAgC;IAC3C,MAAM,EAAE,sCAAsC;IAC9C,MAAM,EAAE,oCAAoC;IAC5C,GAAG,EAAE,uBAAuB;IAC5B,QAAQ,EAAE,wCAAwC;IAClD,OAAO,EAAE,6CAA6C;IACtD,KAAK,EAAE,6CAA6C;IACpD,UAAU,EAAE,+CAA+C;CAC5D,CAAA"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Collapse PowerShell error blocks in `text` to a single summary line each.
|
|
3
|
+
* The summary preserves the opening `At line:X char:Y` header (the only
|
|
4
|
+
* diagnostic signal we keep) and discards the body, caret, category and
|
|
5
|
+
* fully-qualified-id continuations.
|
|
6
|
+
*
|
|
7
|
+
* Returns the input unchanged if no recognisable block is found. Safe to call
|
|
8
|
+
* on arbitrary shell output — lines that don't fall inside a block pass
|
|
9
|
+
* through verbatim.
|
|
10
|
+
*/
|
|
11
|
+
export declare function foldShellErrorNoise(text: string): string;
|
|
12
|
+
//# sourceMappingURL=shell-error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shell-error.d.ts","sourceRoot":"","sources":["../../src/utils/shell-error.ts"],"names":[],"mappings":"AAgCA;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAkCxD"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
// @x-code-cli/core — Shell stderr noise folding
|
|
2
|
+
//
|
|
3
|
+
// PowerShell and cmd emit multi-line diagnostics for every parse/syntax error:
|
|
4
|
+
// the `At line:X char:Y` header, a line of the offending source, a caret
|
|
5
|
+
// underline (`+ ~~~~`), a free-form description line, then the tail markers
|
|
6
|
+
// (`+ CategoryInfo` and `+ FullyQualifiedErrorId`). When the agent loops on
|
|
7
|
+
// a misquoted command, those 5–10 line stacks stack up in context faster
|
|
8
|
+
// than the actual diagnostic signal. We collapse each block to a single line.
|
|
9
|
+
//
|
|
10
|
+
// The detection model:
|
|
11
|
+
// - A block STARTS at a line matching `At line:X char:Y`.
|
|
12
|
+
// - A block ENDS at whichever comes first: (a) a `FullyQualifiedErrorId`
|
|
13
|
+
// line (that's always the PS-emitted terminator), (b) another block
|
|
14
|
+
// start, (c) a hard scan cap.
|
|
15
|
+
// - The scan cap guards against pathological input where a FQID line is
|
|
16
|
+
// missing — we won't silently devour unrelated output.
|
|
17
|
+
/** Max lines we'll consume in a single block. PS stacks are ~5 lines and
|
|
18
|
+
* never approach 12; anything past that is probably not part of the block. */
|
|
19
|
+
const BLOCK_SCAN_LIMIT = 12;
|
|
20
|
+
const PS_BLOCK_START = /^At line:\d+ char:\d+/;
|
|
21
|
+
const PS_FQID_LINE = /^\s*\+\s*FullyQualifiedErrorId\s*:/;
|
|
22
|
+
function isBlockStart(line) {
|
|
23
|
+
return PS_BLOCK_START.test(line);
|
|
24
|
+
}
|
|
25
|
+
function isFqidTerminator(line) {
|
|
26
|
+
return PS_FQID_LINE.test(line);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Collapse PowerShell error blocks in `text` to a single summary line each.
|
|
30
|
+
* The summary preserves the opening `At line:X char:Y` header (the only
|
|
31
|
+
* diagnostic signal we keep) and discards the body, caret, category and
|
|
32
|
+
* fully-qualified-id continuations.
|
|
33
|
+
*
|
|
34
|
+
* Returns the input unchanged if no recognisable block is found. Safe to call
|
|
35
|
+
* on arbitrary shell output — lines that don't fall inside a block pass
|
|
36
|
+
* through verbatim.
|
|
37
|
+
*/
|
|
38
|
+
export function foldShellErrorNoise(text) {
|
|
39
|
+
if (!text)
|
|
40
|
+
return text;
|
|
41
|
+
// Fast path: most shell output isn't a PS error stack.
|
|
42
|
+
if (!text.includes('At line:'))
|
|
43
|
+
return text;
|
|
44
|
+
const lines = text.split(/\r?\n/);
|
|
45
|
+
const out = [];
|
|
46
|
+
let i = 0;
|
|
47
|
+
while (i < lines.length) {
|
|
48
|
+
const line = lines[i];
|
|
49
|
+
if (!isBlockStart(line)) {
|
|
50
|
+
out.push(line);
|
|
51
|
+
i++;
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
out.push(`${line.trim()} [PS parse error — details folded]`);
|
|
55
|
+
i++;
|
|
56
|
+
// Consume the body of the block. We stop at the natural terminator
|
|
57
|
+
// (`FullyQualifiedErrorId`) or at a new block header (in case multiple
|
|
58
|
+
// errors were concatenated). The scan cap is a defensive safety net;
|
|
59
|
+
// real PS errors never hit it.
|
|
60
|
+
let scanned = 0;
|
|
61
|
+
while (i < lines.length && scanned < BLOCK_SCAN_LIMIT) {
|
|
62
|
+
if (isBlockStart(lines[i]))
|
|
63
|
+
break;
|
|
64
|
+
const terminator = isFqidTerminator(lines[i]);
|
|
65
|
+
i++;
|
|
66
|
+
scanned++;
|
|
67
|
+
if (terminator)
|
|
68
|
+
break;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return out.join('\n');
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=shell-error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shell-error.js","sourceRoot":"","sources":["../../src/utils/shell-error.ts"],"names":[],"mappings":"AAAA,gDAAgD;AAChD,EAAE;AACF,+EAA+E;AAC/E,yEAAyE;AACzE,4EAA4E;AAC5E,4EAA4E;AAC5E,yEAAyE;AACzE,8EAA8E;AAC9E,EAAE;AACF,uBAAuB;AACvB,4DAA4D;AAC5D,2EAA2E;AAC3E,wEAAwE;AACxE,kCAAkC;AAClC,0EAA0E;AAC1E,2DAA2D;AAE3D;+EAC+E;AAC/E,MAAM,gBAAgB,GAAG,EAAE,CAAA;AAE3B,MAAM,cAAc,GAAG,uBAAuB,CAAA;AAC9C,MAAM,YAAY,GAAG,oCAAoC,CAAA;AAEzD,SAAS,YAAY,CAAC,IAAY;IAChC,OAAO,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAClC,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAY;IACpC,OAAO,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAChC,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAA;IACtB,uDAAuD;IACvD,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;QAAE,OAAO,IAAI,CAAA;IAE3C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IACjC,MAAM,GAAG,GAAa,EAAE,CAAA;IACxB,IAAI,CAAC,GAAG,CAAC,CAAA;IACT,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;QACrB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACd,CAAC,EAAE,CAAA;YACH,SAAQ;QACV,CAAC;QAED,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,oCAAoC,CAAC,CAAA;QAC5D,CAAC,EAAE,CAAA;QAEH,mEAAmE;QACnE,uEAAuE;QACvE,qEAAqE;QACrE,+BAA+B;QAC/B,IAAI,OAAO,GAAG,CAAC,CAAA;QACf,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,OAAO,GAAG,gBAAgB,EAAE,CAAC;YACtD,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBAAE,MAAK;YACjC,MAAM,UAAU,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;YAC7C,CAAC,EAAE,CAAA;YACH,OAAO,EAAE,CAAA;YACT,IAAI,UAAU;gBAAE,MAAK;QACvB,CAAC;IACH,CAAC;IAED,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACvB,CAAC"}
|
package/dist/utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAMA,0CAA0C;AAC1C,eAAO,MAAM,SAAS,YAAY,CAAA;AAElC,0CAA0C;AAC1C,eAAO,MAAM,gBAAgB,QAAqC,CAAA;
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAMA,0CAA0C;AAC1C,eAAO,MAAM,SAAS,YAAY,CAAA;AAElC,0CAA0C;AAC1C,eAAO,MAAM,gBAAgB,QAAqC,CAAA;AAoGlE,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAmB3D;AAED,6BAA6B;AAC7B,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOnE;AAED,uDAAuD;AACvD,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAMpE;AAED,uDAAuD;AACvD,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CAO5F"}
|
package/dist/utils.js
CHANGED
|
@@ -8,27 +8,121 @@ export const XCODE_DIR = '.x-code';
|
|
|
8
8
|
/** Global config directory (~/.x-code) */
|
|
9
9
|
export const GLOBAL_XCODE_DIR = path.join(os.homedir(), '.x-code');
|
|
10
10
|
// ── Debug log (shared by core + cli) ────────────────────────────────────
|
|
11
|
-
// Turn on with `DEBUG_STDOUT=1`. Writes to
|
|
12
|
-
//
|
|
13
|
-
//
|
|
14
|
-
// paths (every stream chunk, every tool call) and we want ordering to
|
|
15
|
-
// match real-time events; an async queue would reorder entries.
|
|
11
|
+
// Turn on with `DEBUG_STDOUT=1`. Writes to ~/.x-code/logs/debug.log so a
|
|
12
|
+
// globally-installed CLI doesn't pollute the user's project tree and so
|
|
13
|
+
// every invocation across every cwd ends up in one greppable file.
|
|
16
14
|
//
|
|
17
|
-
//
|
|
15
|
+
// Sync I/O is deliberate: callers are in hot paths (every stream chunk,
|
|
16
|
+
// every tool call) and we want on-disk ordering to match real-time event
|
|
17
|
+
// order. An async queue would reorder entries under backpressure.
|
|
18
|
+
//
|
|
19
|
+
// Performance: we keep ONE open file descriptor for the lifetime of the
|
|
20
|
+
// process (writeSync ~10μs) instead of appendFileSync (~100μs each — open +
|
|
21
|
+
// write + close per call). On rotation we close + reopen. The fd is
|
|
22
|
+
// inherited at exit and closed by the kernel, so no explicit teardown.
|
|
23
|
+
//
|
|
24
|
+
// Bounded per-line size: a single `stream.tool-result` from reading a large
|
|
25
|
+
// file can otherwise consume tens of KB in one entry, eating most of the
|
|
26
|
+
// 1MB budget in a handful of lines. We hard-cap each entry at MAX_LINE_BYTES
|
|
27
|
+
// so even chatty turns yield at least ~250 lines/MB of grep-able context.
|
|
28
|
+
//
|
|
29
|
+
// Rotation: two-file scheme (debug.log + debug.log.1). When the active file
|
|
30
|
+
// reaches MAX_LOG_BYTES we rename it over .1 and start fresh, capping total
|
|
31
|
+
// disk use at ~2× MAX_LOG_BYTES. Same shape pip / Cargo / npm use for cache
|
|
32
|
+
// logs at small scale — simple enough we don't need a logrotate cron.
|
|
18
33
|
const DEBUG = process.env.DEBUG_STDOUT === '1';
|
|
19
|
-
|
|
20
|
-
|
|
34
|
+
/** Per-file size cap. Total disk = 2× this (active + rotated). 10MB chosen
|
|
35
|
+
* so a typical multi-turn agent run (~85KB/turn × 50–100 turns) lands
|
|
36
|
+
* entirely in the active file — grep/tail doesn't need to span rotation
|
|
37
|
+
* for normal debugging. The combined 20MB is still small enough to attach
|
|
38
|
+
* to a bug report verbatim. */
|
|
39
|
+
const MAX_LOG_BYTES = 10 * 1024 * 1024;
|
|
40
|
+
/** Per-entry truncation cap. Bounds worst-case line size — without this a
|
|
41
|
+
* single huge tool-result could eat the whole budget in a handful of
|
|
42
|
+
* entries. 1KB keeps the worst case at ~5k lines per file (~10k across
|
|
43
|
+
* rotation) while still leaving room for short stack traces and small
|
|
44
|
+
* payloads in full. Typical lines are <200 bytes, so the realistic per-
|
|
45
|
+
* file count is in the tens of thousands. */
|
|
46
|
+
const MAX_LINE_BYTES = 1024;
|
|
47
|
+
const LOG_DIR = path.join(GLOBAL_XCODE_DIR, 'logs');
|
|
48
|
+
const LOG_FILE = path.join(LOG_DIR, 'debug.log');
|
|
49
|
+
const LOG_FILE_OLD = path.join(LOG_DIR, 'debug.log.1');
|
|
50
|
+
/** In-memory byte counter for the active file. Avoids a statSync on every
|
|
51
|
+
* hot-path debugLog call — only hit disk when initialising or rotating. */
|
|
52
|
+
let currentLogBytes = -1;
|
|
53
|
+
let logFd = null;
|
|
54
|
+
function ensureLogReady() {
|
|
55
|
+
if (logFd !== null)
|
|
56
|
+
return;
|
|
57
|
+
fsSync.mkdirSync(LOG_DIR, { recursive: true });
|
|
58
|
+
if (currentLogBytes < 0) {
|
|
59
|
+
try {
|
|
60
|
+
currentLogBytes = fsSync.statSync(LOG_FILE).size;
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
// File doesn't exist yet — open() in 'a' mode will create it.
|
|
64
|
+
currentLogBytes = 0;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
logFd = fsSync.openSync(LOG_FILE, 'a');
|
|
68
|
+
}
|
|
69
|
+
function rotateIfNeeded(nextWriteBytes) {
|
|
70
|
+
if (currentLogBytes + nextWriteBytes < MAX_LOG_BYTES)
|
|
71
|
+
return;
|
|
72
|
+
try {
|
|
73
|
+
if (logFd !== null) {
|
|
74
|
+
fsSync.closeSync(logFd);
|
|
75
|
+
logFd = null;
|
|
76
|
+
}
|
|
77
|
+
// rename silently overwrites the previous .1 on POSIX. On Windows
|
|
78
|
+
// rename fails if the target exists, so unlink first; missing .1
|
|
79
|
+
// is fine (no previous rotation).
|
|
80
|
+
try {
|
|
81
|
+
fsSync.unlinkSync(LOG_FILE_OLD);
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
/* no previous rotation — fine */
|
|
85
|
+
}
|
|
86
|
+
fsSync.renameSync(LOG_FILE, LOG_FILE_OLD);
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
// Rotation failed (file locked, FS full, etc.) — reset and let the
|
|
90
|
+
// next ensureLogReady() reopen fresh. We'd rather lose history than
|
|
91
|
+
// spam errors.
|
|
92
|
+
}
|
|
93
|
+
currentLogBytes = 0;
|
|
94
|
+
}
|
|
95
|
+
/** Truncate `s` to at most `maxBytes` UTF-8 bytes, appending a marker noting
|
|
96
|
+
* how many bytes were dropped. The cheap `length * 4` upper bound short-
|
|
97
|
+
* circuits the common ASCII case (most debug content) without paying for
|
|
98
|
+
* Buffer.byteLength on every line. */
|
|
99
|
+
function truncateForLog(s, maxBytes) {
|
|
100
|
+
if (s.length * 4 <= maxBytes)
|
|
101
|
+
return s;
|
|
102
|
+
if (Buffer.byteLength(s, 'utf8') <= maxBytes)
|
|
103
|
+
return s;
|
|
104
|
+
const sliceLen = Math.max(0, maxBytes - 64);
|
|
105
|
+
const truncated = s.slice(0, sliceLen);
|
|
106
|
+
const dropped = s.length - sliceLen;
|
|
107
|
+
return `${truncated}…<+${dropped}c truncated>`;
|
|
21
108
|
}
|
|
22
109
|
export function debugLog(tag, content) {
|
|
23
110
|
if (!DEBUG)
|
|
24
111
|
return;
|
|
25
112
|
try {
|
|
113
|
+
const safeContent = truncateForLog(content, MAX_LINE_BYTES);
|
|
26
114
|
const ts = new Date().toISOString();
|
|
27
115
|
// `JSON.stringify(content)` quotes newlines/tabs so the full payload
|
|
28
116
|
// lands on ONE line in the log — much easier to grep across turns,
|
|
29
117
|
// and multi-line text-deltas don't visually merge with neighbours.
|
|
30
|
-
const line = `[${ts}] ${tag} ${JSON.stringify(
|
|
31
|
-
|
|
118
|
+
const line = `[${ts}] ${tag} ${JSON.stringify(safeContent)}\n`;
|
|
119
|
+
const bytes = Buffer.byteLength(line, 'utf8');
|
|
120
|
+
rotateIfNeeded(bytes);
|
|
121
|
+
ensureLogReady();
|
|
122
|
+
if (logFd !== null) {
|
|
123
|
+
fsSync.writeSync(logFd, line);
|
|
124
|
+
currentLogBytes += bytes;
|
|
125
|
+
}
|
|
32
126
|
}
|
|
33
127
|
catch {
|
|
34
128
|
// best effort — never crash the agent just because we can't log
|
package/dist/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,oDAAoD;AACpD,OAAO,MAAM,MAAM,SAAS,CAAA;AAC5B,OAAO,EAAE,MAAM,kBAAkB,CAAA;AACjC,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,0CAA0C;AAC1C,MAAM,CAAC,MAAM,SAAS,GAAG,SAAS,CAAA;AAElC,0CAA0C;AAC1C,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAA;AAElE,2EAA2E;AAC3E,
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@x-code-cli/core",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.9",
|
|
4
4
|
"repository": {
|
|
5
5
|
"type": "git",
|
|
6
6
|
"url": "https://github.com/woai3c/x-code-cli",
|
|
@@ -20,25 +20,34 @@
|
|
|
20
20
|
"node": ">=20.19.0"
|
|
21
21
|
},
|
|
22
22
|
"dependencies": {
|
|
23
|
-
"ai": "^
|
|
23
|
+
"@ai-sdk/alibaba": "^1.0.0",
|
|
24
24
|
"@ai-sdk/anthropic": "^3.0.0",
|
|
25
|
-
"@ai-sdk/openai": "^3.0.0",
|
|
26
|
-
"@ai-sdk/google": "^3.0.0",
|
|
27
|
-
"@ai-sdk/xai": "^3.0.0",
|
|
28
25
|
"@ai-sdk/deepseek": "^2.0.0",
|
|
29
|
-
"@ai-sdk/
|
|
26
|
+
"@ai-sdk/google": "^3.0.0",
|
|
30
27
|
"@ai-sdk/moonshotai": "^2.0.0",
|
|
28
|
+
"@ai-sdk/openai": "^3.0.0",
|
|
31
29
|
"@ai-sdk/openai-compatible": "^2.0.0",
|
|
32
|
-
"
|
|
33
|
-
"zod": "^3.25.76",
|
|
34
|
-
"globby": "^14.0.0",
|
|
35
|
-
"execa": "^9.0.0",
|
|
30
|
+
"@ai-sdk/xai": "^3.0.0",
|
|
36
31
|
"@tavily/core": "^0.7.0",
|
|
37
32
|
"@vscode/ripgrep": "^1.17.0",
|
|
33
|
+
"ai": "^6.0.0",
|
|
34
|
+
"chalk": "^5.4.0",
|
|
38
35
|
"cheerio": "^1.0.0",
|
|
39
|
-
"turndown": "^7.2.0",
|
|
40
36
|
"diff": "^8.0.0",
|
|
41
|
-
"
|
|
37
|
+
"execa": "^9.0.0",
|
|
38
|
+
"file-type": "^22.0.1",
|
|
39
|
+
"globby": "^14.0.0",
|
|
40
|
+
"mammoth": "^1.12.0",
|
|
41
|
+
"officeparser": "^6.1.0",
|
|
42
|
+
"pdf-parse": "^2.4.5",
|
|
43
|
+
"tesseract.js": "^7.0.0",
|
|
44
|
+
"turndown": "^7.2.0",
|
|
45
|
+
"xlsx": "^0.18.5",
|
|
46
|
+
"zhipu-ai-provider": "^0.2.0",
|
|
47
|
+
"zod": "^3.25.76"
|
|
48
|
+
},
|
|
49
|
+
"devDependencies": {
|
|
50
|
+
"@types/pdf-parse": "^1.1.5"
|
|
42
51
|
},
|
|
43
52
|
"scripts": {
|
|
44
53
|
"build": "tsc -b",
|