@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.
Files changed (92) hide show
  1. package/dist/agent/file-ingest.d.ts +62 -0
  2. package/dist/agent/file-ingest.d.ts.map +1 -0
  3. package/dist/agent/file-ingest.js +390 -0
  4. package/dist/agent/file-ingest.js.map +1 -0
  5. package/dist/agent/light-compact.d.ts +13 -0
  6. package/dist/agent/light-compact.d.ts.map +1 -0
  7. package/dist/agent/light-compact.js +106 -0
  8. package/dist/agent/light-compact.js.map +1 -0
  9. package/dist/agent/loop-guard.d.ts +50 -0
  10. package/dist/agent/loop-guard.d.ts.map +1 -0
  11. package/dist/agent/loop-guard.js +107 -0
  12. package/dist/agent/loop-guard.js.map +1 -0
  13. package/dist/agent/loop-state.d.ts +11 -0
  14. package/dist/agent/loop-state.d.ts.map +1 -1
  15. package/dist/agent/loop-state.js +3 -1
  16. package/dist/agent/loop-state.js.map +1 -1
  17. package/dist/agent/loop.d.ts +2 -2
  18. package/dist/agent/loop.d.ts.map +1 -1
  19. package/dist/agent/loop.js +73 -8
  20. package/dist/agent/loop.js.map +1 -1
  21. package/dist/agent/messages.d.ts +5 -2
  22. package/dist/agent/messages.d.ts.map +1 -1
  23. package/dist/agent/messages.js.map +1 -1
  24. package/dist/agent/provider-compat.d.ts +7 -0
  25. package/dist/agent/provider-compat.d.ts.map +1 -1
  26. package/dist/agent/provider-compat.js +122 -0
  27. package/dist/agent/provider-compat.js.map +1 -1
  28. package/dist/agent/stream-utils.d.ts +7 -0
  29. package/dist/agent/stream-utils.d.ts.map +1 -1
  30. package/dist/agent/stream-utils.js.map +1 -1
  31. package/dist/agent/system-prompt.js +3 -3
  32. package/dist/agent/system-prompt.js.map +1 -1
  33. package/dist/agent/tool-execution.d.ts.map +1 -1
  34. package/dist/agent/tool-execution.js +68 -26
  35. package/dist/agent/tool-execution.js.map +1 -1
  36. package/dist/agent/tool-result-sanitize.d.ts +8 -0
  37. package/dist/agent/tool-result-sanitize.d.ts.map +1 -0
  38. package/dist/agent/tool-result-sanitize.js +77 -0
  39. package/dist/agent/tool-result-sanitize.js.map +1 -0
  40. package/dist/agent/vision-fallback.d.ts +22 -0
  41. package/dist/agent/vision-fallback.d.ts.map +1 -0
  42. package/dist/agent/vision-fallback.js +127 -0
  43. package/dist/agent/vision-fallback.js.map +1 -0
  44. package/dist/index.d.ts +10 -1
  45. package/dist/index.d.ts.map +1 -1
  46. package/dist/index.js +6 -1
  47. package/dist/index.js.map +1 -1
  48. package/dist/knowledge/session-usage.d.ts +24 -0
  49. package/dist/knowledge/session-usage.d.ts.map +1 -0
  50. package/dist/knowledge/session-usage.js +86 -0
  51. package/dist/knowledge/session-usage.js.map +1 -0
  52. package/dist/providers/cache-control.d.ts +29 -0
  53. package/dist/providers/cache-control.d.ts.map +1 -0
  54. package/dist/providers/cache-control.js +93 -0
  55. package/dist/providers/cache-control.js.map +1 -0
  56. package/dist/providers/capabilities.d.ts +15 -0
  57. package/dist/providers/capabilities.d.ts.map +1 -0
  58. package/dist/providers/capabilities.js +38 -0
  59. package/dist/providers/capabilities.js.map +1 -0
  60. package/dist/tools/index.d.ts +31 -5
  61. package/dist/tools/index.d.ts.map +1 -1
  62. package/dist/tools/index.js +1 -10
  63. package/dist/tools/index.js.map +1 -1
  64. package/dist/tools/read-file.d.ts +29 -1
  65. package/dist/tools/read-file.d.ts.map +1 -1
  66. package/dist/tools/read-file.js +103 -10
  67. package/dist/tools/read-file.js.map +1 -1
  68. package/dist/tools/shell-provider.d.ts +13 -0
  69. package/dist/tools/shell-provider.d.ts.map +1 -0
  70. package/dist/tools/shell-provider.js +74 -0
  71. package/dist/tools/shell-provider.js.map +1 -0
  72. package/dist/tools/shell-utils.d.ts +1 -7
  73. package/dist/tools/shell-utils.d.ts.map +1 -1
  74. package/dist/tools/shell-utils.js +0 -17
  75. package/dist/tools/shell-utils.js.map +1 -1
  76. package/dist/tools/truncate.d.ts +36 -0
  77. package/dist/tools/truncate.d.ts.map +1 -0
  78. package/dist/tools/truncate.js +118 -0
  79. package/dist/tools/truncate.js.map +1 -0
  80. package/dist/tools/web-search.js +2 -2
  81. package/dist/tools/web-search.js.map +1 -1
  82. package/dist/types/index.d.ts +8 -0
  83. package/dist/types/index.d.ts.map +1 -1
  84. package/dist/types/index.js.map +1 -1
  85. package/dist/utils/shell-error.d.ts +12 -0
  86. package/dist/utils/shell-error.d.ts.map +1 -0
  87. package/dist/utils/shell-error.js +73 -0
  88. package/dist/utils/shell-error.js.map +1 -0
  89. package/dist/utils.d.ts.map +1 -1
  90. package/dist/utils.js +104 -10
  91. package/dist/utils.js.map +1 -1
  92. package/package.json +21 -12
@@ -1 +1 @@
1
- {"version":3,"file":"shell-utils.js","sourceRoot":"","sources":["../../src/tools/shell-utils.ts"],"names":[],"mappings":"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"}
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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"}
@@ -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 { getShellConfig } from './shell-utils.js';
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 } = getShellConfig();
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,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAEjD,MAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;AACrC,MAAM,gBAAgB,GAAG,MAAM,CAAA;AAQ/B,KAAK,UAAU,gBAAgB,CAAC,KAAa,EAAE,UAAkB;IAC/D,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAA;IAC/C,MAAM,MAAM,GAAG,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,cAAe,EAAE,CAAC,CAAA;IAC9D,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,UAAU,EAAE,CAAC,CAAA;IAC3D,OAAO,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAe,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;AACxG,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,KAAa,EAAE,UAAkB;IAC9D,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,gDAAgD,CAAC,CAAA;IACrE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;IAChC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC,CAAA;IAE/D,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAC3B,OAAO,EAAE;YACP,sBAAsB,EAAE,OAAO,CAAC,GAAG,CAAC,aAAc;YAClD,MAAM,EAAE,kBAAkB;SAC3B;QACD,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,gBAAgB,CAAC;KAC9C,CAAC,CAAA;IAEF,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,2BAA2B,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC,CAAA;IAC5E,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAE7B,CAAA;IACD,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAA;AACvG,CAAC;AAED,SAAS,oBAAoB;IAC3B,MAAM,EAAE,IAAI,EAAE,GAAG,cAAc,EAAE,CAAA;IACjC,IAAI,UAAkB,CAAA;IAEtB,IAAI,IAAI,KAAK,YAAY,EAAE,CAAC;QAC1B,UAAU,GAAG;YACX,sBAAsB;YACtB,oCAAoC;YACpC,mCAAmC;YACnC,8BAA8B;YAC9B,6EAA6E;YAC7E,6EAA6E;SAC9E,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACd,CAAC;SAAM,CAAC;QACN,MAAM,EAAE,GAAG,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW,CAAA;QACpD,UAAU,GAAG;YACX,sBAAsB;YACtB,oCAAoC;YACpC,kCAAkC;YAClC,8BAA8B;YAC9B,gDAAgD,EAAE,EAAE;YACpD,8CAA8C,EAAE,EAAE;SACnD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACd,CAAC;IAED,OAAO;QACL,0EAA0E;QAC1E,EAAE;QACF,gDAAgD;QAChD,gEAAgE;QAChE,EAAE;QACF,qEAAqE;QACrE,6DAA6D;QAC7D,EAAE;QACF,UAAU,IAAI,IAAI;QAClB,UAAU;QACV,EAAE;QACF,oEAAoE;KACrE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACd,CAAC;AAED,SAAS,aAAa,CAAC,OAAuB;IAC5C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,mBAAmB,CAAA;IACpD,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;AAClF,CAAC;AAED,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,CAAC;IAC5B,WAAW,EACT,+GAA+G;QAC/G,uBAAuB,IAAI,yEAAyE;QACpG,wCAAwC,IAAI,uCAAuC;IACrF,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC;QAC9C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;KACvE,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE;QACvD,MAAM,CAAC,GAAG,UAAU,IAAI,CAAC,CAAA;QACzB,MAAM,SAAS,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAA;QAC9C,MAAM,QAAQ,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAA;QAE5C,IAAI,CAAC,SAAS,IAAI,CAAC,QAAQ;YAAE,OAAO,oBAAoB,EAAE,CAAA;QAE1D,cAAc,CAAC,UAAU,EAAE,cAAc,KAAK,EAAE,CAAC,CAAA;QACjD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,MAAM,gBAAgB,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,eAAe,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;YAC9F,OAAO,aAAa,CAAC,OAAO,CAAC,CAAA;QAC/B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;YAC5D,OAAO,oBAAoB,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,MAAM,GAAG,EAAE,CAAA;QACtE,CAAC;IACH,CAAC;CACF,CAAC,CAAA"}
1
+ {"version":3,"file":"web-search.js","sourceRoot":"","sources":["../../src/tools/web-search.ts"],"names":[],"mappings":"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"}
@@ -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":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
@@ -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"}
@@ -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;AAgBlE,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAY3D;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"}
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 <cwd>/stdout-debug.log
12
- // project-root rather than ~/.x-code so a single tail -f in the repo
13
- // captures everything. Intentionally sync I/O because callers are in hot
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
- // Content is logged **verbatim**, no truncation. This file is gitignored.
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
- function debugLogPath() {
20
- return path.join(process.cwd(), 'stdout-debug.log');
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(content)}\n`;
31
- fsSync.appendFileSync(debugLogPath(), line, 'utf8');
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,oEAAoE;AACpE,qEAAqE;AACrE,yEAAyE;AACzE,sEAAsE;AACtE,gEAAgE;AAChE,EAAE;AACF,0EAA0E;AAC1E,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,GAAG,CAAA;AAE9C,SAAS,YAAY;IACnB,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,kBAAkB,CAAC,CAAA;AACrD,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,GAAW,EAAE,OAAe;IACnD,IAAI,CAAC,KAAK;QAAE,OAAM;IAClB,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;QACnC,qEAAqE;QACrE,mEAAmE;QACnE,mEAAmE;QACnE,MAAM,IAAI,GAAG,IAAI,EAAE,KAAK,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAA;QAC1D,MAAM,CAAC,cAAc,CAAC,YAAY,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,CAAA;IACrD,CAAC;IAAC,MAAM,CAAC;QACP,gEAAgE;IAClE,CAAC;AACH,CAAC;AAED,6BAA6B;AAC7B,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,QAAgB;IAC/C,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;QACzB,OAAO,IAAI,CAAA;IACb,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC;AAED,uDAAuD;AACvD,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,QAAgB;IACjD,IAAI,CAAC;QACH,OAAO,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAA;IACX,CAAC;AACH,CAAC;AAED,uDAAuD;AACvD,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,QAAgB;IACjD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;QACpD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAA4B,CAAA;IACvD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC"}
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.7",
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": "^6.0.0",
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/alibaba": "^1.0.0",
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
- "zhipu-ai-provider": "^0.2.0",
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
- "chalk": "^5.4.0"
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",