@astralyn/pi 1.0.0 → 1.0.2

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 (197) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/dist/bundle/chunks/{anthropic-messages-CG2BSDQS.js → anthropic-messages-YET4T7BO.js} +3 -3
  3. package/dist/bundle/chunks/azure-openai-responses-SBLL5YN3.js +2 -0
  4. package/dist/bundle/chunks/bedrock-converse-stream.js +2 -2
  5. package/dist/bundle/chunks/{chunk-HESRDUKO.js → chunk-5RBGZ6YW.js} +89 -63
  6. package/dist/bundle/chunks/{chunk-PFZKRUMO.js → chunk-IZ3S3GDX.js} +1 -1
  7. package/dist/bundle/chunks/{chunk-SGLYRVQL.js → chunk-MWM24AOB.js} +1 -1
  8. package/dist/bundle/chunks/{chunk-6UFFVA7M.js → chunk-NY3CWK44.js} +1 -1
  9. package/dist/bundle/chunks/chunk-SVJ7OGEB.js +2 -0
  10. package/dist/bundle/chunks/chunk-XDYM2567.js +20 -0
  11. package/dist/bundle/chunks/{cloudflare-workers-ai-system-one-YB7XPPP4.js → cloudflare-workers-ai-system-one-QI46LUZ6.js} +1 -1
  12. package/dist/bundle/chunks/codemode-worker.js +24 -3
  13. package/dist/bundle/chunks/{google-generative-ai-V5ZM5MCL.js → google-generative-ai-YTZCSHQN.js} +1 -1
  14. package/dist/bundle/chunks/{google-vertex-22THOFP5.js → google-vertex-OTFZJJXQ.js} +1 -1
  15. package/dist/bundle/chunks/{mistral-conversations-WHSCJJWP.js → mistral-conversations-ELH4V4TY.js} +1 -1
  16. package/dist/bundle/chunks/node-USQQ7C6M.js +16 -0
  17. package/dist/bundle/chunks/openai-chatgpt.js +1 -1
  18. package/dist/bundle/chunks/{openai-codex-responses-N7GDPBPP.js → openai-codex-responses-OLVTU4UA.js} +1 -1
  19. package/dist/bundle/chunks/openai-completions-53M2KJ67.js +7 -0
  20. package/dist/bundle/chunks/openai-responses-4ABDEL4Z.js +3 -0
  21. package/dist/bundle/chunks/{virtual-modules-4RQ2L6W4.js → virtual-modules-EDIGEIG6.js} +1 -1
  22. package/dist/bundle/cli.js +1 -1
  23. package/dist/bundle/index.js +1 -1
  24. package/dist/bundle/rpc-entry.js +1 -1
  25. package/dist/cli/args.d.ts.map +1 -1
  26. package/dist/cli/args.js +4 -1
  27. package/dist/cli/args.js.map +1 -1
  28. package/dist/config.d.ts.map +1 -1
  29. package/dist/config.js +3 -0
  30. package/dist/config.js.map +1 -1
  31. package/dist/core/agent-session.d.ts.map +1 -1
  32. package/dist/core/agent-session.js +1 -1
  33. package/dist/core/agent-session.js.map +1 -1
  34. package/dist/core/export-html/tool-renderer.d.ts +3 -3
  35. package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
  36. package/dist/core/export-html/tool-renderer.js +3 -3
  37. package/dist/core/export-html/tool-renderer.js.map +1 -1
  38. package/dist/core/extensions/index.d.ts +1 -1
  39. package/dist/core/extensions/index.d.ts.map +1 -1
  40. package/dist/core/extensions/index.js.map +1 -1
  41. package/dist/core/extensions/loader.d.ts.map +1 -1
  42. package/dist/core/extensions/loader.js +5 -0
  43. package/dist/core/extensions/loader.js.map +1 -1
  44. package/dist/core/extensions/runner.d.ts +3 -1
  45. package/dist/core/extensions/runner.d.ts.map +1 -1
  46. package/dist/core/extensions/runner.js +6 -0
  47. package/dist/core/extensions/runner.js.map +1 -1
  48. package/dist/core/extensions/types.d.ts +9 -0
  49. package/dist/core/extensions/types.d.ts.map +1 -1
  50. package/dist/core/extensions/types.js.map +1 -1
  51. package/dist/core/mcp-servers.d.ts +6 -0
  52. package/dist/core/mcp-servers.d.ts.map +1 -1
  53. package/dist/core/mcp-servers.js +11 -0
  54. package/dist/core/mcp-servers.js.map +1 -1
  55. package/dist/core/model-config.d.ts +36 -0
  56. package/dist/core/model-config.d.ts.map +1 -1
  57. package/dist/core/model-config.js +14 -2
  58. package/dist/core/model-config.js.map +1 -1
  59. package/dist/core/model-resolver.js +1 -1
  60. package/dist/core/model-resolver.js.map +1 -1
  61. package/dist/core/provider-composer.d.ts +2 -1
  62. package/dist/core/provider-composer.d.ts.map +1 -1
  63. package/dist/core/provider-composer.js +13 -0
  64. package/dist/core/provider-composer.js.map +1 -1
  65. package/dist/core/tools/renderers/bash.d.ts.map +1 -1
  66. package/dist/core/tools/renderers/bash.js +4 -3
  67. package/dist/core/tools/renderers/bash.js.map +1 -1
  68. package/dist/core/tools/renderers/index.d.ts +2 -2
  69. package/dist/core/tools/renderers/index.d.ts.map +1 -1
  70. package/dist/core/tools/renderers/index.js.map +1 -1
  71. package/dist/core/tools/shell-tool.d.ts.map +1 -1
  72. package/dist/core/tools/shell-tool.js +9 -2
  73. package/dist/core/tools/shell-tool.js.map +1 -1
  74. package/dist/extensions/deepwiki/execute.d.ts +0 -3
  75. package/dist/extensions/deepwiki/execute.d.ts.map +1 -1
  76. package/dist/extensions/deepwiki/execute.js.map +1 -1
  77. package/dist/extensions/deepwiki/render.d.ts.map +1 -1
  78. package/dist/extensions/deepwiki/render.js +0 -5
  79. package/dist/extensions/deepwiki/render.js.map +1 -1
  80. package/dist/extensions/mcp/cli.d.ts.map +1 -1
  81. package/dist/extensions/mcp/cli.js +3 -0
  82. package/dist/extensions/mcp/cli.js.map +1 -1
  83. package/dist/extensions/mcp/config.d.ts +15 -3
  84. package/dist/extensions/mcp/config.d.ts.map +1 -1
  85. package/dist/extensions/mcp/config.js +46 -10
  86. package/dist/extensions/mcp/config.js.map +1 -1
  87. package/dist/extensions/mcp/index.d.ts +4 -1
  88. package/dist/extensions/mcp/index.d.ts.map +1 -1
  89. package/dist/extensions/mcp/index.js +80 -45
  90. package/dist/extensions/mcp/index.js.map +1 -1
  91. package/dist/extensions/mcp/oauth.d.ts +4 -1
  92. package/dist/extensions/mcp/oauth.d.ts.map +1 -1
  93. package/dist/extensions/mcp/oauth.js +54 -10
  94. package/dist/extensions/mcp/oauth.js.map +1 -1
  95. package/dist/extensions/mcp/runtime.d.ts.map +1 -1
  96. package/dist/extensions/mcp/runtime.js +1 -0
  97. package/dist/extensions/mcp/runtime.js.map +1 -1
  98. package/dist/extensions/mcp/tools.d.ts +3 -1
  99. package/dist/extensions/mcp/tools.d.ts.map +1 -1
  100. package/dist/extensions/mcp/tools.js +19 -13
  101. package/dist/extensions/mcp/tools.js.map +1 -1
  102. package/dist/extensions/mcp/ui.d.ts.map +1 -1
  103. package/dist/extensions/mcp/ui.js +8 -4
  104. package/dist/extensions/mcp/ui.js.map +1 -1
  105. package/dist/extensions/question/render.d.ts.map +1 -1
  106. package/dist/extensions/question/render.js +3 -7
  107. package/dist/extensions/question/render.js.map +1 -1
  108. package/dist/index.d.ts +1 -1
  109. package/dist/index.d.ts.map +1 -1
  110. package/dist/index.js.map +1 -1
  111. package/dist/modes/interactive/components/armin.d.ts +3 -0
  112. package/dist/modes/interactive/components/armin.d.ts.map +1 -1
  113. package/dist/modes/interactive/components/armin.js +7 -5
  114. package/dist/modes/interactive/components/armin.js.map +1 -1
  115. package/dist/modes/interactive/components/auth-url.d.ts +14 -0
  116. package/dist/modes/interactive/components/auth-url.d.ts.map +1 -0
  117. package/dist/modes/interactive/components/auth-url.js +34 -0
  118. package/dist/modes/interactive/components/auth-url.js.map +1 -0
  119. package/dist/modes/interactive/components/easter-egg-3d.d.ts +104 -0
  120. package/dist/modes/interactive/components/easter-egg-3d.d.ts.map +1 -0
  121. package/dist/modes/interactive/components/{pi-logo-animation.js → easter-egg-3d.js} +121 -74
  122. package/dist/modes/interactive/components/easter-egg-3d.js.map +1 -0
  123. package/dist/modes/interactive/components/easter-egg-3d.lazy.d.ts +6 -0
  124. package/dist/modes/interactive/components/easter-egg-3d.lazy.d.ts.map +1 -0
  125. package/dist/modes/interactive/components/easter-egg-3d.lazy.js +24 -0
  126. package/dist/modes/interactive/components/easter-egg-3d.lazy.js.map +1 -0
  127. package/dist/modes/interactive/components/index.d.ts +0 -1
  128. package/dist/modes/interactive/components/index.d.ts.map +1 -1
  129. package/dist/modes/interactive/components/index.js +0 -1
  130. package/dist/modes/interactive/components/index.js.map +1 -1
  131. package/dist/modes/interactive/components/login-dialog.d.ts +2 -0
  132. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  133. package/dist/modes/interactive/components/login-dialog.js +9 -5
  134. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  135. package/dist/modes/interactive/interactive-mode.d.ts +2 -2
  136. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  137. package/dist/modes/interactive/interactive-mode.js +34 -18
  138. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  139. package/dist/modes/interactive/tasks/index.d.ts.map +1 -1
  140. package/dist/modes/interactive/tasks/index.js +11 -3
  141. package/dist/modes/interactive/tasks/index.js.map +1 -1
  142. package/dist/modes/interactive/tasks/layout.js +4 -5
  143. package/dist/modes/interactive/tasks/layout.js.map +1 -1
  144. package/dist/modes/interactive/tasks/manager.d.ts.map +1 -1
  145. package/dist/modes/interactive/tasks/manager.js +2 -0
  146. package/dist/modes/interactive/tasks/manager.js.map +1 -1
  147. package/dist/modes/interactive/tool-view/chat.d.ts +2 -3
  148. package/dist/modes/interactive/tool-view/chat.d.ts.map +1 -1
  149. package/dist/modes/interactive/tool-view/chat.js +18 -5
  150. package/dist/modes/interactive/tool-view/chat.js.map +1 -1
  151. package/dist/modes/interactive/tool-view/style.d.ts +2 -1
  152. package/dist/modes/interactive/tool-view/style.d.ts.map +1 -1
  153. package/dist/modes/interactive/tool-view/style.js +2 -2
  154. package/dist/modes/interactive/tool-view/style.js.map +1 -1
  155. package/dist/modes/interactive/tool-view/tool-execution.d.ts +4 -19
  156. package/dist/modes/interactive/tool-view/tool-execution.d.ts.map +1 -1
  157. package/dist/modes/interactive/tool-view/tool-execution.js +23 -67
  158. package/dist/modes/interactive/tool-view/tool-execution.js.map +1 -1
  159. package/dist/utils/image-convert.d.ts +12 -0
  160. package/dist/utils/image-convert.d.ts.map +1 -1
  161. package/dist/utils/image-convert.js +45 -6
  162. package/dist/utils/image-convert.js.map +1 -1
  163. package/docs/bundled/tasks.md +5 -3
  164. package/docs/bundled/tool-presentation.md +3 -2
  165. package/docs/codemode.md +1 -1
  166. package/docs/extensions.md +4 -0
  167. package/docs/keybindings.md +1 -1
  168. package/docs/mcp.md +23 -1
  169. package/docs/models.md +30 -3
  170. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  171. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  172. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  173. package/examples/extensions/gondolin/package-lock.json +2 -2
  174. package/examples/extensions/gondolin/package.json +1 -1
  175. package/examples/extensions/sandbox/package-lock.json +2 -2
  176. package/examples/extensions/sandbox/package.json +1 -1
  177. package/examples/extensions/with-deps/package-lock.json +2 -2
  178. package/examples/extensions/with-deps/package.json +1 -1
  179. package/npm-shrinkwrap.json +58 -58
  180. package/package.json +11 -11
  181. package/dist/bundle/chunks/azure-openai-responses-PBA4QKCM.js +0 -2
  182. package/dist/bundle/chunks/chunk-PJVFYVHE.js +0 -42
  183. package/dist/bundle/chunks/chunk-Z2RKSI3O.js +0 -2
  184. package/dist/bundle/chunks/node-CXWYTK2I.js +0 -16
  185. package/dist/bundle/chunks/openai-completions-RGGQK5UW.js +0 -7
  186. package/dist/bundle/chunks/openai-responses-3ZLD5JYI.js +0 -3
  187. package/dist/modes/interactive/components/daxnuts.d.ts +0 -23
  188. package/dist/modes/interactive/components/daxnuts.d.ts.map +0 -1
  189. package/dist/modes/interactive/components/daxnuts.js +0 -138
  190. package/dist/modes/interactive/components/daxnuts.js.map +0 -1
  191. package/dist/modes/interactive/components/pi-logo-animation.d.ts +0 -68
  192. package/dist/modes/interactive/components/pi-logo-animation.d.ts.map +0 -1
  193. package/dist/modes/interactive/components/pi-logo-animation.js.map +0 -1
  194. package/dist/modes/interactive/components/pi-logo-animation.lazy.d.ts +0 -7
  195. package/dist/modes/interactive/components/pi-logo-animation.lazy.d.ts.map +0 -1
  196. package/dist/modes/interactive/components/pi-logo-animation.lazy.js +0 -12
  197. package/dist/modes/interactive/components/pi-logo-animation.lazy.js.map +0 -1
@@ -22,7 +22,7 @@ import { findExtensionStackMatches, recordCrash, takeUnnotifiedCrash } from "../
22
22
  import { DEFAULT_THINKING_LEVEL, THINKING_LEVEL_OPTIONS } from "../../core/defaults.js";
23
23
  import { FooterDataProvider } from "../../core/footer-data-provider.js";
24
24
  import { configureHttpDispatcher, formatHttpIdleTimeoutMs } from "../../core/http-dispatcher.js";
25
- import { KeybindingsManager } from "../../core/keybindings.js";
25
+ import { KEYBINDINGS, KeybindingsManager } from "../../core/keybindings.js";
26
26
  import { createCompactionSummaryMessage, createCustomMessage } from "../../core/messages.js";
27
27
  import { defaultModelPerProvider, findExactModelReferenceMatch, resolveModelScopeFromModels, } from "../../core/model-resolver.js";
28
28
  import { CredentialSynchronizationError } from "../../core/model-runtime.js";
@@ -40,6 +40,7 @@ import { getChangelogPath, getNewEntries, normalizeChangelogLinks, parseChangelo
40
40
  import { copyToClipboard, readClipboardFilePaths, readClipboardText } from "../../utils/clipboard.js";
41
41
  import { extensionForImageMimeType, readClipboardImage } from "../../utils/clipboard-image.js";
42
42
  import { parseGitUrl } from "../../utils/git.js";
43
+ import { ensurePngTranscoder } from "../../utils/image-convert.js";
43
44
  import { getCwdRelativePath } from "../../utils/paths.js";
44
45
  import { getPiUserAgent } from "../../utils/pi-user-agent.js";
45
46
  import { killTrackedDetachedChildren } from "../../utils/shell.js";
@@ -56,9 +57,9 @@ import { CompactionSummaryMessageComponent } from "./components/compaction-summa
56
57
  import { CustomEditor } from "./components/custom-editor.js";
57
58
  import { CustomEntryComponent } from "./components/custom-entry.js";
58
59
  import { CustomMessageComponent } from "./components/custom-message.js";
59
- import { DaxnutsComponent } from "./components/daxnuts.js";
60
60
  import { DynamicBorder } from "./components/dynamic-border.js";
61
61
  import { EarendilAnnouncementComponent } from "./components/earendil-announcement.js";
62
+ import { playArmin3d, playPiLogo3d } from "./components/easter-egg-3d.lazy.js";
62
63
  import { ExtensionEditorComponent } from "./components/extension-editor.js";
63
64
  import { ExtensionInputComponent } from "./components/extension-input.js";
64
65
  import { ExtensionSelectorComponent } from "./components/extension-selector.js";
@@ -69,7 +70,6 @@ import { createMermaidMarkdownTransformer } from "./components/mermaid.js";
69
70
  import { ModelSelectorComponent } from "./components/model-selector.js";
70
71
  import { formatAuthSelectorProviderStatus, formatAuthSelectorProviderType, OAuthSelectorComponent, } from "./components/oauth-selector.js";
71
72
  import { piLogoLines, piWordmark, supportsPiLogo } from "./components/pi-logo.js";
72
- import { playPiLogoAnimation } from "./components/pi-logo-animation.lazy.js";
73
73
  import { createLoginMenuSelector } from "./components/radius-login-selector.js";
74
74
  import { ScopedModelsSelectorComponent } from "./components/scoped-models-selector.js";
75
75
  import { SessionSelectorComponent } from "./components/session-selector.js";
@@ -131,6 +131,22 @@ function isCompactionCostNotice(item) {
131
131
  function isUsageSessionEntry(item) {
132
132
  return "type" in item && item.type === "usage";
133
133
  }
134
+ /**
135
+ * Task rows for `/hotkeys`. Task keybindings act outside the editor, so they never showed up in
136
+ * the editor-driven sections; labels come from KEYBINDINGS so the table cannot drift from the
137
+ * binding registry.
138
+ */
139
+ function hotkeysTaskSection(display) {
140
+ const detach = KEYBINDINGS["app.tasks.detach"];
141
+ const detachSelected = KEYBINDINGS["app.tasks.detachSelected"];
142
+ return `
143
+ **Tasks**
144
+ | Key | Action |
145
+ |-----|--------|
146
+ | \`${display("app.tasks.detach")}\` | ${detach.description} |
147
+ | \`${display("app.tasks.detachSelected")}\` | ${detachSelected.description} (while /tasks is open) |
148
+ `;
149
+ }
134
150
  const DEAD_TERMINAL_ERROR_CODES = new Set(["EIO", "EPIPE", "ENOTCONN"]);
135
151
  function isDeadTerminalError(error) {
136
152
  if (!error || typeof error !== "object" || !("code" in error)) {
@@ -681,6 +697,7 @@ export class InteractiveMode {
681
697
  // Start the UI before initializing extensions so session_start handlers can use interactive dialogs
682
698
  this.ui.start();
683
699
  this.isInitialized = true;
700
+ this.ensurePngTranscoder();
684
701
  this.themeController.applyFromSettings();
685
702
  // The header and startup notices bake theme colors into their text, so build them once the terminal
686
703
  // reported its colors. This ends at the terminal's DA1 reply, or after 100 ms if it answers nothing.
@@ -732,7 +749,7 @@ export class InteractiveMode {
732
749
  const onboarding = () => theme.fg("dim", `Pi can explain its own features and look up its docs. Ask it how to use or extend Pi.`);
733
750
  const header = new BuiltInHeader(() => `${withLogo(compactInstructions())}\n${compactOnboarding()}\n\n${onboarding()}`, () => `${withLogo(expandedInstructions())}\n\n${onboarding()}`, this.getStartupExpansionState(), 1, 0);
734
751
  if (showLogo)
735
- header.onLogoClick = (column, row) => playPiLogoAnimation(this.renderer, column, row);
752
+ header.onLogoClick = (column, row) => playPiLogo3d(this.renderer, column, row);
736
753
  this.builtInHeader = header;
737
754
  // Setup UI layout
738
755
  this.headerContainer.addChild(new Spacer(1));
@@ -1528,8 +1545,16 @@ export class InteractiveMode {
1528
1545
  applyFullscreenScrollbarSetting() {
1529
1546
  this.transcriptScrollView?.setScrollbar(this.settingsManager.getFullscreenScrollbar());
1530
1547
  }
1548
+ /** Lets extension images use the PNG transcoder; tool results register it themselves. */
1549
+ ensurePngTranscoder() {
1550
+ ensurePngTranscoder(() => {
1551
+ this.ui.invalidate();
1552
+ this.ui.requestRender();
1553
+ });
1554
+ }
1531
1555
  applyRuntimeSettings() {
1532
1556
  setCapabilityOverrides(this.settingsManager.getTerminalCapabilityOverrides());
1557
+ this.ensurePngTranscoder();
1533
1558
  configureHttpDispatcher(this.settingsManager.getHttpIdleTimeoutMs());
1534
1559
  this.applyFullscreenScrollbarSetting();
1535
1560
  if (this.renderer instanceof TuiAltScreen) {
@@ -1649,7 +1674,7 @@ export class InteractiveMode {
1649
1674
  * whatever this returns, so they never reach into the tool registry themselves.
1650
1675
  */
1651
1676
  getRegisteredToolDefinition(toolName) {
1652
- return withBuiltInRenderers(toolName, this.session.getToolDefinition(toolName));
1677
+ return this.session.extensionRunner.resolveToolRenderers(toolName, () => withBuiltInRenderers(toolName, this.session.getToolDefinition(toolName)));
1653
1678
  }
1654
1679
  getMarkdownTransformers() {
1655
1680
  return [this.mermaidMarkdownTransformer, ...this.session.extensionRunner.getMarkdownTransformers()];
@@ -4232,7 +4257,6 @@ export class InteractiveMode {
4232
4257
  this.updateEditorBorderColor();
4233
4258
  this.showStatus(`Model: ${model.id}`);
4234
4259
  void this.maybeWarnAboutAnthropicSubscriptionAuth(model);
4235
- this.checkDaxnutsEasterEgg(model);
4236
4260
  }
4237
4261
  catch (error) {
4238
4262
  this.showError(error instanceof Error ? error.message : String(error));
@@ -4365,7 +4389,6 @@ export class InteractiveMode {
4365
4389
  done();
4366
4390
  this.showStatus(persist ? `Default model: ${model.provider}/${model.id}` : `Model: ${model.id}`);
4367
4391
  void this.maybeWarnAboutAnthropicSubscriptionAuth(model);
4368
- this.checkDaxnutsEasterEgg(model);
4369
4392
  }
4370
4393
  catch (error) {
4371
4394
  done();
@@ -5021,7 +5044,6 @@ export class InteractiveMode {
5021
5044
  if (selectedModel) {
5022
5045
  this.showStatus(`${actionLabel}. Selected ${selectedModel.id}. Credentials saved to ${getAuthPath()}`);
5023
5046
  void this.maybeWarnAboutAnthropicSubscriptionAuth(selectedModel);
5024
- this.checkDaxnutsEasterEgg(selectedModel);
5025
5047
  }
5026
5048
  else {
5027
5049
  this.showStatus(`${actionLabel}. Credentials saved to ${getAuthPath()}`);
@@ -5704,6 +5726,8 @@ export class InteractiveMode {
5704
5726
  | \`!\` | Run bash command |
5705
5727
  | \`!!\` | Run bash command (excluded from context) |
5706
5728
  `;
5729
+ // Task keybindings act outside the editor contexts this table was built from.
5730
+ hotkeys += hotkeysTaskSection((action) => this.getAppKeyDisplay(action));
5707
5731
  // Add extension-registered shortcuts
5708
5732
  const extensionRunner = this.session.extensionRunner;
5709
5733
  const shortcuts = extensionRunner.getShortcuts(this.keybindings.getEffectiveConfig());
@@ -5770,6 +5794,8 @@ export class InteractiveMode {
5770
5794
  this.ui.requestRender();
5771
5795
  }
5772
5796
  handleArminSaysHi() {
5797
+ if (playArmin3d(this.renderer))
5798
+ return;
5773
5799
  this.chatContainer.addChild(new Spacer(1));
5774
5800
  this.chatContainer.addChild(new ArminComponent(this.ui));
5775
5801
  this.ui.requestRender();
@@ -5779,16 +5805,6 @@ export class InteractiveMode {
5779
5805
  this.chatContainer.addChild(new EarendilAnnouncementComponent());
5780
5806
  this.ui.requestRender();
5781
5807
  }
5782
- handleDaxnuts() {
5783
- this.chatContainer.addChild(new Spacer(1));
5784
- this.chatContainer.addChild(new DaxnutsComponent(this.ui));
5785
- this.ui.requestRender();
5786
- }
5787
- checkDaxnutsEasterEgg(model) {
5788
- if (model.provider === "opencode" && model.id.toLowerCase().includes("kimi-k2.5")) {
5789
- this.handleDaxnuts();
5790
- }
5791
- }
5792
5808
  async handleBashCommand(command, excludeFromContext = false) {
5793
5809
  const extensionRunner = this.session.extensionRunner;
5794
5810
  // Emit user_bash event to let extensions intercept