@astralyn/pi 0.84.0 → 0.84.2

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 (176) hide show
  1. package/CHANGELOG.md +30 -1
  2. package/dist/cli/args.js +3 -3
  3. package/dist/cli/args.js.map +1 -1
  4. package/dist/cli/auth-check.d.ts +19 -0
  5. package/dist/cli/auth-check.d.ts.map +1 -0
  6. package/dist/cli/auth-check.js +50 -0
  7. package/dist/cli/auth-check.js.map +1 -0
  8. package/dist/cli/auth-command.d.ts +24 -0
  9. package/dist/cli/auth-command.d.ts.map +1 -0
  10. package/dist/cli/auth-command.js +104 -0
  11. package/dist/cli/auth-command.js.map +1 -0
  12. package/dist/cli/credential-print.d.ts +4 -14
  13. package/dist/cli/credential-print.d.ts.map +1 -1
  14. package/dist/cli/credential-print.js +38 -79
  15. package/dist/cli/credential-print.js.map +1 -1
  16. package/dist/core/auth-storage.d.ts +10 -0
  17. package/dist/core/auth-storage.d.ts.map +1 -1
  18. package/dist/core/auth-storage.js +76 -1
  19. package/dist/core/auth-storage.js.map +1 -1
  20. package/dist/core/extensions/types.d.ts +5 -0
  21. package/dist/core/extensions/types.d.ts.map +1 -1
  22. package/dist/core/extensions/types.js.map +1 -1
  23. package/dist/core/keybindings.d.ts +8 -0
  24. package/dist/core/keybindings.d.ts.map +1 -1
  25. package/dist/core/model-resolver.d.ts.map +1 -1
  26. package/dist/core/model-resolver.js +1 -0
  27. package/dist/core/model-resolver.js.map +1 -1
  28. package/dist/core/model-runtime.d.ts +2 -0
  29. package/dist/core/model-runtime.d.ts.map +1 -1
  30. package/dist/core/model-runtime.js +3 -1
  31. package/dist/core/model-runtime.js.map +1 -1
  32. package/dist/core/tools/bash.d.ts +4 -0
  33. package/dist/core/tools/bash.d.ts.map +1 -1
  34. package/dist/core/tools/bash.js +6 -4
  35. package/dist/core/tools/bash.js.map +1 -1
  36. package/dist/core/tools/edit.d.ts +4 -0
  37. package/dist/core/tools/edit.d.ts.map +1 -1
  38. package/dist/core/tools/edit.js +11 -7
  39. package/dist/core/tools/edit.js.map +1 -1
  40. package/dist/core/tools/find.d.ts +4 -0
  41. package/dist/core/tools/find.d.ts.map +1 -1
  42. package/dist/core/tools/find.js +5 -1
  43. package/dist/core/tools/find.js.map +1 -1
  44. package/dist/core/tools/grep.d.ts +4 -0
  45. package/dist/core/tools/grep.d.ts.map +1 -1
  46. package/dist/core/tools/grep.js +5 -1
  47. package/dist/core/tools/grep.js.map +1 -1
  48. package/dist/core/tools/ls.d.ts +4 -0
  49. package/dist/core/tools/ls.d.ts.map +1 -1
  50. package/dist/core/tools/ls.js +5 -1
  51. package/dist/core/tools/ls.js.map +1 -1
  52. package/dist/core/tools/read.d.ts +4 -0
  53. package/dist/core/tools/read.d.ts.map +1 -1
  54. package/dist/core/tools/read.js +6 -2
  55. package/dist/core/tools/read.js.map +1 -1
  56. package/dist/core/tools/write.d.ts +4 -0
  57. package/dist/core/tools/write.d.ts.map +1 -1
  58. package/dist/core/tools/write.js +6 -2
  59. package/dist/core/tools/write.js.map +1 -1
  60. package/dist/extensions/index.d.ts.map +1 -1
  61. package/dist/extensions/index.js +0 -4
  62. package/dist/extensions/index.js.map +1 -1
  63. package/dist/extensions/todo/schema.d.ts +1 -1
  64. package/dist/extensions/todo/state.js +5 -5
  65. package/dist/extensions/todo/state.js.map +1 -1
  66. package/dist/main.d.ts.map +1 -1
  67. package/dist/main.js +57 -21
  68. package/dist/main.js.map +1 -1
  69. package/dist/modes/interactive/interactive-mode.d.ts +3 -4
  70. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  71. package/dist/modes/interactive/interactive-mode.js +48 -41
  72. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  73. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  74. package/dist/modes/interactive/theme/theme.js +11 -3
  75. package/dist/modes/interactive/theme/theme.js.map +1 -1
  76. package/dist/server/create-harness.d.ts +26 -0
  77. package/dist/server/create-harness.d.ts.map +1 -0
  78. package/dist/server/create-harness.js +104 -0
  79. package/dist/server/create-harness.js.map +1 -0
  80. package/dist/utils/coalescing-terminal.d.ts +19 -4
  81. package/dist/utils/coalescing-terminal.d.ts.map +1 -1
  82. package/dist/utils/coalescing-terminal.js +33 -5
  83. package/dist/utils/coalescing-terminal.js.map +1 -1
  84. package/docs/bundled/README.md +0 -2
  85. package/docs/docs.json +0 -8
  86. package/docs/extensions.md +3 -2
  87. package/docs/keybindings.md +9 -5
  88. package/docs/providers.md +8 -1
  89. package/docs/usage.md +0 -1
  90. package/examples/extensions/README.md +2 -0
  91. package/examples/extensions/custom-provider-anthropic/package-lock.json +5 -5
  92. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  93. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  94. package/examples/extensions/gondolin/package-lock.json +2 -2
  95. package/examples/extensions/gondolin/package.json +1 -1
  96. package/examples/extensions/plan-mode/README.md +66 -0
  97. package/examples/extensions/plan-mode/index.ts +390 -0
  98. package/examples/extensions/plan-mode/utils.ts +168 -0
  99. package/examples/extensions/sandbox/package-lock.json +3 -3
  100. package/examples/extensions/sandbox/package.json +1 -1
  101. package/examples/extensions/subagent/README.md +175 -0
  102. package/examples/extensions/subagent/agents/planner.md +37 -0
  103. package/examples/extensions/subagent/agents/reviewer.md +35 -0
  104. package/examples/extensions/subagent/agents/scout.md +50 -0
  105. package/examples/extensions/subagent/agents/worker.md +24 -0
  106. package/examples/extensions/subagent/agents.ts +126 -0
  107. package/examples/extensions/subagent/index.ts +1009 -0
  108. package/examples/extensions/subagent/prompts/implement-and-review.md +10 -0
  109. package/examples/extensions/subagent/prompts/implement.md +10 -0
  110. package/examples/extensions/subagent/prompts/scout-and-plan.md +9 -0
  111. package/examples/extensions/with-deps/package-lock.json +4 -4
  112. package/examples/extensions/with-deps/package.json +1 -1
  113. package/npm-shrinkwrap.json +26 -26
  114. package/package.json +6 -6
  115. package/dist/extensions/biu/index.d.ts +0 -19
  116. package/dist/extensions/biu/index.d.ts.map +0 -1
  117. package/dist/extensions/biu/index.js +0 -350
  118. package/dist/extensions/biu/index.js.map +0 -1
  119. package/dist/extensions/biu/prompts.d.ts +0 -26
  120. package/dist/extensions/biu/prompts.d.ts.map +0 -1
  121. package/dist/extensions/biu/prompts.js +0 -260
  122. package/dist/extensions/biu/prompts.js.map +0 -1
  123. package/dist/extensions/biu/workspace.d.ts +0 -122
  124. package/dist/extensions/biu/workspace.d.ts.map +0 -1
  125. package/dist/extensions/biu/workspace.js +0 -404
  126. package/dist/extensions/biu/workspace.js.map +0 -1
  127. package/dist/extensions/rewind/anchor.d.ts +0 -29
  128. package/dist/extensions/rewind/anchor.d.ts.map +0 -1
  129. package/dist/extensions/rewind/anchor.js +0 -35
  130. package/dist/extensions/rewind/anchor.js.map +0 -1
  131. package/dist/extensions/rewind/config.d.ts +0 -16
  132. package/dist/extensions/rewind/config.d.ts.map +0 -1
  133. package/dist/extensions/rewind/config.js +0 -69
  134. package/dist/extensions/rewind/config.js.map +0 -1
  135. package/dist/extensions/rewind/engine.d.ts +0 -93
  136. package/dist/extensions/rewind/engine.d.ts.map +0 -1
  137. package/dist/extensions/rewind/engine.js +0 -778
  138. package/dist/extensions/rewind/engine.js.map +0 -1
  139. package/dist/extensions/rewind/gc.d.ts +0 -35
  140. package/dist/extensions/rewind/gc.d.ts.map +0 -1
  141. package/dist/extensions/rewind/gc.js +0 -169
  142. package/dist/extensions/rewind/gc.js.map +0 -1
  143. package/dist/extensions/rewind/index.d.ts +0 -3
  144. package/dist/extensions/rewind/index.d.ts.map +0 -1
  145. package/dist/extensions/rewind/index.js +0 -287
  146. package/dist/extensions/rewind/index.js.map +0 -1
  147. package/dist/extensions/rewind/menu.d.ts +0 -13
  148. package/dist/extensions/rewind/menu.d.ts.map +0 -1
  149. package/dist/extensions/rewind/menu.js +0 -123
  150. package/dist/extensions/rewind/menu.js.map +0 -1
  151. package/dist/extensions/rewind/paths.d.ts +0 -4
  152. package/dist/extensions/rewind/paths.d.ts.map +0 -1
  153. package/dist/extensions/rewind/paths.js +0 -15
  154. package/dist/extensions/rewind/paths.js.map +0 -1
  155. package/dist/extensions/rewind/restore.d.ts +0 -54
  156. package/dist/extensions/rewind/restore.d.ts.map +0 -1
  157. package/dist/extensions/rewind/restore.js +0 -94
  158. package/dist/extensions/rewind/restore.js.map +0 -1
  159. package/dist/extensions/rewind/snapshot.d.ts +0 -45
  160. package/dist/extensions/rewind/snapshot.d.ts.map +0 -1
  161. package/dist/extensions/rewind/snapshot.js +0 -21
  162. package/dist/extensions/rewind/snapshot.js.map +0 -1
  163. package/dist/extensions/rewind/storage.d.ts +0 -12
  164. package/dist/extensions/rewind/storage.d.ts.map +0 -1
  165. package/dist/extensions/rewind/storage.js +0 -33
  166. package/dist/extensions/rewind/storage.js.map +0 -1
  167. package/dist/extensions/rewind/text.d.ts +0 -7
  168. package/dist/extensions/rewind/text.d.ts.map +0 -1
  169. package/dist/extensions/rewind/text.js +0 -19
  170. package/dist/extensions/rewind/text.js.map +0 -1
  171. package/dist/extensions/rewind/tool-path.d.ts +0 -3
  172. package/dist/extensions/rewind/tool-path.d.ts.map +0 -1
  173. package/dist/extensions/rewind/tool-path.js +0 -9
  174. package/dist/extensions/rewind/tool-path.js.map +0 -1
  175. package/docs/bundled/extensions/biu.md +0 -63
  176. package/docs/bundled/extensions/rewind.md +0 -86
@@ -167,7 +167,10 @@ function formatLoginProviderCompletionDescription(provider) {
167
167
  export function createInteractiveTui(options) {
168
168
  const terminal = options.terminal ?? new ProcessTerminal();
169
169
  if (options.tuiMode === "fullscreen") {
170
- return new TuiAltScreen(terminal, options.showHardwareCursor, options.logDirectory, { openUrl: openBrowser });
170
+ return new TuiAltScreen(terminal, options.showHardwareCursor, options.logDirectory, {
171
+ openUrl: openBrowser,
172
+ onRightClickPaste: options.onRightClickPaste,
173
+ });
171
174
  }
172
175
  return new TuiMainScreen(terminal, options.showHardwareCursor, options.logDirectory);
173
176
  }
@@ -179,12 +182,19 @@ export function createInteractiveTuiReference(getTui) {
179
182
  const value = Reflect.get(tui, property, tui);
180
183
  if (typeof value !== "function")
181
184
  return value;
185
+ let methodTui = tui;
186
+ let method = value;
182
187
  return (...args) => {
183
- const tui = getTui();
184
- const method = Reflect.get(tui, property, tui);
185
- if (typeof method !== "function")
186
- throw new TypeError(`TUI property ${String(property)} is not callable`);
187
- return Reflect.apply(method, tui, args);
188
+ const currentTui = getTui();
189
+ if (currentTui !== methodTui) {
190
+ const currentMethod = Reflect.get(currentTui, property, currentTui);
191
+ if (typeof currentMethod !== "function") {
192
+ throw new TypeError(`TUI property ${String(property)} is not callable`);
193
+ }
194
+ methodTui = currentTui;
195
+ method = currentMethod;
196
+ }
197
+ return Reflect.apply(method, methodTui, args);
188
198
  };
189
199
  },
190
200
  set: (_target, property, value) => {
@@ -210,16 +220,6 @@ export class InteractiveMode {
210
220
  return this.session.settingsManager;
211
221
  }
212
222
  constructor(runtimeHost, options = {}) {
213
- // Input listeners live on the TUI renderer instance, which switchTuiMode
214
- // replaces; this pair tracks the scrollback-preservation listener so it
215
- // can be unsubscribed from the outgoing renderer and re-registered on the
216
- // incoming one without duplicates.
217
- this.scrollbackPreservationInputHandler = () => {
218
- if (!this.agentRunActive)
219
- this.coalescingTerminal.setScrollbackPreservation(false);
220
- return undefined;
221
- };
222
- this.agentRunActive = false;
223
223
  this.autocompleteProviderWrappers = [];
224
224
  this.isInitialized = false;
225
225
  this.pendingUserInputs = [];
@@ -280,6 +280,9 @@ export class InteractiveMode {
280
280
  this.builtInHeader = undefined;
281
281
  // Custom header from extension (undefined = use built-in header)
282
282
  this.customHeader = undefined;
283
+ this.onRightClickPaste = () => {
284
+ void this.handleRightClickPaste();
285
+ };
283
286
  /**
284
287
  * Gracefully shutdown the agent.
285
288
  * Stops the TUI before emitting shutdown events so extension UI cleanup cannot
@@ -304,22 +307,17 @@ export class InteractiveMode {
304
307
  showHardwareCursor: this.settingsManager.getShowHardwareCursor(),
305
308
  logDirectory: getAgentDir(),
306
309
  terminal,
310
+ onRightClickPaste: this.onRightClickPaste,
307
311
  });
308
312
  this.ui = createInteractiveTuiReference(() => this.renderer);
309
313
  // Lets full-redraw rewrites scroll grown content into scrollback
310
- // instead of dropping the lines pushed above the screen.
311
- // previousViewportTop is TS-private but a plain runtime field, and
312
- // pi-tui writes each full-redraw frame before updating it, so the
313
- // wrapper observes the pre-frame value; if either assumption breaks,
314
- // readViewportTop falls back to the bottom-anchored repaint.
315
- terminal.setViewportTopProvider(() => this.ui.previousViewportTop);
316
- // Scrollback preservation stays on from agent_start until the user's
317
- // next input after the run settles: post-run reflow frames must not
318
- // yank a reader who is still scrolled up, but once the user acts they
319
- // are back at the bottom and upstream's clean wipe-and-replay wins.
320
- // The listener is registered on the initial renderer and rebound by
321
- // switchTuiMode whenever the renderer is replaced.
322
- this.scrollbackPreservationInputUnsubscribe = this.ui.addInputListener(this.scrollbackPreservationInputHandler);
314
+ // instead of dropping the lines pushed above the screen. The render
315
+ // state comes from pi-tui's public captureRenderState(); pi-tui
316
+ // writes each full-redraw frame before updating its bookkeeping, so
317
+ // the wrapper observes the pre-frame viewport top. Fullscreen
318
+ // renderers return undefined (their frames do not match the rewrite
319
+ // shape anyway), falling back to the bottom-anchored repaint.
320
+ terminal.setViewportTopProvider(() => this.renderer instanceof TuiMainScreen ? this.renderer.captureRenderState().previousViewportTop : undefined);
323
321
  this.ui.setClearOnShrink(this.settingsManager.getClearOnShrink());
324
322
  this.headerContainer = new Container();
325
323
  this.loadedResourcesContainer = new Container();
@@ -550,6 +548,7 @@ export class InteractiveMode {
550
548
  showHardwareCursor,
551
549
  logDirectory: getAgentDir(),
552
550
  terminal,
551
+ onRightClickPaste: this.onRightClickPaste,
553
552
  });
554
553
  nextUi.setClearOnShrink(clearOnShrink);
555
554
  nextUi.onDebug = onDebug;
@@ -557,9 +556,6 @@ export class InteractiveMode {
557
556
  nextUi.restoreRenderState(this.mainScreenRenderState);
558
557
  }
559
558
  this.renderer = nextUi;
560
- // Renderers own their input-listener sets; move the preservation
561
- // listener onto the incoming renderer before anything else touches it.
562
- this.rebindScrollbackPreservationInputListener();
563
559
  this.options.tuiMode = mode;
564
560
  this.mountInteractiveTui(nextUi, components);
565
561
  nextUi.invalidate();
@@ -1825,10 +1821,6 @@ export class InteractiveMode {
1825
1821
  this.extensionTerminalInputSubscriptions.delete(subscription);
1826
1822
  };
1827
1823
  }
1828
- rebindScrollbackPreservationInputListener() {
1829
- this.scrollbackPreservationInputUnsubscribe?.();
1830
- this.scrollbackPreservationInputUnsubscribe = this.ui.addInputListener(this.scrollbackPreservationInputHandler);
1831
- }
1832
1824
  rebindExtensionTerminalInputListeners() {
1833
1825
  for (const subscription of this.extensionTerminalInputSubscriptions) {
1834
1826
  subscription.unsubscribe();
@@ -2279,6 +2271,22 @@ export class InteractiveMode {
2279
2271
  void this.handleClipboardPaste();
2280
2272
  };
2281
2273
  }
2274
+ async handleRightClickPaste() {
2275
+ const target = this.renderer.getFocusedComponent();
2276
+ const handleInput = target?.handleInput;
2277
+ if (!target || !handleInput)
2278
+ return;
2279
+ try {
2280
+ const text = await readClipboardText();
2281
+ if (!text || this.renderer.getFocusedComponent() !== target)
2282
+ return;
2283
+ handleInput.call(target, `\x1b[200~${text}\x1b[201~`);
2284
+ this.ui.requestRender();
2285
+ }
2286
+ catch {
2287
+ // Silently ignore clipboard errors (may not have permission, etc.)
2288
+ }
2289
+ }
2282
2290
  async handleClipboardPaste() {
2283
2291
  try {
2284
2292
  const image = await readClipboardImage();
@@ -2499,8 +2507,9 @@ export class InteractiveMode {
2499
2507
  this.footer.invalidate();
2500
2508
  switch (event.type) {
2501
2509
  case "agent_start":
2502
- this.agentRunActive = true;
2503
- this.coalescingTerminal.setScrollbackPreservation(true);
2510
+ // Opens the scrollback-preservation window; the terminal
2511
+ // closes it on the user's next input after the run settles.
2512
+ this.coalescingTerminal.setAgentRunActive(true);
2504
2513
  this.clearPendingTools();
2505
2514
  if (this.settingsManager.getShowTerminalProgress()) {
2506
2515
  this.ui.terminal.setProgress(true);
@@ -2677,7 +2686,7 @@ export class InteractiveMode {
2677
2686
  // Preservation itself stays on until the next user input; the
2678
2687
  // run's trailing reflow frames may land after this event while
2679
2688
  // the reader is still scrolled up.
2680
- this.agentRunActive = false;
2689
+ this.coalescingTerminal.setAgentRunActive(false);
2681
2690
  await this.checkShutdownRequested();
2682
2691
  break;
2683
2692
  case "compaction_start": {
@@ -5401,8 +5410,6 @@ export class InteractiveMode {
5401
5410
  this.clearStatusIndicator();
5402
5411
  this.themeController.disableAutoSync();
5403
5412
  this.clearExtensionTerminalInputListeners();
5404
- this.scrollbackPreservationInputUnsubscribe?.();
5405
- this.scrollbackPreservationInputUnsubscribe = undefined;
5406
5413
  this.clearPendingTools();
5407
5414
  this.disposeChatToolComponents();
5408
5415
  this.footer.dispose();