@astralyn/pi 0.82.4 → 0.82.5

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 (89) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/dist/core/agent-session.d.ts.map +1 -1
  3. package/dist/core/agent-session.js +2 -2
  4. package/dist/core/agent-session.js.map +1 -1
  5. package/dist/core/extensions/index.d.ts +1 -1
  6. package/dist/core/extensions/index.d.ts.map +1 -1
  7. package/dist/core/extensions/index.js +1 -1
  8. package/dist/core/extensions/index.js.map +1 -1
  9. package/dist/core/extensions/loader.d.ts +1 -1
  10. package/dist/core/extensions/loader.d.ts.map +1 -1
  11. package/dist/core/extensions/loader.js +2 -3
  12. package/dist/core/extensions/loader.js.map +1 -1
  13. package/dist/core/extensions/types.d.ts +9 -0
  14. package/dist/core/extensions/types.d.ts.map +1 -1
  15. package/dist/core/extensions/types.js +11 -0
  16. package/dist/core/extensions/types.js.map +1 -1
  17. package/dist/extensions/question/dialog.d.ts +3 -1
  18. package/dist/extensions/question/dialog.d.ts.map +1 -1
  19. package/dist/extensions/question/dialog.js +106 -52
  20. package/dist/extensions/question/dialog.js.map +1 -1
  21. package/dist/extensions/question/index.d.ts.map +1 -1
  22. package/dist/extensions/question/index.js +2 -2
  23. package/dist/extensions/question/index.js.map +1 -1
  24. package/dist/extensions/question/render-cache.d.ts +9 -0
  25. package/dist/extensions/question/render-cache.d.ts.map +1 -1
  26. package/dist/extensions/question/render-cache.js +22 -0
  27. package/dist/extensions/question/render-cache.js.map +1 -1
  28. package/dist/extensions/question/results.d.ts.map +1 -1
  29. package/dist/extensions/question/results.js +6 -1
  30. package/dist/extensions/question/results.js.map +1 -1
  31. package/dist/extensions/question/schema.d.ts +4 -0
  32. package/dist/extensions/question/schema.d.ts.map +1 -1
  33. package/dist/extensions/question/schema.js +19 -28
  34. package/dist/extensions/question/schema.js.map +1 -1
  35. package/dist/extensions/question/types.d.ts +1 -1
  36. package/dist/extensions/question/types.d.ts.map +1 -1
  37. package/dist/extensions/question/types.js.map +1 -1
  38. package/dist/extensions/subagent/agents.d.ts.map +1 -1
  39. package/dist/extensions/subagent/agents.js +12 -6
  40. package/dist/extensions/subagent/agents.js.map +1 -1
  41. package/dist/extensions/subagent/constants.d.ts +1 -1
  42. package/dist/extensions/subagent/constants.d.ts.map +1 -1
  43. package/dist/extensions/subagent/constants.js +3 -2
  44. package/dist/extensions/subagent/constants.js.map +1 -1
  45. package/dist/extensions/subagent/runner.d.ts +1 -1
  46. package/dist/extensions/subagent/runner.d.ts.map +1 -1
  47. package/dist/extensions/subagent/runner.js +5 -1
  48. package/dist/extensions/subagent/runner.js.map +1 -1
  49. package/dist/extensions/subagent/schema.d.ts.map +1 -1
  50. package/dist/extensions/subagent/schema.js +2 -2
  51. package/dist/extensions/subagent/schema.js.map +1 -1
  52. package/dist/extensions/subagent/sdk-runner.d.ts.map +1 -1
  53. package/dist/extensions/subagent/sdk-runner.js +5 -0
  54. package/dist/extensions/subagent/sdk-runner.js.map +1 -1
  55. package/dist/extensions/subagent/types.d.ts +7 -0
  56. package/dist/extensions/subagent/types.d.ts.map +1 -1
  57. package/dist/extensions/subagent/types.js.map +1 -1
  58. package/dist/extensions/todo/constants.d.ts +1 -1
  59. package/dist/extensions/todo/constants.d.ts.map +1 -1
  60. package/dist/extensions/todo/constants.js +29 -4
  61. package/dist/extensions/todo/constants.js.map +1 -1
  62. package/dist/extensions/todo/index.d.ts +1 -1
  63. package/dist/extensions/todo/index.d.ts.map +1 -1
  64. package/dist/extensions/todo/index.js +22 -3
  65. package/dist/extensions/todo/index.js.map +1 -1
  66. package/dist/extensions/todo/schema.d.ts +6 -5
  67. package/dist/extensions/todo/schema.d.ts.map +1 -1
  68. package/dist/extensions/todo/schema.js +20 -9
  69. package/dist/extensions/todo/schema.js.map +1 -1
  70. package/dist/extensions/todo/state.d.ts +5 -1
  71. package/dist/extensions/todo/state.d.ts.map +1 -1
  72. package/dist/extensions/todo/state.js +184 -38
  73. package/dist/extensions/todo/state.js.map +1 -1
  74. package/dist/extensions/todo/view.d.ts.map +1 -1
  75. package/dist/extensions/todo/view.js +10 -6
  76. package/dist/extensions/todo/view.js.map +1 -1
  77. package/dist/modes/interactive/interactive-mode.d.ts +2 -0
  78. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  79. package/dist/modes/interactive/interactive-mode.js +34 -1
  80. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  81. package/dist/utils/coalescing-terminal.d.ts +71 -17
  82. package/dist/utils/coalescing-terminal.d.ts.map +1 -1
  83. package/dist/utils/coalescing-terminal.js +136 -31
  84. package/dist/utils/coalescing-terminal.js.map +1 -1
  85. package/docs/bundled/extensions/question.md +9 -7
  86. package/docs/bundled/extensions/subagent.md +2 -2
  87. package/docs/bundled/extensions/todo.md +5 -3
  88. package/npm-shrinkwrap.json +2 -2
  89. package/package.json +1 -1
@@ -164,6 +164,8 @@ function formatLoginProviderCompletionDescription(provider) {
164
164
  export class InteractiveMode {
165
165
  runtimeHost;
166
166
  ui;
167
+ coalescingTerminal;
168
+ agentRunActive = false;
167
169
  loadedResourcesContainer;
168
170
  chatContainer;
169
171
  pendingMessagesContainer;
@@ -273,7 +275,25 @@ export class InteractiveMode {
273
275
  await this.rebindCurrentSession({ renderBeforeBind: true });
274
276
  });
275
277
  this.version = VERSION;
276
- this.ui = new TUI(new CoalescingTerminal(), this.settingsManager.getShowHardwareCursor(), getAgentDir());
278
+ const terminal = new CoalescingTerminal();
279
+ this.coalescingTerminal = terminal;
280
+ this.ui = new TUI(terminal, this.settingsManager.getShowHardwareCursor(), getAgentDir());
281
+ // Lets full-redraw rewrites scroll grown content into scrollback
282
+ // instead of dropping the lines pushed above the screen.
283
+ // previousViewportTop is TS-private but a plain runtime field, and
284
+ // pi-tui writes each full-redraw frame before updating it, so the
285
+ // wrapper observes the pre-frame value; if either assumption breaks,
286
+ // readViewportTop falls back to the bottom-anchored repaint.
287
+ terminal.setViewportTopProvider(() => this.ui.previousViewportTop);
288
+ // Scrollback preservation stays on from agent_start until the user's
289
+ // next input after the run settles: post-run reflow frames must not
290
+ // yank a reader who is still scrolled up, but once the user acts they
291
+ // are back at the bottom and upstream's clean wipe-and-replay wins.
292
+ this.ui.addInputListener(() => {
293
+ if (!this.agentRunActive)
294
+ this.coalescingTerminal.setScrollbackPreservation(false);
295
+ return undefined;
296
+ });
277
297
  this.ui.setClearOnShrink(this.settingsManager.getClearOnShrink());
278
298
  this.headerContainer = new Container();
279
299
  this.loadedResourcesContainer = new Container();
@@ -2298,6 +2318,8 @@ export class InteractiveMode {
2298
2318
  this.footer.invalidate();
2299
2319
  switch (event.type) {
2300
2320
  case "agent_start":
2321
+ this.agentRunActive = true;
2322
+ this.coalescingTerminal.setScrollbackPreservation(true);
2301
2323
  this.pendingTools.clear();
2302
2324
  if (this.settingsManager.getShowTerminalProgress()) {
2303
2325
  this.ui.terminal.setProgress(true);
@@ -2471,6 +2493,10 @@ export class InteractiveMode {
2471
2493
  this.ui.requestRender();
2472
2494
  break;
2473
2495
  case "agent_settled":
2496
+ // Preservation itself stays on until the next user input; the
2497
+ // run's trailing reflow frames may land after this event while
2498
+ // the reader is still scrolled up.
2499
+ this.agentRunActive = false;
2474
2500
  await this.checkShutdownRequested();
2475
2501
  break;
2476
2502
  case "compaction_start": {
@@ -3118,6 +3144,11 @@ export class InteractiveMode {
3118
3144
  }
3119
3145
  setToolsExpanded(expanded) {
3120
3146
  this.toolOutputExpanded = expanded;
3147
+ // An explicit toggle prefers upstream's clean wipe-and-replay even
3148
+ // mid-run: the user just pressed the key, so they are interacting at
3149
+ // the bottom, and a full replay leaves scrollback as the exact new
3150
+ // transcript instead of preservation's stale seams.
3151
+ this.coalescingTerminal.passNextFullRedraw();
3121
3152
  const activeHeader = this.customHeader ?? this.builtInHeader;
3122
3153
  if (isExpandable(activeHeader)) {
3123
3154
  activeHeader.setExpanded(expanded);
@@ -3134,6 +3165,8 @@ export class InteractiveMode {
3134
3165
  toggleThinkingBlockVisibility() {
3135
3166
  this.hideThinkingBlock = !this.hideThinkingBlock;
3136
3167
  this.settingsManager.setHideThinkingBlock(this.hideThinkingBlock);
3168
+ // Same reasoning as setToolsExpanded.
3169
+ this.coalescingTerminal.passNextFullRedraw();
3137
3170
  // Rebuild chat from session messages
3138
3171
  this.chatContainer.clear();
3139
3172
  this.rebuildChatFromMessages();