@code-yeongyu/senpi 2026.5.21-2 → 2026.5.23

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 (188) hide show
  1. package/CHANGELOG.md +53 -0
  2. package/README.md +1 -1
  3. package/dist/cli/file-processor.d.ts.map +1 -1
  4. package/dist/cli/file-processor.js +2 -3
  5. package/dist/cli/file-processor.js.map +1 -1
  6. package/dist/config.d.ts.map +1 -1
  7. package/dist/config.js +3 -10
  8. package/dist/config.js.map +1 -1
  9. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  10. package/dist/core/agent-session-runtime.js +2 -1
  11. package/dist/core/agent-session-runtime.js.map +1 -1
  12. package/dist/core/agent-session-services.d.ts.map +1 -1
  13. package/dist/core/agent-session-services.js +3 -2
  14. package/dist/core/agent-session-services.js.map +1 -1
  15. package/dist/core/agent-session.d.ts +2 -0
  16. package/dist/core/agent-session.d.ts.map +1 -1
  17. package/dist/core/agent-session.js +28 -4
  18. package/dist/core/agent-session.js.map +1 -1
  19. package/dist/core/auth-storage.d.ts.map +1 -1
  20. package/dist/core/auth-storage.js +2 -1
  21. package/dist/core/auth-storage.js.map +1 -1
  22. package/dist/core/export-html/index.d.ts.map +1 -1
  23. package/dist/core/export-html/index.js +8 -7
  24. package/dist/core/export-html/index.js.map +1 -1
  25. package/dist/core/export-html/template.js +6 -3
  26. package/dist/core/extensions/builtin/compaction/index.d.ts.map +1 -1
  27. package/dist/core/extensions/builtin/compaction/index.js +9 -0
  28. package/dist/core/extensions/builtin/compaction/index.js.map +1 -1
  29. package/dist/core/extensions/loader.d.ts.map +1 -1
  30. package/dist/core/extensions/loader.js +13 -30
  31. package/dist/core/extensions/loader.js.map +1 -1
  32. package/dist/core/model-registry.d.ts.map +1 -1
  33. package/dist/core/model-registry.js +5 -1
  34. package/dist/core/model-registry.js.map +1 -1
  35. package/dist/core/package-manager.d.ts +1 -0
  36. package/dist/core/package-manager.d.ts.map +1 -1
  37. package/dist/core/package-manager.js +47 -32
  38. package/dist/core/package-manager.js.map +1 -1
  39. package/dist/core/prompt-templates.d.ts.map +1 -1
  40. package/dist/core/prompt-templates.js +6 -20
  41. package/dist/core/prompt-templates.js.map +1 -1
  42. package/dist/core/resource-loader.d.ts.map +1 -1
  43. package/dist/core/resource-loader.js +38 -31
  44. package/dist/core/resource-loader.js.map +1 -1
  45. package/dist/core/sdk.d.ts.map +1 -1
  46. package/dist/core/sdk.js +9 -4
  47. package/dist/core/sdk.js.map +1 -1
  48. package/dist/core/session-manager.d.ts.map +1 -1
  49. package/dist/core/session-manager.js +32 -24
  50. package/dist/core/session-manager.js.map +1 -1
  51. package/dist/core/settings-manager.d.ts.map +1 -1
  52. package/dist/core/settings-manager.js +6 -13
  53. package/dist/core/settings-manager.js.map +1 -1
  54. package/dist/core/skills.d.ts.map +1 -1
  55. package/dist/core/skills.js +8 -22
  56. package/dist/core/skills.js.map +1 -1
  57. package/dist/core/tools/bash.d.ts.map +1 -1
  58. package/dist/core/tools/bash.js +54 -53
  59. package/dist/core/tools/bash.js.map +1 -1
  60. package/dist/core/tools/edit-diff.d.ts +3 -1
  61. package/dist/core/tools/edit-diff.d.ts.map +1 -1
  62. package/dist/core/tools/edit-diff.js +8 -1
  63. package/dist/core/tools/edit-diff.js.map +1 -1
  64. package/dist/core/tools/edit.d.ts +3 -1
  65. package/dist/core/tools/edit.d.ts.map +1 -1
  66. package/dist/core/tools/edit.js +44 -81
  67. package/dist/core/tools/edit.js.map +1 -1
  68. package/dist/core/tools/file-mutation-queue.d.ts.map +1 -1
  69. package/dist/core/tools/file-mutation-queue.js +27 -12
  70. package/dist/core/tools/file-mutation-queue.js.map +1 -1
  71. package/dist/core/tools/find.d.ts.map +1 -1
  72. package/dist/core/tools/find.js +2 -3
  73. package/dist/core/tools/find.js.map +1 -1
  74. package/dist/core/tools/grep.d.ts.map +1 -1
  75. package/dist/core/tools/grep.js +3 -3
  76. package/dist/core/tools/grep.js.map +1 -1
  77. package/dist/core/tools/ls.d.ts.map +1 -1
  78. package/dist/core/tools/ls.js +5 -5
  79. package/dist/core/tools/ls.js.map +1 -1
  80. package/dist/core/tools/output-accumulator.d.ts +2 -0
  81. package/dist/core/tools/output-accumulator.d.ts.map +1 -1
  82. package/dist/core/tools/output-accumulator.js +9 -3
  83. package/dist/core/tools/output-accumulator.js.map +1 -1
  84. package/dist/core/tools/path-utils.d.ts +2 -0
  85. package/dist/core/tools/path-utils.d.ts.map +1 -1
  86. package/dist/core/tools/path-utils.js +39 -21
  87. package/dist/core/tools/path-utils.js.map +1 -1
  88. package/dist/core/tools/read.d.ts.map +1 -1
  89. package/dist/core/tools/read.js +9 -8
  90. package/dist/core/tools/read.js.map +1 -1
  91. package/dist/core/tools/truncate.d.ts.map +1 -1
  92. package/dist/core/tools/truncate.js +12 -2
  93. package/dist/core/tools/truncate.js.map +1 -1
  94. package/dist/core/tools/write.d.ts.map +1 -1
  95. package/dist/core/tools/write.js +20 -35
  96. package/dist/core/tools/write.js.map +1 -1
  97. package/dist/main.d.ts.map +1 -1
  98. package/dist/main.js +5 -6
  99. package/dist/main.js.map +1 -1
  100. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  101. package/dist/modes/interactive/components/config-selector.js +1 -1
  102. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  103. package/dist/modes/interactive/components/footer.d.ts +1 -0
  104. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  105. package/dist/modes/interactive/components/footer.js +14 -5
  106. package/dist/modes/interactive/components/footer.js.map +1 -1
  107. package/dist/modes/interactive/components/login-dialog.d.ts +9 -1
  108. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  109. package/dist/modes/interactive/components/login-dialog.js +29 -4
  110. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  111. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  112. package/dist/modes/interactive/interactive-mode.js +4 -4
  113. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  114. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  115. package/dist/modes/interactive/theme/theme.js +37 -28
  116. package/dist/modes/interactive/theme/theme.js.map +1 -1
  117. package/dist/utils/clipboard-native.d.ts +3 -1
  118. package/dist/utils/clipboard-native.d.ts.map +1 -1
  119. package/dist/utils/clipboard-native.js +14 -8
  120. package/dist/utils/clipboard-native.js.map +1 -1
  121. package/dist/utils/image-resize-core.d.ts +30 -0
  122. package/dist/utils/image-resize-core.d.ts.map +1 -0
  123. package/dist/utils/image-resize-core.js +124 -0
  124. package/dist/utils/image-resize-core.js.map +1 -0
  125. package/dist/utils/image-resize-worker.d.ts +2 -0
  126. package/dist/utils/image-resize-worker.d.ts.map +1 -0
  127. package/dist/utils/image-resize-worker.js +31 -0
  128. package/dist/utils/image-resize-worker.js.map +1 -0
  129. package/dist/utils/image-resize.d.ts +7 -27
  130. package/dist/utils/image-resize.d.ts.map +1 -1
  131. package/dist/utils/image-resize.js +75 -115
  132. package/dist/utils/image-resize.js.map +1 -1
  133. package/dist/utils/paths.d.ts +15 -1
  134. package/dist/utils/paths.d.ts.map +1 -1
  135. package/dist/utils/paths.js +33 -7
  136. package/dist/utils/paths.js.map +1 -1
  137. package/docs/custom-provider.md +44 -12
  138. package/docs/models.md +8 -2
  139. package/docs/packages.md +5 -4
  140. package/docs/sdk.md +2 -0
  141. package/docs/usage.md +2 -2
  142. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  143. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  144. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  145. package/examples/extensions/sandbox/package-lock.json +2 -2
  146. package/examples/extensions/sandbox/package.json +1 -1
  147. package/examples/extensions/with-deps/package-lock.json +2 -2
  148. package/examples/extensions/with-deps/package.json +1 -1
  149. package/node_modules/@earendil-works/pi-agent-core/package.json +2 -2
  150. package/node_modules/@earendil-works/pi-ai/dist/cli.d.ts.map +1 -1
  151. package/node_modules/@earendil-works/pi-ai/dist/cli.js +14 -0
  152. package/node_modules/@earendil-works/pi-ai/dist/cli.js.map +1 -1
  153. package/node_modules/@earendil-works/pi-ai/dist/index.d.ts +1 -1
  154. package/node_modules/@earendil-works/pi-ai/dist/index.d.ts.map +1 -1
  155. package/node_modules/@earendil-works/pi-ai/dist/index.js.map +1 -1
  156. package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts +145 -225
  157. package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts.map +1 -1
  158. package/node_modules/@earendil-works/pi-ai/dist/models.generated.js +133 -224
  159. package/node_modules/@earendil-works/pi-ai/dist/models.generated.js.map +1 -1
  160. package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.d.ts.map +1 -1
  161. package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.js +2 -1
  162. package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.js.map +1 -1
  163. package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.d.ts +27 -8
  164. package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  165. package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.js +35 -22
  166. package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.js.map +1 -1
  167. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts +10 -0
  168. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts.map +1 -1
  169. package/node_modules/@earendil-works/pi-ai/dist/types.js.map +1 -1
  170. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/device-code.d.ts +19 -0
  171. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/device-code.d.ts.map +1 -0
  172. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/device-code.js +55 -0
  173. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/device-code.js.map +1 -0
  174. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/github-copilot.d.ts +3 -3
  175. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
  176. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/github-copilot.js +45 -69
  177. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
  178. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/index.d.ts +1 -0
  179. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/index.d.ts.map +1 -1
  180. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/index.js +1 -0
  181. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/index.js.map +1 -1
  182. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/types.d.ts +8 -1
  183. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/types.d.ts.map +1 -1
  184. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/types.js.map +1 -1
  185. package/node_modules/@earendil-works/pi-ai/package.json +2 -2
  186. package/node_modules/@earendil-works/pi-tui/package.json +1 -1
  187. package/npm-shrinkwrap.json +13 -13
  188. package/package.json +5 -5
@@ -14,11 +14,11 @@
14
14
  */
15
15
  import { randomUUID } from "node:crypto";
16
16
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
17
- import { basename, dirname, resolve } from "node:path";
17
+ import { basename, dirname } from "node:path";
18
18
  import { cleanupSessionResources, isContextOverflow, modelsAreEqual, resetApiProviders, streamSimple, } from "@earendil-works/pi-ai";
19
- import { expandTildePath } from "../config.js";
20
19
  import { theme } from "../modes/interactive/theme/theme.js";
21
20
  import { stripFrontmatter } from "../utils/frontmatter.js";
21
+ import { resolvePath } from "../utils/paths.js";
22
22
  import { sleep } from "../utils/sleep.js";
23
23
  import { formatNoApiKeyFoundMessage, formatNoModelSelectedMessage } from "./auth-guidance.js";
24
24
  import { executeBashWithOperations } from "./bash-executor.js";
@@ -275,6 +275,16 @@ export class AgentSession {
275
275
  getMessageRevision() {
276
276
  return this._messageRevision;
277
277
  }
278
+ _modelSelectionChangesContext(previousModel, nextModel) {
279
+ if (!modelsAreEqual(previousModel, nextModel))
280
+ return true;
281
+ return previousModel?.contextWindow !== nextModel.contextWindow;
282
+ }
283
+ _invalidateCompactionForModelSelection() {
284
+ this.abortCompaction();
285
+ this.abortBranchSummary();
286
+ this._incrementMessageRevision();
287
+ }
278
288
  // Track last assistant message for auto-compaction check
279
289
  _lastAssistantMessage = undefined;
280
290
  /** Internal handler for agent events - shared by subscribe and reconnect */
@@ -576,6 +586,10 @@ export class AgentSession {
576
586
  * Call this when completely done with the session.
577
587
  */
578
588
  dispose() {
589
+ this.abortRetry();
590
+ this.abortCompaction();
591
+ this.abortBranchSummary();
592
+ this.abortBash();
579
593
  this._extensionRunner.invalidate("This extension ctx is stale after session replacement or reload. Do not use a captured pi or command ctx after ctx.newSession(), ctx.fork(), ctx.switchSession(), or ctx.reload(). For newSession, fork, and switchSession, move post-replacement work into withSession and use the ctx passed to withSession. For reload, do not use the old ctx after await ctx.reload().");
580
594
  this._disconnectFromAgent();
581
595
  this._eventListeners = [];
@@ -1163,6 +1177,8 @@ export class AgentSession {
1163
1177
  */
1164
1178
  async abort() {
1165
1179
  this.abortRetry();
1180
+ this.abortCompaction();
1181
+ this.abortBranchSummary();
1166
1182
  if (this._userAbortPromise) {
1167
1183
  this.agent.abort();
1168
1184
  await this._userAbortPromise;
@@ -1186,7 +1202,7 @@ export class AgentSession {
1186
1202
  // Model Management
1187
1203
  // =========================================================================
1188
1204
  async _emitModelSelect(nextModel, previousModel, source) {
1189
- if (modelsAreEqual(previousModel, nextModel))
1205
+ if (!this._modelSelectionChangesContext(previousModel, nextModel))
1190
1206
  return undefined;
1191
1207
  const result = await this._extensionRunner.emitModelSelect({
1192
1208
  type: "model_select",
@@ -1230,6 +1246,10 @@ export class AgentSession {
1230
1246
  throw new Error(`No API key for ${model.provider}/${model.id}`);
1231
1247
  }
1232
1248
  const previousModel = this.model;
1249
+ const invalidatesCompaction = this._modelSelectionChangesContext(previousModel, model);
1250
+ if (invalidatesCompaction) {
1251
+ this._invalidateCompactionForModelSelection();
1252
+ }
1233
1253
  const thinkingLevel = this._getThinkingLevelForModelSwitch();
1234
1254
  this.agent.state.model = model;
1235
1255
  this.sessionManager.appendModelChange(model.provider, model.id);
@@ -1266,6 +1286,10 @@ export class AgentSession {
1266
1286
  nextIndex = direction === "forward" ? (currentIndex + 1) % len : (currentIndex - 1 + len) % len;
1267
1287
  }
1268
1288
  const next = favoriteModels[nextIndex];
1289
+ const invalidatesCompaction = this._modelSelectionChangesContext(currentModel, next.model);
1290
+ if (invalidatesCompaction) {
1291
+ this._invalidateCompactionForModelSelection();
1292
+ }
1269
1293
  const thinkingLevel = this._getThinkingLevelForModelSwitch(next.thinkingLevel);
1270
1294
  this.agent.state.model = next.model;
1271
1295
  this.sessionManager.appendModelChange(next.model.provider, next.model.id);
@@ -2806,7 +2830,7 @@ export class AgentSession {
2806
2830
  * @returns The resolved output file path.
2807
2831
  */
2808
2832
  exportToJsonl(outputPath) {
2809
- const filePath = resolve(expandTildePath(outputPath ?? `session-${new Date().toISOString().replace(/[:.]/g, "-")}.jsonl`));
2833
+ const filePath = resolvePath(outputPath ?? `session-${new Date().toISOString().replace(/[:.]/g, "-")}.jsonl`, process.cwd());
2810
2834
  const dir = dirname(filePath);
2811
2835
  if (!existsSync(dir)) {
2812
2836
  mkdirSync(dir, { recursive: true });