@draht/coding-agent 2026.3.5 → 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.
Files changed (193) hide show
  1. package/CHANGELOG.md +55 -0
  2. package/README.md +6 -2
  3. package/agents/architect.md +1 -0
  4. package/agents/debugger.md +1 -0
  5. package/agents/git-committer.md +1 -0
  6. package/agents/implementer.md +1 -0
  7. package/agents/reviewer.md +1 -0
  8. package/agents/security-auditor.md +1 -0
  9. package/agents/verifier.md +1 -0
  10. package/dist/agents/architect.md +1 -0
  11. package/dist/agents/debugger.md +1 -0
  12. package/dist/agents/git-committer.md +1 -0
  13. package/dist/agents/implementer.md +1 -0
  14. package/dist/agents/reviewer.md +1 -0
  15. package/dist/agents/security-auditor.md +1 -0
  16. package/dist/agents/verifier.md +1 -0
  17. package/dist/cli/args.d.ts +6 -0
  18. package/dist/cli/args.d.ts.map +1 -1
  19. package/dist/cli/args.js +24 -0
  20. package/dist/cli/args.js.map +1 -1
  21. package/dist/cli/attach-mode.d.ts +13 -0
  22. package/dist/cli/attach-mode.d.ts.map +1 -0
  23. package/dist/cli/attach-mode.js +97 -0
  24. package/dist/cli/attach-mode.js.map +1 -0
  25. package/dist/cli/list-sessions.d.ts +8 -0
  26. package/dist/cli/list-sessions.d.ts.map +1 -0
  27. package/dist/cli/list-sessions.js +52 -0
  28. package/dist/cli/list-sessions.js.map +1 -0
  29. package/dist/config.d.ts +7 -0
  30. package/dist/config.d.ts.map +1 -1
  31. package/dist/config.js +15 -0
  32. package/dist/config.js.map +1 -1
  33. package/dist/core/agent-session.d.ts +1 -0
  34. package/dist/core/agent-session.d.ts.map +1 -1
  35. package/dist/core/agent-session.js +50 -17
  36. package/dist/core/agent-session.js.map +1 -1
  37. package/dist/core/auth-storage.d.ts +2 -1
  38. package/dist/core/auth-storage.d.ts.map +1 -1
  39. package/dist/core/auth-storage.js +25 -1
  40. package/dist/core/auth-storage.js.map +1 -1
  41. package/dist/core/compaction/utils.d.ts +3 -0
  42. package/dist/core/compaction/utils.d.ts.map +1 -1
  43. package/dist/core/compaction/utils.js +16 -1
  44. package/dist/core/compaction/utils.js.map +1 -1
  45. package/dist/core/export-html/index.d.ts +5 -2
  46. package/dist/core/export-html/index.d.ts.map +1 -1
  47. package/dist/core/export-html/index.js +4 -3
  48. package/dist/core/export-html/index.js.map +1 -1
  49. package/dist/core/export-html/template.js +11 -14
  50. package/dist/core/export-html/tool-renderer.d.ts +5 -2
  51. package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
  52. package/dist/core/export-html/tool-renderer.js +12 -5
  53. package/dist/core/export-html/tool-renderer.js.map +1 -1
  54. package/dist/core/extensions/index.d.ts +1 -1
  55. package/dist/core/extensions/index.d.ts.map +1 -1
  56. package/dist/core/extensions/index.js.map +1 -1
  57. package/dist/core/extensions/loader.d.ts.map +1 -1
  58. package/dist/core/extensions/loader.js +6 -6
  59. package/dist/core/extensions/loader.js.map +1 -1
  60. package/dist/core/extensions/runner.d.ts +3 -2
  61. package/dist/core/extensions/runner.d.ts.map +1 -1
  62. package/dist/core/extensions/runner.js +32 -0
  63. package/dist/core/extensions/runner.js.map +1 -1
  64. package/dist/core/extensions/types.d.ts +21 -2
  65. package/dist/core/extensions/types.d.ts.map +1 -1
  66. package/dist/core/extensions/types.js.map +1 -1
  67. package/dist/core/model-resolver.d.ts.map +1 -1
  68. package/dist/core/model-resolver.js +2 -2
  69. package/dist/core/model-resolver.js.map +1 -1
  70. package/dist/core/package-manager.d.ts.map +1 -1
  71. package/dist/core/package-manager.js +8 -8
  72. package/dist/core/package-manager.js.map +1 -1
  73. package/dist/core/prompt-templates.d.ts.map +1 -1
  74. package/dist/core/prompt-templates.js +4 -4
  75. package/dist/core/prompt-templates.js.map +1 -1
  76. package/dist/core/resource-loader.d.ts.map +1 -1
  77. package/dist/core/resource-loader.js +10 -9
  78. package/dist/core/resource-loader.js.map +1 -1
  79. package/dist/core/sdk.d.ts.map +1 -1
  80. package/dist/core/sdk.js +7 -0
  81. package/dist/core/sdk.js.map +1 -1
  82. package/dist/core/settings-manager.d.ts +4 -0
  83. package/dist/core/settings-manager.d.ts.map +1 -1
  84. package/dist/core/settings-manager.js +38 -4
  85. package/dist/core/settings-manager.js.map +1 -1
  86. package/dist/core/skills.d.ts.map +1 -1
  87. package/dist/core/skills.js +3 -3
  88. package/dist/core/skills.js.map +1 -1
  89. package/dist/core/socket-server/discovery.d.ts +19 -0
  90. package/dist/core/socket-server/discovery.d.ts.map +1 -0
  91. package/dist/core/socket-server/discovery.js +91 -0
  92. package/dist/core/socket-server/discovery.js.map +1 -0
  93. package/dist/core/socket-server/index.d.ts +13 -0
  94. package/dist/core/socket-server/index.d.ts.map +1 -0
  95. package/dist/core/socket-server/index.js +11 -0
  96. package/dist/core/socket-server/index.js.map +1 -0
  97. package/dist/core/socket-server/session-integration.d.ts +17 -0
  98. package/dist/core/socket-server/session-integration.d.ts.map +1 -0
  99. package/dist/core/socket-server/session-integration.js +77 -0
  100. package/dist/core/socket-server/session-integration.js.map +1 -0
  101. package/dist/core/socket-server/socket-client.d.ts +65 -0
  102. package/dist/core/socket-server/socket-client.d.ts.map +1 -0
  103. package/dist/core/socket-server/socket-client.js +197 -0
  104. package/dist/core/socket-server/socket-client.js.map +1 -0
  105. package/dist/core/socket-server/socket-server.d.ts +60 -0
  106. package/dist/core/socket-server/socket-server.d.ts.map +1 -0
  107. package/dist/core/socket-server/socket-server.js +273 -0
  108. package/dist/core/socket-server/socket-server.js.map +1 -0
  109. package/dist/core/socket-server/types.d.ts +81 -0
  110. package/dist/core/socket-server/types.d.ts.map +1 -0
  111. package/dist/core/socket-server/types.js +8 -0
  112. package/dist/core/socket-server/types.js.map +1 -0
  113. package/dist/index.d.ts +1 -1
  114. package/dist/index.d.ts.map +1 -1
  115. package/dist/index.js.map +1 -1
  116. package/dist/main.d.ts.map +1 -1
  117. package/dist/main.js +76 -11
  118. package/dist/main.js.map +1 -1
  119. package/dist/migrations.d.ts.map +1 -1
  120. package/dist/migrations.js +2 -2
  121. package/dist/migrations.js.map +1 -1
  122. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  123. package/dist/modes/interactive/components/config-selector.js +3 -3
  124. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  125. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
  126. package/dist/modes/interactive/components/extension-editor.js +1 -0
  127. package/dist/modes/interactive/components/extension-editor.js.map +1 -1
  128. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  129. package/dist/modes/interactive/components/footer.js +8 -23
  130. package/dist/modes/interactive/components/footer.js.map +1 -1
  131. package/dist/modes/interactive/components/settings-selector.d.ts +2 -0
  132. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  133. package/dist/modes/interactive/components/settings-selector.js +10 -0
  134. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  135. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  136. package/dist/modes/interactive/components/tool-execution.js +14 -4
  137. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  138. package/dist/modes/interactive/components/tree-selector.d.ts +21 -2
  139. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
  140. package/dist/modes/interactive/components/tree-selector.js +115 -9
  141. package/dist/modes/interactive/components/tree-selector.js.map +1 -1
  142. package/dist/modes/interactive/interactive-mode.d.ts +1 -0
  143. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  144. package/dist/modes/interactive/interactive-mode.js +64 -5
  145. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  146. package/dist/modes/rpc/jsonl.d.ts +17 -0
  147. package/dist/modes/rpc/jsonl.d.ts.map +1 -0
  148. package/dist/modes/rpc/jsonl.js +49 -0
  149. package/dist/modes/rpc/jsonl.js.map +1 -0
  150. package/dist/modes/rpc/rpc-client.d.ts +1 -1
  151. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  152. package/dist/modes/rpc/rpc-client.js +7 -11
  153. package/dist/modes/rpc/rpc-client.js.map +1 -1
  154. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  155. package/dist/modes/rpc/rpc-mode.js +9 -11
  156. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  157. package/dist/prompts/commands/discuss-phase.md +10 -0
  158. package/dist/prompts/commands/execute-phase.md +51 -34
  159. package/dist/prompts/commands/fix.md +8 -6
  160. package/dist/prompts/commands/init-project.md +12 -0
  161. package/dist/prompts/commands/map-codebase.md +17 -18
  162. package/dist/prompts/commands/new-project.md +12 -0
  163. package/dist/prompts/commands/next-milestone.md +5 -3
  164. package/dist/prompts/commands/plan-phase.md +27 -5
  165. package/dist/prompts/commands/quick.md +12 -5
  166. package/dist/prompts/commands/review.md +10 -10
  167. package/dist/prompts/commands/verify-work.md +31 -17
  168. package/docs/compaction.md +2 -0
  169. package/docs/custom-provider.md +11 -7
  170. package/docs/extensions.md +55 -3
  171. package/docs/keybindings.md +9 -1
  172. package/docs/models.md +5 -1
  173. package/docs/rpc.md +40 -3
  174. package/docs/session.md +2 -2
  175. package/docs/settings.md +1 -0
  176. package/docs/terminal-setup.md +28 -3
  177. package/docs/tmux.md +61 -0
  178. package/docs/tree.md +9 -0
  179. package/examples/extensions/overlay-qa-tests.ts +468 -1
  180. package/examples/extensions/provider-payload.ts +14 -0
  181. package/examples/extensions/with-deps/index.ts +1 -5
  182. package/package.json +7 -5
  183. package/prompts/commands/discuss-phase.md +10 -0
  184. package/prompts/commands/execute-phase.md +51 -34
  185. package/prompts/commands/fix.md +8 -6
  186. package/prompts/commands/init-project.md +12 -0
  187. package/prompts/commands/map-codebase.md +17 -18
  188. package/prompts/commands/new-project.md +12 -0
  189. package/prompts/commands/next-milestone.md +5 -3
  190. package/prompts/commands/plan-phase.md +27 -5
  191. package/prompts/commands/quick.md +12 -5
  192. package/prompts/commands/review.md +10 -10
  193. package/prompts/commands/verify-work.md +31 -17
@@ -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 = () => this.defaultEditor.onEscape?.();
1293
- customEditor.onCtrlD = () => this.defaultEditor.onCtrlD?.();
1294
- customEditor.onPasteImage = () => this.defaultEditor.onPasteImage?.();
1295
- customEditor.onExtensionShortcut = (data) => this.defaultEditor.onExtensionShortcut?.(data);
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 = [];