@astralyn/pi 0.82.2 → 0.82.4

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 (172) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/README.md +70 -634
  3. package/dist/cli/config-selector.d.ts.map +1 -1
  4. package/dist/cli/config-selector.js +3 -2
  5. package/dist/cli/config-selector.js.map +1 -1
  6. package/dist/cli/startup-ui.d.ts.map +1 -1
  7. package/dist/cli/startup-ui.js +3 -2
  8. package/dist/cli/startup-ui.js.map +1 -1
  9. package/dist/core/agent-session.d.ts +2 -0
  10. package/dist/core/agent-session.d.ts.map +1 -1
  11. package/dist/core/agent-session.js +31 -12
  12. package/dist/core/agent-session.js.map +1 -1
  13. package/dist/core/extensions/index.d.ts +1 -1
  14. package/dist/core/extensions/index.d.ts.map +1 -1
  15. package/dist/core/extensions/index.js.map +1 -1
  16. package/dist/core/extensions/types.d.ts +11 -0
  17. package/dist/core/extensions/types.d.ts.map +1 -1
  18. package/dist/core/extensions/types.js.map +1 -1
  19. package/dist/core/model-resolver.d.ts +1 -0
  20. package/dist/core/model-resolver.d.ts.map +1 -1
  21. package/dist/core/model-resolver.js +13 -3
  22. package/dist/core/model-resolver.js.map +1 -1
  23. package/dist/core/remote-catalog-provider.d.ts.map +1 -1
  24. package/dist/core/remote-catalog-provider.js +19 -1
  25. package/dist/core/remote-catalog-provider.js.map +1 -1
  26. package/dist/core/resource-loader.d.ts.map +1 -1
  27. package/dist/core/resource-loader.js +3 -0
  28. package/dist/core/resource-loader.js.map +1 -1
  29. package/dist/extensions/index.d.ts.map +1 -1
  30. package/dist/extensions/index.js +2 -0
  31. package/dist/extensions/index.js.map +1 -1
  32. package/dist/extensions/llama/provider.d.ts.map +1 -1
  33. package/dist/extensions/llama/provider.js +6 -0
  34. package/dist/extensions/llama/provider.js.map +1 -1
  35. package/dist/extensions/plan/constants.d.ts +31 -0
  36. package/dist/extensions/plan/constants.d.ts.map +1 -0
  37. package/dist/extensions/plan/constants.js +57 -0
  38. package/dist/extensions/plan/constants.js.map +1 -0
  39. package/dist/extensions/plan/index.d.ts +21 -0
  40. package/dist/extensions/plan/index.d.ts.map +1 -0
  41. package/dist/extensions/plan/index.js +291 -0
  42. package/dist/extensions/plan/index.js.map +1 -0
  43. package/dist/extensions/plan/schema.d.ts +15 -0
  44. package/dist/extensions/plan/schema.d.ts.map +1 -0
  45. package/dist/extensions/plan/schema.js +13 -0
  46. package/dist/extensions/plan/schema.js.map +1 -0
  47. package/dist/extensions/plan/state.d.ts +29 -0
  48. package/dist/extensions/plan/state.d.ts.map +1 -0
  49. package/dist/extensions/plan/state.js +74 -0
  50. package/dist/extensions/plan/state.js.map +1 -0
  51. package/dist/extensions/plan/storage.d.ts +18 -0
  52. package/dist/extensions/plan/storage.d.ts.map +1 -0
  53. package/dist/extensions/plan/storage.js +58 -0
  54. package/dist/extensions/plan/storage.js.map +1 -0
  55. package/dist/extensions/rewind/anchor.d.ts +29 -0
  56. package/dist/extensions/rewind/anchor.d.ts.map +1 -0
  57. package/dist/extensions/rewind/anchor.js +35 -0
  58. package/dist/extensions/rewind/anchor.js.map +1 -0
  59. package/dist/extensions/rewind/engine.d.ts +2 -6
  60. package/dist/extensions/rewind/engine.d.ts.map +1 -1
  61. package/dist/extensions/rewind/engine.js +41 -10
  62. package/dist/extensions/rewind/engine.js.map +1 -1
  63. package/dist/extensions/rewind/index.d.ts.map +1 -1
  64. package/dist/extensions/rewind/index.js +55 -21
  65. package/dist/extensions/rewind/index.js.map +1 -1
  66. package/dist/extensions/rewind/menu.d.ts.map +1 -1
  67. package/dist/extensions/rewind/menu.js +7 -2
  68. package/dist/extensions/rewind/menu.js.map +1 -1
  69. package/dist/extensions/rewind/restore.d.ts +26 -9
  70. package/dist/extensions/rewind/restore.d.ts.map +1 -1
  71. package/dist/extensions/rewind/restore.js +58 -16
  72. package/dist/extensions/rewind/restore.js.map +1 -1
  73. package/dist/extensions/subagent/activity.d.ts +1 -0
  74. package/dist/extensions/subagent/activity.d.ts.map +1 -1
  75. package/dist/extensions/subagent/activity.js +20 -4
  76. package/dist/extensions/subagent/activity.js.map +1 -1
  77. package/dist/extensions/subagent/agents.d.ts.map +1 -1
  78. package/dist/extensions/subagent/agents.js +2 -13
  79. package/dist/extensions/subagent/agents.js.map +1 -1
  80. package/dist/extensions/subagent/constants.d.ts +4 -3
  81. package/dist/extensions/subagent/constants.d.ts.map +1 -1
  82. package/dist/extensions/subagent/constants.js +9 -3
  83. package/dist/extensions/subagent/constants.js.map +1 -1
  84. package/dist/extensions/subagent/index.d.ts.map +1 -1
  85. package/dist/extensions/subagent/index.js +12 -5
  86. package/dist/extensions/subagent/index.js.map +1 -1
  87. package/dist/extensions/subagent/render.d.ts.map +1 -1
  88. package/dist/extensions/subagent/render.js +166 -41
  89. package/dist/extensions/subagent/render.js.map +1 -1
  90. package/dist/extensions/subagent/resolve.d.ts +2 -5
  91. package/dist/extensions/subagent/resolve.d.ts.map +1 -1
  92. package/dist/extensions/subagent/resolve.js +8 -13
  93. package/dist/extensions/subagent/resolve.js.map +1 -1
  94. package/dist/extensions/subagent/runner.d.ts +3 -1
  95. package/dist/extensions/subagent/runner.d.ts.map +1 -1
  96. package/dist/extensions/subagent/runner.js +111 -66
  97. package/dist/extensions/subagent/runner.js.map +1 -1
  98. package/dist/extensions/subagent/schema.d.ts +0 -6
  99. package/dist/extensions/subagent/schema.d.ts.map +1 -1
  100. package/dist/extensions/subagent/schema.js +2 -3
  101. package/dist/extensions/subagent/schema.js.map +1 -1
  102. package/dist/extensions/subagent/sdk-runner.d.ts.map +1 -1
  103. package/dist/extensions/subagent/sdk-runner.js +32 -16
  104. package/dist/extensions/subagent/sdk-runner.js.map +1 -1
  105. package/dist/extensions/subagent/types.d.ts +3 -2
  106. package/dist/extensions/subagent/types.d.ts.map +1 -1
  107. package/dist/extensions/subagent/types.js.map +1 -1
  108. package/dist/modes/interactive/components/custom-message.d.ts +3 -1
  109. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
  110. package/dist/modes/interactive/components/custom-message.js +10 -2
  111. package/dist/modes/interactive/components/custom-message.js.map +1 -1
  112. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
  113. package/dist/modes/interactive/components/scoped-models-selector.js +22 -13
  114. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  115. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  116. package/dist/modes/interactive/interactive-mode.js +31 -18
  117. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  118. package/dist/utils/coalescing-terminal.d.ts +62 -0
  119. package/dist/utils/coalescing-terminal.d.ts.map +1 -0
  120. package/dist/utils/coalescing-terminal.js +151 -0
  121. package/dist/utils/coalescing-terminal.js.map +1 -0
  122. package/docs/bundled/README.md +38 -0
  123. package/docs/bundled/extensions/README.md +19 -0
  124. package/docs/bundled/extensions/plan.md +31 -0
  125. package/docs/{distribution → bundled}/extensions/question.md +0 -11
  126. package/docs/{distribution → bundled}/extensions/rewind.md +19 -18
  127. package/docs/{distribution → bundled}/extensions/router.md +1 -14
  128. package/docs/{distribution → bundled}/extensions/statusline.md +1 -2
  129. package/docs/{distribution → bundled}/extensions/subagent.md +15 -22
  130. package/docs/bundled/extensions/todo.md +28 -0
  131. package/docs/{distribution → bundled}/themes.md +4 -11
  132. package/docs/{distribution → bundled}/tool-presentation.md +4 -10
  133. package/docs/compaction.md +18 -14
  134. package/docs/custom-provider.md +8 -8
  135. package/docs/docs.json +61 -9
  136. package/docs/extensions.md +14 -13
  137. package/docs/index.md +12 -7
  138. package/docs/json.md +4 -4
  139. package/docs/providers.md +1 -1
  140. package/docs/rpc.md +3 -9
  141. package/docs/session-format.md +5 -5
  142. package/docs/skills.md +1 -1
  143. package/docs/themes.md +4 -8
  144. package/docs/tui.md +1 -1
  145. package/examples/extensions/README.md +0 -1
  146. package/examples/extensions/custom-provider-anthropic/index.ts +4 -4
  147. package/examples/extensions/custom-provider-gitlab-duo/index.ts +2 -2
  148. package/examples/extensions/dynamic-resources/dynamic.json +1 -1
  149. package/examples/extensions/gondolin/index.ts +4 -6
  150. package/examples/extensions/message-renderer.ts +2 -2
  151. package/examples/extensions/overlay-qa-tests.ts +2 -2
  152. package/examples/extensions/project-trust.ts +2 -2
  153. package/examples/sdk/README.md +38 -44
  154. package/npm-shrinkwrap.json +2 -2
  155. package/package.json +6 -2
  156. package/docs/development.md +0 -68
  157. package/docs/distribution/README.md +0 -34
  158. package/docs/distribution/architecture.md +0 -102
  159. package/docs/distribution/extensions/README.md +0 -17
  160. package/docs/distribution/maintenance.md +0 -121
  161. package/docs/distribution/release.md +0 -85
  162. package/examples/extensions/subagent/README.md +0 -175
  163. package/examples/extensions/subagent/agents/planner.md +0 -37
  164. package/examples/extensions/subagent/agents/reviewer.md +0 -35
  165. package/examples/extensions/subagent/agents/scout.md +0 -50
  166. package/examples/extensions/subagent/agents/worker.md +0 -24
  167. package/examples/extensions/subagent/agents.ts +0 -126
  168. package/examples/extensions/subagent/index.ts +0 -1009
  169. package/examples/extensions/subagent/prompts/implement-and-review.md +0 -10
  170. package/examples/extensions/subagent/prompts/implement.md +0 -10
  171. package/examples/extensions/subagent/prompts/scout-and-plan.md +0 -9
  172. /package/docs/{distribution → bundled}/extensions/deepwiki.md +0 -0
@@ -6,7 +6,7 @@ import * as crypto from "node:crypto";
6
6
  import * as fs from "node:fs";
7
7
  import * as os from "node:os";
8
8
  import * as path from "node:path";
9
- import { CombinedAutocompleteProvider, Container, fuzzyFilter, Markdown, matchesKey, ProcessTerminal, Spacer, setKeybindings, Text, TruncatedText, TUI, visibleWidth, } from "@earendil-works/pi-tui";
9
+ import { CombinedAutocompleteProvider, Container, fuzzyFilter, Markdown, matchesKey, Spacer, setKeybindings, Text, TruncatedText, TUI, visibleWidth, } from "@earendil-works/pi-tui";
10
10
  import chalk from "chalk";
11
11
  import { spawn, spawnSync } from "child_process";
12
12
  import { APP_NAME, APP_TITLE, CONFIG_DIR_NAME, getAgentDir, getAuthPath, getDebugLogPath, getDocsPath, getShareViewerUrl, VERSION, } from "../../config.js";
@@ -17,7 +17,7 @@ import { FooterDataProvider } from "../../core/footer-data-provider.js";
17
17
  import { configureHttpDispatcher, formatHttpIdleTimeoutMs } from "../../core/http-dispatcher.js";
18
18
  import { KeybindingsManager } from "../../core/keybindings.js";
19
19
  import { createCompactionSummaryMessage } from "../../core/messages.js";
20
- import { defaultModelPerProvider, findExactModelReferenceMatch, resolveModelScope } from "../../core/model-resolver.js";
20
+ import { defaultModelPerProvider, findExactModelReferenceMatch, resolveModelScope, resolveModelScopeWithDiagnostics, } from "../../core/model-resolver.js";
21
21
  import { DefaultPackageManager } from "../../core/package-manager.js";
22
22
  import { formatMissingSessionCwdPrompt, MissingSessionCwdError } from "../../core/session-cwd.js";
23
23
  import { SessionManager, sessionEntryToContextMessages } from "../../core/session-manager.js";
@@ -27,6 +27,7 @@ import { getUsageCostBreakdown } from "../../core/usage-totals.js";
27
27
  import { getChangelogPath, getNewEntries, normalizeChangelogLinks, parseChangelog } from "../../utils/changelog.js";
28
28
  import { copyToClipboard, readClipboardText } from "../../utils/clipboard.js";
29
29
  import { extensionForImageMimeType, readClipboardImage } from "../../utils/clipboard-image.js";
30
+ import { CoalescingTerminal } from "../../utils/coalescing-terminal.js";
30
31
  import { parseGitUrl } from "../../utils/git.js";
31
32
  import { getCwdRelativePath } from "../../utils/paths.js";
32
33
  import { killTrackedDetachedChildren } from "../../utils/shell.js";
@@ -272,7 +273,7 @@ export class InteractiveMode {
272
273
  await this.rebindCurrentSession({ renderBeforeBind: true });
273
274
  });
274
275
  this.version = VERSION;
275
- this.ui = new TUI(new ProcessTerminal(), this.settingsManager.getShowHardwareCursor(), getAgentDir());
276
+ this.ui = new TUI(new CoalescingTerminal(), this.settingsManager.getShowHardwareCursor(), getAgentDir());
276
277
  this.ui.setClearOnShrink(this.settingsManager.getClearOnShrink());
277
278
  this.headerContainer = new Container();
278
279
  this.loadedResourcesContainer = new Container();
@@ -2636,7 +2637,7 @@ export class InteractiveMode {
2636
2637
  case "custom": {
2637
2638
  if (message.display) {
2638
2639
  const renderer = this.session.extensionRunner.getMessageRenderer(message.customType);
2639
- const component = new CustomMessageComponent(message, renderer, this.getMarkdownThemeWithSettings());
2640
+ const component = new CustomMessageComponent(message, renderer, this.getMarkdownThemeWithSettings(), this.outputPad);
2640
2641
  component.setExpanded(this.toolOutputExpanded);
2641
2642
  this.chatContainer.addChild(component);
2642
2643
  }
@@ -3531,7 +3532,9 @@ export class InteractiveMode {
3531
3532
  this.outputPad = padding;
3532
3533
  if (this.streamingComponent || this.session.isStreaming) {
3533
3534
  for (const child of this.chatContainer.children) {
3534
- if (child instanceof AssistantMessageComponent || child instanceof UserMessageComponent) {
3535
+ if (child instanceof AssistantMessageComponent ||
3536
+ child instanceof CustomMessageComponent ||
3537
+ child instanceof UserMessageComponent) {
3535
3538
  child.setOutputPad(padding);
3536
3539
  }
3537
3540
  }
@@ -3716,12 +3719,17 @@ export class InteractiveMode {
3716
3719
  // Get all available models
3717
3720
  await this.session.modelRuntime.refresh();
3718
3721
  const allModels = [...(await this.session.modelRuntime.getAvailable())];
3719
- if (allModels.length === 0) {
3722
+ const allModelIds = new Set(allModels.map((model) => `${model.provider}/${model.id}`));
3723
+ const configuredPatterns = this.settingsManager.getEnabledModels();
3724
+ const sessionScopedModels = this.session.scopedModels;
3725
+ if (allModels.length === 0 && !configuredPatterns?.length && sessionScopedModels.length === 0) {
3720
3726
  this.showStatus("No models available");
3721
3727
  return;
3722
3728
  }
3729
+ const configuredScope = configuredPatterns?.length
3730
+ ? await resolveModelScopeWithDiagnostics(configuredPatterns, this.session.modelRuntime)
3731
+ : undefined;
3723
3732
  // Check if session has scoped models (from previous session-only changes or CLI --models)
3724
- const sessionScopedModels = this.session.scopedModels;
3725
3733
  const hasSessionScope = sessionScopedModels.length > 0;
3726
3734
  // Build enabled model IDs from session state or settings
3727
3735
  let currentEnabledIds = null;
@@ -3729,18 +3737,22 @@ export class InteractiveMode {
3729
3737
  // Use current session's scoped models
3730
3738
  currentEnabledIds = sessionScopedModels.map((scoped) => `${scoped.model.provider}/${scoped.model.id}`);
3731
3739
  }
3732
- else {
3733
- // Fall back to settings
3734
- const patterns = this.settingsManager.getEnabledModels();
3735
- if (patterns !== undefined && patterns.length > 0) {
3736
- const scopedModels = await resolveModelScope(patterns, this.session.modelRuntime);
3737
- currentEnabledIds = scopedModels.map((scoped) => `${scoped.model.provider}/${scoped.model.id}`);
3738
- }
3740
+ else if (configuredScope) {
3741
+ currentEnabledIds = configuredScope.scopedModels.map((scoped) => `${scoped.model.provider}/${scoped.model.id}`);
3742
+ }
3743
+ for (const diagnostic of configuredScope?.diagnostics ?? []) {
3744
+ if (diagnostic.code !== "no-match")
3745
+ continue;
3746
+ currentEnabledIds ??= [];
3747
+ if (!currentEnabledIds.includes(diagnostic.pattern))
3748
+ currentEnabledIds.push(diagnostic.pattern);
3739
3749
  }
3740
3750
  // Helper to update session's scoped models (session-only, no persist)
3741
3751
  const updateSessionModels = async (enabledIds) => {
3742
3752
  currentEnabledIds = enabledIds === null ? null : [...enabledIds];
3743
- if (enabledIds && enabledIds.length > 0 && enabledIds.length < allModels.length) {
3753
+ const hasEnabledAvailableModel = enabledIds?.some((id) => allModelIds.has(id)) ?? false;
3754
+ const allAvailableModelsEnabled = enabledIds !== null && [...allModelIds].every((id) => enabledIds.includes(id));
3755
+ if (enabledIds && hasEnabledAvailableModel && !allAvailableModelsEnabled) {
3744
3756
  const newScopedModels = await resolveModelScope(enabledIds, this.session.modelRuntime);
3745
3757
  this.session.setScopedModels(newScopedModels.map((sm) => ({
3746
3758
  model: sm.model,
@@ -3764,9 +3776,10 @@ export class InteractiveMode {
3764
3776
  },
3765
3777
  onPersist: (enabledIds) => {
3766
3778
  // Persist to settings
3767
- const newPatterns = enabledIds === null || enabledIds.length === allModels.length
3768
- ? undefined // All enabled = clear filter
3769
- : enabledIds;
3779
+ const allEnabled = enabledIds !== null &&
3780
+ enabledIds.length === allModels.length &&
3781
+ enabledIds.every((id) => allModelIds.has(id));
3782
+ const newPatterns = enabledIds === null || allEnabled ? undefined : enabledIds;
3770
3783
  this.settingsManager.setEnabledModels(newPatterns ? [...newPatterns] : undefined);
3771
3784
  this.showStatus("Model selection saved to settings");
3772
3785
  },