@astralyn/pi 0.82.1 → 0.82.3

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 (91) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/LICENSE +21 -0
  3. package/README.md +71 -624
  4. package/dist/core/agent-session.d.ts +4 -0
  5. package/dist/core/agent-session.d.ts.map +1 -1
  6. package/dist/core/agent-session.js +193 -43
  7. package/dist/core/agent-session.js.map +1 -1
  8. package/dist/core/extensions/loader.d.ts.map +1 -1
  9. package/dist/core/extensions/loader.js +6 -13
  10. package/dist/core/extensions/loader.js.map +1 -1
  11. package/dist/core/extensions/types.d.ts +2 -0
  12. package/dist/core/extensions/types.d.ts.map +1 -1
  13. package/dist/core/extensions/types.js.map +1 -1
  14. package/dist/core/model-resolver.d.ts +1 -0
  15. package/dist/core/model-resolver.d.ts.map +1 -1
  16. package/dist/core/model-resolver.js +13 -3
  17. package/dist/core/model-resolver.js.map +1 -1
  18. package/dist/core/remote-catalog-provider.d.ts.map +1 -1
  19. package/dist/core/remote-catalog-provider.js +19 -1
  20. package/dist/core/remote-catalog-provider.js.map +1 -1
  21. package/dist/core/resource-loader.d.ts.map +1 -1
  22. package/dist/core/resource-loader.js +3 -0
  23. package/dist/core/resource-loader.js.map +1 -1
  24. package/dist/core/tools/tool-definition-wrapper.d.ts +7 -2
  25. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
  26. package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
  27. package/dist/extensions/llama/provider.d.ts.map +1 -1
  28. package/dist/extensions/llama/provider.js +6 -0
  29. package/dist/extensions/llama/provider.js.map +1 -1
  30. package/dist/modes/interactive/components/custom-message.d.ts +3 -1
  31. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
  32. package/dist/modes/interactive/components/custom-message.js +10 -2
  33. package/dist/modes/interactive/components/custom-message.js.map +1 -1
  34. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
  35. package/dist/modes/interactive/components/scoped-models-selector.js +22 -13
  36. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  37. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  38. package/dist/modes/interactive/interactive-mode.js +53 -28
  39. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  40. package/docs/bundled/README.md +38 -0
  41. package/docs/bundled/extensions/README.md +18 -0
  42. package/docs/bundled/extensions/deepwiki.md +62 -0
  43. package/docs/bundled/extensions/question.md +48 -0
  44. package/docs/bundled/extensions/rewind.md +75 -0
  45. package/docs/bundled/extensions/router.md +126 -0
  46. package/docs/bundled/extensions/statusline.md +109 -0
  47. package/docs/bundled/extensions/subagent.md +95 -0
  48. package/docs/bundled/extensions/todo.md +28 -0
  49. package/docs/bundled/themes.md +51 -0
  50. package/docs/bundled/tool-presentation.md +85 -0
  51. package/docs/compaction.md +20 -14
  52. package/docs/containerization.md +1 -1
  53. package/docs/custom-provider.md +8 -8
  54. package/docs/docs.json +57 -9
  55. package/docs/extensions.md +14 -13
  56. package/docs/index.md +12 -7
  57. package/docs/json.md +4 -4
  58. package/docs/providers.md +1 -1
  59. package/docs/rpc.md +3 -9
  60. package/docs/session-format.md +5 -5
  61. package/docs/skills.md +1 -1
  62. package/docs/themes.md +4 -8
  63. package/docs/tui.md +1 -1
  64. package/examples/extensions/README.md +0 -1
  65. package/examples/extensions/custom-provider-anthropic/index.ts +4 -4
  66. package/examples/extensions/custom-provider-anthropic/package-lock.json +3 -3
  67. package/examples/extensions/custom-provider-gitlab-duo/index.ts +2 -2
  68. package/examples/extensions/custom-provider-gitlab-duo/test.ts +1 -1
  69. package/examples/extensions/doom-overlay/doom/build/doom.wasm +0 -0
  70. package/examples/extensions/doom-overlay/doom/build.sh +0 -0
  71. package/examples/extensions/dynamic-resources/dynamic.json +1 -1
  72. package/examples/extensions/gondolin/index.ts +4 -6
  73. package/examples/extensions/message-renderer.ts +2 -2
  74. package/examples/extensions/overlay-qa-tests.ts +2 -2
  75. package/examples/extensions/project-trust.ts +2 -2
  76. package/examples/extensions/sandbox/package-lock.json +1 -1
  77. package/examples/extensions/with-deps/package-lock.json +2 -2
  78. package/examples/sdk/README.md +38 -44
  79. package/npm-shrinkwrap.json +3465 -624
  80. package/package.json +34 -18
  81. package/docs/development.md +0 -71
  82. package/examples/extensions/subagent/README.md +0 -175
  83. package/examples/extensions/subagent/agents/planner.md +0 -37
  84. package/examples/extensions/subagent/agents/reviewer.md +0 -35
  85. package/examples/extensions/subagent/agents/scout.md +0 -50
  86. package/examples/extensions/subagent/agents/worker.md +0 -24
  87. package/examples/extensions/subagent/agents.ts +0 -126
  88. package/examples/extensions/subagent/index.ts +0 -1009
  89. package/examples/extensions/subagent/prompts/implement-and-review.md +0 -10
  90. package/examples/extensions/subagent/prompts/implement.md +0 -10
  91. package/examples/extensions/subagent/prompts/scout-and-plan.md +0 -9
@@ -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";
@@ -2315,6 +2315,17 @@ export class InteractiveMode {
2315
2315
  }
2316
2316
  this.ui.requestRender();
2317
2317
  break;
2318
+ case "turn_start":
2319
+ // A mid-run compaction replaces the working indicator. Restore it before the
2320
+ // next provider request without waiting for another agent_start event.
2321
+ if (this.settingsManager.getShowTerminalProgress()) {
2322
+ this.ui.terminal.setProgress(true);
2323
+ }
2324
+ if (this.workingVisible && this.activeStatusIndicator?.kind !== "working") {
2325
+ this.showStatusIndicator(new WorkingStatusIndicator(this.ui, this.workingMessage ?? this.defaultWorkingMessage, this.workingIndicatorOptions));
2326
+ }
2327
+ this.ui.requestRender();
2328
+ break;
2318
2329
  case "queue_update":
2319
2330
  this.updatePendingMessagesDisplay();
2320
2331
  this.ui.requestRender();
@@ -2491,19 +2502,21 @@ export class InteractiveMode {
2491
2502
  this.showStatus("Auto-compaction cancelled");
2492
2503
  }
2493
2504
  }
2494
- else if (event.result) {
2495
- this.chatContainer.clear();
2496
- this.rebuildChatFromMessages();
2497
- this.addMessageToChat(createCompactionSummaryMessage(event.result.summary, event.result.tokensBefore, new Date().toISOString()));
2498
- this.footer.invalidate();
2499
- }
2500
- else if (event.errorMessage) {
2501
- if (event.reason === "manual") {
2502
- this.showError(event.errorMessage);
2505
+ else {
2506
+ if (event.result) {
2507
+ this.chatContainer.clear();
2508
+ this.rebuildChatFromMessages();
2509
+ this.addMessageToChat(createCompactionSummaryMessage(event.result.summary, event.result.tokensBefore, new Date().toISOString()));
2510
+ this.footer.invalidate();
2503
2511
  }
2504
- else {
2505
- this.chatContainer.addChild(new Spacer(1));
2506
- this.chatContainer.addChild(new Text(theme.fg("error", event.errorMessage), 1, 0));
2512
+ if (event.errorMessage) {
2513
+ if (event.reason === "manual") {
2514
+ this.showError(event.errorMessage);
2515
+ }
2516
+ else {
2517
+ this.chatContainer.addChild(new Spacer(1));
2518
+ this.chatContainer.addChild(new Text(theme.fg("error", event.errorMessage), 1, 0));
2519
+ }
2507
2520
  }
2508
2521
  }
2509
2522
  void this.flushCompactionQueue({ willRetry: event.willRetry });
@@ -2623,7 +2636,7 @@ export class InteractiveMode {
2623
2636
  case "custom": {
2624
2637
  if (message.display) {
2625
2638
  const renderer = this.session.extensionRunner.getMessageRenderer(message.customType);
2626
- const component = new CustomMessageComponent(message, renderer, this.getMarkdownThemeWithSettings());
2639
+ const component = new CustomMessageComponent(message, renderer, this.getMarkdownThemeWithSettings(), this.outputPad);
2627
2640
  component.setExpanded(this.toolOutputExpanded);
2628
2641
  this.chatContainer.addChild(component);
2629
2642
  }
@@ -3518,7 +3531,9 @@ export class InteractiveMode {
3518
3531
  this.outputPad = padding;
3519
3532
  if (this.streamingComponent || this.session.isStreaming) {
3520
3533
  for (const child of this.chatContainer.children) {
3521
- if (child instanceof AssistantMessageComponent || child instanceof UserMessageComponent) {
3534
+ if (child instanceof AssistantMessageComponent ||
3535
+ child instanceof CustomMessageComponent ||
3536
+ child instanceof UserMessageComponent) {
3522
3537
  child.setOutputPad(padding);
3523
3538
  }
3524
3539
  }
@@ -3703,12 +3718,17 @@ export class InteractiveMode {
3703
3718
  // Get all available models
3704
3719
  await this.session.modelRuntime.refresh();
3705
3720
  const allModels = [...(await this.session.modelRuntime.getAvailable())];
3706
- if (allModels.length === 0) {
3721
+ const allModelIds = new Set(allModels.map((model) => `${model.provider}/${model.id}`));
3722
+ const configuredPatterns = this.settingsManager.getEnabledModels();
3723
+ const sessionScopedModels = this.session.scopedModels;
3724
+ if (allModels.length === 0 && !configuredPatterns?.length && sessionScopedModels.length === 0) {
3707
3725
  this.showStatus("No models available");
3708
3726
  return;
3709
3727
  }
3728
+ const configuredScope = configuredPatterns?.length
3729
+ ? await resolveModelScopeWithDiagnostics(configuredPatterns, this.session.modelRuntime)
3730
+ : undefined;
3710
3731
  // Check if session has scoped models (from previous session-only changes or CLI --models)
3711
- const sessionScopedModels = this.session.scopedModels;
3712
3732
  const hasSessionScope = sessionScopedModels.length > 0;
3713
3733
  // Build enabled model IDs from session state or settings
3714
3734
  let currentEnabledIds = null;
@@ -3716,18 +3736,22 @@ export class InteractiveMode {
3716
3736
  // Use current session's scoped models
3717
3737
  currentEnabledIds = sessionScopedModels.map((scoped) => `${scoped.model.provider}/${scoped.model.id}`);
3718
3738
  }
3719
- else {
3720
- // Fall back to settings
3721
- const patterns = this.settingsManager.getEnabledModels();
3722
- if (patterns !== undefined && patterns.length > 0) {
3723
- const scopedModels = await resolveModelScope(patterns, this.session.modelRuntime);
3724
- currentEnabledIds = scopedModels.map((scoped) => `${scoped.model.provider}/${scoped.model.id}`);
3725
- }
3739
+ else if (configuredScope) {
3740
+ currentEnabledIds = configuredScope.scopedModels.map((scoped) => `${scoped.model.provider}/${scoped.model.id}`);
3741
+ }
3742
+ for (const diagnostic of configuredScope?.diagnostics ?? []) {
3743
+ if (diagnostic.code !== "no-match")
3744
+ continue;
3745
+ currentEnabledIds ??= [];
3746
+ if (!currentEnabledIds.includes(diagnostic.pattern))
3747
+ currentEnabledIds.push(diagnostic.pattern);
3726
3748
  }
3727
3749
  // Helper to update session's scoped models (session-only, no persist)
3728
3750
  const updateSessionModels = async (enabledIds) => {
3729
3751
  currentEnabledIds = enabledIds === null ? null : [...enabledIds];
3730
- if (enabledIds && enabledIds.length > 0 && enabledIds.length < allModels.length) {
3752
+ const hasEnabledAvailableModel = enabledIds?.some((id) => allModelIds.has(id)) ?? false;
3753
+ const allAvailableModelsEnabled = enabledIds !== null && [...allModelIds].every((id) => enabledIds.includes(id));
3754
+ if (enabledIds && hasEnabledAvailableModel && !allAvailableModelsEnabled) {
3731
3755
  const newScopedModels = await resolveModelScope(enabledIds, this.session.modelRuntime);
3732
3756
  this.session.setScopedModels(newScopedModels.map((sm) => ({
3733
3757
  model: sm.model,
@@ -3751,9 +3775,10 @@ export class InteractiveMode {
3751
3775
  },
3752
3776
  onPersist: (enabledIds) => {
3753
3777
  // Persist to settings
3754
- const newPatterns = enabledIds === null || enabledIds.length === allModels.length
3755
- ? undefined // All enabled = clear filter
3756
- : enabledIds;
3778
+ const allEnabled = enabledIds !== null &&
3779
+ enabledIds.length === allModels.length &&
3780
+ enabledIds.every((id) => allModelIds.has(id));
3781
+ const newPatterns = enabledIds === null || allEnabled ? undefined : enabledIds;
3757
3782
  this.settingsManager.setEnabledModels(newPatterns ? [...newPatterns] : undefined);
3758
3783
  this.showStatus("Model selection saved to settings");
3759
3784
  },