@averyyy/pi-coding-agent 0.86.1-piclient.1 → 0.87.0-piclient.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 (114) hide show
  1. package/CHANGELOG.md +40 -0
  2. package/README.md +36 -0
  3. package/dist/bundle/chunks/{chunk-K53F3E6X.js → chunk-3OMQWEMP.js} +44 -38
  4. package/dist/bundle/chunks/chunk-CJ5EZ24X.js +2 -0
  5. package/dist/bundle/chunks/devin-runtime.js +7 -2
  6. package/dist/bundle/chunks/github-copilot.js +1 -1
  7. package/dist/bundle/chunks/{openai-completions-CYGM3XXP.js → openai-completions-XHML6MTL.js} +1 -1
  8. package/dist/bundle/chunks/{virtual-modules-TAAJ5574.js → virtual-modules-N7I2ZIFC.js} +1 -1
  9. package/dist/bundle/cli-runtime.js +1 -1
  10. package/dist/bundle/index.js +1 -1
  11. package/dist/bundle/rpc-entry.js +1 -1
  12. package/dist/cli/file-processor.d.ts +1 -1
  13. package/dist/cli/file-processor.d.ts.map +1 -1
  14. package/dist/cli/file-processor.js.map +1 -1
  15. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  16. package/dist/core/agent-session-runtime.js +1 -1
  17. package/dist/core/agent-session-runtime.js.map +1 -1
  18. package/dist/core/agent-session.d.ts +28 -3
  19. package/dist/core/agent-session.d.ts.map +1 -1
  20. package/dist/core/agent-session.js +482 -145
  21. package/dist/core/agent-session.js.map +1 -1
  22. package/dist/core/cache-warmer.d.ts +1 -0
  23. package/dist/core/cache-warmer.d.ts.map +1 -1
  24. package/dist/core/cache-warmer.js +15 -1
  25. package/dist/core/cache-warmer.js.map +1 -1
  26. package/dist/core/compaction/compaction.d.ts +3 -1
  27. package/dist/core/compaction/compaction.d.ts.map +1 -1
  28. package/dist/core/compaction/compaction.js +146 -48
  29. package/dist/core/compaction/compaction.js.map +1 -1
  30. package/dist/core/crash-log.d.ts +5 -0
  31. package/dist/core/crash-log.d.ts.map +1 -1
  32. package/dist/core/crash-log.js +68 -0
  33. package/dist/core/crash-log.js.map +1 -1
  34. package/dist/core/export-html/template.js +6 -1
  35. package/dist/core/extensions/index.d.ts +1 -1
  36. package/dist/core/extensions/index.d.ts.map +1 -1
  37. package/dist/core/extensions/index.js.map +1 -1
  38. package/dist/core/extensions/runner.d.ts +16 -3
  39. package/dist/core/extensions/runner.d.ts.map +1 -1
  40. package/dist/core/extensions/runner.js +110 -5
  41. package/dist/core/extensions/runner.js.map +1 -1
  42. package/dist/core/extensions/types.d.ts +77 -6
  43. package/dist/core/extensions/types.d.ts.map +1 -1
  44. package/dist/core/extensions/types.js.map +1 -1
  45. package/dist/core/index.d.ts +1 -1
  46. package/dist/core/index.d.ts.map +1 -1
  47. package/dist/core/index.js.map +1 -1
  48. package/dist/core/model-config.d.ts +52 -0
  49. package/dist/core/model-config.d.ts.map +1 -1
  50. package/dist/core/model-config.js +16 -0
  51. package/dist/core/model-config.js.map +1 -1
  52. package/dist/core/prompt-templates.d.ts +6 -1
  53. package/dist/core/prompt-templates.d.ts.map +1 -1
  54. package/dist/core/prompt-templates.js +61 -35
  55. package/dist/core/prompt-templates.js.map +1 -1
  56. package/dist/core/provider-composer.d.ts +1 -0
  57. package/dist/core/provider-composer.d.ts.map +1 -1
  58. package/dist/core/provider-composer.js +19 -0
  59. package/dist/core/provider-composer.js.map +1 -1
  60. package/dist/core/resource-loader.d.ts.map +1 -1
  61. package/dist/core/resource-loader.js +6 -2
  62. package/dist/core/resource-loader.js.map +1 -1
  63. package/dist/core/sdk.d.ts.map +1 -1
  64. package/dist/core/sdk.js +2 -2
  65. package/dist/core/sdk.js.map +1 -1
  66. package/dist/core/session-manager.d.ts +36 -9
  67. package/dist/core/session-manager.d.ts.map +1 -1
  68. package/dist/core/session-manager.js +97 -7
  69. package/dist/core/session-manager.js.map +1 -1
  70. package/dist/core/tools/read.d.ts +4 -1
  71. package/dist/core/tools/read.d.ts.map +1 -1
  72. package/dist/core/tools/read.js +5 -1
  73. package/dist/core/tools/read.js.map +1 -1
  74. package/dist/index.d.ts +2 -2
  75. package/dist/index.d.ts.map +1 -1
  76. package/dist/index.js +1 -1
  77. package/dist/index.js.map +1 -1
  78. package/dist/main.d.ts.map +1 -1
  79. package/dist/main.js +4 -3
  80. package/dist/main.js.map +1 -1
  81. package/dist/modes/interactive/bug-report.d.ts.map +1 -1
  82. package/dist/modes/interactive/bug-report.js +4 -0
  83. package/dist/modes/interactive/bug-report.js.map +1 -1
  84. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
  85. package/dist/modes/interactive/components/tree-selector.js +7 -0
  86. package/dist/modes/interactive/components/tree-selector.js.map +1 -1
  87. package/dist/modes/interactive/interactive-mode.d.ts +3 -0
  88. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  89. package/dist/modes/interactive/interactive-mode.js +64 -2
  90. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  91. package/dist/utils/mime.d.ts.map +1 -1
  92. package/dist/utils/mime.js +1 -1
  93. package/dist/utils/mime.js.map +1 -1
  94. package/dist/utils/tool-result-images.d.ts +3 -1
  95. package/dist/utils/tool-result-images.d.ts.map +1 -1
  96. package/dist/utils/tool-result-images.js +4 -1
  97. package/dist/utils/tool-result-images.js.map +1 -1
  98. package/docs/compaction.md +23 -4
  99. package/docs/extensions.md +70 -6
  100. package/docs/models.md +29 -1
  101. package/docs/sdk.md +13 -2
  102. package/docs/session-format.md +15 -2
  103. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  104. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  105. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  106. package/examples/extensions/gondolin/package-lock.json +2 -2
  107. package/examples/extensions/gondolin/package.json +1 -1
  108. package/examples/extensions/sandbox/package-lock.json +2 -2
  109. package/examples/extensions/sandbox/package.json +1 -1
  110. package/examples/extensions/with-deps/package-lock.json +2 -2
  111. package/examples/extensions/with-deps/package.json +1 -1
  112. package/examples/plugins/pi-example-plugin/src/session.ts +3 -2
  113. package/package.json +8 -8
  114. package/dist/bundle/chunks/chunk-WF5BMKD5.js +0 -2
@@ -16,12 +16,12 @@ import { parseSkillBlock } from "../../core/agent-session.js";
16
16
  import { SessionImportFileNotFoundError } from "../../core/agent-session-runtime.js";
17
17
  import { CACHE_TTL_MS, collectCacheMisses, computeCacheWaste, detectCacheMiss, } from "../../core/cache-stats.js";
18
18
  import { formatCacheWarmingStatus, formatCacheWarmingUsage } from "../../core/cache-warmer.js";
19
- import { recordCrash, takeUnnotifiedCrash } from "../../core/crash-log.js";
19
+ import { findExtensionStackMatches, recordCrash, takeUnnotifiedCrash } from "../../core/crash-log.js";
20
20
  import { DEFAULT_THINKING_LEVEL, THINKING_LEVEL_OPTIONS } from "../../core/defaults.js";
21
21
  import { FooterDataProvider } from "../../core/footer-data-provider.js";
22
22
  import { configureHttpDispatcher, formatHttpIdleTimeoutMs } from "../../core/http-dispatcher.js";
23
23
  import { KeybindingsManager } from "../../core/keybindings.js";
24
- import { createCompactionSummaryMessage } from "../../core/messages.js";
24
+ import { createCompactionSummaryMessage, createCustomMessage } from "../../core/messages.js";
25
25
  import { defaultModelPerProvider, findExactModelReferenceMatch, resolveModelScopeFromModels, } from "../../core/model-resolver.js";
26
26
  import { CredentialSynchronizationError } from "../../core/model-runtime.js";
27
27
  import { DefaultPackageManager } from "../../core/package-manager.js";
@@ -122,6 +122,22 @@ function isDeadTerminalError(error) {
122
122
  const code = error.code;
123
123
  return code !== undefined && DEAD_TERMINAL_ERROR_CODES.has(code);
124
124
  }
125
+ export function formatCrashExtensionHint(extensionMatches) {
126
+ const matches = Array.isArray(extensionMatches)
127
+ ? extensionMatches.filter((match) => typeof match === "string" && match.length > 0)
128
+ : [];
129
+ if (matches.length === 0)
130
+ return undefined;
131
+ const quoted = matches.map((match) => `\`${match}\``);
132
+ const labels = quoted.length === 1
133
+ ? quoted[0]
134
+ : quoted.length === 2
135
+ ? quoted.join(" and ")
136
+ : `${quoted.slice(0, -1).join(", ")}, and ${quoted[quoted.length - 1]}`;
137
+ const noun = matches.length === 1 ? "extension" : "extensions";
138
+ const pronoun = matches.length === 1 ? "it" : "them";
139
+ return `A stack frame came from loaded ${noun} ${labels}, which may be involved. Try disabling ${pronoun} with \`${APP_NAME} config\`, or run \`${APP_NAME} -ne\` to confirm.`;
140
+ }
125
141
  const ANTHROPIC_SUBSCRIPTION_AUTH_WARNING = "Anthropic subscription auth is active. Third-party harness usage draws from extra usage and is billed per token, not your Claude plan limits. Manage extra usage at https://claude.ai/settings/usage. Disable this warning in /settings.";
126
142
  function isAnthropicSubscriptionAuthKey(apiKey) {
127
143
  return typeof apiKey === "string" && apiKey.startsWith("sk-ant-oat");
@@ -244,6 +260,7 @@ export class InteractiveMode {
244
260
  managedToolStatusStarted = false;
245
261
  // Streaming message tracking
246
262
  streamingComponent = undefined;
263
+ entriesRenderedByBoundaryCompaction = new Set();
247
264
  streamingMessage = undefined;
248
265
  // Tool execution tracking: toolCallId -> component
249
266
  pendingTools = new Map();
@@ -1562,6 +1579,10 @@ export class InteractiveMode {
1562
1579
  async handleFatalRuntimeError(prefix, error) {
1563
1580
  const message = error instanceof Error ? error.message : String(error);
1564
1581
  this.showError(`${prefix}: ${message}`);
1582
+ const extensionHint = this.getCrashExtensionHint(error);
1583
+ if (extensionHint) {
1584
+ this.chatContainer.addChild(new Text(theme.fg("warning", extensionHint), this.outputPad, 0));
1585
+ }
1565
1586
  if (this.recordCrash("fatal_error", error)) {
1566
1587
  this.chatContainer.addChild(new Text(theme.fg("muted", this.crashReportInstructions()), this.outputPad, 0));
1567
1588
  }
@@ -1569,6 +1590,14 @@ export class InteractiveMode {
1569
1590
  this.stop("transcript");
1570
1591
  process.exit(1);
1571
1592
  }
1593
+ getCrashExtensionHint(error) {
1594
+ try {
1595
+ return formatCrashExtensionHint(findExtensionStackMatches(error instanceof Error ? error.stack : undefined, this.session.resourceLoader.getExtensions().extensions));
1596
+ }
1597
+ catch {
1598
+ return undefined;
1599
+ }
1600
+ }
1572
1601
  /** Persist a crash so the next start can point the user at `/bug`. Returns false when nothing was written. */
1573
1602
  recordCrash(kind, error) {
1574
1603
  try {
@@ -2821,6 +2850,8 @@ export class InteractiveMode {
2821
2850
  this.ui.requestRender();
2822
2851
  break;
2823
2852
  case "entry_appended":
2853
+ if (this.entriesRenderedByBoundaryCompaction.delete(event.entry.id))
2854
+ break;
2824
2855
  if (event.entry.type === "custom") {
2825
2856
  this.addCustomEntryToChat(event.entry);
2826
2857
  this.ui.requestRender();
@@ -2829,6 +2860,34 @@ export class InteractiveMode {
2829
2860
  this.addCacheWarmingUsage(event.entry);
2830
2861
  this.ui.requestRender();
2831
2862
  }
2863
+ else if (event.entry.type === "custom_message" && event.entry.display) {
2864
+ this.addMessageToChat(createCustomMessage(event.entry.customType, event.entry.content, event.entry.display, event.entry.details, event.entry.timestamp));
2865
+ this.ui.requestRender();
2866
+ }
2867
+ else if (event.entry.type === "compaction") {
2868
+ const entries = this.sessionManager.buildContextEntries();
2869
+ if (entries[0]?.id !== event.entry.id)
2870
+ break;
2871
+ this.chatContainer.clear();
2872
+ const branch = this.sessionManager.getBranch();
2873
+ const compactionIndex = branch.findIndex((entry) => entry.id === event.entry.id);
2874
+ const entriesAfterCompaction = new Set(branch.slice(compactionIndex + 1).map((entry) => entry.id));
2875
+ const retainedEntries = entries.slice(1);
2876
+ this.renderSessionEntries(retainedEntries.filter((entry) => !entriesAfterCompaction.has(entry.id)));
2877
+ this.addMessageToChat(createCompactionSummaryMessage(event.entry.summary, event.entry.tokensBefore, event.entry.timestamp));
2878
+ if (event.entry.usage) {
2879
+ this.addCompactionCostNotice({
2880
+ type: "compaction_cost",
2881
+ kind: "compaction",
2882
+ usage: event.entry.usage,
2883
+ });
2884
+ }
2885
+ this.renderSessionEntries(retainedEntries.filter((entry) => entriesAfterCompaction.has(entry.id)));
2886
+ for (const entryId of entriesAfterCompaction)
2887
+ this.entriesRenderedByBoundaryCompaction.add(entryId);
2888
+ this.footer.invalidate();
2889
+ this.ui.requestRender();
2890
+ }
2832
2891
  break;
2833
2892
  case "session_info_changed":
2834
2893
  this.updateTerminalTitle();
@@ -3576,6 +3635,9 @@ export class InteractiveMode {
3576
3635
  catch { }
3577
3636
  console.error(`${APP_NAME} exiting due to uncaughtException:`);
3578
3637
  console.error(error);
3638
+ const extensionHint = this.getCrashExtensionHint(error);
3639
+ if (extensionHint)
3640
+ console.error(`\n${extensionHint}`);
3579
3641
  if (this.recordCrash("uncaught_exception", error)) {
3580
3642
  console.error(`\n${this.crashReportInstructions()}`);
3581
3643
  }