@code-yeongyu/senpi 2026.5.29-4 → 2026.6.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 (121) hide show
  1. package/CHANGELOG.md +41 -1
  2. package/README.md +8 -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 +13 -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 +5 -1
  11. package/dist/core/agent-session.d.ts.map +1 -1
  12. package/dist/core/agent-session.js +18 -2
  13. package/dist/core/agent-session.js.map +1 -1
  14. package/dist/core/compaction/branch-summarization.d.ts +3 -1
  15. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  16. package/dist/core/compaction/branch-summarization.js +9 -3
  17. package/dist/core/compaction/branch-summarization.js.map +1 -1
  18. package/dist/core/extensions/index.d.ts +1 -1
  19. package/dist/core/extensions/index.d.ts.map +1 -1
  20. package/dist/core/extensions/index.js.map +1 -1
  21. package/dist/core/extensions/runner.d.ts +4 -2
  22. package/dist/core/extensions/runner.d.ts.map +1 -1
  23. package/dist/core/extensions/runner.js +13 -1
  24. package/dist/core/extensions/runner.js.map +1 -1
  25. package/dist/core/extensions/types.d.ts +7 -1
  26. package/dist/core/extensions/types.d.ts.map +1 -1
  27. package/dist/core/extensions/types.js.map +1 -1
  28. package/dist/core/footer-data-provider.d.ts +2 -0
  29. package/dist/core/footer-data-provider.d.ts.map +1 -1
  30. package/dist/core/footer-data-provider.js +29 -1
  31. package/dist/core/footer-data-provider.js.map +1 -1
  32. package/dist/core/model-resolver.d.ts.map +1 -1
  33. package/dist/core/model-resolver.js +1 -0
  34. package/dist/core/model-resolver.js.map +1 -1
  35. package/dist/core/provider-attribution.d.ts +4 -0
  36. package/dist/core/provider-attribution.d.ts.map +1 -0
  37. package/dist/core/provider-attribution.js +73 -0
  38. package/dist/core/provider-attribution.js.map +1 -0
  39. package/dist/core/provider-display-names.d.ts.map +1 -1
  40. package/dist/core/provider-display-names.js +1 -0
  41. package/dist/core/provider-display-names.js.map +1 -1
  42. package/dist/core/sdk.d.ts.map +1 -1
  43. package/dist/core/sdk.js +8 -34
  44. package/dist/core/sdk.js.map +1 -1
  45. package/dist/core/session-manager.d.ts.map +1 -1
  46. package/dist/core/session-manager.js +92 -68
  47. package/dist/core/session-manager.js.map +1 -1
  48. package/dist/core/tools/edit.d.ts.map +1 -1
  49. package/dist/core/tools/edit.js +7 -10
  50. package/dist/core/tools/edit.js.map +1 -1
  51. package/dist/core/tools/find.d.ts.map +1 -1
  52. package/dist/core/tools/find.js.map +1 -1
  53. package/dist/core/tools/grep.d.ts.map +1 -1
  54. package/dist/core/tools/grep.js.map +1 -1
  55. package/dist/core/tools/ls.d.ts.map +1 -1
  56. package/dist/core/tools/ls.js +5 -7
  57. package/dist/core/tools/ls.js.map +1 -1
  58. package/dist/core/tools/read.d.ts.map +1 -1
  59. package/dist/core/tools/read.js +6 -7
  60. package/dist/core/tools/read.js.map +1 -1
  61. package/dist/core/tools/render-utils.d.ts +5 -2
  62. package/dist/core/tools/render-utils.d.ts.map +1 -1
  63. package/dist/core/tools/render-utils.js +17 -1
  64. package/dist/core/tools/render-utils.js.map +1 -1
  65. package/dist/core/tools/write.d.ts.map +1 -1
  66. package/dist/core/tools/write.js +5 -6
  67. package/dist/core/tools/write.js.map +1 -1
  68. package/dist/index.d.ts +2 -0
  69. package/dist/index.d.ts.map +1 -1
  70. package/dist/index.js +2 -0
  71. package/dist/index.js.map +1 -1
  72. package/dist/main.d.ts.map +1 -1
  73. package/dist/main.js +8 -0
  74. package/dist/main.js.map +1 -1
  75. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  76. package/dist/modes/interactive/components/tool-execution.js +25 -1
  77. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  78. package/dist/modes/interactive/interactive-mode.d.ts +3 -0
  79. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  80. package/dist/modes/interactive/interactive-mode.js +39 -0
  81. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  82. package/dist/modes/print-mode.d.ts.map +1 -1
  83. package/dist/modes/print-mode.js +1 -0
  84. package/dist/modes/print-mode.js.map +1 -1
  85. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  86. package/dist/modes/rpc/rpc-mode.js +1 -0
  87. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  88. package/docs/extensions.md +35 -11
  89. package/docs/providers.md +2 -0
  90. package/docs/quickstart.md +1 -0
  91. package/docs/rpc.md +3 -2
  92. package/docs/session-format.md +1 -1
  93. package/docs/sessions.md +8 -0
  94. package/docs/settings.md +1 -1
  95. package/docs/terminal-setup.md +2 -0
  96. package/docs/tui.md +12 -3
  97. package/docs/usage.md +6 -1
  98. package/examples/extensions/custom-header.ts +1 -1
  99. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  100. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  101. package/examples/extensions/custom-provider-gitlab-duo/index.ts +53 -2
  102. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  103. package/examples/extensions/doom-overlay/index.ts +1 -1
  104. package/examples/extensions/handoff.ts +1 -1
  105. package/examples/extensions/interactive-shell.ts +1 -1
  106. package/examples/extensions/overlay-qa-tests.ts +152 -81
  107. package/examples/extensions/qna.ts +1 -1
  108. package/examples/extensions/question.ts +1 -1
  109. package/examples/extensions/questionnaire.ts +1 -1
  110. package/examples/extensions/sandbox/package-lock.json +2 -2
  111. package/examples/extensions/sandbox/package.json +1 -1
  112. package/examples/extensions/snake.ts +1 -1
  113. package/examples/extensions/space-invaders.ts +1 -1
  114. package/examples/extensions/summarize.ts +1 -1
  115. package/examples/extensions/tic-tac-toe.ts +1 -1
  116. package/examples/extensions/todo.ts +1 -1
  117. package/examples/extensions/tools.ts +5 -0
  118. package/examples/extensions/with-deps/package-lock.json +2 -2
  119. package/examples/extensions/with-deps/package.json +1 -1
  120. package/npm-shrinkwrap.json +12 -12
  121. package/package.json +4 -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, expandTildePath, getAuthPath, getDebugLogPath, getDocsPath, getShareViewerUrl, VERSION, } from "../../config.js";
13
14
  import { parseSkillBlock } from "../../core/agent-session.js";
@@ -135,6 +136,27 @@ function isAnthropicSubscriptionAuthKey(apiKey) {
135
136
  function isUnknownModel(model) {
136
137
  return !!model && model.provider === "unknown" && model.id === "unknown" && model.api === "unknown";
137
138
  }
139
+ function quoteIfNeeded(value) {
140
+ if (value.length > 0 && !/[^a-zA-Z0-9_\-./~:@]/.test(value)) {
141
+ return value;
142
+ }
143
+ return `'${value.replace(/'/g, `'\\''`)}'`;
144
+ }
145
+ export function formatResumeCommand(sessionManager) {
146
+ if (!process.stdout.isTTY)
147
+ return undefined;
148
+ if (!sessionManager.isPersisted())
149
+ return undefined;
150
+ const sessionFile = sessionManager.getSessionFile();
151
+ if (!sessionFile || !fs.existsSync(sessionFile))
152
+ return undefined;
153
+ const args = [APP_NAME];
154
+ if (!sessionManager.usesDefaultSessionDir()) {
155
+ args.push("--session-dir", quoteIfNeeded(sessionManager.getSessionDir()));
156
+ }
157
+ args.push("--session", sessionManager.getSessionId());
158
+ return args.join(" ");
159
+ }
138
160
  function hasDefaultModelProvider(providerId) {
139
161
  return providerId in defaultModelPerProvider;
140
162
  }
@@ -171,6 +193,7 @@ export class InteractiveMode {
171
193
  version;
172
194
  isInitialized = false;
173
195
  onInputCallback;
196
+ pendingUserInputs = [];
174
197
  loadingAnimation = undefined;
175
198
  workingMessage = undefined;
176
199
  workingVisible = true;
@@ -1157,6 +1180,10 @@ export class InteractiveMode {
1157
1180
  const uiContext = this.createExtensionUIContext();
1158
1181
  await this.session.bindExtensions({
1159
1182
  uiContext,
1183
+ mode: "tui",
1184
+ abortHandler: () => {
1185
+ this.restoreQueuedMessagesToEditor({ abort: true });
1186
+ },
1160
1187
  commandContextActions: {
1161
1188
  waitForIdle: () => this.session.agent.waitForIdle(),
1162
1189
  newSession: async (options) => {
@@ -1290,6 +1317,7 @@ export class InteractiveMode {
1290
1317
  // Create a context for shortcut handlers
1291
1318
  const createContext = () => ({
1292
1319
  ui: this.createExtensionUIContext(),
1320
+ mode: "tui",
1293
1321
  hasUI: true,
1294
1322
  cwd: this.sessionManager.getCwd(),
1295
1323
  sessionManager: this.sessionManager,
@@ -2283,6 +2311,9 @@ export class InteractiveMode {
2283
2311
  if (this.onInputCallback) {
2284
2312
  this.onInputCallback(text);
2285
2313
  }
2314
+ else {
2315
+ this.pendingUserInputs.push(text);
2316
+ }
2286
2317
  this.editor.addToHistory?.(text);
2287
2318
  };
2288
2319
  }
@@ -2790,6 +2821,10 @@ export class InteractiveMode {
2790
2821
  }
2791
2822
  }
2792
2823
  async getUserInput() {
2824
+ const queuedInput = this.pendingUserInputs.shift();
2825
+ if (queuedInput !== undefined) {
2826
+ return queuedInput;
2827
+ }
2793
2828
  return new Promise((resolve) => {
2794
2829
  this.onInputCallback = (text) => {
2795
2830
  this.onInputCallback = undefined;
@@ -2851,6 +2886,10 @@ export class InteractiveMode {
2851
2886
  await this.ui.terminal.drainInput(1000);
2852
2887
  this.stop();
2853
2888
  await this.runtimeHost.dispose();
2889
+ const resumeCommand = formatResumeCommand(this.sessionManager);
2890
+ if (resumeCommand) {
2891
+ process.stdout.write(`${chalk.dim("To resume this session:")} ${resumeCommand}\n`);
2892
+ }
2854
2893
  process.exit(0);
2855
2894
  }
2856
2895
  emergencyTerminalExit() {