@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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loop-guard.d.ts","sourceRoot":"","sources":["../../src/agent/loop-guard.ts"],"names":[],"mappings":"AA2BA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAGhD;uBACuB;AACvB,eAAO,MAAM,mBAAmB,IAAI,CAAA;AAEpC,4EAA4E;AAC5E,eAAO,MAAM,mBAAmB,IAAI,CAAA;AAEpC,yDAAyD;AACzD,eAAO,MAAM,gBAAgB,IAAI,CAAA;AAWjC;;sCAEsC;AACtC,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM,CAGrE;AAED,MAAM,MAAM,SAAS;AACnB,2DAA2D;AACzD;IAAE,IAAI,EAAE,IAAI,CAAA;CAAE;AAChB;;;mCAGmC;GACjC;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE;AAC7D,4EAA4E;GAC1E;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAA;AAE7D;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,GAAG,SAAS,CAgC9G;AAED;8BAC8B;AAC9B,wBAAgB,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAUvF;AAED;;4CAE4C;AAC5C,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,6BAE7F"}
@@ -0,0 +1,107 @@
1
+ // @x-code-cli/core — Doom-loop circuit breaker
2
+ //
3
+ // Detects when the model is repeatedly making the same tool call with the
4
+ // same arguments — usually because the previous call failed and the model's
5
+ // next best idea is to try it again verbatim. On Windows we see this most
6
+ // often with shell commands that fail for quoting reasons: the model tweaks
7
+ // nothing and retries the exact same line 5–10 times, each failure padding
8
+ // the context with a stack trace.
9
+ //
10
+ // Two stages:
11
+ // Stage 1 (soft, default threshold 3): inject a synthetic tool-result that
12
+ // tells the model "this exact call failed 3 times, stop and change your
13
+ // approach". The next turn sees the synthetic result and usually pivots.
14
+ // Stage 2 (hard, default threshold 5): abort the turn and prompt the user
15
+ // — 5 identical calls after the soft nudge means the nudge isn't helping
16
+ // and we should not pad another round of context.
17
+ //
18
+ // Detection is by SHA256 over `{toolName, stableInputJson}`. Stable stringify
19
+ // sorts object keys so `{a:1,b:2}` and `{b:2,a:1}` hash to the same value.
20
+ //
21
+ // Tuning note: we don't use opencode's "exactly 3 identical in a row"
22
+ // predicate — that misses the case where the model tries `foo`, then reads a
23
+ // file in between, then tries `foo` again. We instead look at the last N
24
+ // tool calls of the same toolName and check if K of them share the hash.
25
+ import crypto from 'node:crypto';
26
+ import { toolResultMessage } from './messages.js';
27
+ /** Tool calls at or above this count in the rolling window trigger the soft
28
+ * synthetic nudge. */
29
+ export const SOFT_LOOP_THRESHOLD = 3;
30
+ /** Tool calls at or above this count abort the turn and prompt the user. */
31
+ export const HARD_LOOP_THRESHOLD = 5;
32
+ /** Size of the rolling window we scan for duplicates. */
33
+ export const LOOP_WINDOW_SIZE = 8;
34
+ /** Stable JSON stringify: sorts object keys deterministically so semantically
35
+ * identical inputs hash to the same value regardless of key order. */
36
+ function stableStringify(value) {
37
+ if (value === null || typeof value !== 'object')
38
+ return JSON.stringify(value);
39
+ if (Array.isArray(value))
40
+ return '[' + value.map(stableStringify).join(',') + ']';
41
+ const entries = Object.entries(value).sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0));
42
+ return '{' + entries.map(([k, v]) => JSON.stringify(k) + ':' + stableStringify(v)).join(',') + '}';
43
+ }
44
+ /** Hash a tool call for duplicate detection. Truncated to 16 hex chars —
45
+ * collision probability at that length is vanishingly small for the 8-entry
46
+ * window we're comparing against. */
47
+ export function hashToolCall(toolName, input) {
48
+ const payload = toolName + '\x00' + stableStringify(input);
49
+ return crypto.createHash('sha256').update(payload).digest('hex').slice(0, 16);
50
+ }
51
+ /**
52
+ * Check whether the incoming tool call is a duplicate of recent calls in the
53
+ * window, and report what the caller should do. Does NOT mutate state — the
54
+ * caller commits the hash via {@link recordToolCall} once the call proceeds.
55
+ *
56
+ * We only count matches that share the same hash AND the same toolName; a
57
+ * fresh command with identical-looking args under a different tool never
58
+ * triggers the guard.
59
+ */
60
+ export function checkForLoop(state, toolName, input, toolCallId) {
61
+ const hash = hashToolCall(toolName, input);
62
+ const window = state.recentToolCalls.slice(-LOOP_WINDOW_SIZE);
63
+ let identical = 0;
64
+ for (const entry of window) {
65
+ if (entry.toolName === toolName && entry.hash === hash)
66
+ identical++;
67
+ }
68
+ // The current incoming call is what pushes us over the threshold, so we
69
+ // compare against N-1 prior matches.
70
+ const priorMatches = identical;
71
+ if (priorMatches + 1 >= HARD_LOOP_THRESHOLD) {
72
+ return {
73
+ kind: 'hard-block',
74
+ toolName,
75
+ message: `Tool ${toolName} has been called with identical arguments ${priorMatches + 1} times in a row. The model is looping; aborting this turn.`,
76
+ };
77
+ }
78
+ if (priorMatches + 1 >= SOFT_LOOP_THRESHOLD) {
79
+ return {
80
+ kind: 'soft-block',
81
+ toolCallId,
82
+ message: `This exact ${toolName} call (same arguments) has already been attempted ${priorMatches + 1} times this session with the same result. ` +
83
+ 'DO NOT retry it. Change your approach — alter the arguments meaningfully, try a different tool, or ask the user what to do instead.',
84
+ };
85
+ }
86
+ return { kind: 'ok' };
87
+ }
88
+ /** Commit a tool call to the rolling window. Bound size so the array doesn't
89
+ * grow for long sessions. */
90
+ export function recordToolCall(state, toolName, input) {
91
+ const hash = hashToolCall(toolName, input);
92
+ state.recentToolCalls.push({ toolName, hash });
93
+ // Keep 2x the window to give checkForLoop some history beyond the active
94
+ // comparison window (lets us tune LOOP_WINDOW_SIZE without changing the
95
+ // persistence footprint).
96
+ const cap = LOOP_WINDOW_SIZE * 2;
97
+ if (state.recentToolCalls.length > cap) {
98
+ state.recentToolCalls.splice(0, state.recentToolCalls.length - cap);
99
+ }
100
+ }
101
+ /** Build a synthetic tool-result message telling the model the call was
102
+ * blocked by the loop guard. The model sees this as if the tool returned it
103
+ * and usually adjusts on the next turn. */
104
+ export function syntheticLoopBlockResult(toolName, toolCallId, message) {
105
+ return toolResultMessage(toolCallId, toolName, `[loop-guard] ${message}`);
106
+ }
107
+ //# sourceMappingURL=loop-guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loop-guard.js","sourceRoot":"","sources":["../../src/agent/loop-guard.ts"],"names":[],"mappings":"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"}
@@ -9,6 +9,17 @@ export interface LoopState {
9
9
  startedAt: string;
10
10
  filesModified: Set<string>;
11
11
  turnCount: number;
12
+ /** Rolling record of recently executed tool calls, keyed by a hash of the
13
+ * tool name + stable-stringified input. Used by the doom-loop guard to
14
+ * detect when the model is looping on the same failing call. */
15
+ recentToolCalls: Array<{
16
+ toolName: string;
17
+ hash: string;
18
+ }>;
19
+ /** Cached system prompt text — rebuilt once per session so the prefix
20
+ * stays byte-stable across turns, enabling automatic prefix-caching on
21
+ * OpenAI-compatible providers (DeepSeek, Moonshot, Alibaba, …). */
22
+ systemPromptCache: string | null;
12
23
  }
13
24
  export declare function createLoopState(): LoopState;
14
25
  //# sourceMappingURL=loop-state.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"loop-state.d.ts","sourceRoot":"","sources":["../../src/agent/loop-state.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,IAAI,CAAA;AAEtC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAEnD,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,YAAY,EAAE,CAAA;IACxB,UAAU,EAAE,UAAU,CAAA;IACtB,6FAA6F;IAC7F,eAAe,EAAE,MAAM,CAAA;IACvB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAC1B,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,wBAAgB,eAAe,IAAI,SAAS,CAU3C"}
1
+ {"version":3,"file":"loop-state.d.ts","sourceRoot":"","sources":["../../src/agent/loop-state.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,IAAI,CAAA;AAEtC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAEnD,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,YAAY,EAAE,CAAA;IACxB,UAAU,EAAE,UAAU,CAAA;IACtB,6FAA6F;IAC7F,eAAe,EAAE,MAAM,CAAA;IACvB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAC1B,SAAS,EAAE,MAAM,CAAA;IACjB;;qEAEiE;IACjE,eAAe,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC1D;;wEAEoE;IACpE,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAA;CACjC;AAED,wBAAgB,eAAe,IAAI,SAAS,CAY3C"}
@@ -1,12 +1,14 @@
1
1
  export function createLoopState() {
2
2
  return {
3
3
  messages: [],
4
- tokenUsage: { inputTokens: 0, outputTokens: 0, totalTokens: 0 },
4
+ tokenUsage: { inputTokens: 0, outputTokens: 0, totalTokens: 0, cacheReadTokens: 0, cacheCreationTokens: 0 },
5
5
  lastInputTokens: 0,
6
6
  sessionId: Date.now().toString(36),
7
7
  startedAt: new Date().toISOString(),
8
8
  filesModified: new Set(),
9
9
  turnCount: 0,
10
+ recentToolCalls: [],
11
+ systemPromptCache: null,
10
12
  };
11
13
  }
12
14
  //# sourceMappingURL=loop-state.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"loop-state.js","sourceRoot":"","sources":["../../src/agent/loop-state.ts"],"names":[],"mappings":"AAgBA,MAAM,UAAU,eAAe;IAC7B,OAAO;QACL,QAAQ,EAAE,EAAE;QACZ,UAAU,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE;QAC/D,eAAe,EAAE,CAAC;QAClB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC;QAClC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,aAAa,EAAE,IAAI,GAAG,EAAE;QACxB,SAAS,EAAE,CAAC;KACb,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"loop-state.js","sourceRoot":"","sources":["../../src/agent/loop-state.ts"],"names":[],"mappings":"AAwBA,MAAM,UAAU,eAAe;IAC7B,OAAO;QACL,QAAQ,EAAE,EAAE;QACZ,UAAU,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,eAAe,EAAE,CAAC,EAAE,mBAAmB,EAAE,CAAC,EAAE;QAC3G,eAAe,EAAE,CAAC;QAClB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC;QAClC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,aAAa,EAAE,IAAI,GAAG,EAAE;QACxB,SAAS,EAAE,CAAC;QACZ,eAAe,EAAE,EAAE;QACnB,iBAAiB,EAAE,IAAI;KACxB,CAAA;AACH,CAAC"}
@@ -1,11 +1,11 @@
1
- import type { LanguageModel, ModelMessage } from 'ai';
1
+ import type { LanguageModel, ModelMessage, UserContent } from 'ai';
2
2
  import type { AgentCallbacks, AgentOptions } from '../types/index.js';
3
3
  import type { LoopState } from './loop-state.js';
4
4
  export type { LoopState } from './loop-state.js';
5
5
  /** Compress old messages into a summary. */
6
6
  export declare function compressMessages(messages: ModelMessage[], model: LanguageModel): Promise<ModelMessage[]>;
7
7
  /** Main agent loop. */
8
- export declare function agentLoop(userMessage: string, model: LanguageModel, options: AgentOptions, callbacks: AgentCallbacks, existingState?: LoopState): Promise<LoopState>;
8
+ export declare function agentLoop(userMessage: UserContent, model: LanguageModel, options: AgentOptions, callbacks: AgentCallbacks, existingState?: LoopState): Promise<LoopState>;
9
9
  /** Save session on exit. Summary generation makes an LLM call that can be
10
10
  * slow, so we bound it with a 2s timeout — on Ctrl+C we want to return
11
11
  * to the shell promptly, not wait for a roundtrip. If the timeout fires
@@ -1 +1 @@
1
- {"version":3,"file":"loop.d.ts","sourceRoot":"","sources":["../../src/agent/loop.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,IAAI,CAAA;AAMrD,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAKrE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAOhD,YAAY,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAKhD,4CAA4C;AAC5C,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAc9G;AAmLD,uBAAuB;AACvB,wBAAsB,SAAS,CAC7B,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,aAAa,EACpB,OAAO,EAAE,YAAY,EACrB,SAAS,EAAE,cAAc,EACzB,aAAa,CAAC,EAAE,SAAS,GACxB,OAAO,CAAC,SAAS,CAAC,CAkGpB;AAED;;;;8BAI8B;AAC9B,wBAAsB,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,aAAa,EAAE,SAAS,SAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBzG"}
1
+ {"version":3,"file":"loop.d.ts","sourceRoot":"","sources":["../../src/agent/loop.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,IAAI,CAAA;AAQlE,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAMrE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAQhD,YAAY,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAKhD,4CAA4C;AAC5C,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAc9G;AA0OD,uBAAuB;AACvB,wBAAsB,SAAS,CAC7B,WAAW,EAAE,WAAW,EACxB,KAAK,EAAE,aAAa,EACpB,OAAO,EAAE,YAAY,EACrB,SAAS,EAAE,cAAc,EACzB,aAAa,CAAC,EAAE,SAAS,GACxB,OAAO,CAAC,SAAS,CAAC,CA2GpB;AAED;;;;8BAI8B;AAC9B,wBAAsB,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,aAAa,EAAE,SAAS,SAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBzG"}
@@ -4,16 +4,20 @@ import path from 'node:path';
4
4
  import { generateText, streamText } from 'ai';
5
5
  import { buildKnowledgeContext } from '../knowledge/loader.js';
6
6
  import { generateSessionSummary, saveSessionSummary } from '../knowledge/session.js';
7
+ import { persistUsageSnapshot } from '../knowledge/session-usage.js';
8
+ import { applyCacheControl } from '../providers/cache-control.js';
7
9
  import { clearProgressReporter, setProgressReporter } from '../tools/progress.js';
8
10
  import { toolRegistry, truncateToolResult } from '../tools/index.js';
9
11
  import { debugLog } from '../utils.js';
10
12
  import { classifyApiError, isContextTooLongError } from './api-errors.js';
11
13
  import { estimateTokenCount, getCompressionThreshold, getMaxOutputTokens } from './context-window.js';
14
+ import { lightCompactMessages } from './light-compact.js';
12
15
  import { createLoopState } from './loop-state.js';
13
- import { ensureReasoningContentParts } from './provider-compat.js';
16
+ import { downgradeBinaryPartsForProvider, ensureReasoningContentParts } from './provider-compat.js';
14
17
  import { drainStreamResult } from './stream-utils.js';
15
18
  import { buildSystemPrompt } from './system-prompt.js';
16
19
  import { processToolCalls } from './tool-execution.js';
20
+ import { truncateToolResultsInMessages } from './tool-result-sanitize.js';
17
21
  /** Number of recent messages to keep verbatim when compressing. */
18
22
  const KEEP_RECENT = 6;
19
23
  /** Compress old messages into a summary. */
@@ -32,11 +36,25 @@ export async function compressMessages(messages, model) {
32
36
  /**
33
37
  * Proactive compression: compress when either the last real input-token count
34
38
  * or the character-based estimate has crossed the threshold.
39
+ *
40
+ * Runs a light O(n) compaction first (drops loop-guard pairs — no LLM call,
41
+ * no network). If that brings us back under the threshold, we skip the
42
+ * expensive LLM-summary path entirely. This is the difference between a
43
+ * $0 10ms pass and a full summarisation round trip — for loop-induced
44
+ * bloat (by far the common case), the light path is enough.
35
45
  */
36
46
  async function checkAndCompressContext(state, model, threshold, callbacks) {
37
47
  const needsCompression = state.lastInputTokens > threshold || estimateTokenCount(state.messages) > threshold;
38
48
  if (!needsCompression || state.messages.length <= KEEP_RECENT)
39
49
  return;
50
+ const light = lightCompactMessages(state.messages);
51
+ if (light.dropped > 0) {
52
+ state.messages = light.messages;
53
+ const stillOver = estimateTokenCount(state.messages) > threshold;
54
+ callbacks.onContextCompressed(`Dropped ${light.dropped} looped tool-call message(s) to reclaim context${stillOver ? ' — still over threshold, summarising' : ''}.`);
55
+ if (!stillOver)
56
+ return;
57
+ }
40
58
  try {
41
59
  const summary = await generateSessionSummary(state.messages, model, state.sessionId, state.startedAt, [
42
60
  ...state.filesModified,
@@ -105,27 +123,59 @@ async function streamChunksToUI(result, callbacks) {
105
123
  /** Pull the response + usage off a completed stream and fold into state. */
106
124
  async function collectTurnResponse(result, state, modelId, callbacks) {
107
125
  const response = await result.response;
126
+ // CRITICAL: auto-executed tools (readFile / grep / glob / listDir / webFetch
127
+ // / webSearch) return their results through `response.messages` without
128
+ // passing through the manual `pushToolResult` path. Without a sanitizer
129
+ // pass here, reading an 800-line file or a grep that matched 2k times dumps
130
+ // the full content into `state.messages` and then rides along on every
131
+ // subsequent turn. The worst realized case before this sanitizer was a
132
+ // 9M-token context built from cumulative failed-shell stacks + unsliced
133
+ // file reads. Truncate here so the messages we persist match the per-tool
134
+ // budget used elsewhere in the loop.
135
+ truncateToolResultsInMessages(response.messages);
108
136
  state.messages.push(...response.messages);
109
137
  ensureReasoningContentParts(state.messages, modelId);
110
138
  const usage = await result.usage;
111
139
  if (usage) {
112
140
  state.tokenUsage.inputTokens += usage.inputTokens ?? 0;
113
141
  state.tokenUsage.outputTokens += usage.outputTokens ?? 0;
142
+ // AI SDK v6 normalizes provider cache fields into inputTokenDetails:
143
+ // cacheReadTokens ← Anthropic cache_read_input_tokens / OpenAI cached_tokens
144
+ // cacheWriteTokens ← Anthropic cache_creation_input_tokens (others: 0)
145
+ // Both are subsets of inputTokens, so we don't double-count into total.
146
+ state.tokenUsage.cacheReadTokens += usage.inputTokenDetails?.cacheReadTokens ?? 0;
147
+ state.tokenUsage.cacheCreationTokens += usage.inputTokenDetails?.cacheWriteTokens ?? 0;
114
148
  state.tokenUsage.totalTokens = state.tokenUsage.inputTokens + state.tokenUsage.outputTokens;
115
149
  if (usage.inputTokens != null)
116
150
  state.lastInputTokens = usage.inputTokens;
117
151
  callbacks.onUsageUpdate(state.tokenUsage);
152
+ void persistUsageSnapshot(state, modelId);
118
153
  }
119
154
  return result.finishReason;
120
155
  }
121
156
  /** Run one agent turn: stream to UI, collect response. Resilient to errors. */
122
157
  async function runTurn(state, model, options, systemPrompt, callbacks) {
158
+ // Text-only providers (DeepSeek, custom) would 400 on any surviving
159
+ // image/file parts. Rewrite those parts to OCR'd text in-place before
160
+ // the stream starts. Multimodal providers short-circuit inside the
161
+ // helper based on their capability flags.
162
+ await downgradeBinaryPartsForProvider(state.messages, options.modelId);
163
+ // Per-provider prompt caching: Anthropic gets cache_control breakpoints on
164
+ // the system prompt + last two messages; OpenAI gets a stable
165
+ // promptCacheKey keyed on sessionId; OpenAI-compatible providers rely on
166
+ // the system-prompt cache in LoopState keeping the prefix byte-stable.
167
+ const cached = applyCacheControl({
168
+ system: systemPrompt,
169
+ messages: state.messages,
170
+ modelId: options.modelId,
171
+ sessionId: state.sessionId,
172
+ });
123
173
  let result;
124
174
  try {
125
175
  result = streamText({
126
176
  model,
127
- system: systemPrompt,
128
- messages: state.messages,
177
+ system: cached.system,
178
+ messages: cached.messages,
129
179
  tools: toolRegistry,
130
180
  maxRetries: 3,
131
181
  abortSignal: options.abortSignal,
@@ -134,6 +184,12 @@ async function runTurn(state, model, options, systemPrompt, callbacks) {
134
184
  // outright with HTTP 400. getMaxOutputTokens applies per-model ceilings;
135
185
  // unknown models fall through to the module-level default.
136
186
  maxOutputTokens: getMaxOutputTokens(options.modelId),
187
+ // AI SDK types `providerOptions` as `SharedV3ProviderOptions` (nested
188
+ // JSONObject). Our cache-control helper returns a looser
189
+ // `Record<string, unknown>` shape because provider-specific field sets
190
+ // drift too fast to keep a strict union in sync. The runtime contract
191
+ // is narrow JSON and we cast here at the single call site.
192
+ providerOptions: cached.providerOptions,
137
193
  });
138
194
  }
139
195
  catch (err) {
@@ -199,11 +255,20 @@ export async function agentLoop(userMessage, model, options, callbacks, existing
199
255
  while (state.turnCount < options.maxTurns) {
200
256
  state.turnCount++;
201
257
  await checkAndCompressContext(state, model, compressionThreshold, callbacks);
202
- const systemPrompt = buildSystemPrompt({
203
- knowledgeContext: fullKnowledgeContext,
204
- modelId: options.modelId,
205
- isGitRepo,
206
- });
258
+ // Build the system prompt once per session and reuse it across turns.
259
+ // Stable byte-level prefix is a prerequisite for OpenAI-compatible
260
+ // providers' automatic prefix caching (DeepSeek, Moonshot, Alibaba,
261
+ // Zhipu, xAI). If this string changes between turns — e.g. because
262
+ // buildSystemPrompt interpolates a fresh timestamp — the cache misses
263
+ // every request.
264
+ if (!state.systemPromptCache) {
265
+ state.systemPromptCache = buildSystemPrompt({
266
+ knowledgeContext: fullKnowledgeContext,
267
+ modelId: options.modelId,
268
+ isGitRepo,
269
+ });
270
+ }
271
+ const systemPrompt = state.systemPromptCache;
207
272
  const outcome = await runTurn(state, model, options, systemPrompt, callbacks);
208
273
  if (outcome.kind === 'error')
209
274
  break;
@@ -1 +1 @@
1
- {"version":3,"file":"loop.js","sourceRoot":"","sources":["../../src/agent/loop.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"loop.js","sourceRoot":"","sources":["../../src/agent/loop.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,9 @@
1
- import type { ModelMessage } from 'ai';
1
+ import type { FilePart, ImagePart, ModelMessage, TextPart } from 'ai';
2
+ /** Content accepted by a user message — a plain string for simple prompts,
3
+ * or a parts array for prompts that include attached images / files. */
4
+ export type UserContent = string | Array<TextPart | ImagePart | FilePart>;
2
5
  /** Create a user message */
3
- export declare function userMessage(content: string): ModelMessage;
6
+ export declare function userMessage(content: UserContent): ModelMessage;
4
7
  /** Create a tool result message */
5
8
  export declare function toolResultMessage(toolCallId: string, toolName: string, result: string): ModelMessage;
6
9
  //# sourceMappingURL=messages.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../src/agent/messages.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,IAAI,CAAA;AAEtC,4BAA4B;AAC5B,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,CAEzD;AAED,mCAAmC;AACnC,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,YAAY,CAYpG"}
1
+ {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../src/agent/messages.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAA;AAErE;yEACyE;AACzE,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,KAAK,CAAC,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC,CAAA;AAEzE,4BAA4B;AAC5B,wBAAgB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,YAAY,CAE9D;AAED,mCAAmC;AACnC,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,YAAY,CAYpG"}
@@ -1 +1 @@
1
- {"version":3,"file":"messages.js","sourceRoot":"","sources":["../../src/agent/messages.ts"],"names":[],"mappings":"AAGA,4BAA4B;AAC5B,MAAM,UAAU,WAAW,CAAC,OAAe;IACzC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAA;AAClC,CAAC;AAED,mCAAmC;AACnC,MAAM,UAAU,iBAAiB,CAAC,UAAkB,EAAE,QAAgB,EAAE,MAAc;IACpF,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,aAAa;gBACnB,UAAU;gBACV,QAAQ;gBACR,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;aACxC;SACF;KACF,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"messages.js","sourceRoot":"","sources":["../../src/agent/messages.ts"],"names":[],"mappings":"AAOA,4BAA4B;AAC5B,MAAM,UAAU,WAAW,CAAC,OAAoB;IAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAA;AAClC,CAAC;AAED,mCAAmC;AACnC,MAAM,UAAU,iBAAiB,CAAC,UAAkB,EAAE,QAAgB,EAAE,MAAc;IACpF,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,aAAa;gBACnB,UAAU;gBACV,QAAQ;gBACR,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;aACxC;SACF;KACF,CAAA;AACH,CAAC"}
@@ -14,4 +14,11 @@ import type { ModelMessage } from 'ai';
14
14
  * `"reasoning_content": ""` in the JSON body.
15
15
  */
16
16
  export declare function ensureReasoningContentParts(messages: ModelMessage[], modelId: string): void;
17
+ /**
18
+ * Strip binary content parts from the conversation history in-place so that
19
+ * the next `streamText` call doesn't 400 on a provider that can't accept
20
+ * them. Replaces images with OCR'd text annotated as a fallback so the
21
+ * model knows it's looking at text, not the image itself.
22
+ */
23
+ export declare function downgradeBinaryPartsForProvider(messages: ModelMessage[], modelId: string): Promise<void>;
17
24
  //# sourceMappingURL=provider-compat.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"provider-compat.d.ts","sourceRoot":"","sources":["../../src/agent/provider-compat.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,IAAI,CAAA;AAEtC;;;;;;;;;;;;;GAaG;AACH,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,YAAY,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAc3F"}
1
+ {"version":3,"file":"provider-compat.d.ts","sourceRoot":"","sources":["../../src/agent/provider-compat.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,IAAI,CAAA;AAKtC;;;;;;;;;;;;;GAaG;AACH,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,YAAY,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAc3F;AA0DD;;;;;GAKG;AACH,wBAAsB,+BAA+B,CACnD,QAAQ,EAAE,YAAY,EAAE,EACxB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAoEf"}
@@ -1,3 +1,9 @@
1
+ // @x-code-cli/core — Provider-specific compatibility shims
2
+ import fs from 'node:fs/promises';
3
+ import os from 'node:os';
4
+ import path from 'node:path';
5
+ import { capabilitiesOf } from '../providers/capabilities.js';
6
+ import { ocrImage } from './file-ingest.js';
1
7
  /**
2
8
  * Ensure all assistant messages have a reasoning content part.
3
9
  *
@@ -28,4 +34,120 @@ export function ensureReasoningContentParts(messages, modelId) {
28
34
  }
29
35
  }
30
36
  }
37
+ const ocrCache = new Map();
38
+ async function ocrBuffer(buffer) {
39
+ const key = `${buffer.length}:${buffer.subarray(0, 64).toString('base64')}`;
40
+ const cached = ocrCache.get(key);
41
+ if (cached != null)
42
+ return cached;
43
+ // tesseract.js takes a path, URL, or Buffer. Buffers work but some
44
+ // versions have edge cases — writing to a tmp file is universally safe.
45
+ const tmp = path.join(os.tmpdir(), `xcc-ocr-${Date.now()}-${Math.random().toString(36).slice(2)}.png`);
46
+ try {
47
+ await fs.writeFile(tmp, buffer);
48
+ const text = await ocrImage(tmp);
49
+ ocrCache.set(key, text);
50
+ return text;
51
+ }
52
+ finally {
53
+ await fs.unlink(tmp).catch(() => { });
54
+ }
55
+ }
56
+ function imagePartToBuffer(part) {
57
+ const img = part.image;
58
+ if (Buffer.isBuffer(img))
59
+ return img;
60
+ if (img instanceof Uint8Array)
61
+ return Buffer.from(img);
62
+ if (typeof img === 'string') {
63
+ // Could be base64 or a data URL. Strip the `data:...;base64,` prefix if present.
64
+ const commaIdx = img.indexOf(',');
65
+ const data = img.startsWith('data:') && commaIdx > 0 ? img.slice(commaIdx + 1) : img;
66
+ try {
67
+ return Buffer.from(data, 'base64');
68
+ }
69
+ catch {
70
+ return null;
71
+ }
72
+ }
73
+ return null;
74
+ }
75
+ /**
76
+ * Strip binary content parts from the conversation history in-place so that
77
+ * the next `streamText` call doesn't 400 on a provider that can't accept
78
+ * them. Replaces images with OCR'd text annotated as a fallback so the
79
+ * model knows it's looking at text, not the image itself.
80
+ */
81
+ export async function downgradeBinaryPartsForProvider(messages, modelId) {
82
+ const caps = capabilitiesOf(modelId);
83
+ if (caps.image && caps.pdf)
84
+ return;
85
+ for (const msg of messages) {
86
+ // User messages — content may be an array of TextPart | ImagePart | FilePart.
87
+ if (msg.role === 'user' && Array.isArray(msg.content)) {
88
+ const rewritten = [];
89
+ for (const part of msg.content) {
90
+ if (part.type === 'image' && !caps.image) {
91
+ const buffer = imagePartToBuffer(part);
92
+ const text = buffer ? await ocrBuffer(buffer) : '[image omitted]';
93
+ rewritten.push({
94
+ type: 'text',
95
+ text: `[Image replaced by local OCR — the current model cannot natively see images. Visual content is NOT visible.]\n${text}`,
96
+ });
97
+ continue;
98
+ }
99
+ if (part.type === 'file' && !caps.pdf) {
100
+ rewritten.push({
101
+ type: 'text',
102
+ text: `[File omitted: ${part.filename ?? 'unknown'} — current model does not accept file attachments.]`,
103
+ });
104
+ continue;
105
+ }
106
+ rewritten.push(part);
107
+ }
108
+ ;
109
+ msg.content = rewritten;
110
+ continue;
111
+ }
112
+ // Tool result messages — content is always an array of tool-result parts.
113
+ if (msg.role === 'tool' && Array.isArray(msg.content)) {
114
+ for (const part of msg.content) {
115
+ if (part.type !== 'tool-result')
116
+ continue;
117
+ const output = part.output;
118
+ if (!output || output.type !== 'content' || !Array.isArray(output.value))
119
+ continue;
120
+ const rewritten = [];
121
+ for (const entry of output.value) {
122
+ if (entry.type === 'image-data' && !caps.image) {
123
+ const data = entry.data ?? '';
124
+ let text = '[image omitted]';
125
+ try {
126
+ const buffer = Buffer.from(data, 'base64');
127
+ text = await ocrBuffer(buffer);
128
+ }
129
+ catch {
130
+ // fall through with placeholder
131
+ }
132
+ rewritten.push({
133
+ type: 'text',
134
+ text: `[Image replaced by local OCR — the current model cannot natively see images.]\n${text}`,
135
+ });
136
+ continue;
137
+ }
138
+ if ((entry.type === 'file-data' || entry.type === 'file-url' || entry.type === 'file-id') && !caps.pdf) {
139
+ rewritten.push({
140
+ type: 'text',
141
+ text: `[File attachment omitted (${entry.filename ?? entry.mediaType ?? 'binary'}) — current model does not accept file attachments.]`,
142
+ });
143
+ continue;
144
+ }
145
+ rewritten.push(entry);
146
+ }
147
+ ;
148
+ output.value = rewritten;
149
+ }
150
+ }
151
+ }
152
+ }
31
153
  //# sourceMappingURL=provider-compat.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"provider-compat.js","sourceRoot":"","sources":["../../src/agent/provider-compat.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,2BAA2B,CAAC,QAAwB,EAAE,OAAe;IACnF,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC;QAAE,OAAM;IAE5C,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW;YAAE,SAAQ;QAEtC,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAA;QAC3B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;YAAE,SAAQ;QAErC,MAAM,YAAY,GAAI,OAAmC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAA;QAC7F,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,CAAC;YAAC,OAAkD,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAA;QAC/F,CAAC;IACH,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"provider-compat.js","sourceRoot":"","sources":["../../src/agent/provider-compat.ts"],"names":[],"mappings":"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"}
@@ -15,6 +15,13 @@ export interface StreamResult {
15
15
  usage: Promise<{
16
16
  inputTokens?: number;
17
17
  outputTokens?: number;
18
+ /** AI SDK v6 normalizes provider cache fields here. cacheReadTokens
19
+ * is a subset of inputTokens (don't double-count); cacheWriteTokens
20
+ * is what Anthropic charges as cache_creation_input_tokens. */
21
+ inputTokenDetails?: {
22
+ cacheReadTokens?: number;
23
+ cacheWriteTokens?: number;
24
+ };
18
25
  } | undefined>;
19
26
  finishReason: Promise<string>;
20
27
  toolCalls: Promise<Array<{
@@ -1 +1 @@
1
- {"version":3,"file":"stream-utils.d.ts","sourceRoot":"","sources":["../../src/agent/stream-utils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,IAAI,CAAA;AAEtC,kGAAkG;AAClG,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,aAAa,CAAC;QACxB,IAAI,EAAE,MAAM,CAAA;QACZ,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,QAAQ,CAAC,EAAE,MAAM,CAAA;QACjB,KAAK,CAAC,EAAE,OAAO,CAAA;QACf,MAAM,CAAC,EAAE,OAAO,CAAA;QAChB,UAAU,CAAC,EAAE,MAAM,CAAA;KACpB,CAAC,CAAA;IACF,QAAQ,EAAE,OAAO,CAAC;QAAE,QAAQ,EAAE,YAAY,EAAE,CAAA;KAAE,CAAC,CAAA;IAC/C,KAAK,EAAE,OAAO,CAAC;QAAE,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC,CAAA;IAC3E,YAAY,EAAE,OAAO,CAAC,MAAM,CAAC,CAAA;IAC7B,SAAS,EAAE,OAAO,CAChB,KAAK,CAAC;QACJ,QAAQ,EAAE,MAAM,CAAA;QAChB,UAAU,EAAE,MAAM,CAAA;QAClB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAC/B,CAAC,CACH,CAAA;CACF;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAM5D"}
1
+ {"version":3,"file":"stream-utils.d.ts","sourceRoot":"","sources":["../../src/agent/stream-utils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,IAAI,CAAA;AAEtC,kGAAkG;AAClG,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,aAAa,CAAC;QACxB,IAAI,EAAE,MAAM,CAAA;QACZ,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,QAAQ,CAAC,EAAE,MAAM,CAAA;QACjB,KAAK,CAAC,EAAE,OAAO,CAAA;QACf,MAAM,CAAC,EAAE,OAAO,CAAA;QAChB,UAAU,CAAC,EAAE,MAAM,CAAA;KACpB,CAAC,CAAA;IACF,QAAQ,EAAE,OAAO,CAAC;QAAE,QAAQ,EAAE,YAAY,EAAE,CAAA;KAAE,CAAC,CAAA;IAC/C,KAAK,EAAE,OAAO,CACV;QACE,WAAW,CAAC,EAAE,MAAM,CAAA;QACpB,YAAY,CAAC,EAAE,MAAM,CAAA;QACrB;;wEAEgE;QAChE,iBAAiB,CAAC,EAAE;YAClB,eAAe,CAAC,EAAE,MAAM,CAAA;YACxB,gBAAgB,CAAC,EAAE,MAAM,CAAA;SAC1B,CAAA;KACF,GACD,SAAS,CACZ,CAAA;IACD,YAAY,EAAE,OAAO,CAAC,MAAM,CAAC,CAAA;IAC7B,SAAS,EAAE,OAAO,CAChB,KAAK,CAAC;QACJ,QAAQ,EAAE,MAAM,CAAA;QAChB,UAAU,EAAE,MAAM,CAAA;QAClB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAC/B,CAAC,CACH,CAAA;CACF;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAM5D"}
@@ -1 +1 @@
1
- {"version":3,"file":"stream-utils.js","sourceRoot":"","sources":["../../src/agent/stream-utils.ts"],"names":[],"mappings":"AAyBA;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAoB;IACpD,MAAM,IAAI,GAAG,GAAG,EAAE,GAAE,CAAC,CAAA;IACrB,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAC5C,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAChD,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IACzC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;AAC/C,CAAC"}
1
+ {"version":3,"file":"stream-utils.js","sourceRoot":"","sources":["../../src/agent/stream-utils.ts"],"names":[],"mappings":"AAsCA;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAoB;IACpD,MAAM,IAAI,GAAG,GAAG,EAAE,GAAE,CAAC,CAAA;IACrB,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAC5C,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAChD,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IACzC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;AAC/C,CAAC"}
@@ -1,5 +1,5 @@
1
1
  // @x-code-cli/core — System Prompt management
2
- import { getShellConfig } from '../tools/shell-utils.js';
2
+ import { getShellProvider } from '../tools/shell-provider.js';
3
3
  const BASE_SYSTEM_PROMPT = `You are X-Code, an AI coding assistant running in the user's terminal. You are powered by the {model} model.
4
4
 
5
5
  When users ask about your identity, model, or version, you should tell them:
@@ -90,9 +90,9 @@ If you find a saved memory contradicts what you now observe, delete or update it
90
90
  - Is Git Repo: {isGitRepo}`;
91
91
  /** Build the full system prompt with dynamic values and optional knowledge context */
92
92
  export function buildSystemPrompt(options) {
93
- const shellConfig = getShellConfig();
93
+ const shellProvider = getShellProvider();
94
94
  let prompt = BASE_SYSTEM_PROMPT.replace(/\{platform\}/g, process.platform)
95
- .replace(/\{shell\}/g, shellConfig.type)
95
+ .replace(/\{shell\}/g, shellProvider.type)
96
96
  .replace(/\{cwd\}/g, process.cwd())
97
97
  .replace(/\{model\}/g, options?.modelId ?? 'unknown')
98
98
  .replace(/\{isGitRepo\}/g, options?.isGitRepo ? 'yes' : 'no');