@mariozechner/pi-coding-agent 0.50.6 → 0.50.8

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 (73) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/dist/core/agent-session.d.ts +4 -1
  3. package/dist/core/agent-session.d.ts.map +1 -1
  4. package/dist/core/agent-session.js +52 -6
  5. package/dist/core/agent-session.js.map +1 -1
  6. package/dist/core/extensions/index.d.ts +1 -1
  7. package/dist/core/extensions/index.d.ts.map +1 -1
  8. package/dist/core/extensions/index.js.map +1 -1
  9. package/dist/core/extensions/runner.d.ts +15 -1
  10. package/dist/core/extensions/runner.d.ts.map +1 -1
  11. package/dist/core/extensions/runner.js +38 -0
  12. package/dist/core/extensions/runner.js.map +1 -1
  13. package/dist/core/extensions/types.d.ts +14 -1
  14. package/dist/core/extensions/types.d.ts.map +1 -1
  15. package/dist/core/extensions/types.js.map +1 -1
  16. package/dist/core/keybindings.d.ts +1 -1
  17. package/dist/core/keybindings.d.ts.map +1 -1
  18. package/dist/core/keybindings.js +6 -0
  19. package/dist/core/keybindings.js.map +1 -1
  20. package/dist/core/model-registry.d.ts.map +1 -1
  21. package/dist/core/model-registry.js +8 -1
  22. package/dist/core/model-registry.js.map +1 -1
  23. package/dist/core/package-manager.d.ts.map +1 -1
  24. package/dist/core/package-manager.js +17 -11
  25. package/dist/core/package-manager.js.map +1 -1
  26. package/dist/core/resource-loader.d.ts +24 -0
  27. package/dist/core/resource-loader.d.ts.map +1 -1
  28. package/dist/core/resource-loader.js +88 -19
  29. package/dist/core/resource-loader.js.map +1 -1
  30. package/dist/core/sdk.d.ts.map +1 -1
  31. package/dist/core/sdk.js +1 -0
  32. package/dist/core/sdk.js.map +1 -1
  33. package/dist/core/session-manager.d.ts +2 -0
  34. package/dist/core/session-manager.d.ts.map +1 -1
  35. package/dist/core/session-manager.js +2 -0
  36. package/dist/core/session-manager.js.map +1 -1
  37. package/dist/core/settings-manager.d.ts +2 -0
  38. package/dist/core/settings-manager.d.ts.map +1 -1
  39. package/dist/core/settings-manager.js +1 -0
  40. package/dist/core/settings-manager.js.map +1 -1
  41. package/dist/modes/interactive/components/daxnuts.d.ts.map +1 -1
  42. package/dist/modes/interactive/components/daxnuts.js +1 -1
  43. package/dist/modes/interactive/components/daxnuts.js.map +1 -1
  44. package/dist/modes/interactive/components/session-selector-search.d.ts +1 -1
  45. package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -1
  46. package/dist/modes/interactive/components/session-selector-search.js.map +1 -1
  47. package/dist/modes/interactive/components/session-selector.d.ts +1 -0
  48. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
  49. package/dist/modes/interactive/components/session-selector.js +132 -47
  50. package/dist/modes/interactive/components/session-selector.js.map +1 -1
  51. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  52. package/dist/modes/interactive/interactive-mode.js +6 -0
  53. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  54. package/dist/utils/clipboard-image.d.ts.map +1 -1
  55. package/dist/utils/clipboard-image.js +52 -10
  56. package/dist/utils/clipboard-image.js.map +1 -1
  57. package/docs/custom-provider.md +2 -1
  58. package/docs/keybindings.md +8 -0
  59. package/docs/settings.md +5 -1
  60. package/examples/extensions/README.md +7 -0
  61. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  62. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  63. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  64. package/examples/extensions/custom-provider-qwen-cli/index.ts +345 -0
  65. package/examples/extensions/custom-provider-qwen-cli/package.json +16 -0
  66. package/examples/extensions/dynamic-resources/SKILL.md +8 -0
  67. package/examples/extensions/dynamic-resources/dynamic.json +79 -0
  68. package/examples/extensions/dynamic-resources/dynamic.md +5 -0
  69. package/examples/extensions/dynamic-resources/index.ts +15 -0
  70. package/examples/extensions/with-deps/package-lock.json +2 -2
  71. package/examples/extensions/with-deps/package.json +1 -1
  72. package/examples/sdk/12-full-control.ts +1 -0
  73. package/package.json +5 -4
@@ -13,7 +13,7 @@
13
13
  * Modes use this class and add their own I/O layer on top.
14
14
  */
15
15
  import { readFileSync } from "node:fs";
16
- import { join } from "node:path";
16
+ import { basename, dirname, join } from "node:path";
17
17
  import { isContextOverflow, modelsAreEqual, resetApiProviders, supportsXhigh } from "@mariozechner/pi-ai";
18
18
  import { getDocsPath } from "../config.js";
19
19
  import { theme } from "../modes/interactive/theme/theme.js";
@@ -937,14 +937,18 @@ export class AgentSession {
937
937
  /**
938
938
  * Set thinking level.
939
939
  * Clamps to model capabilities based on available thinking levels.
940
- * Saves to session and settings.
940
+ * Saves to session and settings only if the level actually changes.
941
941
  */
942
942
  setThinkingLevel(level) {
943
943
  const availableLevels = this.getAvailableThinkingLevels();
944
944
  const effectiveLevel = availableLevels.includes(level) ? level : this._clampThinkingLevel(level, availableLevels);
945
+ // Only persist if actually changing
946
+ const isChanging = effectiveLevel !== this.agent.state.thinkingLevel;
945
947
  this.agent.setThinkingLevel(effectiveLevel);
946
- this.sessionManager.appendThinkingLevelChange(effectiveLevel);
947
- this.settingsManager.setDefaultThinkingLevel(effectiveLevel);
948
+ if (isChanging) {
949
+ this.sessionManager.appendThinkingLevelChange(effectiveLevel);
950
+ this.settingsManager.setDefaultThinkingLevel(effectiveLevel);
951
+ }
948
952
  }
949
953
  /**
950
954
  * Cycle to next thinking level.
@@ -1317,7 +1321,48 @@ export class AgentSession {
1317
1321
  if (this._extensionRunner) {
1318
1322
  this._applyExtensionBindings(this._extensionRunner);
1319
1323
  await this._extensionRunner.emit({ type: "session_start" });
1324
+ await this.extendResourcesFromExtensions("startup");
1325
+ }
1326
+ }
1327
+ async extendResourcesFromExtensions(reason) {
1328
+ if (!this._extensionRunner?.hasHandlers("resources_discover")) {
1329
+ return;
1330
+ }
1331
+ const { skillPaths, promptPaths, themePaths } = await this._extensionRunner.emitResourcesDiscover(this._cwd, reason);
1332
+ if (skillPaths.length === 0 && promptPaths.length === 0 && themePaths.length === 0) {
1333
+ return;
1334
+ }
1335
+ const extensionPaths = {
1336
+ skillPaths: this.buildExtensionResourcePaths(skillPaths),
1337
+ promptPaths: this.buildExtensionResourcePaths(promptPaths),
1338
+ themePaths: this.buildExtensionResourcePaths(themePaths),
1339
+ };
1340
+ this._resourceLoader.extendResources(extensionPaths);
1341
+ this._baseSystemPrompt = this._rebuildSystemPrompt(this.getActiveToolNames());
1342
+ this.agent.setSystemPrompt(this._baseSystemPrompt);
1343
+ }
1344
+ buildExtensionResourcePaths(entries) {
1345
+ return entries.map((entry) => {
1346
+ const source = this.getExtensionSourceLabel(entry.extensionPath);
1347
+ const baseDir = entry.extensionPath.startsWith("<") ? undefined : dirname(entry.extensionPath);
1348
+ return {
1349
+ path: entry.path,
1350
+ metadata: {
1351
+ source,
1352
+ scope: "temporary",
1353
+ origin: "top-level",
1354
+ baseDir,
1355
+ },
1356
+ };
1357
+ });
1358
+ }
1359
+ getExtensionSourceLabel(extensionPath) {
1360
+ if (extensionPath.startsWith("<")) {
1361
+ return `extension:${extensionPath.replace(/[<>]/g, "")}`;
1320
1362
  }
1363
+ const base = basename(extensionPath);
1364
+ const name = base.replace(/\.(ts|js)$/, "");
1365
+ return `extension:${name}`;
1321
1366
  }
1322
1367
  _applyExtensionBindings(runner) {
1323
1368
  runner.setUIContext(this._extensionUIContext);
@@ -1482,6 +1527,7 @@ export class AgentSession {
1482
1527
  this._extensionErrorListener;
1483
1528
  if (this._extensionRunner && hasBindings) {
1484
1529
  await this._extensionRunner.emit({ type: "session_start" });
1530
+ await this.extendResourcesFromExtensions("reload");
1485
1531
  }
1486
1532
  }
1487
1533
  // =========================================================================
@@ -1499,8 +1545,8 @@ export class AgentSession {
1499
1545
  if (isContextOverflow(message, contextWindow))
1500
1546
  return false;
1501
1547
  const err = message.errorMessage;
1502
- // Match: overloaded_error, rate limit, 429, 500, 502, 503, 504, service unavailable, connection errors, fetch failed, terminated
1503
- return /overloaded|rate.?limit|too many requests|429|500|502|503|504|service.?unavailable|server error|internal error|connection.?error|connection.?refused|other side closed|fetch failed|upstream.?connect|reset before headers|terminated/i.test(err);
1548
+ // Match: overloaded_error, rate limit, 429, 500, 502, 503, 504, service unavailable, connection errors, fetch failed, terminated, retry delay exceeded
1549
+ return /overloaded|rate.?limit|too many requests|429|500|502|503|504|service.?unavailable|server error|internal error|connection.?error|connection.?refused|other side closed|fetch failed|upstream.?connect|reset before headers|terminated|retry delay/i.test(err);
1504
1550
  }
1505
1551
  /**
1506
1552
  * Handle retryable errors with exponential backoff.