@draht/coding-agent 2026.3.6 → 2026.3.11-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.
- package/CHANGELOG.md +43 -0
- package/README.md +6 -2
- package/dist/cli/args.d.ts +6 -0
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +24 -0
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/attach-mode.d.ts +13 -0
- package/dist/cli/attach-mode.d.ts.map +1 -0
- package/dist/cli/attach-mode.js +97 -0
- package/dist/cli/attach-mode.js.map +1 -0
- package/dist/cli/list-sessions.d.ts +8 -0
- package/dist/cli/list-sessions.d.ts.map +1 -0
- package/dist/cli/list-sessions.js +52 -0
- package/dist/cli/list-sessions.js.map +1 -0
- package/dist/core/agent-session.d.ts +1 -0
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +50 -17
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/auth-storage.d.ts +2 -1
- package/dist/core/auth-storage.d.ts.map +1 -1
- package/dist/core/auth-storage.js +25 -1
- package/dist/core/auth-storage.js.map +1 -1
- package/dist/core/compaction/utils.d.ts +3 -0
- package/dist/core/compaction/utils.d.ts.map +1 -1
- package/dist/core/compaction/utils.js +16 -1
- package/dist/core/compaction/utils.js.map +1 -1
- package/dist/core/export-html/index.d.ts +5 -2
- package/dist/core/export-html/index.d.ts.map +1 -1
- package/dist/core/export-html/index.js +4 -3
- package/dist/core/export-html/index.js.map +1 -1
- package/dist/core/export-html/template.js +11 -14
- package/dist/core/export-html/tool-renderer.d.ts +5 -2
- package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
- package/dist/core/export-html/tool-renderer.js +12 -5
- package/dist/core/export-html/tool-renderer.js.map +1 -1
- 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 +6 -6
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/runner.d.ts +3 -2
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +32 -0
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +21 -2
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/model-resolver.d.ts.map +1 -1
- package/dist/core/model-resolver.js +2 -2
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/package-manager.d.ts.map +1 -1
- package/dist/core/package-manager.js +1 -1
- package/dist/core/package-manager.js.map +1 -1
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +1 -1
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +7 -0
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/settings-manager.d.ts +4 -0
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +36 -2
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/socket-server/discovery.d.ts +19 -0
- package/dist/core/socket-server/discovery.d.ts.map +1 -0
- package/dist/core/socket-server/discovery.js +91 -0
- package/dist/core/socket-server/discovery.js.map +1 -0
- package/dist/core/socket-server/index.d.ts +13 -0
- package/dist/core/socket-server/index.d.ts.map +1 -0
- package/dist/core/socket-server/index.js +11 -0
- package/dist/core/socket-server/index.js.map +1 -0
- package/dist/core/socket-server/session-integration.d.ts +17 -0
- package/dist/core/socket-server/session-integration.d.ts.map +1 -0
- package/dist/core/socket-server/session-integration.js +77 -0
- package/dist/core/socket-server/session-integration.js.map +1 -0
- package/dist/core/socket-server/socket-client.d.ts +65 -0
- package/dist/core/socket-server/socket-client.d.ts.map +1 -0
- package/dist/core/socket-server/socket-client.js +197 -0
- package/dist/core/socket-server/socket-client.js.map +1 -0
- package/dist/core/socket-server/socket-server.d.ts +60 -0
- package/dist/core/socket-server/socket-server.d.ts.map +1 -0
- package/dist/core/socket-server/socket-server.js +273 -0
- package/dist/core/socket-server/socket-server.js.map +1 -0
- package/dist/core/socket-server/types.d.ts +81 -0
- package/dist/core/socket-server/types.d.ts.map +1 -0
- package/dist/core/socket-server/types.js +8 -0
- package/dist/core/socket-server/types.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +76 -11
- package/dist/main.js.map +1 -1
- package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-editor.js +1 -0
- package/dist/modes/interactive/components/extension-editor.js.map +1 -1
- package/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/dist/modes/interactive/components/footer.js +8 -23
- package/dist/modes/interactive/components/footer.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 +10 -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 +14 -4
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/components/tree-selector.d.ts +21 -2
- package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/tree-selector.js +115 -9
- package/dist/modes/interactive/components/tree-selector.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +1 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +64 -5
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/rpc/jsonl.d.ts +17 -0
- package/dist/modes/rpc/jsonl.d.ts.map +1 -0
- package/dist/modes/rpc/jsonl.js +49 -0
- package/dist/modes/rpc/jsonl.js.map +1 -0
- package/dist/modes/rpc/rpc-client.d.ts +1 -1
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-client.js +7 -11
- package/dist/modes/rpc/rpc-client.js.map +1 -1
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-mode.js +9 -11
- package/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/docs/compaction.md +2 -0
- package/docs/custom-provider.md +11 -7
- package/docs/extensions.md +55 -3
- package/docs/keybindings.md +9 -1
- package/docs/models.md +5 -1
- package/docs/rpc.md +40 -3
- package/docs/session.md +2 -2
- package/docs/settings.md +1 -0
- package/docs/terminal-setup.md +28 -3
- package/docs/tmux.md +61 -0
- package/docs/tree.md +9 -0
- package/examples/extensions/overlay-qa-tests.ts +468 -1
- package/examples/extensions/provider-payload.ts +14 -0
- package/examples/extensions/with-deps/index.ts +1 -5
- package/package.json +7 -5
|
@@ -360,6 +360,12 @@ export class InteractiveMode {
|
|
|
360
360
|
this.showNewVersionNotification(newVersion);
|
|
361
361
|
}
|
|
362
362
|
});
|
|
363
|
+
// Check tmux keyboard setup asynchronously
|
|
364
|
+
this.checkTmuxKeyboardSetup().then((warning) => {
|
|
365
|
+
if (warning) {
|
|
366
|
+
this.showWarning(warning);
|
|
367
|
+
}
|
|
368
|
+
});
|
|
363
369
|
// Show startup warnings
|
|
364
370
|
const { migratedProviders, modelFallbackMessage, initialMessage, initialImages, initialMessages } = this.options;
|
|
365
371
|
if (migratedProviders && migratedProviders.length > 0) {
|
|
@@ -428,6 +434,44 @@ export class InteractiveMode {
|
|
|
428
434
|
return undefined;
|
|
429
435
|
}
|
|
430
436
|
}
|
|
437
|
+
async checkTmuxKeyboardSetup() {
|
|
438
|
+
if (!process.env.TMUX)
|
|
439
|
+
return undefined;
|
|
440
|
+
const runTmuxShow = (option) => {
|
|
441
|
+
return new Promise((resolve) => {
|
|
442
|
+
const proc = spawn("tmux", ["show", "-gv", option], {
|
|
443
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
444
|
+
});
|
|
445
|
+
let stdout = "";
|
|
446
|
+
const timer = setTimeout(() => {
|
|
447
|
+
proc.kill();
|
|
448
|
+
resolve(undefined);
|
|
449
|
+
}, 2000);
|
|
450
|
+
proc.stdout?.on("data", (data) => {
|
|
451
|
+
stdout += data.toString();
|
|
452
|
+
});
|
|
453
|
+
proc.on("error", () => {
|
|
454
|
+
clearTimeout(timer);
|
|
455
|
+
resolve(undefined);
|
|
456
|
+
});
|
|
457
|
+
proc.on("close", (code) => {
|
|
458
|
+
clearTimeout(timer);
|
|
459
|
+
resolve(code === 0 ? stdout.trim() : undefined);
|
|
460
|
+
});
|
|
461
|
+
});
|
|
462
|
+
};
|
|
463
|
+
const [extendedKeys, extendedKeysFormat] = await Promise.all([
|
|
464
|
+
runTmuxShow("extended-keys"),
|
|
465
|
+
runTmuxShow("extended-keys-format"),
|
|
466
|
+
]);
|
|
467
|
+
if (extendedKeys !== "on" && extendedKeys !== "always") {
|
|
468
|
+
return "tmux extended-keys is off. Modified Enter keys may not work. Add `set -g extended-keys on` to ~/.tmux.conf and restart tmux.";
|
|
469
|
+
}
|
|
470
|
+
if (extendedKeysFormat === "xterm") {
|
|
471
|
+
return "tmux extended-keys-format is xterm. Pi works best with csi-u. Add `set -g extended-keys-format csi-u` to ~/.tmux.conf and restart tmux.";
|
|
472
|
+
}
|
|
473
|
+
return undefined;
|
|
474
|
+
}
|
|
431
475
|
/**
|
|
432
476
|
* Get changelog entries to display on startup.
|
|
433
477
|
* Only shows new entries since last seen version, skips for resumed sessions.
|
|
@@ -1289,10 +1333,18 @@ export class InteractiveMode {
|
|
|
1289
1333
|
// Use duck typing since instanceof fails across jiti module boundaries
|
|
1290
1334
|
const customEditor = newEditor;
|
|
1291
1335
|
if ("actionHandlers" in customEditor && customEditor.actionHandlers instanceof Map) {
|
|
1292
|
-
customEditor.onEscape
|
|
1293
|
-
|
|
1294
|
-
|
|
1295
|
-
customEditor.
|
|
1336
|
+
if (!customEditor.onEscape) {
|
|
1337
|
+
customEditor.onEscape = () => this.defaultEditor.onEscape?.();
|
|
1338
|
+
}
|
|
1339
|
+
if (!customEditor.onCtrlD) {
|
|
1340
|
+
customEditor.onCtrlD = () => this.defaultEditor.onCtrlD?.();
|
|
1341
|
+
}
|
|
1342
|
+
if (!customEditor.onPasteImage) {
|
|
1343
|
+
customEditor.onPasteImage = () => this.defaultEditor.onPasteImage?.();
|
|
1344
|
+
}
|
|
1345
|
+
if (!customEditor.onExtensionShortcut) {
|
|
1346
|
+
customEditor.onExtensionShortcut = (data) => this.defaultEditor.onExtensionShortcut?.(data);
|
|
1347
|
+
}
|
|
1296
1348
|
// Copy action handlers (clear, suspend, model switching, etc.)
|
|
1297
1349
|
for (const [action, handler] of this.defaultEditor.actionHandlers) {
|
|
1298
1350
|
customEditor.actionHandlers.set(action, handler);
|
|
@@ -2294,6 +2346,7 @@ export class InteractiveMode {
|
|
|
2294
2346
|
// Spawn editor synchronously with inherited stdio for interactive editing
|
|
2295
2347
|
const result = spawnSync(editor, [...editorArgs, tmpFile], {
|
|
2296
2348
|
stdio: "inherit",
|
|
2349
|
+
shell: process.platform === "win32",
|
|
2297
2350
|
});
|
|
2298
2351
|
// On successful exit (status 0), replace editor content
|
|
2299
2352
|
if (result.status === 0) {
|
|
@@ -2547,6 +2600,7 @@ export class InteractiveMode {
|
|
|
2547
2600
|
hideThinkingBlock: this.hideThinkingBlock,
|
|
2548
2601
|
collapseChangelog: this.settingsManager.getCollapseChangelog(),
|
|
2549
2602
|
doubleEscapeAction: this.settingsManager.getDoubleEscapeAction(),
|
|
2603
|
+
treeFilterMode: this.settingsManager.getTreeFilterMode(),
|
|
2550
2604
|
showHardwareCursor: this.settingsManager.getShowHardwareCursor(),
|
|
2551
2605
|
editorPaddingX: this.settingsManager.getEditorPaddingX(),
|
|
2552
2606
|
autocompleteMaxVisible: this.settingsManager.getAutocompleteMaxVisible(),
|
|
@@ -2625,6 +2679,9 @@ export class InteractiveMode {
|
|
|
2625
2679
|
onDoubleEscapeActionChange: (action) => {
|
|
2626
2680
|
this.settingsManager.setDoubleEscapeAction(action);
|
|
2627
2681
|
},
|
|
2682
|
+
onTreeFilterModeChange: (mode) => {
|
|
2683
|
+
this.settingsManager.setTreeFilterMode(mode);
|
|
2684
|
+
},
|
|
2628
2685
|
onShowHardwareCursorChange: (enabled) => {
|
|
2629
2686
|
this.settingsManager.setShowHardwareCursor(enabled);
|
|
2630
2687
|
this.ui.setShowHardwareCursor(enabled);
|
|
@@ -2878,6 +2935,7 @@ export class InteractiveMode {
|
|
|
2878
2935
|
showTreeSelector(initialSelectedId) {
|
|
2879
2936
|
const tree = this.sessionManager.getTree();
|
|
2880
2937
|
const realLeafId = this.sessionManager.getLeafId();
|
|
2938
|
+
const initialFilterMode = this.settingsManager.getTreeFilterMode();
|
|
2881
2939
|
if (tree.length === 0) {
|
|
2882
2940
|
this.showStatus("No entries in session");
|
|
2883
2941
|
return;
|
|
@@ -2971,7 +3029,7 @@ export class InteractiveMode {
|
|
|
2971
3029
|
}, (entryId, label) => {
|
|
2972
3030
|
this.sessionManager.appendLabelChange(entryId, label);
|
|
2973
3031
|
this.ui.requestRender();
|
|
2974
|
-
}, initialSelectedId);
|
|
3032
|
+
}, initialSelectedId, initialFilterMode);
|
|
2975
3033
|
return { component: selector, focus: selector };
|
|
2976
3034
|
});
|
|
2977
3035
|
}
|
|
@@ -3526,6 +3584,7 @@ export class InteractiveMode {
|
|
|
3526
3584
|
// New session via session (emits extension session events)
|
|
3527
3585
|
await this.session.newSession();
|
|
3528
3586
|
// Clear UI state
|
|
3587
|
+
this.headerContainer.clear();
|
|
3529
3588
|
this.chatContainer.clear();
|
|
3530
3589
|
this.pendingMessagesContainer.clear();
|
|
3531
3590
|
this.compactionQueuedMessages = [];
|