@earendil-works/pi-coding-agent 0.77.0 → 0.78.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 (147) hide show
  1. package/CHANGELOG.md +63 -1
  2. package/README.md +10 -2
  3. package/dist/cli/args.d.ts +1 -0
  4. package/dist/cli/args.d.ts.map +1 -1
  5. package/dist/cli/args.js +15 -0
  6. package/dist/cli/args.js.map +1 -1
  7. package/dist/config.d.ts.map +1 -1
  8. package/dist/config.js +9 -1
  9. package/dist/config.js.map +1 -1
  10. package/dist/core/agent-session.d.ts +3 -1
  11. package/dist/core/agent-session.d.ts.map +1 -1
  12. package/dist/core/agent-session.js +7 -1
  13. package/dist/core/agent-session.js.map +1 -1
  14. package/dist/core/auth-storage.d.ts.map +1 -1
  15. package/dist/core/auth-storage.js +4 -3
  16. package/dist/core/auth-storage.js.map +1 -1
  17. package/dist/core/compaction/branch-summarization.d.ts +3 -1
  18. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  19. package/dist/core/compaction/branch-summarization.js +9 -3
  20. package/dist/core/compaction/branch-summarization.js.map +1 -1
  21. package/dist/core/export-html/template.js +19 -6
  22. package/dist/core/extensions/index.d.ts +1 -1
  23. package/dist/core/extensions/index.d.ts.map +1 -1
  24. package/dist/core/extensions/index.js.map +1 -1
  25. package/dist/core/extensions/runner.d.ts +4 -2
  26. package/dist/core/extensions/runner.d.ts.map +1 -1
  27. package/dist/core/extensions/runner.js +13 -1
  28. package/dist/core/extensions/runner.js.map +1 -1
  29. package/dist/core/extensions/types.d.ts +7 -1
  30. package/dist/core/extensions/types.d.ts.map +1 -1
  31. package/dist/core/extensions/types.js.map +1 -1
  32. package/dist/core/footer-data-provider.d.ts +2 -0
  33. package/dist/core/footer-data-provider.d.ts.map +1 -1
  34. package/dist/core/footer-data-provider.js +29 -1
  35. package/dist/core/footer-data-provider.js.map +1 -1
  36. package/dist/core/model-resolver.d.ts.map +1 -1
  37. package/dist/core/model-resolver.js +3 -0
  38. package/dist/core/model-resolver.js.map +1 -1
  39. package/dist/core/package-manager.d.ts +2 -0
  40. package/dist/core/package-manager.d.ts.map +1 -1
  41. package/dist/core/package-manager.js +22 -6
  42. package/dist/core/package-manager.js.map +1 -1
  43. package/dist/core/provider-attribution.d.ts +4 -0
  44. package/dist/core/provider-attribution.d.ts.map +1 -0
  45. package/dist/core/provider-attribution.js +72 -0
  46. package/dist/core/provider-attribution.js.map +1 -0
  47. package/dist/core/provider-display-names.d.ts.map +1 -1
  48. package/dist/core/provider-display-names.js +3 -0
  49. package/dist/core/provider-display-names.js.map +1 -1
  50. package/dist/core/sdk.d.ts.map +1 -1
  51. package/dist/core/sdk.js +7 -33
  52. package/dist/core/sdk.js.map +1 -1
  53. package/dist/core/session-manager.d.ts.map +1 -1
  54. package/dist/core/session-manager.js +92 -68
  55. package/dist/core/session-manager.js.map +1 -1
  56. package/dist/core/tools/edit.d.ts.map +1 -1
  57. package/dist/core/tools/edit.js +7 -10
  58. package/dist/core/tools/edit.js.map +1 -1
  59. package/dist/core/tools/find.d.ts.map +1 -1
  60. package/dist/core/tools/find.js.map +1 -1
  61. package/dist/core/tools/grep.d.ts.map +1 -1
  62. package/dist/core/tools/grep.js.map +1 -1
  63. package/dist/core/tools/ls.d.ts.map +1 -1
  64. package/dist/core/tools/ls.js +5 -7
  65. package/dist/core/tools/ls.js.map +1 -1
  66. package/dist/core/tools/read.d.ts.map +1 -1
  67. package/dist/core/tools/read.js +6 -7
  68. package/dist/core/tools/read.js.map +1 -1
  69. package/dist/core/tools/render-utils.d.ts +5 -2
  70. package/dist/core/tools/render-utils.d.ts.map +1 -1
  71. package/dist/core/tools/render-utils.js +17 -1
  72. package/dist/core/tools/render-utils.js.map +1 -1
  73. package/dist/core/tools/write.d.ts.map +1 -1
  74. package/dist/core/tools/write.js +5 -6
  75. package/dist/core/tools/write.js.map +1 -1
  76. package/dist/index.d.ts +2 -0
  77. package/dist/index.d.ts.map +1 -1
  78. package/dist/index.js +2 -0
  79. package/dist/index.js.map +1 -1
  80. package/dist/main.d.ts.map +1 -1
  81. package/dist/main.js +8 -0
  82. package/dist/main.js.map +1 -1
  83. package/dist/modes/interactive/components/login-dialog.d.ts +0 -1
  84. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  85. package/dist/modes/interactive/components/login-dialog.js +3 -12
  86. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  87. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  88. package/dist/modes/interactive/components/tool-execution.js +22 -0
  89. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  90. package/dist/modes/interactive/interactive-mode.d.ts +3 -0
  91. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  92. package/dist/modes/interactive/interactive-mode.js +36 -0
  93. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  94. package/dist/modes/print-mode.d.ts.map +1 -1
  95. package/dist/modes/print-mode.js +1 -0
  96. package/dist/modes/print-mode.js.map +1 -1
  97. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  98. package/dist/modes/rpc/rpc-mode.js +1 -0
  99. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  100. package/dist/utils/git.d.ts.map +1 -1
  101. package/dist/utils/git.js +54 -22
  102. package/dist/utils/git.js.map +1 -1
  103. package/dist/utils/open-browser.d.ts +9 -0
  104. package/dist/utils/open-browser.d.ts.map +1 -0
  105. package/dist/utils/open-browser.js +22 -0
  106. package/dist/utils/open-browser.js.map +1 -0
  107. package/docs/containerization.md +111 -0
  108. package/docs/docs.json +4 -0
  109. package/docs/extensions.md +36 -11
  110. package/docs/index.md +1 -0
  111. package/docs/providers.md +5 -0
  112. package/docs/quickstart.md +1 -0
  113. package/docs/rpc.md +3 -2
  114. package/docs/session-format.md +1 -1
  115. package/docs/sessions.md +8 -0
  116. package/docs/settings.md +1 -1
  117. package/docs/terminal-setup.md +2 -0
  118. package/docs/tui.md +12 -3
  119. package/docs/usage.md +6 -1
  120. package/examples/extensions/README.md +1 -0
  121. package/examples/extensions/custom-header.ts +1 -1
  122. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  123. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  124. package/examples/extensions/custom-provider-gitlab-duo/index.ts +53 -2
  125. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  126. package/examples/extensions/doom-overlay/index.ts +1 -1
  127. package/examples/extensions/gondolin/index.ts +531 -0
  128. package/examples/extensions/gondolin/package-lock.json +185 -0
  129. package/examples/extensions/gondolin/package.json +19 -0
  130. package/examples/extensions/handoff.ts +1 -1
  131. package/examples/extensions/interactive-shell.ts +1 -1
  132. package/examples/extensions/overlay-qa-tests.ts +152 -81
  133. package/examples/extensions/qna.ts +1 -1
  134. package/examples/extensions/question.ts +1 -1
  135. package/examples/extensions/questionnaire.ts +1 -1
  136. package/examples/extensions/sandbox/package-lock.json +2 -2
  137. package/examples/extensions/sandbox/package.json +1 -1
  138. package/examples/extensions/snake.ts +1 -1
  139. package/examples/extensions/space-invaders.ts +1 -1
  140. package/examples/extensions/summarize.ts +1 -1
  141. package/examples/extensions/tic-tac-toe.ts +1 -1
  142. package/examples/extensions/todo.ts +1 -1
  143. package/examples/extensions/tools.ts +5 -0
  144. package/examples/extensions/with-deps/package-lock.json +2 -2
  145. package/examples/extensions/with-deps/package.json +1 -1
  146. package/npm-shrinkwrap.json +12 -12
  147. package/package.json +5 -4
@@ -8,6 +8,7 @@ import * as os from "node:os";
8
8
  import * as path from "node:path";
9
9
  import { getProviders, } from "@earendil-works/pi-ai";
10
10
  import { CombinedAutocompleteProvider, Container, fuzzyFilter, getCapabilities, hyperlink, Loader, Markdown, matchesKey, ProcessTerminal, Spacer, setKeybindings, Text, TruncatedText, TUI, visibleWidth, } from "@earendil-works/pi-tui";
11
+ import chalk from "chalk";
11
12
  import { spawn, spawnSync } from "child_process";
12
13
  import { APP_NAME, APP_TITLE, getAgentDir, getAuthPath, getDebugLogPath, getDocsPath, getShareViewerUrl, VERSION, } from "../../config.js";
13
14
  import { parseSkillBlock } from "../../core/agent-session.js";
@@ -91,6 +92,27 @@ function isAnthropicSubscriptionAuthKey(apiKey) {
91
92
  function isUnknownModel(model) {
92
93
  return !!model && model.provider === "unknown" && model.id === "unknown" && model.api === "unknown";
93
94
  }
95
+ function quoteIfNeeded(value) {
96
+ if (value.length > 0 && !/[^a-zA-Z0-9_\-./~:@]/.test(value)) {
97
+ return value;
98
+ }
99
+ return `'${value.replace(/'/g, `'\\''`)}'`;
100
+ }
101
+ export function formatResumeCommand(sessionManager) {
102
+ if (!process.stdout.isTTY)
103
+ return undefined;
104
+ if (!sessionManager.isPersisted())
105
+ return undefined;
106
+ const sessionFile = sessionManager.getSessionFile();
107
+ if (!sessionFile || !fs.existsSync(sessionFile))
108
+ return undefined;
109
+ const args = [APP_NAME];
110
+ if (!sessionManager.usesDefaultSessionDir()) {
111
+ args.push("--session-dir", quoteIfNeeded(sessionManager.getSessionDir()));
112
+ }
113
+ args.push("--session", sessionManager.getSessionId());
114
+ return args.join(" ");
115
+ }
94
116
  function hasDefaultModelProvider(providerId) {
95
117
  return providerId in defaultModelPerProvider;
96
118
  }
@@ -125,6 +147,7 @@ export class InteractiveMode {
125
147
  version;
126
148
  isInitialized = false;
127
149
  onInputCallback;
150
+ pendingUserInputs = [];
128
151
  loadingAnimation = undefined;
129
152
  workingMessage = undefined;
130
153
  workingVisible = true;
@@ -1106,6 +1129,7 @@ export class InteractiveMode {
1106
1129
  const uiContext = this.createExtensionUIContext();
1107
1130
  await this.session.bindExtensions({
1108
1131
  uiContext,
1132
+ mode: "tui",
1109
1133
  abortHandler: () => {
1110
1134
  this.restoreQueuedMessagesToEditor({ abort: true });
1111
1135
  },
@@ -1245,6 +1269,7 @@ export class InteractiveMode {
1245
1269
  // Create a context for shortcut handlers
1246
1270
  const createContext = () => ({
1247
1271
  ui: this.createExtensionUIContext(),
1272
+ mode: "tui",
1248
1273
  hasUI: true,
1249
1274
  cwd: this.sessionManager.getCwd(),
1250
1275
  sessionManager: this.sessionManager,
@@ -2130,6 +2155,9 @@ export class InteractiveMode {
2130
2155
  if (this.onInputCallback) {
2131
2156
  this.onInputCallback(text);
2132
2157
  }
2158
+ else {
2159
+ this.pendingUserInputs.push(text);
2160
+ }
2133
2161
  this.editor.addToHistory?.(text);
2134
2162
  };
2135
2163
  }
@@ -2608,6 +2636,10 @@ export class InteractiveMode {
2608
2636
  }
2609
2637
  }
2610
2638
  async getUserInput() {
2639
+ const queuedInput = this.pendingUserInputs.shift();
2640
+ if (queuedInput !== undefined) {
2641
+ return queuedInput;
2642
+ }
2611
2643
  return new Promise((resolve) => {
2612
2644
  this.onInputCallback = (text) => {
2613
2645
  this.onInputCallback = undefined;
@@ -2669,6 +2701,10 @@ export class InteractiveMode {
2669
2701
  await this.ui.terminal.drainInput(1000);
2670
2702
  this.stop();
2671
2703
  await this.runtimeHost.dispose();
2704
+ const resumeCommand = formatResumeCommand(this.sessionManager);
2705
+ if (resumeCommand) {
2706
+ process.stdout.write(`${chalk.dim("To resume this session:")} ${resumeCommand}\n`);
2707
+ }
2672
2708
  process.exit(0);
2673
2709
  }
2674
2710
  emergencyTerminalExit() {