@mariozechner/pi-coding-agent 0.46.0 → 0.48.0
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/CHANGELOG.md +61 -1
- package/README.md +34 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +10 -1
- package/dist/config.js.map +1 -1
- package/dist/core/agent-session.d.ts +16 -3
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +125 -22
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/compaction/branch-summarization.d.ts +2 -0
- package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
- package/dist/core/compaction/branch-summarization.js +11 -4
- package/dist/core/compaction/branch-summarization.js.map +1 -1
- package/dist/core/export-html/ansi-to-html.d.ts +22 -0
- package/dist/core/export-html/ansi-to-html.d.ts.map +1 -0
- package/dist/core/export-html/ansi-to-html.js +249 -0
- package/dist/core/export-html/ansi-to-html.js.map +1 -0
- package/dist/core/export-html/index.d.ts +17 -0
- package/dist/core/export-html/index.d.ts.map +1 -1
- package/dist/core/export-html/index.js +52 -23
- package/dist/core/export-html/index.js.map +1 -1
- package/dist/core/export-html/template.css +0 -33
- package/dist/core/export-html/template.js +171 -18
- package/dist/core/export-html/tool-renderer.d.ts +35 -0
- package/dist/core/export-html/tool-renderer.d.ts.map +1 -0
- package/dist/core/export-html/tool-renderer.js +57 -0
- package/dist/core/export-html/tool-renderer.js.map +1 -0
- package/dist/core/extensions/index.d.ts +1 -1
- package/dist/core/extensions/index.d.ts.map +1 -1
- package/dist/core/extensions/index.js.map +1 -1
- package/dist/core/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/runner.d.ts +8 -1
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +41 -0
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +45 -6
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/prompt-templates.d.ts +5 -1
- package/dist/core/prompt-templates.d.ts.map +1 -1
- package/dist/core/prompt-templates.js +22 -28
- package/dist/core/prompt-templates.js.map +1 -1
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +5 -1
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-manager.d.ts +8 -0
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +43 -0
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/settings-manager.d.ts +9 -0
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +21 -0
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/skills.d.ts.map +1 -1
- package/dist/core/skills.js +6 -37
- package/dist/core/skills.js.map +1 -1
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js +19 -14
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/tools/bash.d.ts +2 -0
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +4 -1
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/index.d.ts +4 -1
- package/dist/core/tools/index.d.ts.map +1 -1
- package/dist/core/tools/index.js +8 -3
- package/dist/core/tools/index.js.map +1 -1
- package/dist/core/tools/path-utils.d.ts +1 -0
- package/dist/core/tools/path-utils.d.ts.map +1 -1
- package/dist/core/tools/path-utils.js +7 -0
- package/dist/core/tools/path-utils.js.map +1 -1
- package/dist/core/tools/read.d.ts.map +1 -1
- package/dist/core/tools/read.js +13 -2
- package/dist/core/tools/read.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +84 -14
- package/dist/main.js.map +1 -1
- package/dist/modes/interactive/components/custom-editor.d.ts +2 -2
- package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-editor.js +2 -2
- package/dist/modes/interactive/components/custom-editor.js.map +1 -1
- package/dist/modes/interactive/components/extension-editor.d.ts +2 -2
- package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-editor.js +3 -3
- package/dist/modes/interactive/components/extension-editor.js.map +1 -1
- package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/session-selector.js +5 -3
- package/dist/modes/interactive/components/session-selector.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector.d.ts +2 -0
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +12 -0
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +3 -1
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/components/tree-selector.d.ts +7 -0
- package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/tree-selector.js +140 -4
- package/dist/modes/interactive/components/tree-selector.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +123 -106
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/theme/theme-schema.json +23 -3
- package/dist/modes/print-mode.d.ts.map +1 -1
- package/dist/modes/print-mode.js +7 -2
- package/dist/modes/print-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-mode.js +7 -1
- package/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/dist/utils/frontmatter.d.ts +8 -0
- package/dist/utils/frontmatter.d.ts.map +1 -0
- package/dist/utils/frontmatter.js +26 -0
- package/dist/utils/frontmatter.js.map +1 -0
- package/dist/utils/image-convert.d.ts.map +1 -1
- package/dist/utils/image-convert.js +6 -1
- package/dist/utils/image-convert.js.map +1 -1
- package/dist/utils/image-resize.d.ts.map +1 -1
- package/dist/utils/image-resize.js +14 -1
- package/dist/utils/image-resize.js.map +1 -1
- package/dist/utils/photon.d.ts +28 -0
- package/dist/utils/photon.d.ts.map +1 -0
- package/dist/utils/photon.js +51 -0
- package/dist/utils/photon.js.map +1 -0
- package/docs/extensions.md +83 -4
- package/docs/rpc.md +17 -15
- package/docs/sdk.md +1 -1
- package/docs/tree.md +20 -2
- package/docs/tui.md +26 -0
- package/examples/extensions/input-transform.ts +43 -0
- package/examples/extensions/modal-editor.ts +1 -1
- package/examples/extensions/overlay-test.ts +8 -3
- package/examples/extensions/question.ts +1 -1
- package/examples/extensions/questionnaire.ts +1 -1
- package/examples/extensions/rainbow-editor.ts +1 -8
- package/examples/extensions/subagent/agents.ts +3 -32
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/package.json +6 -5
|
@@ -65,6 +65,7 @@ export class InteractiveMode {
|
|
|
65
65
|
keybindings;
|
|
66
66
|
version;
|
|
67
67
|
isInitialized = false;
|
|
68
|
+
hasRenderedInitialMessages = false;
|
|
68
69
|
onInputCallback;
|
|
69
70
|
loadingAnimation = undefined;
|
|
70
71
|
defaultWorkingMessage = "Working...";
|
|
@@ -136,7 +137,8 @@ export class InteractiveMode {
|
|
|
136
137
|
this.statusContainer = new Container();
|
|
137
138
|
this.widgetContainer = new Container();
|
|
138
139
|
this.keybindings = KeybindingsManager.create();
|
|
139
|
-
|
|
140
|
+
const editorPaddingX = this.settingsManager.getEditorPaddingX();
|
|
141
|
+
this.defaultEditor = new CustomEditor(this.ui, getEditorTheme(), this.keybindings, { paddingX: editorPaddingX });
|
|
140
142
|
this.editor = this.defaultEditor;
|
|
141
143
|
this.editorContainer = new Container();
|
|
142
144
|
this.editorContainer.addChild(this.editor);
|
|
@@ -204,6 +206,7 @@ export class InteractiveMode {
|
|
|
204
206
|
const extensionCommands = (this.session.extensionRunner?.getRegisteredCommands() ?? []).map((cmd) => ({
|
|
205
207
|
name: cmd.name,
|
|
206
208
|
description: cmd.description ?? "(extension command)",
|
|
209
|
+
getArgumentCompletions: cmd.getArgumentCompletions,
|
|
207
210
|
}));
|
|
208
211
|
// Build skill commands from session.skills (if enabled)
|
|
209
212
|
this.skillCommands.clear();
|
|
@@ -230,53 +233,67 @@ export class InteractiveMode {
|
|
|
230
233
|
// Setup autocomplete with fd tool for file path completion
|
|
231
234
|
this.fdPath = await ensureTool("fd");
|
|
232
235
|
this.setupAutocomplete(this.fdPath);
|
|
233
|
-
// Add header with keybindings from config
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
this.
|
|
267
|
-
|
|
236
|
+
// Add header with keybindings from config (unless silenced)
|
|
237
|
+
if (!this.settingsManager.getQuietStartup()) {
|
|
238
|
+
const logo = theme.bold(theme.fg("accent", APP_NAME)) + theme.fg("dim", ` v${this.version}`);
|
|
239
|
+
// Build startup instructions using keybinding hint helpers
|
|
240
|
+
const kb = this.keybindings;
|
|
241
|
+
const hint = (action, desc) => appKeyHint(kb, action, desc);
|
|
242
|
+
const instructions = [
|
|
243
|
+
hint("interrupt", "to interrupt"),
|
|
244
|
+
hint("clear", "to clear"),
|
|
245
|
+
rawKeyHint(`${appKey(kb, "clear")} twice`, "to exit"),
|
|
246
|
+
hint("exit", "to exit (empty)"),
|
|
247
|
+
hint("suspend", "to suspend"),
|
|
248
|
+
keyHint("deleteToLineEnd", "to delete to end"),
|
|
249
|
+
hint("cycleThinkingLevel", "to cycle thinking"),
|
|
250
|
+
rawKeyHint(`${appKey(kb, "cycleModelForward")}/${appKey(kb, "cycleModelBackward")}`, "to cycle models"),
|
|
251
|
+
hint("selectModel", "to select model"),
|
|
252
|
+
hint("expandTools", "to expand tools"),
|
|
253
|
+
hint("toggleThinking", "to toggle thinking"),
|
|
254
|
+
hint("externalEditor", "for external editor"),
|
|
255
|
+
rawKeyHint("/", "for commands"),
|
|
256
|
+
rawKeyHint("!", "to run bash"),
|
|
257
|
+
rawKeyHint("!!", "to run bash (no context)"),
|
|
258
|
+
hint("followUp", "to queue follow-up"),
|
|
259
|
+
hint("dequeue", "to edit all queued messages"),
|
|
260
|
+
hint("pasteImage", "to paste image"),
|
|
261
|
+
rawKeyHint("drop files", "to attach"),
|
|
262
|
+
].join("\n");
|
|
263
|
+
this.builtInHeader = new Text(`${logo}\n${instructions}`, 1, 0);
|
|
264
|
+
// Setup UI layout
|
|
265
|
+
this.ui.addChild(new Spacer(1));
|
|
266
|
+
this.ui.addChild(this.builtInHeader);
|
|
267
|
+
this.ui.addChild(new Spacer(1));
|
|
268
|
+
// Add changelog if provided
|
|
269
|
+
if (this.changelogMarkdown) {
|
|
270
|
+
this.ui.addChild(new DynamicBorder());
|
|
271
|
+
if (this.settingsManager.getCollapseChangelog()) {
|
|
272
|
+
const versionMatch = this.changelogMarkdown.match(/##\s+\[?(\d+\.\d+\.\d+)\]?/);
|
|
273
|
+
const latestVersion = versionMatch ? versionMatch[1] : this.version;
|
|
274
|
+
const condensedText = `Updated to v${latestVersion}. Use ${theme.bold("/changelog")} to view full changelog.`;
|
|
275
|
+
this.ui.addChild(new Text(condensedText, 1, 0));
|
|
276
|
+
}
|
|
277
|
+
else {
|
|
278
|
+
this.ui.addChild(new Text(theme.bold(theme.fg("accent", "What's New")), 1, 0));
|
|
279
|
+
this.ui.addChild(new Spacer(1));
|
|
280
|
+
this.ui.addChild(new Markdown(this.changelogMarkdown.trim(), 1, 0, getMarkdownTheme()));
|
|
281
|
+
this.ui.addChild(new Spacer(1));
|
|
282
|
+
}
|
|
283
|
+
this.ui.addChild(new DynamicBorder());
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
else {
|
|
287
|
+
// Minimal header when silenced
|
|
288
|
+
this.builtInHeader = new Text("", 0, 0);
|
|
289
|
+
if (this.changelogMarkdown) {
|
|
290
|
+
// Still show changelog notification even in silent mode
|
|
291
|
+
this.ui.addChild(new Spacer(1));
|
|
268
292
|
const versionMatch = this.changelogMarkdown.match(/##\s+\[?(\d+\.\d+\.\d+)\]?/);
|
|
269
293
|
const latestVersion = versionMatch ? versionMatch[1] : this.version;
|
|
270
294
|
const condensedText = `Updated to v${latestVersion}. Use ${theme.bold("/changelog")} to view full changelog.`;
|
|
271
295
|
this.ui.addChild(new Text(condensedText, 1, 0));
|
|
272
296
|
}
|
|
273
|
-
else {
|
|
274
|
-
this.ui.addChild(new Text(theme.bold(theme.fg("accent", "What's New")), 1, 0));
|
|
275
|
-
this.ui.addChild(new Spacer(1));
|
|
276
|
-
this.ui.addChild(new Markdown(this.changelogMarkdown.trim(), 1, 0, getMarkdownTheme()));
|
|
277
|
-
this.ui.addChild(new Spacer(1));
|
|
278
|
-
}
|
|
279
|
-
this.ui.addChild(new DynamicBorder());
|
|
280
297
|
}
|
|
281
298
|
this.ui.addChild(this.chatContainer);
|
|
282
299
|
this.ui.addChild(this.pendingMessagesContainer);
|
|
@@ -421,33 +438,38 @@ export class InteractiveMode {
|
|
|
421
438
|
* Initialize the extension system with TUI-based UI context.
|
|
422
439
|
*/
|
|
423
440
|
async initExtensions() {
|
|
424
|
-
// Show
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
const
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
const
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
const
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
this.
|
|
441
|
+
// Show discovery info unless silenced
|
|
442
|
+
if (!this.settingsManager.getQuietStartup()) {
|
|
443
|
+
// Show loaded project context files
|
|
444
|
+
const contextFiles = loadProjectContextFiles();
|
|
445
|
+
if (contextFiles.length > 0) {
|
|
446
|
+
const contextList = contextFiles.map((f) => theme.fg("dim", ` ${f.path}`)).join("\n");
|
|
447
|
+
this.chatContainer.addChild(new Text(theme.fg("muted", "Loaded context:\n") + contextList, 0, 0));
|
|
448
|
+
this.chatContainer.addChild(new Spacer(1));
|
|
449
|
+
}
|
|
450
|
+
// Show loaded skills (already discovered by SDK)
|
|
451
|
+
const skills = this.session.skills;
|
|
452
|
+
if (skills.length > 0) {
|
|
453
|
+
const skillList = skills.map((s) => theme.fg("dim", ` ${s.filePath}`)).join("\n");
|
|
454
|
+
this.chatContainer.addChild(new Text(theme.fg("muted", "Loaded skills:\n") + skillList, 0, 0));
|
|
455
|
+
this.chatContainer.addChild(new Spacer(1));
|
|
456
|
+
}
|
|
457
|
+
// Show skill warnings if any
|
|
458
|
+
const skillWarnings = this.session.skillWarnings;
|
|
459
|
+
if (skillWarnings.length > 0) {
|
|
460
|
+
const warningList = skillWarnings
|
|
461
|
+
.map((w) => theme.fg("warning", ` ${w.skillPath}: ${w.message}`))
|
|
462
|
+
.join("\n");
|
|
463
|
+
this.chatContainer.addChild(new Text(theme.fg("warning", "Skill warnings:\n") + warningList, 0, 0));
|
|
464
|
+
this.chatContainer.addChild(new Spacer(1));
|
|
465
|
+
}
|
|
466
|
+
// Show loaded prompt templates
|
|
467
|
+
const templates = this.session.promptTemplates;
|
|
468
|
+
if (templates.length > 0) {
|
|
469
|
+
const templateList = templates.map((t) => theme.fg("dim", ` /${t.name} ${t.source}`)).join("\n");
|
|
470
|
+
this.chatContainer.addChild(new Text(theme.fg("muted", "Loaded prompt templates:\n") + templateList, 0, 0));
|
|
471
|
+
this.chatContainer.addChild(new Spacer(1));
|
|
472
|
+
}
|
|
451
473
|
}
|
|
452
474
|
const extensionRunner = this.session.extensionRunner;
|
|
453
475
|
if (!extensionRunner) {
|
|
@@ -463,7 +485,9 @@ export class InteractiveMode {
|
|
|
463
485
|
this.session
|
|
464
486
|
.sendCustomMessage(message, options)
|
|
465
487
|
.then(() => {
|
|
466
|
-
if
|
|
488
|
+
// Don't rebuild if initial render hasn't happened yet
|
|
489
|
+
// (renderInitialMessages will handle it)
|
|
490
|
+
if (!wasStreaming && message.display && this.hasRenderedInitialMessages) {
|
|
467
491
|
this.rebuildChatFromMessages();
|
|
468
492
|
}
|
|
469
493
|
})
|
|
@@ -547,7 +571,12 @@ export class InteractiveMode {
|
|
|
547
571
|
return { cancelled: false };
|
|
548
572
|
},
|
|
549
573
|
navigateTree: async (targetId, options) => {
|
|
550
|
-
const result = await this.session.navigateTree(targetId, {
|
|
574
|
+
const result = await this.session.navigateTree(targetId, {
|
|
575
|
+
summarize: options?.summarize,
|
|
576
|
+
customInstructions: options?.customInstructions,
|
|
577
|
+
replaceInstructions: options?.replaceInstructions,
|
|
578
|
+
label: options?.label,
|
|
579
|
+
});
|
|
551
580
|
if (result.cancelled) {
|
|
552
581
|
return { cancelled: true };
|
|
553
582
|
}
|
|
@@ -566,12 +595,14 @@ export class InteractiveMode {
|
|
|
566
595
|
});
|
|
567
596
|
// Set up extension-registered shortcuts
|
|
568
597
|
this.setupExtensionShortcuts(extensionRunner);
|
|
569
|
-
// Show loaded extensions
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
598
|
+
// Show loaded extensions (unless silenced)
|
|
599
|
+
if (!this.settingsManager.getQuietStartup()) {
|
|
600
|
+
const extensionPaths = extensionRunner.getExtensionPaths();
|
|
601
|
+
if (extensionPaths.length > 0) {
|
|
602
|
+
const extList = extensionPaths.map((p) => theme.fg("dim", ` ${p}`)).join("\n");
|
|
603
|
+
this.chatContainer.addChild(new Text(theme.fg("muted", "Loaded extensions:\n") + extList, 0, 0));
|
|
604
|
+
this.chatContainer.addChild(new Spacer(1));
|
|
605
|
+
}
|
|
575
606
|
}
|
|
576
607
|
// Emit session_start event
|
|
577
608
|
await extensionRunner.emit({
|
|
@@ -1241,19 +1272,6 @@ export class InteractiveMode {
|
|
|
1241
1272
|
await this.shutdown();
|
|
1242
1273
|
return;
|
|
1243
1274
|
}
|
|
1244
|
-
// Handle skill commands (/skill:name [args])
|
|
1245
|
-
if (text.startsWith("/skill:")) {
|
|
1246
|
-
const spaceIndex = text.indexOf(" ");
|
|
1247
|
-
const commandName = spaceIndex === -1 ? text.slice(1) : text.slice(1, spaceIndex);
|
|
1248
|
-
const args = spaceIndex === -1 ? "" : text.slice(spaceIndex + 1).trim();
|
|
1249
|
-
const skillPath = this.skillCommands.get(commandName);
|
|
1250
|
-
if (skillPath) {
|
|
1251
|
-
this.editor.addToHistory?.(text);
|
|
1252
|
-
this.editor.setText("");
|
|
1253
|
-
await this.handleSkillCommand(skillPath, args);
|
|
1254
|
-
return;
|
|
1255
|
-
}
|
|
1256
|
-
}
|
|
1257
1275
|
// Handle bash command (! for normal, !! for excluded from context)
|
|
1258
1276
|
if (text.startsWith("!")) {
|
|
1259
1277
|
const isExcluded = text.startsWith("!!");
|
|
@@ -1503,6 +1521,11 @@ export class InteractiveMode {
|
|
|
1503
1521
|
});
|
|
1504
1522
|
this.footer.invalidate();
|
|
1505
1523
|
}
|
|
1524
|
+
else if (event.errorMessage) {
|
|
1525
|
+
// Compaction failed (e.g., quota exceeded, API error)
|
|
1526
|
+
this.chatContainer.addChild(new Spacer(1));
|
|
1527
|
+
this.chatContainer.addChild(new Text(theme.fg("error", event.errorMessage), 1, 0));
|
|
1528
|
+
}
|
|
1506
1529
|
void this.flushCompactionQueue({ willRetry: event.willRetry });
|
|
1507
1530
|
this.ui.requestRender();
|
|
1508
1531
|
break;
|
|
@@ -1690,6 +1713,7 @@ export class InteractiveMode {
|
|
|
1690
1713
|
this.ui.requestRender();
|
|
1691
1714
|
}
|
|
1692
1715
|
renderInitialMessages() {
|
|
1716
|
+
this.hasRenderedInitialMessages = true;
|
|
1693
1717
|
// Get aligned messages and entries from session context
|
|
1694
1718
|
const context = this.sessionManager.buildSessionContext();
|
|
1695
1719
|
this.renderSessionContext(context, {
|
|
@@ -1750,6 +1774,9 @@ export class InteractiveMode {
|
|
|
1750
1774
|
type: "session_shutdown",
|
|
1751
1775
|
});
|
|
1752
1776
|
}
|
|
1777
|
+
// Wait for any pending renders to complete
|
|
1778
|
+
// requestRender() uses process.nextTick(), so we wait one tick
|
|
1779
|
+
await new Promise((resolve) => process.nextTick(resolve));
|
|
1753
1780
|
this.stop();
|
|
1754
1781
|
process.exit(0);
|
|
1755
1782
|
}
|
|
@@ -2117,6 +2144,7 @@ export class InteractiveMode {
|
|
|
2117
2144
|
hideThinkingBlock: this.hideThinkingBlock,
|
|
2118
2145
|
collapseChangelog: this.settingsManager.getCollapseChangelog(),
|
|
2119
2146
|
doubleEscapeAction: this.settingsManager.getDoubleEscapeAction(),
|
|
2147
|
+
editorPaddingX: this.settingsManager.getEditorPaddingX(),
|
|
2120
2148
|
}, {
|
|
2121
2149
|
onAutoCompactChange: (enabled) => {
|
|
2122
2150
|
this.session.setAutoCompactionEnabled(enabled);
|
|
@@ -2183,6 +2211,10 @@ export class InteractiveMode {
|
|
|
2183
2211
|
onDoubleEscapeActionChange: (action) => {
|
|
2184
2212
|
this.settingsManager.setDoubleEscapeAction(action);
|
|
2185
2213
|
},
|
|
2214
|
+
onEditorPaddingXChange: (padding) => {
|
|
2215
|
+
this.settingsManager.setEditorPaddingX(padding);
|
|
2216
|
+
this.defaultEditor.setPaddingX(padding);
|
|
2217
|
+
},
|
|
2186
2218
|
onCancel: () => {
|
|
2187
2219
|
done();
|
|
2188
2220
|
this.ui.requestRender();
|
|
@@ -2823,21 +2855,6 @@ export class InteractiveMode {
|
|
|
2823
2855
|
this.chatContainer.addChild(new Text(info, 1, 0));
|
|
2824
2856
|
this.ui.requestRender();
|
|
2825
2857
|
}
|
|
2826
|
-
async handleSkillCommand(skillPath, args) {
|
|
2827
|
-
try {
|
|
2828
|
-
const content = fs.readFileSync(skillPath, "utf-8");
|
|
2829
|
-
// Strip YAML frontmatter if present
|
|
2830
|
-
const body = content.replace(/^---\n[\s\S]*?\n---\n/, "").trim();
|
|
2831
|
-
const skillDir = path.dirname(skillPath);
|
|
2832
|
-
const header = `Skill location: ${skillPath}\nReferences are relative to ${skillDir}.`;
|
|
2833
|
-
const skillMessage = `${header}\n\n${body}`;
|
|
2834
|
-
const message = args ? `${skillMessage}\n\n---\n\nUser: ${args}` : skillMessage;
|
|
2835
|
-
await this.session.prompt(message);
|
|
2836
|
-
}
|
|
2837
|
-
catch (err) {
|
|
2838
|
-
this.showError(`Failed to load skill: ${err instanceof Error ? err.message : String(err)}`);
|
|
2839
|
-
}
|
|
2840
|
-
}
|
|
2841
2858
|
handleChangelogCommand() {
|
|
2842
2859
|
const changelogPath = getChangelogPath();
|
|
2843
2860
|
const allEntries = parseChangelog(changelogPath);
|