lonny-agent 0.2.2 → 0.2.4

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 (64) hide show
  1. package/.claude/settings.local.json +14 -0
  2. package/dist/agent/index.js +1 -1
  3. package/dist/agent/index.js.map +1 -1
  4. package/dist/agent/project.d.ts +26 -0
  5. package/dist/agent/project.d.ts.map +1 -0
  6. package/dist/agent/project.js +303 -0
  7. package/dist/agent/project.js.map +1 -0
  8. package/dist/agent/prompt-builder.d.ts +1 -1
  9. package/dist/agent/prompt-builder.d.ts.map +1 -1
  10. package/dist/agent/prompt-builder.js +10 -5
  11. package/dist/agent/prompt-builder.js.map +1 -1
  12. package/dist/agent/providers/anthropic.d.ts.map +1 -1
  13. package/dist/agent/providers/anthropic.js +20 -2
  14. package/dist/agent/providers/anthropic.js.map +1 -1
  15. package/dist/agent/providers/google.js +1 -1
  16. package/dist/agent/providers/google.js.map +1 -1
  17. package/dist/agent/providers/ollama.d.ts.map +1 -1
  18. package/dist/agent/providers/ollama.js +2 -1
  19. package/dist/agent/providers/ollama.js.map +1 -1
  20. package/dist/agent/providers/openai.d.ts.map +1 -1
  21. package/dist/agent/providers/openai.js +23 -3
  22. package/dist/agent/providers/openai.js.map +1 -1
  23. package/dist/agent/session.d.ts +4 -2
  24. package/dist/agent/session.d.ts.map +1 -1
  25. package/dist/agent/session.js +206 -147
  26. package/dist/agent/session.js.map +1 -1
  27. package/dist/tools/__tests__/edit.test.js +14 -14
  28. package/dist/tools/__tests__/edit.test.js.map +1 -1
  29. package/dist/tools/edit.d.ts +17 -0
  30. package/dist/tools/edit.d.ts.map +1 -1
  31. package/dist/tools/edit.js +81 -34
  32. package/dist/tools/edit.js.map +1 -1
  33. package/dist/tools/read.d.ts +6 -0
  34. package/dist/tools/read.d.ts.map +1 -1
  35. package/dist/tools/read.js +42 -15
  36. package/dist/tools/read.js.map +1 -1
  37. package/dist/tools/registry.d.ts.map +1 -1
  38. package/dist/tools/registry.js +0 -4
  39. package/dist/tools/registry.js.map +1 -1
  40. package/dist/tools/write_plan.d.ts +1 -1
  41. package/dist/tools/write_plan.d.ts.map +1 -1
  42. package/dist/tools/write_plan.js +14 -4
  43. package/dist/tools/write_plan.js.map +1 -1
  44. package/dist/tui/index.d.ts.map +1 -1
  45. package/dist/tui/index.js +5 -4
  46. package/dist/tui/index.js.map +1 -1
  47. package/dist/web/index.js +5 -5
  48. package/dist/web/index.js.map +1 -1
  49. package/package.json +1 -1
  50. package/src/agent/index.ts +1 -1
  51. package/src/agent/project.ts +366 -0
  52. package/src/agent/prompt-builder.ts +11 -5
  53. package/src/agent/providers/anthropic.ts +21 -2
  54. package/src/agent/providers/google.ts +1 -1
  55. package/src/agent/providers/ollama.ts +5 -1
  56. package/src/agent/providers/openai.ts +27 -3
  57. package/src/agent/session.ts +216 -150
  58. package/src/tools/__tests__/edit.test.ts +14 -14
  59. package/src/tools/edit.ts +103 -36
  60. package/src/tools/read.ts +61 -25
  61. package/src/tools/registry.ts +260 -265
  62. package/src/tools/write_plan.ts +21 -5
  63. package/src/tui/index.ts +5 -4
  64. package/src/web/index.ts +5 -5
@@ -1 +1 @@
1
- {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../../src/agent/providers/openai.ts"],"names":[],"mappings":"AAQA,OAAO,EAAY,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACpE,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAclE,qBAAa,cAAe,YAAW,WAAW;IAChD,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,QAAQ,CAAC,CAAS;IAC1B,OAAO,CAAC,eAAe,CAAC,CAAQ;IAChC,OAAO,CAAC,WAAW,CAAS;IAC5B,6DAA6D;IAC7D,OAAO,CAAC,WAAW,CAAS;gBAG1B,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,MAAM,EAChB,KAAK,CAAC,EAAE,MAAM,EACd,QAAQ,CAAC,EAAE,OAAO,EAClB,eAAe,CAAC,EAAE,MAAM,EACxB,WAAW,CAAC,EAAE,OAAO,EACrB,WAAW,CAAC,EAAE,OAAO;IAWhB,IAAI,CACT,QAAQ,EAAE,UAAU,EAAE,EACtB,KAAK,EAAE,cAAc,EAAE,EACvB,MAAM,CAAC,EAAE,WAAW,GACnB,cAAc,CAAC,QAAQ,CAAC;CAgQ5B"}
1
+ {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../../src/agent/providers/openai.ts"],"names":[],"mappings":"AAQA,OAAO,EAAY,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACpE,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAclE,qBAAa,cAAe,YAAW,WAAW;IAChD,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,QAAQ,CAAC,CAAS;IAC1B,OAAO,CAAC,eAAe,CAAC,CAAQ;IAChC,OAAO,CAAC,WAAW,CAAS;IAC5B,6DAA6D;IAC7D,OAAO,CAAC,WAAW,CAAS;gBAG1B,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,MAAM,EAChB,KAAK,CAAC,EAAE,MAAM,EACd,QAAQ,CAAC,EAAE,OAAO,EAClB,eAAe,CAAC,EAAE,MAAM,EACxB,WAAW,CAAC,EAAE,OAAO,EACrB,WAAW,CAAC,EAAE,OAAO;IAWhB,IAAI,CACT,QAAQ,EAAE,UAAU,EAAE,EACtB,KAAK,EAAE,cAAc,EAAE,EACvB,MAAM,CAAC,EAAE,WAAW,GACnB,cAAc,CAAC,QAAQ,CAAC;CAwR5B"}
@@ -137,12 +137,21 @@ export class OpenAIProvider {
137
137
  for (const tc of delta.tool_calls) {
138
138
  if (tc.id) {
139
139
  if (currentToolCall) {
140
+ let input;
141
+ const rawArgs = currentToolCall.arguments || '';
142
+ try {
143
+ input = JSON.parse(rawArgs || '{}');
144
+ }
145
+ catch {
146
+ console.error('[openai] Failed to parse tool_call arguments (flush on new tool):', rawArgs);
147
+ input = {};
148
+ }
140
149
  yield {
141
150
  type: 'tool_use',
142
151
  tool_call: {
143
152
  id: currentToolCall.id,
144
153
  name: currentToolCall.name,
145
- input: JSON.parse(currentToolCall.arguments || '{}'),
154
+ input,
146
155
  },
147
156
  reasoning_content: reasoningContent,
148
157
  };
@@ -161,18 +170,20 @@ export class OpenAIProvider {
161
170
  }
162
171
  if (chunk.choices?.[0]?.finish_reason) {
163
172
  if (currentToolCall) {
173
+ const finalArgs = currentToolCall.arguments || '';
164
174
  try {
165
175
  yield {
166
176
  type: 'tool_use',
167
177
  tool_call: {
168
178
  id: currentToolCall.id,
169
179
  name: currentToolCall.name,
170
- input: JSON.parse(currentToolCall.arguments || '{}'),
180
+ input: JSON.parse(finalArgs || '{}'),
171
181
  },
172
182
  reasoning_content: reasoningContent,
173
183
  };
174
184
  }
175
185
  catch {
186
+ console.error('[openai] Failed to parse tool_call arguments (finish_reason):', finalArgs);
176
187
  yield {
177
188
  type: 'tool_use',
178
189
  tool_call: {
@@ -232,12 +243,21 @@ export class OpenAIProvider {
232
243
  output_tokens: lastUsage.completion_tokens ?? 0,
233
244
  }
234
245
  : undefined;
246
+ let input;
247
+ const rawFinalArgs = currentToolCall.arguments || '';
248
+ try {
249
+ input = JSON.parse(rawFinalArgs || '{}');
250
+ }
251
+ catch {
252
+ console.error('[openai] Failed to parse tool_call arguments (final flush):', rawFinalArgs);
253
+ input = {};
254
+ }
235
255
  yield {
236
256
  type: 'tool_use',
237
257
  tool_call: {
238
258
  id: currentToolCall.id,
239
259
  name: currentToolCall.name,
240
- input: JSON.parse(currentToolCall.arguments || '{}'),
260
+ input,
241
261
  },
242
262
  reasoning_content: reasoningContent,
243
263
  usage,
@@ -1 +1 @@
1
- {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../../src/agent/providers/openai.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../../src/agent/providers/openai.ts"],"names":[],"mappings":"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"}
@@ -34,13 +34,15 @@ export declare class Session {
34
34
  private stopped;
35
35
  private abortController;
36
36
  constructor(config: Config, output?: SessionOutput);
37
+ /** Initialize the system prompt asynchronously */
38
+ private initSystemPrompt;
37
39
  /** Persist the current session to ~/.lonny/sessions/ */
38
40
  save(): void;
39
41
  /** Try to load a saved session for the given cwd. Returns null if none exists. */
40
- static load(config: Config, output?: SessionOutput): Session | null;
42
+ static load(config: Config, output?: SessionOutput): Promise<Session | null>;
41
43
  /** Remove the saved session file for the given cwd. */
42
44
  static clearSavedSession(cwd: string): void;
43
- setMode(mode: 'code' | 'plan' | 'ask'): void;
45
+ setMode(mode: 'code' | 'plan' | 'ask'): Promise<void>;
44
46
  /** Stop the current conversation gracefully */
45
47
  stop(): void;
46
48
  /** Check if the session was stopped */
@@ -1 +1 @@
1
- {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/agent/session.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAEhD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AACnD,OAAO,KAAK,EAAE,QAAQ,EAAc,MAAM,mBAAmB,CAAA;AAG7D,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAmFvD,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAC7B,6FAA6F;IAC7F,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B;;;OAGG;IACH,WAAW,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;CAC1D;AAqFD,wBAAgB,eAAe,CAAC,EAAE,EAAE,QAAQ,GAAG,MAAM,CAyBpD;AAoBD,qBAAa,OAAO;IAClB,QAAQ,EAAE,UAAU,EAAE,CAAA;IACtB,QAAQ,EAAE,WAAW,CAAA;IACrB,QAAQ,EAAE,YAAY,CAAA;IACtB,OAAO,EAAE,eAAe,CAAA;IACxB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,aAAa,CAAA;IACtB,OAAO,CAAC,cAAc,CAAC,CAA2B;IAClD,kEAAkE;IAClE,IAAI,aAAa,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,EAQ5D;IACD,IAAI,aAAa,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,CAE3D;IACD,gBAAgB,EAAE,MAAM,CAAI;IAC5B,iBAAiB,EAAE,MAAM,CAAI;IAC7B,eAAe,EAAE,MAAM,CAAI;IAC3B,gBAAgB,EAAE,MAAM,CAAI;IAC5B,YAAY,EAAE,MAAM,CAAI;IACxB,aAAa,EAAE,MAAM,CAAI;IACzB,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,eAAe,CAA+B;gBAE1C,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,aAAa;IAiClD,wDAAwD;IACxD,IAAI,IAAI,IAAI;IAkBZ,kFAAkF;IAClF,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,aAAa,GAAG,OAAO,GAAG,IAAI;IAmCnE,uDAAuD;IACvD,MAAM,CAAC,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAS3C,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,IAAI;IAO5C,+CAA+C;IAC/C,IAAI,IAAI,IAAI;IAMZ,uCAAuC;IACvC,SAAS,IAAI,OAAO;IAIpB,oDAAoD;IACpD,YAAY,IAAI,IAAI;IAId,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAwW9C"}
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/agent/session.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAEhD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAElD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AACnD,OAAO,KAAK,EAAE,QAAQ,EAAc,MAAM,mBAAmB,CAAA;AAG7D,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAmFvD,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAC7B,6FAA6F;IAC7F,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B;;;OAGG;IACH,WAAW,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;CAC1D;AAqFD,wBAAgB,eAAe,CAAC,EAAE,EAAE,QAAQ,GAAG,MAAM,CAyBpD;AAoBD,qBAAa,OAAO;IAClB,QAAQ,EAAE,UAAU,EAAE,CAAA;IACtB,QAAQ,EAAE,WAAW,CAAA;IACrB,QAAQ,EAAE,YAAY,CAAA;IACtB,OAAO,EAAE,eAAe,CAAA;IACxB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,aAAa,CAAA;IACtB,OAAO,CAAC,cAAc,CAAC,CAA2B;IAClD,kEAAkE;IAClE,IAAI,aAAa,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,EAQ5D;IACD,IAAI,aAAa,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,CAE3D;IACD,gBAAgB,EAAE,MAAM,CAAI;IAC5B,iBAAiB,EAAE,MAAM,CAAI;IAC7B,eAAe,EAAE,MAAM,CAAI;IAC3B,gBAAgB,EAAE,MAAM,CAAI;IAC5B,YAAY,EAAE,MAAM,CAAI;IACxB,aAAa,EAAE,MAAM,CAAI;IACzB,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,eAAe,CAA+B;gBAE1C,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,aAAa;IAoClD,kDAAkD;IAClD,OAAO,CAAC,gBAAgB;IAMxB,wDAAwD;IACxD,IAAI,IAAI,IAAI;IAkBZ,kFAAkF;WACrE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAoClF,uDAAuD;IACvD,MAAM,CAAC,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IASrC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ3D,+CAA+C;IAC/C,IAAI,IAAI,IAAI;IAMZ,uCAAuC;IACvC,SAAS,IAAI,OAAO;IAIpB,oDAAoD;IACpD,YAAY,IAAI,IAAI;IAMd,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CA2Z9C"}
@@ -4,6 +4,7 @@ import * as os from 'node:os';
4
4
  import * as path from 'node:path';
5
5
  import { saveTokenUsage } from '../config/tokens.js';
6
6
  import { FileReadTracker } from '../diff/apply.js';
7
+ import { fmtErr } from '../tools/errors.js';
7
8
  import { ToolRegistry } from '../tools/registry.js';
8
9
  import { compact, shouldCompact } from './compaction.js';
9
10
  import { EventChannels, getGlobalEventBus } from './event-bus.js';
@@ -241,7 +242,16 @@ export class Session {
241
242
  else {
242
243
  this.provider = new AnthropicProvider(config.apiKey, config.baseUrl, config.model);
243
244
  }
244
- this.messages = [{ role: 'system', content: buildSystemPrompt(config) }];
245
+ // Placeholder until initSystemPrompt() is called
246
+ this.messages = [{ role: 'system', content: '' }];
247
+ // Initialize system prompt asynchronously
248
+ this.initSystemPrompt(config);
249
+ }
250
+ /** Initialize the system prompt asynchronously */
251
+ initSystemPrompt(config) {
252
+ buildSystemPrompt(config).then(prompt => {
253
+ this.messages = [{ role: 'system', content: prompt }];
254
+ });
245
255
  }
246
256
  /** Persist the current session to ~/.lonny/sessions/ */
247
257
  save() {
@@ -262,7 +272,7 @@ export class Session {
262
272
  fs.writeFileSync(filePath, JSON.stringify(data, null, 2), 'utf-8');
263
273
  }
264
274
  /** Try to load a saved session for the given cwd. Returns null if none exists. */
265
- static load(config, output) {
275
+ static async load(config, output) {
266
276
  const filePath = getSessionFilePath(config.cwd);
267
277
  let data;
268
278
  try {
@@ -285,7 +295,8 @@ export class Session {
285
295
  if (data.model !== config.model ||
286
296
  data.provider !== config.provider ||
287
297
  data.mode !== config.mode) {
288
- session.messages[0] = { role: 'system', content: buildSystemPrompt(config) };
298
+ const prompt = await buildSystemPrompt(config);
299
+ session.messages[0] = { role: 'system', content: prompt };
289
300
  }
290
301
  // Restore token stats
291
302
  session.totalInputTokens = data.totalInputTokens;
@@ -303,9 +314,10 @@ export class Session {
303
314
  // Ignore if file doesn't exist
304
315
  }
305
316
  }
306
- setMode(mode) {
317
+ async setMode(mode) {
307
318
  this.config.mode = mode;
308
- this.messages[0] = { role: 'system', content: buildSystemPrompt(this.config) };
319
+ const prompt = await buildSystemPrompt(this.config);
320
+ this.messages[0] = { role: 'system', content: prompt };
309
321
  this.registry.setMode(mode);
310
322
  this.save();
311
323
  }
@@ -322,6 +334,8 @@ export class Session {
322
334
  /** Reset the stopped flag for a new conversation */
323
335
  resetStopped() {
324
336
  this.stopped = false;
337
+ // Create new AbortController for next conversation
338
+ this.abortController = new AbortController();
325
339
  }
326
340
  async chat(userPrompt) {
327
341
  const bus = getGlobalEventBus();
@@ -361,171 +375,205 @@ export class Session {
361
375
  bus.emit(EventChannels.TURN_START, { prompt: userPrompt, iteration: iterations });
362
376
  bus.emit(EventChannels.LLM_STREAM_START, { iteration: iterations });
363
377
  const stream = this.provider.chat(this.messages, this.registry.getDefinitions(), this.abortController.signal);
364
- for await (const chunk of stream) {
365
- if (chunk.reasoning_content) {
366
- reasoningContent = chunk.reasoning_content;
367
- // Stream reasoning content in real-time (only when no text in same chunk)
368
- if (!chunk.text) {
369
- // Emit thinking via EventBus for Web UI
370
- bus.emit(EventChannels.THINKING, { text: chunk.reasoning_content });
371
- if (!reasoningOutput) {
372
- reasoningOutput = true;
373
- reasoningLineStart = true;
374
- if (!out?.suppressToolOutput) {
375
- writeOut(thinkTopBorder(), out);
376
- }
377
- }
378
- // Terminal display with box drawing (skip in Web UI mode, handled by EventBus)
379
- if (!out?.suppressToolOutput) {
380
- // Track column position on current line for wrapping
381
- let thinkCol = 0;
382
- // Handle newlines in streamed content - add left border on each new line
383
- // Also manually wrap long lines so wrapped lines keep the │ prefix.
384
- let remaining = chunk.reasoning_content;
385
- const maxContentWidth = termWidth() - THINK_PREFIX_WIDTH;
386
- while (remaining.length > 0) {
387
- if (reasoningLineStart) {
388
- writeOut(` ${GY}│${RS}${TH}`, out);
389
- reasoningLineStart = false;
390
- thinkCol = 0;
378
+ try {
379
+ for await (const chunk of stream) {
380
+ if (chunk.reasoning_content) {
381
+ reasoningContent = chunk.reasoning_content;
382
+ // Stream reasoning content in real-time (only when no text in same chunk)
383
+ if (!chunk.text) {
384
+ // Emit thinking via EventBus for Web UI
385
+ bus.emit(EventChannels.THINKING, { text: chunk.reasoning_content });
386
+ if (!reasoningOutput) {
387
+ reasoningOutput = true;
388
+ reasoningLineStart = true;
389
+ if (!out?.suppressToolOutput) {
390
+ writeOut(thinkTopBorder(), out);
391
391
  }
392
- const nlIdx = remaining.indexOf('\n');
393
- if (nlIdx === -1) {
394
- // No newline — write as much as fits on current line, wrap if needed
395
- while (remaining.length > 0) {
396
- const segWidth = visibleWidth(remaining);
392
+ }
393
+ // Terminal display with box drawing (skip in Web UI mode, handled by EventBus)
394
+ if (!out?.suppressToolOutput) {
395
+ // Track column position on current line for wrapping
396
+ let thinkCol = 0;
397
+ // Handle newlines in streamed content - add left border on each new line
398
+ // Also manually wrap long lines so wrapped lines keep the │ prefix.
399
+ let remaining = chunk.reasoning_content;
400
+ const maxContentWidth = termWidth() - THINK_PREFIX_WIDTH;
401
+ while (remaining.length > 0) {
402
+ if (reasoningLineStart) {
403
+ writeOut(` ${GY}│${RS}${TH}`, out);
404
+ reasoningLineStart = false;
405
+ thinkCol = 0;
406
+ }
407
+ const nlIdx = remaining.indexOf('\n');
408
+ if (nlIdx === -1) {
409
+ // No newline — write as much as fits on current line, wrap if needed
410
+ while (remaining.length > 0) {
411
+ const segWidth = visibleWidth(remaining);
412
+ const avail = maxContentWidth - thinkCol;
413
+ if (segWidth <= avail) {
414
+ // Fits entirely on current line
415
+ writeOut(remaining, out);
416
+ thinkCol += segWidth;
417
+ remaining = '';
418
+ }
419
+ else if (avail <= 0) {
420
+ // Current line is full, wrap to next
421
+ writeOut(`${RS}\n`, out);
422
+ writeOut(` ${GY}│${RS}${TH}`, out);
423
+ thinkCol = 0;
424
+ }
425
+ else {
426
+ // Write first part that fits, then wrap
427
+ // Find character boundary that fits within avail
428
+ let cut = avail;
429
+ while (cut > 0 && visibleWidth(remaining.slice(0, cut)) > avail)
430
+ cut--;
431
+ if (cut <= 0)
432
+ cut = 1;
433
+ writeOut(remaining.slice(0, cut), out);
434
+ writeOut(`${RS}\n`, out);
435
+ writeOut(` ${GY}│${RS}${TH}`, out);
436
+ thinkCol = 0;
437
+ remaining = remaining.slice(cut);
438
+ }
439
+ }
440
+ }
441
+ else {
442
+ // Has newline — process the segment up to newline
443
+ const segment = remaining.slice(0, nlIdx);
444
+ const segWidth = visibleWidth(segment);
397
445
  const avail = maxContentWidth - thinkCol;
398
446
  if (segWidth <= avail) {
399
- // Fits entirely on current line
400
- writeOut(remaining, out);
401
- thinkCol += segWidth;
402
- remaining = '';
403
- }
404
- else if (avail <= 0) {
405
- // Current line is full, wrap to next
447
+ // Segment fits on current line
448
+ writeOut(segment, out);
406
449
  writeOut(`${RS}\n`, out);
407
- writeOut(` ${GY}│${RS}${TH}`, out);
450
+ reasoningLineStart = true;
408
451
  thinkCol = 0;
409
452
  }
410
453
  else {
411
- // Write first part that fits, then wrap
412
- // Find character boundary that fits within avail
413
- let cut = avail;
414
- while (cut > 0 && visibleWidth(remaining.slice(0, cut)) > avail)
415
- cut--;
416
- if (cut <= 0)
417
- cut = 1;
418
- writeOut(remaining.slice(0, cut), out);
454
+ // Segment too long write what fits, wrap, then rest
455
+ let rest = segment;
456
+ // Write remainder of current line
457
+ if (avail > 0) {
458
+ let cut = avail;
459
+ while (cut > 0 && visibleWidth(rest.slice(0, cut)) > avail)
460
+ cut--;
461
+ if (cut <= 0)
462
+ cut = 1;
463
+ writeOut(rest.slice(0, cut), out);
464
+ rest = rest.slice(cut);
465
+ }
419
466
  writeOut(`${RS}\n`, out);
420
- writeOut(` ${GY}│${RS}${TH}`, out);
467
+ reasoningLineStart = true;
421
468
  thinkCol = 0;
422
- remaining = remaining.slice(cut);
423
- }
424
- }
425
- }
426
- else {
427
- // Has newline — process the segment up to newline
428
- const segment = remaining.slice(0, nlIdx);
429
- const segWidth = visibleWidth(segment);
430
- const avail = maxContentWidth - thinkCol;
431
- if (segWidth <= avail) {
432
- // Segment fits on current line
433
- writeOut(segment, out);
434
- writeOut(`${RS}\n`, out);
435
- reasoningLineStart = true;
436
- thinkCol = 0;
437
- }
438
- else {
439
- // Segment too long — write what fits, wrap, then rest
440
- let rest = segment;
441
- // Write remainder of current line
442
- if (avail > 0) {
443
- let cut = avail;
444
- while (cut > 0 && visibleWidth(rest.slice(0, cut)) > avail)
445
- cut--;
446
- if (cut <= 0)
447
- cut = 1;
448
- writeOut(rest.slice(0, cut), out);
449
- rest = rest.slice(cut);
450
- }
451
- writeOut(`${RS}\n`, out);
452
- reasoningLineStart = true;
453
- thinkCol = 0;
454
- // Write rest of segment on continuation line(s)
455
- if (rest.length > 0) {
456
- writeOut(` ${GY}│${RS}${TH}`, out);
457
- reasoningLineStart = false;
458
- while (rest.length > 0) {
459
- const rw = visibleWidth(rest);
460
- if (rw <= maxContentWidth) {
461
- writeOut(rest, out);
462
- thinkCol = rw;
463
- rest = '';
464
- }
465
- else {
466
- let cut = maxContentWidth;
467
- while (cut > 0 && visibleWidth(rest.slice(0, cut)) > maxContentWidth)
468
- cut--;
469
- if (cut <= 0)
470
- cut = 1;
471
- writeOut(rest.slice(0, cut), out);
472
- writeOut(`${RS}\n`, out);
473
- writeOut(` ${GY}│${RS}${TH}`, out);
474
- rest = rest.slice(cut);
469
+ // Write rest of segment on continuation line(s)
470
+ if (rest.length > 0) {
471
+ writeOut(` ${GY}│${RS}${TH}`, out);
472
+ reasoningLineStart = false;
473
+ while (rest.length > 0) {
474
+ const rw = visibleWidth(rest);
475
+ if (rw <= maxContentWidth) {
476
+ writeOut(rest, out);
477
+ thinkCol = rw;
478
+ rest = '';
479
+ }
480
+ else {
481
+ let cut = maxContentWidth;
482
+ while (cut > 0 && visibleWidth(rest.slice(0, cut)) > maxContentWidth)
483
+ cut--;
484
+ if (cut <= 0)
485
+ cut = 1;
486
+ writeOut(rest.slice(0, cut), out);
487
+ writeOut(`${RS}\n`, out);
488
+ writeOut(` ${GY}│${RS}${TH}`, out);
489
+ rest = rest.slice(cut);
490
+ }
475
491
  }
476
492
  }
493
+ writeOut(`${RS}\n`, out);
494
+ reasoningLineStart = true;
495
+ thinkCol = 0;
477
496
  }
478
- writeOut(`${RS}\n`, out);
479
- reasoningLineStart = true;
480
- thinkCol = 0;
497
+ remaining = remaining.slice(nlIdx + 1);
481
498
  }
482
- remaining = remaining.slice(nlIdx + 1);
483
499
  }
484
500
  }
485
501
  }
486
502
  }
487
- }
488
- if (chunk.type === 'text' && chunk.text) {
489
- if (reasoningOutput) {
490
- bus.emit(EventChannels.THINKING_END, {});
491
- if (!out?.suppressToolOutput) {
492
- writeOut(`${RS}\n`, out);
493
- writeOut(thinkBottomBorder(), out);
503
+ if (chunk.type === 'text' && chunk.text) {
504
+ if (reasoningOutput) {
505
+ bus.emit(EventChannels.THINKING_END, {});
506
+ if (!out?.suppressToolOutput) {
507
+ writeOut(`${RS}\n`, out);
508
+ writeOut(thinkBottomBorder(), out);
509
+ }
510
+ reasoningOutput = false;
511
+ reasoningLineStart = false;
494
512
  }
495
- reasoningOutput = false;
496
- reasoningLineStart = false;
513
+ fullResponse += chunk.text;
514
+ writeOut(chunk.text, out);
497
515
  }
498
- fullResponse += chunk.text;
499
- writeOut(chunk.text, out);
500
- }
501
- else if (chunk.type === 'tool_use' && chunk.tool_call) {
502
- toolCalls.push(chunk.tool_call);
503
- }
504
- else if (chunk.type === 'complete') {
505
- if (chunk.usage) {
506
- this.turnInputTokens += chunk.usage.input_tokens;
507
- this.turnOutputTokens += chunk.usage.output_tokens;
508
- this.totalInputTokens += chunk.usage.input_tokens;
509
- this.totalOutputTokens += chunk.usage.output_tokens;
516
+ else if (chunk.type === 'tool_use' && chunk.tool_call) {
517
+ toolCalls.push(chunk.tool_call);
510
518
  }
511
- if (chunk.finish_reason === 'stop' || chunk.finish_reason === 'end_turn') {
512
- if (toolCalls.length === 0) {
513
- const finalAssistantMsg = {
514
- role: 'assistant',
515
- content: fullResponse || null,
516
- reasoning_content: reasoningContent,
517
- };
518
- this.messages.push(finalAssistantMsg);
519
- printTokenStats(this.turnInputTokens, this.turnOutputTokens, this.totalInputTokens, this.totalOutputTokens, this.turnApiCalls, this.totalApiCalls, out);
520
- writeOut('\n\n', out);
521
- saveTokenUsage(this.config.cwd, this.turnInputTokens, this.turnOutputTokens, this.turnApiCalls);
522
- bus.emit(EventChannels.TURN_END, { iterations, toolCallCount: 0 });
523
- this.save();
524
- return;
519
+ else if (chunk.type === 'complete') {
520
+ if (chunk.usage) {
521
+ this.turnInputTokens += chunk.usage.input_tokens;
522
+ this.turnOutputTokens += chunk.usage.output_tokens;
523
+ this.totalInputTokens += chunk.usage.input_tokens;
524
+ this.totalOutputTokens += chunk.usage.output_tokens;
525
+ }
526
+ if (chunk.finish_reason === 'stop' || chunk.finish_reason === 'end_turn') {
527
+ if (toolCalls.length === 0) {
528
+ const finalAssistantMsg = {
529
+ role: 'assistant',
530
+ content: fullResponse || null,
531
+ reasoning_content: reasoningContent,
532
+ };
533
+ this.messages.push(finalAssistantMsg);
534
+ printTokenStats(this.turnInputTokens, this.turnOutputTokens, this.totalInputTokens, this.totalOutputTokens, this.turnApiCalls, this.totalApiCalls, out);
535
+ writeOut('\n\n', out);
536
+ saveTokenUsage(this.config.cwd, this.turnInputTokens, this.turnOutputTokens, this.turnApiCalls);
537
+ bus.emit(EventChannels.TURN_END, { iterations, toolCallCount: 0 });
538
+ this.save();
539
+ return;
540
+ }
525
541
  }
526
542
  }
527
543
  }
528
544
  }
545
+ catch (e) {
546
+ const errMsg = fmtErr(e);
547
+ const partialContent = fullResponse ? fullResponse.slice(0, 500) : '(empty)';
548
+ if (!out?.suppressToolOutput) {
549
+ writeOut(`\n${RE}Stream error:${RS} ${errMsg}`, out);
550
+ writeOut(`\n ${GY}┃${RS} Partial response: ${partialContent}\n`, out);
551
+ }
552
+ console.error('[session] Stream error:', errMsg, '| Partial response:', partialContent);
553
+ if (reasoningOutput) {
554
+ bus.emit(EventChannels.THINKING_END, {});
555
+ if (!out?.suppressToolOutput) {
556
+ writeOut(`${RS}\n`, out);
557
+ writeOut(thinkBottomBorder(), out);
558
+ }
559
+ }
560
+ bus.emit(EventChannels.LLM_STREAM_END, { iteration: iterations, toolCallCount: 0 });
561
+ bus.emit(EventChannels.TURN_END, { iterations, toolCallCount: 0 });
562
+ // If there are pending toolCalls that weren't executed due to abort,
563
+ // add an assistant message so the model knows they weren't executed
564
+ if (toolCalls.length > 0) {
565
+ const interruptedMsg = {
566
+ role: 'assistant',
567
+ content: null,
568
+ tool_calls: toolCalls,
569
+ reasoning_content: reasoningContent,
570
+ };
571
+ this.messages.push(interruptedMsg);
572
+ }
573
+ saveTokenUsage(this.config.cwd, this.turnInputTokens, this.turnOutputTokens, this.turnApiCalls);
574
+ this.save();
575
+ return;
576
+ }
529
577
  bus.emit(EventChannels.LLM_STREAM_END, {
530
578
  iteration: iterations,
531
579
  toolCallCount: toolCalls.length,
@@ -583,9 +631,20 @@ export class Session {
583
631
  }
584
632
  }
585
633
  }
586
- for (const tc of toolCalls) {
634
+ for (let i = 0; i < toolCalls.length; i++) {
635
+ const tc = toolCalls[i];
587
636
  // Check if stop was requested after each tool call
588
637
  if (this.isStopped()) {
638
+ // Add assistant message with remaining tool_calls so model knows they weren't executed
639
+ const remainingToolCalls = toolCalls.slice(i);
640
+ if (remainingToolCalls.length > 0) {
641
+ const interruptedMsg = {
642
+ role: 'assistant',
643
+ content: null,
644
+ tool_calls: remainingToolCalls,
645
+ };
646
+ this.messages.push(interruptedMsg);
647
+ }
589
648
  bus.emit(EventChannels.TURN_END, { iterations, toolCallCount: toolCalls.length });
590
649
  this.save();
591
650
  return;