@x-code-cli/core 0.1.11 → 0.2.1

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 (115) hide show
  1. package/dist/agent/api-errors.d.ts.map +1 -1
  2. package/dist/agent/api-errors.js +18 -0
  3. package/dist/agent/api-errors.js.map +1 -1
  4. package/dist/agent/diff.d.ts +35 -0
  5. package/dist/agent/diff.d.ts.map +1 -0
  6. package/dist/agent/diff.js +83 -0
  7. package/dist/agent/diff.js.map +1 -0
  8. package/dist/agent/loop-state.d.ts +45 -3
  9. package/dist/agent/loop-state.d.ts.map +1 -1
  10. package/dist/agent/loop-state.js +24 -3
  11. package/dist/agent/loop-state.js.map +1 -1
  12. package/dist/agent/loop.d.ts +10 -6
  13. package/dist/agent/loop.d.ts.map +1 -1
  14. package/dist/agent/loop.js +212 -30
  15. package/dist/agent/loop.js.map +1 -1
  16. package/dist/agent/plan-storage.d.ts +55 -0
  17. package/dist/agent/plan-storage.d.ts.map +1 -0
  18. package/dist/agent/plan-storage.js +156 -0
  19. package/dist/agent/plan-storage.js.map +1 -0
  20. package/dist/agent/session-store.d.ts +114 -0
  21. package/dist/agent/session-store.d.ts.map +1 -0
  22. package/dist/agent/session-store.js +415 -0
  23. package/dist/agent/session-store.js.map +1 -0
  24. package/dist/agent/sub-agents/built-in.d.ts +3 -0
  25. package/dist/agent/sub-agents/built-in.d.ts.map +1 -0
  26. package/dist/agent/sub-agents/built-in.js +98 -0
  27. package/dist/agent/sub-agents/built-in.js.map +1 -0
  28. package/dist/agent/sub-agents/index.d.ts +7 -0
  29. package/dist/agent/sub-agents/index.d.ts.map +1 -0
  30. package/dist/agent/sub-agents/index.js +5 -0
  31. package/dist/agent/sub-agents/index.js.map +1 -0
  32. package/dist/agent/sub-agents/loader.d.ts +5 -0
  33. package/dist/agent/sub-agents/loader.d.ts.map +1 -0
  34. package/dist/agent/sub-agents/loader.js +117 -0
  35. package/dist/agent/sub-agents/loader.js.map +1 -0
  36. package/dist/agent/sub-agents/registry.d.ts +14 -0
  37. package/dist/agent/sub-agents/registry.d.ts.map +1 -0
  38. package/dist/agent/sub-agents/registry.js +37 -0
  39. package/dist/agent/sub-agents/registry.js.map +1 -0
  40. package/dist/agent/sub-agents/runner.d.ts +26 -0
  41. package/dist/agent/sub-agents/runner.d.ts.map +1 -0
  42. package/dist/agent/sub-agents/runner.js +287 -0
  43. package/dist/agent/sub-agents/runner.js.map +1 -0
  44. package/dist/agent/sub-agents/types.d.ts +63 -0
  45. package/dist/agent/sub-agents/types.d.ts.map +1 -0
  46. package/dist/agent/sub-agents/types.js +2 -0
  47. package/dist/agent/sub-agents/types.js.map +1 -0
  48. package/dist/agent/system-prompt.d.ts +15 -0
  49. package/dist/agent/system-prompt.d.ts.map +1 -1
  50. package/dist/agent/system-prompt.js +161 -0
  51. package/dist/agent/system-prompt.js.map +1 -1
  52. package/dist/agent/tool-execution.d.ts +4 -3
  53. package/dist/agent/tool-execution.d.ts.map +1 -1
  54. package/dist/agent/tool-execution.js +324 -14
  55. package/dist/agent/tool-execution.js.map +1 -1
  56. package/dist/agent/tool-result-sanitize.d.ts +12 -0
  57. package/dist/agent/tool-result-sanitize.d.ts.map +1 -1
  58. package/dist/agent/tool-result-sanitize.js +70 -0
  59. package/dist/agent/tool-result-sanitize.js.map +1 -1
  60. package/dist/config/index.d.ts +6 -0
  61. package/dist/config/index.d.ts.map +1 -1
  62. package/dist/config/index.js.map +1 -1
  63. package/dist/index.d.ts +15 -5
  64. package/dist/index.d.ts.map +1 -1
  65. package/dist/index.js +13 -3
  66. package/dist/index.js.map +1 -1
  67. package/dist/knowledge/session.d.ts +4 -7
  68. package/dist/knowledge/session.d.ts.map +1 -1
  69. package/dist/knowledge/session.js +20 -55
  70. package/dist/knowledge/session.js.map +1 -1
  71. package/dist/permissions/index.d.ts +21 -4
  72. package/dist/permissions/index.d.ts.map +1 -1
  73. package/dist/permissions/index.js +37 -3
  74. package/dist/permissions/index.js.map +1 -1
  75. package/dist/permissions/session-store.d.ts +60 -0
  76. package/dist/permissions/session-store.d.ts.map +1 -0
  77. package/dist/permissions/session-store.js +233 -0
  78. package/dist/permissions/session-store.js.map +1 -0
  79. package/dist/tools/ask-user.d.ts.map +1 -1
  80. package/dist/tools/ask-user.js +8 -6
  81. package/dist/tools/ask-user.js.map +1 -1
  82. package/dist/tools/enter-plan-mode.d.ts +25 -0
  83. package/dist/tools/enter-plan-mode.d.ts.map +1 -0
  84. package/dist/tools/enter-plan-mode.js +120 -0
  85. package/dist/tools/enter-plan-mode.js.map +1 -0
  86. package/dist/tools/exit-plan-mode.d.ts +13 -0
  87. package/dist/tools/exit-plan-mode.d.ts.map +1 -0
  88. package/dist/tools/exit-plan-mode.js +22 -0
  89. package/dist/tools/exit-plan-mode.js.map +1 -0
  90. package/dist/tools/grep.d.ts +1 -1
  91. package/dist/tools/index.d.ts +20 -4
  92. package/dist/tools/index.d.ts.map +1 -1
  93. package/dist/tools/index.js +7 -1
  94. package/dist/tools/index.js.map +1 -1
  95. package/dist/tools/save-knowledge.d.ts +2 -2
  96. package/dist/tools/shell-provider.d.ts +4 -0
  97. package/dist/tools/shell-provider.d.ts.map +1 -1
  98. package/dist/tools/shell-provider.js +2 -0
  99. package/dist/tools/shell-provider.js.map +1 -1
  100. package/dist/tools/task.d.ts +14 -0
  101. package/dist/tools/task.d.ts.map +1 -0
  102. package/dist/tools/task.js +95 -0
  103. package/dist/tools/task.js.map +1 -0
  104. package/dist/tools/todo-write.d.ts +21 -0
  105. package/dist/tools/todo-write.d.ts.map +1 -0
  106. package/dist/tools/todo-write.js +117 -0
  107. package/dist/tools/todo-write.js.map +1 -0
  108. package/dist/types/index.d.ts +104 -1
  109. package/dist/types/index.d.ts.map +1 -1
  110. package/dist/types/index.js.map +1 -1
  111. package/package.json +1 -1
  112. package/dist/knowledge/session-usage.d.ts +0 -24
  113. package/dist/knowledge/session-usage.d.ts.map +0 -1
  114. package/dist/knowledge/session-usage.js +0 -86
  115. package/dist/knowledge/session-usage.js.map +0 -1
@@ -3,22 +3,40 @@ import fs from 'node:fs/promises';
3
3
  import path from 'node:path';
4
4
  import { generateText, streamText } from 'ai';
5
5
  import { buildKnowledgeContext } from '../knowledge/loader.js';
6
- import { generateSessionSummary, saveSessionSummary } from '../knowledge/session.js';
7
- import { persistUsageSnapshot } from '../knowledge/session-usage.js';
6
+ import { generateSessionSummary } from '../knowledge/session.js';
8
7
  import { applyCacheControl } from '../providers/cache-control.js';
9
8
  import { getThinkingProviderOptions, mergeThinkingOptions } from '../providers/thinking.js';
10
9
  import { clearProgressReporter, setProgressReporter } from '../tools/progress.js';
11
10
  import { toolRegistry, truncateToolResult } from '../tools/index.js';
11
+ import { createTaskTool } from '../tools/task.js';
12
12
  import { debugLog } from '../utils.js';
13
13
  import { classifyApiError, isContextTooLongError } from './api-errors.js';
14
14
  import { estimateTokenCount, getCompressionThreshold, getMaxOutputTokens } from './context-window.js';
15
15
  import { lightCompactMessages } from './light-compact.js';
16
16
  import { createLoopState } from './loop-state.js';
17
+ import { generateTaskSlug, makePlanFilePath } from './plan-storage.js';
18
+ import { appendHeader, appendUsage, flushPendingMessages, markBoundaryAndReflush, } from './session-store.js';
19
+ /** Pull plain text out of a UserContent payload for slugification.
20
+ * UserContent can be a string OR a multi-part array (text/image/file
21
+ * parts after `buildUserContent` ingests `@path` references); we only
22
+ * care about the text segments — image / file parts contribute
23
+ * nothing to a human-readable filename. */
24
+ function userContentToText(content) {
25
+ if (typeof content === 'string')
26
+ return content;
27
+ if (Array.isArray(content)) {
28
+ return content
29
+ .filter((p) => p?.type === 'text' && typeof p.text === 'string')
30
+ .map((p) => p.text)
31
+ .join(' ');
32
+ }
33
+ return '';
34
+ }
17
35
  import { downgradeBinaryPartsForProvider, ensureReasoningContentParts } from './provider-compat.js';
18
36
  import { drainStreamResult } from './stream-utils.js';
19
37
  import { buildSystemPrompt } from './system-prompt.js';
20
38
  import { processToolCalls } from './tool-execution.js';
21
- import { truncateToolResultsInMessages } from './tool-result-sanitize.js';
39
+ import { repairOrphanToolCalls, truncateToolResultsInMessages } from './tool-result-sanitize.js';
22
40
  /** Number of recent messages to keep verbatim when compressing. */
23
41
  const KEEP_RECENT = 6;
24
42
  /** Compress old messages into a summary. */
@@ -53,20 +71,33 @@ async function checkAndCompressContext(state, model, threshold, callbacks) {
53
71
  state.messages = light.messages;
54
72
  const stillOver = estimateTokenCount(state.messages) > threshold;
55
73
  callbacks.onContextCompressed(`Dropped ${light.dropped} looped tool-call message(s) to reclaim context${stillOver ? ' — still over threshold, summarising' : ''}.`);
56
- if (!stillOver)
74
+ if (!stillOver) {
75
+ // Light compaction succeeded — write a boundary so resume won't
76
+ // resurrect the dropped loop-guard pairs (they're still on disk
77
+ // pre-boundary, but the loader cuts at the latest boundary). The
78
+ // boundary carries no summary text since nothing was summarised.
79
+ void markBoundaryAndReflush(state);
57
80
  return;
81
+ }
58
82
  }
83
+ let summaryText = '';
59
84
  try {
60
85
  const summary = await generateSessionSummary(state.messages, model, state.sessionId, state.startedAt, [
61
86
  ...state.filesModified,
62
87
  ]);
63
- await saveSessionSummary(summary);
88
+ summaryText = summary.summary;
64
89
  }
65
90
  catch {
66
- // Don't block compression on session save failure
91
+ // Summary generation failed fall through with empty text. The
92
+ // compressMessages call below still runs its own LLM summarisation,
93
+ // so context still shrinks; we just lose the structured summary
94
+ // that would have ridden along on the boundary line for picker UX.
67
95
  }
68
96
  state.messages = await compressMessages(state.messages, model);
69
97
  state.lastInputTokens = 0;
98
+ // Write a compact-boundary line + re-flush the trimmed messages so
99
+ // the post-boundary jsonl content equals the new in-memory state.
100
+ void markBoundaryAndReflush(state, summaryText);
70
101
  callbacks.onContextCompressed('Context compressed to fit context window.');
71
102
  }
72
103
  /**
@@ -79,6 +110,10 @@ async function handleContextTooLong(state, model, callbacks) {
79
110
  return false;
80
111
  state.messages = await compressMessages(state.messages, model);
81
112
  state.lastInputTokens = 0;
113
+ // Same boundary discipline as the proactive path — reactive compact
114
+ // also shrinks state.messages in place, so the jsonl needs a
115
+ // compact-boundary marker to keep loader semantics consistent.
116
+ void markBoundaryAndReflush(state);
82
117
  callbacks.onContextCompressed('Context too long — automatically compressed. Retrying...');
83
118
  return true;
84
119
  }
@@ -147,15 +182,87 @@ async function collectTurnResponse(result, state, modelId, callbacks) {
147
182
  state.tokenUsage.cacheReadTokens += usage.inputTokenDetails?.cacheReadTokens ?? 0;
148
183
  state.tokenUsage.cacheCreationTokens += usage.inputTokenDetails?.cacheWriteTokens ?? 0;
149
184
  state.tokenUsage.totalTokens = state.tokenUsage.inputTokens + state.tokenUsage.outputTokens;
185
+ // Snapshot the current context-window occupancy from this response —
186
+ // overwrite, not accumulate. Includes input + output because every
187
+ // major provider (Anthropic, OpenAI, Google, DeepSeek, Moonshot,
188
+ // Alibaba, xAI) defines context window as the SHARED budget pool of
189
+ // input + output: input + output ≤ context_window is the architectural
190
+ // constraint (single KV-cache cap). AI SDK's `inputTokens` already
191
+ // includes cache_read + cache_write, so this is the full
192
+ // prompt-the-model-saw plus what it just wrote — directly comparable
193
+ // to `getContextWindow(modelId)` in the footer "N / M · X%" indicator.
194
+ // Cumulative counters above remain for /usage billing summaries.
195
+ state.tokenUsage.currentContextTokens = (usage.inputTokens ?? 0) + (usage.outputTokens ?? 0);
150
196
  if (usage.inputTokens != null)
151
197
  state.lastInputTokens = usage.inputTokens;
152
198
  callbacks.onUsageUpdate(state.tokenUsage);
153
- void persistUsageSnapshot(state, modelId);
199
+ // Persist a usage snapshot inline with the jsonl transcript. Per-turn
200
+ // cadence: the picker's tail-scan only ever needs the LATEST entry, but
201
+ // we write every turn so a crashed process doesn't lose its final
202
+ // counts. Fire-and-forget — never blocks the loop.
203
+ void appendUsage(state, modelId);
154
204
  }
155
205
  return result.finishReason;
156
206
  }
207
+ /** AbortError from streamText / fetch is the SDK's signal that we cancelled
208
+ * the request. We also accept any error that lands while abortSignal is
209
+ * already aborted — some providers wrap the underlying AbortError into their
210
+ * own error class but still flip the signal first. */
211
+ function isAbortError(err, signal) {
212
+ if (signal?.aborted)
213
+ return true;
214
+ if (err instanceof Error) {
215
+ if (err.name === 'AbortError')
216
+ return true;
217
+ if (/aborted|AbortError/i.test(err.message))
218
+ return true;
219
+ }
220
+ return false;
221
+ }
222
+ /** Build the effective tool set for this loop, applying:
223
+ * 1. The static tool registry (always)
224
+ * 2. The task tool (when subAgentRegistry is present)
225
+ * 3. options.toolFilter allow/deny (for sub-agent loops)
226
+ *
227
+ * Computed once per session and cached — the tool set is stable within
228
+ * a session (registry doesn't change, filter doesn't change). */
229
+ function buildTools(options) {
230
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
231
+ const tools = { ...toolRegistry };
232
+ if (options.subAgentRegistry) {
233
+ tools.task = createTaskTool(options.subAgentRegistry);
234
+ }
235
+ const filter = options.toolFilter;
236
+ if (filter) {
237
+ if (filter.allow) {
238
+ const allowSet = new Set(filter.allow);
239
+ for (const name of Object.keys(tools)) {
240
+ if (!allowSet.has(name))
241
+ delete tools[name];
242
+ }
243
+ }
244
+ if (filter.deny) {
245
+ for (const name of filter.deny) {
246
+ delete tools[name];
247
+ }
248
+ }
249
+ }
250
+ return tools;
251
+ }
157
252
  /** Run one agent turn: stream to UI, collect response. Resilient to errors. */
158
- async function runTurn(state, model, options, systemPrompt, callbacks) {
253
+ async function runTurn(state, model, options, systemPrompt, callbacks,
254
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
255
+ effectiveTools) {
256
+ // Defensive sweep BEFORE every API call: if the previous turn left
257
+ // an assistant tool_call without a paired tool_result anywhere in
258
+ // state.messages (model emitted malformed tool input → SDK rejected
259
+ // with tool-error and never produced a result; or a turn errored
260
+ // mid-flight), append a synthetic error result so the request body
261
+ // is well-formed. Providers strictly require tool_call ↔ tool_result
262
+ // pairing and reject the whole request with confusing errors like
263
+ // "tool must be a response to a preceding message with tool_calls".
264
+ // Idempotent — running every turn is cheap and bulletproof.
265
+ repairOrphanToolCalls(state.messages);
159
266
  // Text-only providers (DeepSeek, custom) would 400 on any surviving
160
267
  // image/file parts. Rewrite those parts to OCR'd text in-place before
161
268
  // the stream starts. Multimodal providers short-circuit inside the
@@ -188,7 +295,7 @@ async function runTurn(state, model, options, systemPrompt, callbacks) {
188
295
  model,
189
296
  system: cached.system,
190
297
  messages: cached.messages,
191
- tools: toolRegistry,
298
+ tools: effectiveTools,
192
299
  maxRetries: 3,
193
300
  abortSignal: options.abortSignal,
194
301
  // Explicit ceiling so provider defaults don't silently truncate long
@@ -205,6 +312,8 @@ async function runTurn(state, model, options, systemPrompt, callbacks) {
205
312
  });
206
313
  }
207
314
  catch (err) {
315
+ if (isAbortError(err, options.abortSignal))
316
+ return { kind: 'aborted' };
208
317
  callbacks.onError(new Error(classifyApiError(err).message));
209
318
  return { kind: 'error' };
210
319
  }
@@ -223,6 +332,8 @@ async function runTurn(state, model, options, systemPrompt, callbacks) {
223
332
  // Silently drain all pending AI SDK promises so unhandled-rejection
224
333
  // warnings (NoOutputGeneratedError) don't leak to stderr.
225
334
  drainStreamResult(result);
335
+ if (isAbortError(err, options.abortSignal))
336
+ return { kind: 'aborted' };
226
337
  if (isContextTooLongError(err)) {
227
338
  const compressed = await handleContextTooLong(state, model, callbacks);
228
339
  if (compressed)
@@ -238,14 +349,35 @@ async function runTurn(state, model, options, systemPrompt, callbacks) {
238
349
  }
239
350
  catch (err) {
240
351
  drainStreamResult(result);
352
+ if (isAbortError(err, options.abortSignal))
353
+ return { kind: 'aborted' };
241
354
  callbacks.onError(new Error(classifyApiError(err).message));
242
355
  return { kind: 'error' };
243
356
  }
244
357
  }
245
358
  /** Main agent loop. */
246
359
  export async function agentLoop(userMessage, model, options, callbacks, existingState) {
247
- const state = existingState ?? createLoopState();
360
+ const state = existingState ?? createLoopState(options.permissionMode ?? 'default');
248
361
  state.messages.push({ role: 'user', content: userMessage });
362
+ // Derive the session task-slug ONCE per session, on the first turn.
363
+ // Drives session-usage filenames (`<slug>-<sessionId>.usage.json`)
364
+ // and (when in plan mode) plan-file names. Set-once: changing it
365
+ // mid-session would orphan the file the previous turn already wrote
366
+ // to.
367
+ //
368
+ // For non-ASCII first messages (CJK, emoji-only) `generateTaskSlug`
369
+ // makes one isolated generateText round-trip to summarize the task
370
+ // into 2-4 English words; for ASCII messages it short-circuits to a
371
+ // local slugify with no network. We kick it off in parallel with
372
+ // knowledge / git-stat below so the round-trip overlaps with disk
373
+ // work and doesn't add serial latency to the first turn. The
374
+ // resulting slug is awaited before any session-usage write or plan
375
+ // file is created (well before the first runTurn), so paths are
376
+ // never written with a stale empty slug.
377
+ const taskText = userContentToText(userMessage);
378
+ const taskSlugPromise = state.taskSlug
379
+ ? Promise.resolve(state.taskSlug)
380
+ : generateTaskSlug(taskText, model, options.modelId, options.abortSignal);
249
381
  // Session continuation is handled explicitly by the UI: if the user accepts
250
382
  // the resume prompt, the pending work is embedded directly in their first
251
383
  // user message. Auto-injecting it into every system prompt made the model
@@ -256,7 +388,34 @@ export async function agentLoop(userMessage, model, options, callbacks, existing
256
388
  .stat(path.join(process.cwd(), '.git'))
257
389
  .then(() => true)
258
390
  .catch(() => false);
391
+ // Cache knowledge context and git status on state for sub-agent use
392
+ state.knowledgeContext = fullKnowledgeContext;
393
+ state.isGitRepo = isGitRepo;
394
+ // Resolve the slug now — must be set before any persistUsageSnapshot
395
+ // (per-turn) or plan-file write below. `generateTaskSlug` returns ''
396
+ // on failure, in which case session/plan files fall back to the
397
+ // pure-timestamp naming we had before this helper existed.
398
+ state.taskSlug = await taskSlugPromise;
399
+ // Lazy plan-file path derivation. We derive ONCE per plan-mode
400
+ // session (the first turn that's in plan mode without a path
401
+ // already set) from the user's task text. Re-deriving on every
402
+ // plan-mode turn would overwrite the path the model has been
403
+ // editing, so the !currentPlanPath guard is critical. Pass the
404
+ // session-wide slug so non-ASCII task text still gets a readable
405
+ // filename instead of timestamp-only.
406
+ if (state.permissionMode === 'plan' && !state.currentPlanPath) {
407
+ state.currentPlanPath = makePlanFilePath(taskText, { slug: state.taskSlug });
408
+ }
409
+ // Write the session header to its jsonl file (idempotent for resumes —
410
+ // the header line already exists in that case and we skip). Must come
411
+ // AFTER taskSlug resolution because the filename is `<slug>-<id>.jsonl`.
412
+ // Fire-and-forget — never blocks the loop on FS errors.
413
+ void appendHeader(state, options.modelId, taskText);
259
414
  const compressionThreshold = getCompressionThreshold(options.modelId);
415
+ // Build the effective tool set once per session — includes the task
416
+ // tool when a subAgentRegistry is available, and applies toolFilter
417
+ // for sub-agent loops. Stable for the session lifetime.
418
+ const effectiveTools = buildTools(options);
260
419
  // Auto-continuation on `length` finish. Reasoning models can exhaust the
261
420
  // output token budget before the user-visible reply completes — the old
262
421
  // behavior was to stop mid-sentence and surface an error, which looks
@@ -266,6 +425,14 @@ export async function agentLoop(userMessage, model, options, callbacks, existing
266
425
  let continuationAttempts = 0;
267
426
  while (state.turnCount < options.maxTurns) {
268
427
  state.turnCount++;
428
+ // Sweep any unpersisted messages from the prior iteration (or the
429
+ // initial user message on iter 1) into the jsonl. Diff-based: only
430
+ // appends `state.messages.slice(persistedMessageCount)`, so it's a
431
+ // no-op when nothing has changed. Must come BEFORE
432
+ // checkAndCompressContext — if compaction fires it rewrites the array
433
+ // in place and writes its own boundary + re-flush, which assumes the
434
+ // pre-compaction tail is already on disk.
435
+ void flushPendingMessages(state);
269
436
  await checkAndCompressContext(state, model, compressionThreshold, callbacks);
270
437
  // Build the system prompt once per session and reuse it across turns.
271
438
  // Stable byte-level prefix is a prerequisite for OpenAI-compatible
@@ -273,17 +440,27 @@ export async function agentLoop(userMessage, model, options, callbacks, existing
273
440
  // Zhipu, xAI). If this string changes between turns — e.g. because
274
441
  // buildSystemPrompt interpolates a fresh timestamp — the cache misses
275
442
  // every request.
443
+ //
444
+ // The plan-mode overlay is folded into this same byte-stable cache.
445
+ // tool-execution invalidates the cache (sets it to null) when
446
+ // permissionMode flips, so each mode's prompt stays cache-friendly
447
+ // for as long as the mode is active. Only the boundary turn pays the
448
+ // cache miss.
276
449
  if (!state.systemPromptCache) {
277
450
  state.systemPromptCache = buildSystemPrompt({
278
451
  knowledgeContext: fullKnowledgeContext,
279
452
  modelId: options.modelId,
280
453
  isGitRepo,
454
+ planMode: state.permissionMode === 'plan',
455
+ planFilePath: state.currentPlanPath ?? undefined,
281
456
  });
282
457
  }
283
458
  const systemPrompt = state.systemPromptCache;
284
- const outcome = await runTurn(state, model, options, systemPrompt, callbacks);
459
+ const outcome = await runTurn(state, model, options, systemPrompt, callbacks, effectiveTools);
285
460
  if (outcome.kind === 'error')
286
461
  break;
462
+ if (outcome.kind === 'aborted')
463
+ break;
287
464
  if (outcome.kind === 'retry') {
288
465
  // Don't count a failed attempt that got recovered via reactive compaction.
289
466
  state.turnCount--;
@@ -298,10 +475,16 @@ export async function agentLoop(userMessage, model, options, callbacks, existing
298
475
  toolCalls = await outcome.result.toolCalls;
299
476
  }
300
477
  catch (err) {
478
+ if (isAbortError(err, options.abortSignal))
479
+ break;
301
480
  callbacks.onError(new Error(classifyApiError(err).message));
302
481
  break;
303
482
  }
304
- await processToolCalls(toolCalls, state, options, callbacks);
483
+ await processToolCalls(toolCalls, state, options, callbacks, model);
484
+ // processToolCalls short-circuits on abort with synthetic results;
485
+ // skip the next streamText call which would just throw AbortError.
486
+ if (options.abortSignal?.aborted)
487
+ break;
305
488
  continue;
306
489
  }
307
490
  if (outcome.finishReason === 'length') {
@@ -328,25 +511,24 @@ export async function agentLoop(userMessage, model, options, callbacks, existing
328
511
  if (state.turnCount >= options.maxTurns) {
329
512
  callbacks.onError(new Error(`Reached maximum turns (${options.maxTurns}). Stopping agent loop.`));
330
513
  }
514
+ // Final flush — catches the last iteration's content when we exit via
515
+ // 'stop'/'error' (the next-iter flush at the top of the loop never
516
+ // runs in those cases). Abort path: useAgent.abort() pushes the
517
+ // `[Request interrupted by user]` notice AFTER agentLoop returns, so
518
+ // it's responsible for its own flush — see use-agent.ts.
519
+ void flushPendingMessages(state);
331
520
  return state;
332
521
  }
333
- /** Save session on exit. Summary generation makes an LLM call that can be
334
- * slow, so we bound it with a 2s timeout on Ctrl+C we want to return
335
- * to the shell promptly, not wait for a roundtrip. If the timeout fires
336
- * or the call fails, we silently skip (session summaries are nice-to-have,
337
- * not critical for exit). */
338
- export async function saveSession(state, model, timeoutMs = 2000) {
339
- const controller = new AbortController();
340
- const timer = setTimeout(() => controller.abort(), timeoutMs);
341
- try {
342
- const summary = await generateSessionSummary(state.messages, model, state.sessionId, state.startedAt, [...state.filesModified], controller.signal);
343
- await saveSessionSummary(summary);
344
- }
345
- catch {
346
- // Timeout or any other failure — skip summary silently.
347
- }
348
- finally {
349
- clearTimeout(timer);
350
- }
522
+ /** Sync any in-memory messages to the session jsonl. Called on exit /
523
+ * cleanup paths so a process kill doesn't lose the last turn. Per-turn
524
+ * appends already happen during agentLoop this is the safety-net
525
+ * drain for whatever is left. Tolerant of a half-initialized state
526
+ * (no taskSlug yet etc.); flushPendingMessages no-ops when there's
527
+ * nothing to write. The `model` parameter is kept for API stability
528
+ * with the previous summary-generating implementation but is unused
529
+ * here summaries now ride along on `compact-boundary` lines, not
530
+ * on a separate exit-time call. */
531
+ export async function saveSession(state, _model) {
532
+ await flushPendingMessages(state);
351
533
  }
352
534
  //# sourceMappingURL=loop.js.map
@@ -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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"}
@@ -0,0 +1,55 @@
1
+ import type { LanguageModel } from 'ai';
2
+ /** Convert an arbitrary task description into a filesystem-safe,
3
+ * lower-case, hyphen-separated slug. Drops anything outside
4
+ * `[a-z0-9 -]` (so CJK / emoji / punctuation collapse to nothing —
5
+ * CJK-only tasks produce an empty slug, which is intentional and
6
+ * caught by callers' timestamp-only fallback). Length capped at
7
+ * SLUG_MAX_LEN cells so `ls` columns stay readable. Exported so
8
+ * session-usage filenames can mirror the same shape as plan files. */
9
+ export declare function slugify(text: string): string;
10
+ /** Build a fresh plan-file path from a task description (typically the
11
+ * user's most recent message). Pure function — no I/O — so callers
12
+ * can stash the path on LoopState before the file actually exists.
13
+ * Format: `<slug>-<timestamp>.md` (slug-only when timestamp could
14
+ * conflict, timestamp-only when the task text produces an empty
15
+ * slug). Pass `opts.slug` when the caller already has a precomputed
16
+ * slug (e.g. agentLoop's session-wide LLM-generated `taskSlug`) to
17
+ * skip the local slugify pass — important for non-ASCII task text
18
+ * where slugify would return empty. */
19
+ export declare function makePlanFilePath(taskText: string, opts?: {
20
+ slug?: string;
21
+ now?: Date;
22
+ }): string;
23
+ /** Derive a human-skimmable filename slug for the session.
24
+ *
25
+ * Fast path: if `slugify(taskText)` already produces ≥6 chars (i.e.
26
+ * the user typed something English-y), return it directly — zero
27
+ * network, zero tokens. Covers the entire English-prompt user base.
28
+ *
29
+ * Slow path: for CJK-only / emoji-heavy / very short first messages
30
+ * where slugify returns empty or near-empty, make ONE isolated
31
+ * generateText call asking for 2-4 lowercase English words. No
32
+ * message history, no tools, no system context — just the user's
33
+ * raw text (truncated) and a strict instruction. Disables thinking
34
+ * on providers that support it so the small token budget isn't
35
+ * spent on hidden reasoning before any visible text appears.
36
+ *
37
+ * Returns '' on any failure (including abort). Callers treat empty
38
+ * as "fall back to timestamp-only naming", matching pre-existing
39
+ * behavior so adding this helper can't regress anyone. */
40
+ export declare function generateTaskSlug(taskText: string, model: LanguageModel, modelId: string, signal?: AbortSignal): Promise<string>;
41
+ /** Make sure the plan directory exists. Recursive mkdir so we don't have
42
+ * to also ensure `.x-code/` separately — first plan written in a fresh
43
+ * project gets the parent created automatically. */
44
+ export declare function ensurePlanDir(): Promise<void>;
45
+ /** Read the plan body at `planPath`. Empty string when the file doesn't
46
+ * exist — exitPlanMode calls this to grab whatever the model has
47
+ * written so far, and "no plan written yet" is a valid (if unhelpful)
48
+ * state. */
49
+ export declare function readPlan(planPath: string): Promise<string>;
50
+ /** Persist the plan body to `planPath`. Used by exitPlanMode when the
51
+ * model passes a `plan` override so the on-disk record matches what
52
+ * the user is approving. Returns the path it wrote to (always equal
53
+ * to the input). */
54
+ export declare function writePlan(planPath: string, body: string): Promise<string>;
55
+ //# sourceMappingURL=plan-storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan-storage.d.ts","sourceRoot":"","sources":["../../src/agent/plan-storage.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,IAAI,CAAA;AAQvC;;;;;;uEAMuE;AACvE,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAU5C;AAiBD;;;;;;;;wCAQwC;AACxC,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,IAAI,CAAA;CAAE,GACnC,MAAM,CAKR;AAuBD;;;;;;;;;;;;;;;;2DAgB2D;AAC3D,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,aAAa,EACpB,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,MAAM,CAAC,CAiCjB;AAED;;qDAEqD;AACrD,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAEnD;AAED;;;aAGa;AACb,wBAAsB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAMhE;AAED;;;qBAGqB;AACrB,wBAAsB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAI/E"}