@earendil-works/pi-coding-agent 0.80.10 → 0.81.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 (144) hide show
  1. package/CHANGELOG.md +60 -0
  2. package/README.md +6 -3
  3. package/dist/cli/args.d.ts.map +1 -1
  4. package/dist/cli/args.js +2 -0
  5. package/dist/cli/args.js.map +1 -1
  6. package/dist/core/agent-session-services.d.ts.map +1 -1
  7. package/dist/core/agent-session-services.js +13 -0
  8. package/dist/core/agent-session-services.js.map +1 -1
  9. package/dist/core/agent-session.d.ts +22 -3
  10. package/dist/core/agent-session.d.ts.map +1 -1
  11. package/dist/core/agent-session.js +75 -56
  12. package/dist/core/agent-session.js.map +1 -1
  13. package/dist/core/compaction/branch-summarization.d.ts +7 -1
  14. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  15. package/dist/core/compaction/branch-summarization.js +8 -11
  16. package/dist/core/compaction/branch-summarization.js.map +1 -1
  17. package/dist/core/compaction/compaction.d.ts +19 -3
  18. package/dist/core/compaction/compaction.d.ts.map +1 -1
  19. package/dist/core/compaction/compaction.js +63 -26
  20. package/dist/core/compaction/compaction.js.map +1 -1
  21. package/dist/core/compaction/utils.d.ts +1 -1
  22. package/dist/core/compaction/utils.d.ts.map +1 -1
  23. package/dist/core/compaction/utils.js +6 -17
  24. package/dist/core/compaction/utils.js.map +1 -1
  25. package/dist/core/extensions/loader.d.ts.map +1 -1
  26. package/dist/core/extensions/loader.js +13 -2
  27. package/dist/core/extensions/loader.js.map +1 -1
  28. package/dist/core/extensions/runner.d.ts +2 -1
  29. package/dist/core/extensions/runner.d.ts.map +1 -1
  30. package/dist/core/extensions/runner.js +31 -0
  31. package/dist/core/extensions/runner.js.map +1 -1
  32. package/dist/core/extensions/types.d.ts +16 -2
  33. package/dist/core/extensions/types.d.ts.map +1 -1
  34. package/dist/core/extensions/types.js.map +1 -1
  35. package/dist/core/model-registry.d.ts +5 -1
  36. package/dist/core/model-registry.d.ts.map +1 -1
  37. package/dist/core/model-registry.js +17 -2
  38. package/dist/core/model-registry.js.map +1 -1
  39. package/dist/core/model-resolver.d.ts.map +1 -1
  40. package/dist/core/model-resolver.js +2 -0
  41. package/dist/core/model-resolver.js.map +1 -1
  42. package/dist/core/model-runtime.d.ts +7 -2
  43. package/dist/core/model-runtime.d.ts.map +1 -1
  44. package/dist/core/model-runtime.js +41 -18
  45. package/dist/core/model-runtime.js.map +1 -1
  46. package/dist/core/prompt-templates.d.ts +1 -0
  47. package/dist/core/prompt-templates.d.ts.map +1 -1
  48. package/dist/core/prompt-templates.js +4 -4
  49. package/dist/core/prompt-templates.js.map +1 -1
  50. package/dist/core/remote-catalog-provider.d.ts +1 -1
  51. package/dist/core/remote-catalog-provider.d.ts.map +1 -1
  52. package/dist/core/remote-catalog-provider.js +26 -7
  53. package/dist/core/remote-catalog-provider.js.map +1 -1
  54. package/dist/core/resource-loader.d.ts.map +1 -1
  55. package/dist/core/resource-loader.js +1 -0
  56. package/dist/core/resource-loader.js.map +1 -1
  57. package/dist/core/sdk.d.ts.map +1 -1
  58. package/dist/core/sdk.js +6 -2
  59. package/dist/core/sdk.js.map +1 -1
  60. package/dist/core/session-manager.d.ts +9 -4
  61. package/dist/core/session-manager.d.ts.map +1 -1
  62. package/dist/core/session-manager.js +99 -23
  63. package/dist/core/session-manager.js.map +1 -1
  64. package/dist/core/tools/read.d.ts.map +1 -1
  65. package/dist/core/tools/read.js +1 -1
  66. package/dist/core/tools/read.js.map +1 -1
  67. package/dist/core/usage-totals.d.ts +19 -0
  68. package/dist/core/usage-totals.d.ts.map +1 -0
  69. package/dist/core/usage-totals.js +52 -0
  70. package/dist/core/usage-totals.js.map +1 -0
  71. package/dist/extensions/index.d.ts +3 -0
  72. package/dist/extensions/index.d.ts.map +1 -0
  73. package/dist/extensions/index.js +3 -0
  74. package/dist/extensions/index.js.map +1 -0
  75. package/dist/extensions/llama/client.d.ts +61 -0
  76. package/dist/extensions/llama/client.d.ts.map +1 -0
  77. package/dist/extensions/llama/client.js +302 -0
  78. package/dist/extensions/llama/client.js.map +1 -0
  79. package/dist/extensions/llama/huggingface.d.ts +23 -0
  80. package/dist/extensions/llama/huggingface.d.ts.map +1 -0
  81. package/dist/extensions/llama/huggingface.js +141 -0
  82. package/dist/extensions/llama/huggingface.js.map +1 -0
  83. package/dist/extensions/llama/index.d.ts +3 -0
  84. package/dist/extensions/llama/index.d.ts.map +1 -0
  85. package/dist/extensions/llama/index.js +208 -0
  86. package/dist/extensions/llama/index.js.map +1 -0
  87. package/dist/extensions/llama/provider.d.ts +10 -0
  88. package/dist/extensions/llama/provider.d.ts.map +1 -0
  89. package/dist/extensions/llama/provider.js +102 -0
  90. package/dist/extensions/llama/provider.js.map +1 -0
  91. package/dist/extensions/llama/ui.d.ts +42 -0
  92. package/dist/extensions/llama/ui.d.ts.map +1 -0
  93. package/dist/extensions/llama/ui.js +416 -0
  94. package/dist/extensions/llama/ui.js.map +1 -0
  95. package/dist/index.d.ts +2 -2
  96. package/dist/index.d.ts.map +1 -1
  97. package/dist/index.js +1 -1
  98. package/dist/index.js.map +1 -1
  99. package/dist/main.d.ts.map +1 -1
  100. package/dist/main.js +10 -4
  101. package/dist/main.js.map +1 -1
  102. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  103. package/dist/modes/interactive/components/footer.js +24 -23
  104. package/dist/modes/interactive/components/footer.js.map +1 -1
  105. package/dist/modes/interactive/interactive-mode.d.ts +1 -0
  106. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  107. package/dist/modes/interactive/interactive-mode.js +48 -26
  108. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  109. package/dist/modes/rpc/rpc-client.d.ts +4 -0
  110. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  111. package/dist/modes/rpc/rpc-client.js +7 -0
  112. package/dist/modes/rpc/rpc-client.js.map +1 -1
  113. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  114. package/dist/modes/rpc/rpc-mode.js +4 -0
  115. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  116. package/dist/modes/rpc/rpc-types.d.ts +11 -0
  117. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  118. package/dist/modes/rpc/rpc-types.js.map +1 -1
  119. package/docs/compaction.md +8 -3
  120. package/docs/custom-provider.md +28 -0
  121. package/docs/extensions.md +51 -9
  122. package/docs/index.md +1 -0
  123. package/docs/json.md +5 -1
  124. package/docs/llama-cpp.md +99 -0
  125. package/docs/prompt-templates.md +1 -0
  126. package/docs/providers.md +11 -0
  127. package/docs/rpc.md +81 -2
  128. package/docs/sdk.md +3 -0
  129. package/docs/session-format.md +17 -3
  130. package/docs/tui.md +41 -26
  131. package/docs/usage.md +2 -1
  132. package/examples/extensions/README.md +1 -1
  133. package/examples/extensions/custom-compaction.ts +1 -0
  134. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  135. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  136. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  137. package/examples/extensions/gondolin/package-lock.json +2 -2
  138. package/examples/extensions/gondolin/package.json +1 -1
  139. package/examples/extensions/sandbox/package-lock.json +2 -2
  140. package/examples/extensions/sandbox/package.json +1 -1
  141. package/examples/extensions/with-deps/package-lock.json +2 -2
  142. package/examples/extensions/with-deps/package.json +1 -1
  143. package/npm-shrinkwrap.json +16 -31
  144. package/package.json +4 -4
@@ -24,6 +24,7 @@ import { SessionManager, sessionEntryToContextMessages } from "../../core/sessio
24
24
  import { BUILTIN_SLASH_COMMANDS } from "../../core/slash-commands.js";
25
25
  import { isInstallTelemetryEnabled } from "../../core/telemetry.js";
26
26
  import { hasTrustRequiringProjectResources, ProjectTrustStore } from "../../core/trust-manager.js";
27
+ import { getUsageCostBreakdown } from "../../core/usage-totals.js";
27
28
  import { getChangelogPath, getNewEntries, normalizeChangelogLinks, parseChangelog } from "../../utils/changelog.js";
28
29
  import { copyToClipboard, readClipboardText } from "../../utils/clipboard.js";
29
30
  import { extensionForImageMimeType, readClipboardImage } from "../../utils/clipboard-image.js";
@@ -579,6 +580,12 @@ export class InteractiveMode {
579
580
  */
580
581
  async run() {
581
582
  await this.init();
583
+ if (!process.env.PI_OFFLINE) {
584
+ void this.session.modelRuntime
585
+ .refresh()
586
+ .then(() => this.updateAvailableProviderCount())
587
+ .catch(() => { });
588
+ }
582
589
  // Start version check asynchronously
583
590
  checkForNewPiVersion(this.version).then((newRelease) => {
584
591
  if (newRelease) {
@@ -1062,7 +1069,10 @@ export class InteractiveMode {
1062
1069
  const promptsResult = this.session.resourceLoader.getPrompts();
1063
1070
  const themesResult = this.session.resourceLoader.getThemes();
1064
1071
  const extensions = options?.extensions ??
1065
- this.session.resourceLoader.getExtensions().extensions.map((extension) => ({
1072
+ this.session.resourceLoader
1073
+ .getExtensions()
1074
+ .extensions.filter((extension) => !extension.hidden)
1075
+ .map((extension) => ({
1066
1076
  path: extension.path,
1067
1077
  sourceInfo: extension.sourceInfo,
1068
1078
  }));
@@ -2511,6 +2521,28 @@ export class InteractiveMode {
2511
2521
  this.ui.requestRender();
2512
2522
  break;
2513
2523
  }
2524
+ case "summarization_retry_scheduled": {
2525
+ this.showError(event.errorMessage);
2526
+ this.showStatusIndicator(new RetryStatusIndicator(this.ui, event.attempt, event.maxAttempts, event.delayMs));
2527
+ this.ui.requestRender();
2528
+ break;
2529
+ }
2530
+ case "summarization_retry_attempt_start": {
2531
+ this.clearStatusIndicator("retry");
2532
+ if (event.source === "branchSummary") {
2533
+ this.showStatusIndicator(new BranchSummaryStatusIndicator(this.ui));
2534
+ }
2535
+ else {
2536
+ this.showStatusIndicator(new CompactionStatusIndicator(this.ui, event.reason));
2537
+ }
2538
+ this.ui.requestRender();
2539
+ break;
2540
+ }
2541
+ case "summarization_retry_finished": {
2542
+ this.clearStatusIndicator("retry");
2543
+ this.ui.requestRender();
2544
+ break;
2545
+ }
2514
2546
  }
2515
2547
  }
2516
2548
  /** Extract text content from a user message */
@@ -3321,8 +3353,10 @@ export class InteractiveMode {
3321
3353
  for (const message of preCommands) {
3322
3354
  await this.session.prompt(message.text);
3323
3355
  }
3324
- // Send first prompt (starts streaming)
3325
- const promptPromise = this.session.prompt(firstPrompt.text).catch((error) => {
3356
+ // Start a prompt when idle, or queue it into a run still finishing compaction.
3357
+ const promptPromise = this.session
3358
+ .prompt(firstPrompt.text, { streamingBehavior: firstPrompt.mode })
3359
+ .catch((error) => {
3326
3360
  restoreQueue(error);
3327
3361
  });
3328
3362
  // Queue remaining messages
@@ -3587,10 +3621,12 @@ export class InteractiveMode {
3587
3621
  return [];
3588
3622
  }
3589
3623
  }
3590
- /** Update the footer's available provider count from current model candidates */
3591
- async updateAvailableProviderCount() {
3592
- const models = await this.getModelCandidates();
3593
- const uniqueProviders = new Set(models.map((m) => m.provider));
3624
+ /** Update the footer's available provider count from the current snapshot without refreshing catalogs. */
3625
+ updateAvailableProviderCount() {
3626
+ const models = this.session.scopedModels.length > 0
3627
+ ? this.session.scopedModels.map((scoped) => scoped.model)
3628
+ : this.session.modelRuntime.getAvailableSnapshot();
3629
+ const uniqueProviders = new Set(models.map((model) => model.provider));
3594
3630
  this.footerDataProvider.setAvailableProviderCount(uniqueProviders.size);
3595
3631
  }
3596
3632
  async maybeWarnAboutAnthropicSubscriptionAuth(model = this.session.model) {
@@ -4678,23 +4714,9 @@ export class InteractiveMode {
4678
4714
  const entries = this.sessionManager.getEntries();
4679
4715
  const cacheWaste = computeCacheWaste(entries, this.session.modelRuntime);
4680
4716
  // Cost/token totals per provider/model actually used (e.g. OpenRouter `auto`
4681
- // resolves to a concrete responseModel), sorted by cost descending.
4682
- const perModelMap = new Map();
4683
- for (const entry of entries) {
4684
- if (entry.type !== "message" || entry.message.role !== "assistant")
4685
- continue;
4686
- const message = entry.message;
4687
- const usage = message.usage;
4688
- const key = `${message.provider}/${message.responseModel ?? message.model}`;
4689
- let bucket = perModelMap.get(key);
4690
- if (!bucket) {
4691
- bucket = { key, cost: 0, tokens: 0 };
4692
- perModelMap.set(key, bucket);
4693
- }
4694
- bucket.cost += usage.cost.total;
4695
- bucket.tokens += usage.input + usage.output + usage.cacheRead + usage.cacheWrite;
4696
- }
4697
- const perModel = Array.from(perModelMap.values()).sort((a, b) => b.cost - a.cost);
4717
+ // resolves to a concrete responseModel). Usage without model attribution is
4718
+ // grouped separately so the breakdown reconciles with the session total.
4719
+ const usageBreakdown = getUsageCostBreakdown(entries);
4698
4720
  let info = `${theme.bold("Session Info")}\n\n`;
4699
4721
  if (sessionName) {
4700
4722
  info += `${theme.fg("dim", "Name:")} ${sessionName}\n`;
@@ -4725,8 +4747,8 @@ export class InteractiveMode {
4725
4747
  if (stats.cost > 0 || cacheWaste.missedTokens > 0) {
4726
4748
  info += `\n${theme.bold("Cost")}\n`;
4727
4749
  info += `${theme.fg("dim", "Total:")} $${stats.cost.toFixed(3)}`;
4728
- if (perModel.length > 1) {
4729
- for (const entry of perModel) {
4750
+ if (usageBreakdown.length > 1) {
4751
+ for (const entry of usageBreakdown) {
4730
4752
  info += `\n ${theme.fg("dim", `${entry.key}:`)} $${entry.cost.toFixed(3)} ${theme.fg("dim", `(${formatTokens(entry.tokens)} tokens)`)}`;
4731
4753
  }
4732
4754
  }