@quatcode/agent 0.2.7 → 0.2.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/theme.js CHANGED
@@ -44,13 +44,41 @@ export const THEMES = [
44
44
  ];
45
45
  let activeId = "quatcode";
46
46
  function mix(base, toward, t) {
47
+ const k = Math.max(0, Math.min(1, t));
47
48
  const [br, bgc, bb] = hexToRgb(base);
48
49
  const [tr, tg, tb] = hexToRgb(toward);
49
- const channel = (a, b) => Math.round(a + (b - a) * t)
50
+ const channel = (a, b) => Math.round(a + (b - a) * k)
50
51
  .toString(16)
51
52
  .padStart(2, "0");
52
53
  return `#${channel(br, tr)}${channel(bgc, tg)}${channel(bb, tb)}`;
53
54
  }
55
+ export { mix };
56
+ /** Smooth 0→1→0 breathe value for time-based pulses. */
57
+ export function pulse(nowMs, periodMs = 900) {
58
+ return 0.5 + 0.5 * Math.sin((nowMs / periodMs) * Math.PI * 2);
59
+ }
60
+ /**
61
+ * A highlight sweeping across the text, letters near the head brightening
62
+ * toward `highlight`. Gives loading labels a premium "shimmer" instead of a
63
+ * static word. `phase` is a continuous position (chars per call unit).
64
+ */
65
+ export function shimmer(text, phase, options = {}) {
66
+ if (!colorEnabled || text === "")
67
+ return text;
68
+ const base = options.base ?? palette.silver;
69
+ const highlight = options.highlight ?? palette.bone;
70
+ const tail = Math.max(1, options.tail ?? 4);
71
+ const chars = [...text];
72
+ const span = chars.length + tail * 2 + 1;
73
+ const head = (((phase % span) + span) % span) - tail;
74
+ let out = "";
75
+ for (let i = 0; i < chars.length; i++) {
76
+ const distance = Math.abs(i - head);
77
+ const t = distance >= tail ? 0 : 1 - distance / tail;
78
+ out += fg(mix(base, highlight, t * t * (3 - 2 * t)), chars[i]);
79
+ }
80
+ return out;
81
+ }
54
82
  export function getThemes() {
55
83
  return THEMES;
56
84
  }
@@ -172,16 +200,30 @@ const ANSI_RE = /\u001b\[[0-9;?]*[A-Za-z]/g;
172
200
  export function stripAnsi(text) {
173
201
  return text.replace(ANSI_RE, "");
174
202
  }
175
- const ASCII_MODE = process.env.QUATCODE_ASCII === "1";
203
+ export const ASCII_MODE = process.env.QUATCODE_ASCII === "1";
204
+ /**
205
+ * Glyphs that live inside emoji blocks but render one column wide in terminal
206
+ * fonts (our own chrome uses them: ★ ✓ ✕ ✎ ❯).
207
+ */
208
+ const NARROW_GLYPHS = new Set([0x2605, 0x2606, 0x270e, 0x2713, 0x2715, 0x2727, 0x276f]);
176
209
  function isWide(cp) {
210
+ if (NARROW_GLYPHS.has(cp))
211
+ return false;
177
212
  return ((cp >= 0x1100 && cp <= 0x115f) ||
213
+ (cp >= 0x231a && cp <= 0x231b) ||
214
+ (cp >= 0x23e9 && cp <= 0x23ec) ||
215
+ cp === 0x23f0 ||
216
+ cp === 0x23f3 ||
217
+ (cp >= 0x25fd && cp <= 0x25fe) ||
218
+ (cp >= 0x2600 && cp <= 0x27bf) ||
219
+ (cp >= 0x2b00 && cp <= 0x2bff) ||
178
220
  (cp >= 0x2e80 && cp <= 0xa4cf) ||
179
221
  (cp >= 0xac00 && cp <= 0xd7a3) ||
180
222
  (cp >= 0xf900 && cp <= 0xfaff) ||
181
223
  (cp >= 0xfe30 && cp <= 0xfe4f) ||
182
224
  (cp >= 0xff00 && cp <= 0xff60) ||
183
225
  (cp >= 0xffe0 && cp <= 0xffe6) ||
184
- (cp >= 0x1f300 && cp <= 0x1faff) ||
226
+ (cp >= 0x1f000 && cp <= 0x1faff) ||
185
227
  (cp >= 0x20000 && cp <= 0x3fffd));
186
228
  }
187
229
  function isCombining(cp) {
@@ -261,9 +303,10 @@ export const glyphs = ASCII_MODE
261
303
  bullet: "*",
262
304
  pin: "*",
263
305
  arrow: "->",
306
+ arrowLeft: "<-",
264
307
  arrowDown: "v",
265
308
  ellipsis: "...",
266
- spinner: ["{*}", "{+}", "{ }", "{+}"],
309
+ spinner: ["-", "\\", "|", "/"],
267
310
  box: {
268
311
  tl: "+",
269
312
  tr: "+",
@@ -287,9 +330,10 @@ export const glyphs = ASCII_MODE
287
330
  bullet: "•",
288
331
  pin: "★",
289
332
  arrow: "→",
333
+ arrowLeft: "←",
290
334
  arrowDown: "↓",
291
335
  ellipsis: "…",
292
- spinner: ["{◆}", "{◈}", "{◇}", "{◈}"],
336
+ spinner: ["{◜}", "{◝}", "{◞}", "{◟}"],
293
337
  box: {
294
338
  tl: "┌",
295
339
  tr: "┐",
package/dist/theme.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"theme.js","sourceRoot":"","sources":["../src/theme.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"theme.js","sourceRoot":"","sources":["../src/theme.ts"],"names":[],"mappings":"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"}
package/dist/tui.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type { ImagePart } from "@quatcode/core";
1
+ import type { ChatMessage, ImagePart } from "@quatcode/core";
2
2
  export type TuiOptions = {
3
3
  dir: string;
4
4
  model?: string;
@@ -14,6 +14,12 @@ export type TuiOptions = {
14
14
  };
15
15
  };
16
16
  export declare function runTui(options: TuiOptions): Promise<number>;
17
+ /**
18
+ * A side-channel (/btw) request can run while a tool call is still in flight,
19
+ * so the transcript may end with an assistant tool_call that has no tool result
20
+ * yet. Providers reject such a sequence (400), so drop unanswered tool_calls.
21
+ */
22
+ export declare function sideChannelMessages(messages: readonly ChatMessage[]): ChatMessage[];
17
23
  export declare function nextImageIndex(text: string): number;
18
24
  export declare function extractInputImages(text: string, images: ReadonlyMap<number, ImagePart>): {
19
25
  text: string;
package/dist/tui.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"tui.d.ts","sourceRoot":"","sources":["../src/tui.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAEV,SAAS,EAMV,MAAM,gBAAgB,CAAC;AAsFxB,MAAM,MAAM,UAAU,GAAG;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,EAAE,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC,WAAW,CAAA;KAAE,CAAC;CAC/D,CAAC;AA2CF,wBAAsB,MAAM,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAWjE;AA2gGD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CASnD;AAED,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,GACrC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,SAAS,EAAE,CAAA;CAAE,CAavC"}
1
+ {"version":3,"file":"tui.d.ts","sourceRoot":"","sources":["../src/tui.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EACV,WAAW,EACX,SAAS,EAMV,MAAM,gBAAgB,CAAC;AAwFxB,MAAM,MAAM,UAAU,GAAG;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,EAAE,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC,WAAW,CAAA;KAAE,CAAC;CAC/D,CAAC;AA4CF,wBAAsB,MAAM,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAWjE;AAmpGD;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,SAAS,WAAW,EAAE,GAAG,WAAW,EAAE,CAiBnF;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CASnD;AAED,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,GACrC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,SAAS,EAAE,CAAA;CAAE,CAavC"}
package/dist/tui.js CHANGED
@@ -12,10 +12,11 @@ import { TurnController, fmtCost, fmtDuration, fmtTokens, toolArg, toolResultBlo
12
12
  import { renderBanner } from "./logo.js";
13
13
  import { renderMarkdown, wrapSegments } from "./markdown.js";
14
14
  import { ADD_PROVIDER, allProviders, buildProvider, defaultModelFor, effortsForModel, hasKey, keyEnvFor, probeProviderModels, providerEnvKey, providerHasModel, providerMeta, providerSlug, registerCustomProvider, removeCustomProvider, resolveProviderForModel, } from "./models.js";
15
- import { activeThemeId, bg, bold, buildColorRemap, clipAnsi, fg, getThemes, glyphs, padEndTo, palette, remapColors, setTheme, stringWidth, stripAnsi, tone, toolGlyph, } from "./theme.js";
16
- import { listSessionsForDir, loadConfig, makeSessionId, saveConfig, saveSession, deleteSession } from "./store.js";
17
- import { configFile, conversationKey, deleteConversation, displayTitle, latestPerConversation, messagesForStorage, sortConversations, updateConversation, } from "./store.js";
15
+ import { ASCII_MODE, activeThemeId, bg, bold, buildColorRemap, clipAnsi, fg, getThemes, glyphs, mix, padEndTo, palette, pulse, remapColors, setTheme, shimmer, stringWidth, stripAnsi, tone, toolGlyph, } from "./theme.js";
16
+ import { listSessions, listSessionsForDir, loadConfig, makeSessionId, saveConfig, saveSession, deleteSession } from "./store.js";
17
+ import { configFile, conversationKey, deleteConversation, displayTitle, latestPerConversation, messagesForStorage, sameDir, sortConversations, updateConversation } from "./store.js";
18
18
  import { MCP_USAGE, isMcpUrl, mcpInstructionsSection, parseMcpAdd } from "./mcp.js";
19
+ import { AUTO, PERSONA_SETTINGS, personaSection, personaSummary, } from "./persona.js";
19
20
  import { copyToClipboard, readClipboardImage, readClipboardText, } from "./clipboard.js";
20
21
  import { createLoadSkillTool, fetchSkillFromUrl, importSkillFile, listSkills, parseSkill, removeSkill, saveSkill, skillsRoot, skillsSystemSection, } from "./skills.js";
21
22
  import { VERSION } from "./version.js";
@@ -27,13 +28,14 @@ const COMMAND_INFO = [
27
28
  { name: "/btw", args: "<question>", desc: "ask a side question without interrupting the task" },
28
29
  { name: "/effort", args: "[level]", desc: "reasoning effort (minimal…high)" },
29
30
  { name: "/key", desc: "enter the API key for the current provider" },
30
- { name: "/dir", args: "[path]", desc: "change the project directory" },
31
+ { name: "/dir", args: "[path]", desc: "move this session to another project directory" },
31
32
  { name: "/context", desc: "project summary" },
32
33
  { name: "/usage", desc: "tokens, cost and time" },
33
34
  { name: "/sessions", desc: "list and resume recent sessions" },
34
35
  { name: "/timeline", desc: "jump to a sent message" },
35
36
  { name: "/undo", desc: "take back the last message" },
36
37
  { name: "/verbose", desc: "toggle full tool output" },
38
+ { name: "/settings", desc: "tune the agent's persona: character, tone, verbosity…" },
37
39
  { name: "/skills", args: "[add|remove|list]", desc: "manage agent skills" },
38
40
  { name: "/mcp", args: "[list|add|remove]", desc: "manage MCP servers" },
39
41
  { name: "/theme", args: "[id]", desc: "change the color theme" },
@@ -75,6 +77,7 @@ class TuiApp {
75
77
  model = "";
76
78
  effort = null;
77
79
  config = {};
80
+ persona = {};
78
81
  summary = null;
79
82
  skills = [];
80
83
  system = "";
@@ -137,6 +140,8 @@ class TuiApp {
137
140
  modeBadgeWidth = 0;
138
141
  modeBadgeHover = false;
139
142
  versionNotice = null;
143
+ sessionDir;
144
+ conversationTitle = null;
140
145
  bottomHintStart = -1;
141
146
  bottomHintWidth = 0;
142
147
  bottomHintRow = -1;
@@ -148,6 +153,7 @@ class TuiApp {
148
153
  constructor(options, input, output) {
149
154
  this.opts = options;
150
155
  this.dir = path.resolve(options.dir);
156
+ this.sessionDir = this.dir;
151
157
  this.gateMode = options.allowAll ? "always" : "ask";
152
158
  this.out = output;
153
159
  this.kb = new Keyboard(input, output);
@@ -182,6 +188,7 @@ class TuiApp {
182
188
  process.exit(143);
183
189
  });
184
190
  this.config = await loadConfig().catch(() => ({}));
191
+ this.persona = this.config.persona ? { ...this.config.persona } : {};
185
192
  for (const [name, value] of Object.entries(this.config.keys ?? {})) {
186
193
  if (value && process.env[name] === undefined)
187
194
  process.env[name] = value;
@@ -748,9 +755,15 @@ class TuiApp {
748
755
  try {
749
756
  const response = await provider.complete({
750
757
  model: this.model,
751
- system: `${this.system ? `${this.system}\n\n` : ""}# side channel\nThe user is asking a quick side question while the main task runs. Answer briefly and directly. Do not use tools, do not change the main task, and do not ask to run anything.`,
758
+ system: [
759
+ this.system,
760
+ personaSection(this.persona),
761
+ "# side channel\nThe user is asking a quick side question while the main task runs. Answer briefly and directly. Do not use tools, do not change the main task, and do not ask to run anything.",
762
+ ]
763
+ .filter(Boolean)
764
+ .join("\n\n"),
752
765
  messages: [
753
- ...this.session.getMessages(),
766
+ ...sideChannelMessages(this.session.getMessages()),
754
767
  { role: "user", content: [{ type: "text", text }] },
755
768
  ],
756
769
  maxTokens: 2048,
@@ -995,6 +1008,10 @@ class TuiApp {
995
1008
  return;
996
1009
  }
997
1010
  if (this.mode === "picker" && this.picker) {
1011
+ if (this.picker.backAt(row - this.lastHeaderRows)) {
1012
+ this.closePicker(null);
1013
+ return;
1014
+ }
998
1015
  const value = this.picker.pickAt(row - this.lastHeaderRows);
999
1016
  if (value !== null)
1000
1017
  this.closePicker(value);
@@ -1218,7 +1235,7 @@ class TuiApp {
1218
1235
  this.bottomHintStart >= 0 ? this.lastHeaderRows + viewport + footer.length - 1 : -1;
1219
1236
  let content;
1220
1237
  if (this.mode === "picker" && this.picker) {
1221
- content = this.picker.render(this.contentWidth() - 2, viewport);
1238
+ content = this.picker.render(this.contentWidth(), viewport);
1222
1239
  }
1223
1240
  else {
1224
1241
  content = this.visibleTranscript(viewport);
@@ -1348,8 +1365,9 @@ class TuiApp {
1348
1365
  return [rule, "", bottom];
1349
1366
  }
1350
1367
  statusLine() {
1351
- const spin = tone.accent(glyphs.spinner[this.spinnerFrame % glyphs.spinner.length] ?? "-");
1352
- const elapsed = ((performance.now() - this.statusStartedAt) / 1000).toFixed(1);
1368
+ const now = performance.now();
1369
+ const elapsedMs = now - this.statusStartedAt;
1370
+ const elapsed = (elapsedMs / 1000).toFixed(1);
1353
1371
  const meta = [
1354
1372
  this.status?.meta,
1355
1373
  `${elapsed}s`,
@@ -1357,13 +1375,27 @@ class TuiApp {
1357
1375
  ]
1358
1376
  .filter(Boolean)
1359
1377
  .join(" · ");
1360
- return ` ${spin} ${this.status?.label ?? ""} ${tone.mist(meta)}`;
1378
+ const frames = glyphs.spinner;
1379
+ const glyph = frames[this.spinnerFrame % frames.length] ?? glyphs.diamond;
1380
+ const icon = fg(mix(palette.accent, palette.bone, pulse(now, 900)), glyph);
1381
+ const base = mix(palette.silver, palette.mist, 0.35);
1382
+ let label;
1383
+ if (this.status?.phase === "tool") {
1384
+ const name = this.status.label;
1385
+ label = `${tone.accent(toolGlyph(name))} ${shimmer(name, now / 55, { base, highlight: palette.bone })}`;
1386
+ }
1387
+ else {
1388
+ label = shimmer(this.status?.label ?? "", now / 55, { base, highlight: palette.bone });
1389
+ }
1390
+ return ` ${icon} ${label} ${tone.mist(meta)}`;
1361
1391
  }
1362
1392
  visibleTranscript(viewport) {
1363
- const total = this.transcript.length;
1364
- const maxOffset = Math.max(0, total - viewport);
1393
+ let contentEnd = this.transcript.length;
1394
+ while (contentEnd > 0 && this.transcript[contentEnd - 1] === "")
1395
+ contentEnd -= 1;
1396
+ const maxOffset = Math.max(0, contentEnd - viewport);
1365
1397
  this.scrollOffset = Math.max(0, Math.min(this.scrollOffset, maxOffset));
1366
- const end = total - this.scrollOffset;
1398
+ const end = contentEnd - this.scrollOffset;
1367
1399
  const start = Math.max(0, end - viewport);
1368
1400
  this.lastVisibleStart = start;
1369
1401
  return this.transcript.slice(start, end);
@@ -1418,7 +1450,7 @@ class TuiApp {
1418
1450
  this.spinnerTimer = setInterval(() => {
1419
1451
  this.spinnerFrame += 1;
1420
1452
  this.scheduleRender();
1421
- }, 90);
1453
+ }, 75);
1422
1454
  if (typeof this.spinnerTimer.unref === "function")
1423
1455
  this.spinnerTimer.unref();
1424
1456
  }
@@ -1564,7 +1596,7 @@ class TuiApp {
1564
1596
  this.agentMode = this.agentMode === "build" ? "plan" : "build";
1565
1597
  this.rebuildTools();
1566
1598
  this.append([
1567
- ` ${tone.accent(glyphs.diamond)} ${tone.mist(`// MODE → ${this.agentMode.toUpperCase()}`)}${this.agentMode === "plan" ? ` ${tone.amber("no edits · run_command allowed (with approval)")}` : ""}`,
1599
+ ` ${tone.accent(glyphs.diamond)} ${tone.mist(`// MODE → ${this.agentMode.toUpperCase()}`)}${this.agentMode === "plan" ? ` ${tone.amber("· no edits")}` : ""}`,
1568
1600
  ]);
1569
1601
  }
1570
1602
  ensureProvider() {
@@ -2012,6 +2044,9 @@ class TuiApp {
2012
2044
  const mcpSection = mcpInstructionsSection(this.mcp.instructions());
2013
2045
  if (mcpSection)
2014
2046
  system = system ? `${system}\n\n${mcpSection}` : mcpSection;
2047
+ const persona = personaSection(this.persona);
2048
+ if (persona)
2049
+ system = system ? `${system}\n\n${persona}` : persona;
2015
2050
  if (this.agentMode === "plan") {
2016
2051
  system = `${system ? `${system}\n\n` : ""}# mode\nYou are in PLAN mode: analyze the codebase and propose a plan. You may run read-only commands with run_command to inspect the project (each command is approved by the user), but never modify files, install packages or run mutating commands. When the plan is ready, present it and tell the user to press Tab to switch to BUILD mode.`;
2017
2052
  }
@@ -2118,6 +2153,8 @@ class TuiApp {
2118
2153
  this.session = new Session(this.system);
2119
2154
  this.conversationId = makeSessionId();
2120
2155
  this.providerSessionId = makeSessionId();
2156
+ this.sessionDir = this.dir;
2157
+ this.conversationTitle = null;
2121
2158
  this.lastTurn = null;
2122
2159
  this.pendingImages = new Map();
2123
2160
  this.transcript = [];
@@ -2179,6 +2216,9 @@ class TuiApp {
2179
2216
  ` ${tone.mist(`// VERBOSE ${this.verbose ? "ON — FULL TOOL OUTPUT" : "OFF"}`)}`,
2180
2217
  ]);
2181
2218
  return false;
2219
+ case "settings":
2220
+ await this.openSettings();
2221
+ return false;
2182
2222
  case "theme":
2183
2223
  await this.changeTheme(arg);
2184
2224
  return false;
@@ -2199,6 +2239,45 @@ class TuiApp {
2199
2239
  return false;
2200
2240
  }
2201
2241
  }
2242
+ async openSettings() {
2243
+ const before = JSON.stringify(this.persona);
2244
+ for (;;) {
2245
+ const entries = PERSONA_SETTINGS.map((setting) => ({
2246
+ kind: "item",
2247
+ value: setting.id,
2248
+ label: `${ASCII_MODE ? setting.asciiIcon : setting.icon} ${setting.label}`,
2249
+ hint: this.persona[setting.id] ?? AUTO,
2250
+ }));
2251
+ const id = await this.openPicker(new Picker({ title: "settings", entries, filterable: false }));
2252
+ if (!id)
2253
+ break;
2254
+ const setting = PERSONA_SETTINGS.find((entry) => entry.id === id);
2255
+ if (!setting)
2256
+ break;
2257
+ const current = this.persona[setting.id] ?? AUTO;
2258
+ const valueEntries = setting.options.map((option) => ({
2259
+ kind: "item",
2260
+ value: option.value,
2261
+ label: option.value === current ? `${glyphs.check} ${option.label}` : ` ${option.label}`,
2262
+ hint: option.description,
2263
+ }));
2264
+ const value = await this.openPicker(new Picker({ title: setting.label, entries: valueEntries, filterable: false }));
2265
+ if (value === null)
2266
+ continue;
2267
+ if (value === AUTO)
2268
+ delete this.persona[setting.id];
2269
+ else
2270
+ this.persona[setting.id] = value;
2271
+ }
2272
+ if (JSON.stringify(this.persona) !== before) {
2273
+ this.config.persona = this.persona;
2274
+ void saveConfig({ ...this.config }).catch(() => undefined);
2275
+ this.append([
2276
+ ` ${tone.accent(glyphs.diamond)} ${tone.mist(`// SETTINGS → ${personaSummary(this.persona)}`)}`,
2277
+ "",
2278
+ ]);
2279
+ }
2280
+ }
2202
2281
  async changeTheme(arg) {
2203
2282
  const current = activeThemeId();
2204
2283
  if (arg) {
@@ -2235,7 +2314,14 @@ class TuiApp {
2235
2314
  const records = await listSessionsForDir(this.dir, max);
2236
2315
  const conversations = sortConversations(latestPerConversation(records));
2237
2316
  if (conversations.length === 0) {
2238
- this.append([` ${tone.mist(`// NO SESSIONS YET IN ${shortenHome(this.dir).toUpperCase()}`)}`]);
2317
+ const lines = [
2318
+ ` ${tone.mist(`// NO SESSIONS YET IN ${shortenHome(this.dir).toUpperCase()}`)}`,
2319
+ ];
2320
+ const elsewhere = await this.latestSessionElsewhere();
2321
+ if (elsewhere) {
2322
+ lines.push(` ${tone.mist(`// latest: "${clipAnsi(displayTitle(elsewhere), 48)}" in ${shortenHome(elsewhere.cwd)}`)}`, ` ${tone.mist(`// resume it with: /dir ${shortenHome(elsewhere.cwd)} then /sessions`)}`);
2323
+ }
2324
+ this.append(lines);
2239
2325
  return;
2240
2326
  }
2241
2327
  const labelWidth = Math.max(20, this.contentWidth() - 62);
@@ -2243,7 +2329,7 @@ class TuiApp {
2243
2329
  kind: "item",
2244
2330
  value: conversationKey(record),
2245
2331
  label: `${record.pinned ? `${glyphs.pin} ` : ""}${clipAnsi(displayTitle(record), labelWidth)}`,
2246
- hint: `${record.pinned ? "pinned · " : ""}${record.createdAt.slice(0, 16).replace("T", " ")} · ${record.provider ? `${record.provider} · ` : ""}${record.model} · ${record.status} · ${record.steps} steps`,
2332
+ hint: `${record.pinned ? "pinned · " : ""}${record.provider ? `${record.provider} · ` : ""}${record.model} · ${record.createdAt.slice(0, 16).replace("T", " ")}`,
2247
2333
  }));
2248
2334
  const chosen = await this.openPicker(new Picker({
2249
2335
  title: "sessions · enter resumes",
@@ -2299,6 +2385,7 @@ class TuiApp {
2299
2385
  if (!title)
2300
2386
  return;
2301
2387
  await updateConversation(conversationKey(record), { title });
2388
+ this.conversationTitle = title;
2302
2389
  this.append([
2303
2390
  ` ${tone.accent(glyphs.diamond)} ${tone.mist(`// SESSION RENAMED → ${clipAnsi(title, 60)}`)}`,
2304
2391
  ]);
@@ -2307,6 +2394,8 @@ class TuiApp {
2307
2394
  const messages = record.messages ?? [];
2308
2395
  this.session = new Session(this.system, messages);
2309
2396
  this.conversationId = conversationKey(record);
2397
+ this.sessionDir = record.cwd ?? this.dir;
2398
+ this.conversationTitle = record.title ?? null;
2310
2399
  this.providerSessionId = makeSessionId();
2311
2400
  if (record.model) {
2312
2401
  const resolved = record.provider && providerHasModel(record.provider, record.model)
@@ -2786,28 +2875,56 @@ class TuiApp {
2786
2875
  this.scheduleRender();
2787
2876
  return choice === "allow" || choice === "always";
2788
2877
  }
2878
+ async latestSessionElsewhere() {
2879
+ const records = await listSessions(50).catch(() => []);
2880
+ return (records.find((record) => record.cwd && !sameDir(record.cwd, this.dir)) ?? null);
2881
+ }
2882
+ /**
2883
+ * On Windows a leading "/" is the drive root, so "/Downloads" resolves to
2884
+ * C:\Downloads instead of the user's Downloads folder. Treat it (and "~")
2885
+ * as home-relative so Unix-style paths do what users expect.
2886
+ */
2887
+ resolveDirArg(arg) {
2888
+ let target = arg.trim();
2889
+ if (target === "~") {
2890
+ target = homedir();
2891
+ }
2892
+ else if (target.startsWith("~/") || target.startsWith("~\\")) {
2893
+ target = path.join(homedir(), target.slice(2));
2894
+ }
2895
+ else if (process.platform === "win32" &&
2896
+ target.startsWith("/") &&
2897
+ !target.startsWith("//")) {
2898
+ target = path.join(homedir(), target);
2899
+ }
2900
+ return path.resolve(this.dir, target);
2901
+ }
2789
2902
  async changeDir(arg) {
2790
2903
  if (!arg) {
2791
2904
  this.append([` ${tone.mist(`// DIR ${this.dir}`)}`]);
2792
2905
  return;
2793
2906
  }
2794
- const next = path.resolve(this.dir, arg);
2907
+ const next = this.resolveDirArg(arg);
2795
2908
  if (next === this.dir) {
2796
2909
  this.append([` ${tone.mist("// already in this directory")}`]);
2797
2910
  return;
2798
2911
  }
2912
+ const messages = this.session.getMessages().map((message) => ({ ...message }));
2799
2913
  this.dir = next;
2800
2914
  this.rebuildTools();
2801
- this.session = new Session("");
2915
+ this.lastTurn = null;
2802
2916
  try {
2803
2917
  const meta = await this.loadProject();
2804
- this.session = new Session(this.system);
2918
+ this.session = new Session(this.system, messages);
2805
2919
  this.append([
2806
- ` ${tone.mist(`// DIR → ${shortenHome(this.dir)}`)}`,
2920
+ ` ${tone.accent(glyphs.diamond)} ${tone.mist(`// SESSION MOVED → ${shortenHome(this.dir)}`)}`,
2807
2921
  ` ${tone.mist("// PROJECT")} ${meta}`,
2922
+ ` ${tone.mist(`// ${messages.length} message${messages.length === 1 ? "" : "s"} carried over`)}`,
2923
+ ` ${tone.mist("// in-memory only — the session keeps its original history")}`,
2808
2924
  ]);
2809
2925
  }
2810
2926
  catch (err) {
2927
+ this.session = new Session(this.system, messages);
2811
2928
  this.append([` ${tone.red(`// failed to scan project: ${errorMessage(err)}`)}`]);
2812
2929
  }
2813
2930
  }
@@ -2902,6 +3019,7 @@ class TuiApp {
2902
3019
  ["mouse drag", "select text · ctrl+c copies"],
2903
3020
  ["click in input", "place the cursor"],
2904
3021
  ["permission card", "← → select · enter confirm · mouse click"],
3022
+ ["pickers", "↑↓ move · enter select · ← or esc back · click rows and the ← back button"],
2905
3023
  ["sessions picker", "ctrl+r rename · ctrl+p pin · ctrl+d delete"],
2906
3024
  ["↑ ↓", "input history — previous / next message"],
2907
3025
  ["wheel", "scroll the conversation"],
@@ -2942,7 +3060,7 @@ class TuiApp {
2942
3060
  continue;
2943
3061
  }
2944
3062
  const prefix = index === 0 ? `${tone.accent(glyphs.prompt)} ` : " ";
2945
- const kind = index === 0 ? "bold" : "plain";
3063
+ const kind = "bold";
2946
3064
  out.push(...wrapSegments([{ text: line, kind }], prefix, " ", width));
2947
3065
  }
2948
3066
  if (imageCount > 0) {
@@ -2955,8 +3073,9 @@ class TuiApp {
2955
3073
  const record = {
2956
3074
  id: makeSessionId(),
2957
3075
  createdAt: new Date().toISOString(),
2958
- cwd: this.dir,
3076
+ cwd: this.sessionDir,
2959
3077
  task: input,
3078
+ title: this.conversationTitle ?? this.sessionTitleFromMessages(),
2960
3079
  provider: this.providerId,
2961
3080
  model: this.model,
2962
3081
  status: result.status,
@@ -2980,6 +3099,22 @@ class TuiApp {
2980
3099
  }
2981
3100
  return record.id;
2982
3101
  }
3102
+ sessionTitleFromMessages() {
3103
+ for (const message of this.session.getMessages()) {
3104
+ if (message.role !== "user")
3105
+ continue;
3106
+ const text = message.content
3107
+ .map((part) => (part.type === "text" ? part.text : ""))
3108
+ .join(" ")
3109
+ .replace(/\[Image \d+\]/g, " ")
3110
+ .replace(/\s+/g, " ")
3111
+ .trim();
3112
+ if (!text)
3113
+ continue;
3114
+ return text.length > 60 ? `${text.slice(0, 59)}…` : text;
3115
+ }
3116
+ return "(untitled)";
3117
+ }
2983
3118
  printGoodbye() {
2984
3119
  this.append(["", ` ${tone.mist(`// SESSION CLOSED · ${this.summaryLine()}`)}`]);
2985
3120
  }
@@ -3037,6 +3172,29 @@ const IMAGE_EXTENSIONS = {
3037
3172
  ".bmp": "image/bmp",
3038
3173
  };
3039
3174
  const IMAGE_MARKER_RE = /\[Image (\d+)\]/g;
3175
+ /**
3176
+ * A side-channel (/btw) request can run while a tool call is still in flight,
3177
+ * so the transcript may end with an assistant tool_call that has no tool result
3178
+ * yet. Providers reject such a sequence (400), so drop unanswered tool_calls.
3179
+ */
3180
+ export function sideChannelMessages(messages) {
3181
+ const answered = new Set();
3182
+ for (const message of messages) {
3183
+ if (message.role === "tool")
3184
+ answered.add(message.toolCallId);
3185
+ }
3186
+ const out = [];
3187
+ for (const message of messages) {
3188
+ if (message.role !== "assistant" || !message.content.some((part) => part.type === "tool_call")) {
3189
+ out.push(message);
3190
+ continue;
3191
+ }
3192
+ const content = message.content.filter((part) => part.type !== "tool_call" || answered.has(part.id));
3193
+ if (content.length > 0)
3194
+ out.push({ ...message, content });
3195
+ }
3196
+ return out;
3197
+ }
3040
3198
  export function nextImageIndex(text) {
3041
3199
  const used = new Set();
3042
3200
  for (const match of text.matchAll(IMAGE_MARKER_RE)) {