pi-ui-extend 0.1.8 → 0.1.9

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 (166) hide show
  1. package/README.md +34 -0
  2. package/bin/pix.mjs +4 -4
  3. package/dist/app/app.js +38 -38
  4. package/dist/app/{cli.d.ts → cli/cli.d.ts} +1 -1
  5. package/dist/app/{cli.js → cli/cli.js} +1 -1
  6. package/dist/app/{install.js → cli/install.js} +2 -2
  7. package/dist/app/{command-controller.d.ts → commands/command-controller.d.ts} +1 -1
  8. package/dist/app/{command-host.d.ts → commands/command-host.d.ts} +3 -3
  9. package/dist/app/{command-model-actions.d.ts → commands/command-model-actions.d.ts} +1 -1
  10. package/dist/app/{command-model-actions.js → commands/command-model-actions.js} +2 -2
  11. package/dist/app/{command-navigation-actions.d.ts → commands/command-navigation-actions.d.ts} +1 -1
  12. package/dist/app/{command-navigation-actions.js → commands/command-navigation-actions.js} +5 -5
  13. package/dist/app/{command-registry.d.ts → commands/command-registry.d.ts} +1 -1
  14. package/dist/app/{command-runtime.js → commands/command-runtime.js} +1 -1
  15. package/dist/app/{command-session-actions.js → commands/command-session-actions.js} +3 -3
  16. package/dist/app/{shell-controller.d.ts → commands/shell-controller.d.ts} +1 -1
  17. package/dist/app/{shell-controller.js → commands/shell-controller.js} +1 -1
  18. package/dist/app/{slash-commands.d.ts → commands/slash-commands.d.ts} +2 -2
  19. package/dist/app/{slash-commands.js → commands/slash-commands.js} +1 -1
  20. package/dist/app/{extension-actions-controller.d.ts → extensions/extension-actions-controller.d.ts} +1 -1
  21. package/dist/app/{extension-actions-controller.js → extensions/extension-actions-controller.js} +1 -1
  22. package/dist/app/{extension-ui-controller.d.ts → extensions/extension-ui-controller.d.ts} +3 -3
  23. package/dist/app/{extension-ui-controller.js → extensions/extension-ui-controller.js} +3 -3
  24. package/dist/app/{input-action-controller.d.ts → input/input-action-controller.d.ts} +7 -7
  25. package/dist/app/{input-action-controller.js → input/input-action-controller.js} +3 -3
  26. package/dist/app/{input-controller.d.ts → input/input-controller.d.ts} +3 -3
  27. package/dist/app/{input-controller.js → input/input-controller.js} +1 -1
  28. package/dist/app/{input-paste-handler.d.ts → input/input-paste-handler.d.ts} +1 -1
  29. package/dist/app/{input-paste-handler.js → input/input-paste-handler.js} +3 -3
  30. package/dist/app/{native-modifiers.js → input/native-modifiers.js} +2 -2
  31. package/dist/app/{prompt-enhancer-controller.d.ts → input/prompt-enhancer-controller.d.ts} +5 -5
  32. package/dist/app/{prompt-enhancer-controller.js → input/prompt-enhancer-controller.js} +3 -3
  33. package/dist/app/{voice-controller.d.ts → input/voice-controller.d.ts} +1 -1
  34. package/dist/app/{voice-controller.js → input/voice-controller.js} +2 -2
  35. package/dist/app/{model-ref.d.ts → model/model-ref.d.ts} +1 -1
  36. package/dist/app/{model-ref.js → model/model-ref.js} +1 -1
  37. package/dist/app/{model-usage-controller.js → model/model-usage-controller.js} +1 -1
  38. package/dist/app/{model-usage-status.d.ts → model/model-usage-status.d.ts} +1 -1
  39. package/dist/app/{model-usage-status.js → model/model-usage-status.js} +1 -1
  40. package/dist/app/{menu-items-controller.d.ts → popup/menu-items-controller.d.ts} +4 -4
  41. package/dist/app/{menu-items-controller.js → popup/menu-items-controller.js} +5 -5
  42. package/dist/app/{popup-action-controller.d.ts → popup/popup-action-controller.d.ts} +4 -4
  43. package/dist/app/{popup-action-controller.js → popup/popup-action-controller.js} +2 -2
  44. package/dist/app/{popup-menu-controller.d.ts → popup/popup-menu-controller.d.ts} +4 -4
  45. package/dist/app/{popup-menu-controller.js → popup/popup-menu-controller.js} +7 -7
  46. package/dist/app/{conversation-entry-renderer.d.ts → rendering/conversation-entry-renderer.d.ts} +3 -3
  47. package/dist/app/{conversation-entry-renderer.js → rendering/conversation-entry-renderer.js} +3 -3
  48. package/dist/app/{conversation-shell-renderer.d.ts → rendering/conversation-shell-renderer.d.ts} +1 -1
  49. package/dist/app/{conversation-shell-renderer.js → rendering/conversation-shell-renderer.js} +1 -1
  50. package/dist/app/{conversation-tool-renderer.d.ts → rendering/conversation-tool-renderer.d.ts} +3 -3
  51. package/dist/app/{conversation-tool-renderer.js → rendering/conversation-tool-renderer.js} +7 -7
  52. package/dist/app/{conversation-viewport.d.ts → rendering/conversation-viewport.d.ts} +3 -3
  53. package/dist/app/{dcp-stats.js → rendering/dcp-stats.js} +1 -1
  54. package/dist/app/{editor-layout-renderer.d.ts → rendering/editor-layout-renderer.d.ts} +3 -3
  55. package/dist/app/{editor-layout-renderer.js → rendering/editor-layout-renderer.js} +2 -2
  56. package/dist/app/{editor-panels.d.ts → rendering/editor-panels.d.ts} +2 -2
  57. package/dist/app/{editor-panels.js → rendering/editor-panels.js} +4 -4
  58. package/dist/app/{message-content.d.ts → rendering/message-content.d.ts} +1 -1
  59. package/dist/app/{message-content.js → rendering/message-content.js} +1 -1
  60. package/dist/app/{render-controller.d.ts → rendering/render-controller.d.ts} +6 -6
  61. package/dist/app/{render-controller.js → rendering/render-controller.js} +5 -5
  62. package/dist/app/{render-text.d.ts → rendering/render-text.d.ts} +2 -2
  63. package/dist/app/{render-text.js → rendering/render-text.js} +3 -3
  64. package/dist/app/{status-line-renderer.d.ts → rendering/status-line-renderer.d.ts} +4 -4
  65. package/dist/app/{status-line-renderer.js → rendering/status-line-renderer.js} +4 -4
  66. package/dist/app/{tab-line-renderer.d.ts → rendering/tab-line-renderer.d.ts} +3 -3
  67. package/dist/app/{tab-line-renderer.js → rendering/tab-line-renderer.js} +2 -2
  68. package/dist/app/{toast-controller.d.ts → rendering/toast-controller.d.ts} +1 -1
  69. package/dist/app/{toast-controller.js → rendering/toast-controller.js} +2 -2
  70. package/dist/app/{toast-renderer.d.ts → rendering/toast-renderer.d.ts} +3 -3
  71. package/dist/app/{toast-renderer.js → rendering/toast-renderer.js} +3 -3
  72. package/dist/app/{tool-block-renderer.d.ts → rendering/tool-block-renderer.d.ts} +5 -5
  73. package/dist/app/{tool-block-renderer.js → rendering/tool-block-renderer.js} +2 -2
  74. package/dist/app/runtime.js +1 -1
  75. package/dist/app/{blink-controller.js → screen/blink-controller.js} +1 -1
  76. package/dist/app/{image-click-targets.d.ts → screen/image-click-targets.d.ts} +2 -2
  77. package/dist/app/{image-opener.d.ts → screen/image-opener.d.ts} +1 -1
  78. package/dist/app/{mouse-controller.d.ts → screen/mouse-controller.d.ts} +13 -9
  79. package/dist/app/{mouse-controller.js → screen/mouse-controller.js} +56 -28
  80. package/dist/app/{screen-selection.d.ts → screen/screen-selection.d.ts} +1 -1
  81. package/dist/app/{screen-styler.d.ts → screen/screen-styler.d.ts} +2 -2
  82. package/dist/app/{screen-styler.js → screen/screen-styler.js} +4 -4
  83. package/dist/app/{scroll-controller.d.ts → screen/scroll-controller.d.ts} +3 -3
  84. package/dist/app/{scroll-controller.js → screen/scroll-controller.js} +1 -1
  85. package/dist/app/{status-controller.d.ts → screen/status-controller.d.ts} +2 -2
  86. package/dist/app/{status-controller.js → screen/status-controller.js} +1 -1
  87. package/dist/app/{queued-message-controller.d.ts → session/queued-message-controller.d.ts} +2 -2
  88. package/dist/app/{queued-message-controller.js → session/queued-message-controller.js} +2 -2
  89. package/dist/app/{request-history.js → session/request-history.js} +2 -2
  90. package/dist/app/{session-event-controller.d.ts → session/session-event-controller.d.ts} +3 -3
  91. package/dist/app/{session-event-controller.js → session/session-event-controller.js} +3 -3
  92. package/dist/app/{session-history.d.ts → session/session-history.d.ts} +1 -1
  93. package/dist/app/{session-history.js → session/session-history.js} +3 -3
  94. package/dist/app/{session-lifecycle-controller.d.ts → session/session-lifecycle-controller.d.ts} +2 -2
  95. package/dist/app/{session-lifecycle-controller.js → session/session-lifecycle-controller.js} +4 -4
  96. package/dist/app/{session-search.d.ts → session/session-search.d.ts} +1 -1
  97. package/dist/app/{session-search.js → session/session-search.js} +3 -3
  98. package/dist/app/{tabs-controller.d.ts → session/tabs-controller.d.ts} +2 -2
  99. package/dist/app/{tabs-controller.js → session/tabs-controller.js} +4 -4
  100. package/dist/app/{subagents-files.d.ts → subagents/subagents-files.d.ts} +1 -1
  101. package/dist/app/{subagents-files.js → subagents/subagents-files.js} +1 -1
  102. package/dist/app/{subagents-model.d.ts → subagents/subagents-model.d.ts} +1 -1
  103. package/dist/app/{subagents-model.js → subagents/subagents-model.js} +4 -4
  104. package/dist/app/{subagents-widget-controller.d.ts → subagents/subagents-widget-controller.d.ts} +1 -1
  105. package/dist/app/{subagents-widget-controller.js → subagents/subagents-widget-controller.js} +2 -2
  106. package/dist/app/{terminal-bell-sound-controller.js → terminal/terminal-bell-sound-controller.js} +1 -1
  107. package/dist/app/{terminal-controller.js → terminal/terminal-controller.js} +2 -2
  108. package/dist/app/{todo-model.d.ts → todo/todo-model.d.ts} +1 -1
  109. package/dist/app/{todo-model.js → todo/todo-model.js} +3 -3
  110. package/dist/app/{todo-widget-controller.d.ts → todo/todo-widget-controller.d.ts} +1 -1
  111. package/dist/app/{todo-widget-controller.js → todo/todo-widget-controller.js} +2 -2
  112. package/dist/app/types.d.ts +2 -2
  113. package/dist/app/{workspace-actions-controller.d.ts → workspace/workspace-actions-controller.d.ts} +1 -1
  114. package/dist/app/{workspace-actions-controller.js → workspace/workspace-actions-controller.js} +3 -3
  115. package/dist/main.js +2 -2
  116. package/external/pi-tools-suite/README.md +78 -0
  117. package/external/pi-tools-suite/src/async-subagents/core/agent-strategy.ts +4 -0
  118. package/external/pi-tools-suite/src/async-subagents/core/spawn.ts +6 -1
  119. package/external/pi-tools-suite/src/dcp/prompts.ts +4 -0
  120. package/external/pi-tools-suite/src/default-pi-tools-suite-config.ts +271 -0
  121. package/external/pi-tools-suite/src/index.ts +1 -0
  122. package/external/pi-tools-suite/src/opencode-import/commands.ts +86 -0
  123. package/external/pi-tools-suite/src/opencode-import/importer.ts +208 -0
  124. package/external/pi-tools-suite/src/opencode-import/index.ts +25 -0
  125. package/package.json +1 -1
  126. /package/dist/app/{install.d.ts → cli/install.d.ts} +0 -0
  127. /package/dist/app/{startup-checks.d.ts → cli/startup-checks.d.ts} +0 -0
  128. /package/dist/app/{startup-checks.js → cli/startup-checks.js} +0 -0
  129. /package/dist/app/{startup-info.d.ts → cli/startup-info.d.ts} +0 -0
  130. /package/dist/app/{startup-info.js → cli/startup-info.js} +0 -0
  131. /package/dist/app/{update.d.ts → cli/update.d.ts} +0 -0
  132. /package/dist/app/{update.js → cli/update.js} +0 -0
  133. /package/dist/app/{command-controller.js → commands/command-controller.js} +0 -0
  134. /package/dist/app/{command-host.js → commands/command-host.js} +0 -0
  135. /package/dist/app/{command-registry.js → commands/command-registry.js} +0 -0
  136. /package/dist/app/{command-runtime.d.ts → commands/command-runtime.d.ts} +0 -0
  137. /package/dist/app/{command-session-actions.d.ts → commands/command-session-actions.d.ts} +0 -0
  138. /package/dist/app/{shell-command.d.ts → commands/shell-command.d.ts} +0 -0
  139. /package/dist/app/{shell-command.js → commands/shell-command.js} +0 -0
  140. /package/dist/app/{extension-event-bus.d.ts → extensions/extension-event-bus.d.ts} +0 -0
  141. /package/dist/app/{extension-event-bus.js → extensions/extension-event-bus.js} +0 -0
  142. /package/dist/app/{native-modifiers.d.ts → input/native-modifiers.d.ts} +0 -0
  143. /package/dist/app/{terminal-edit-shortcuts.d.ts → input/terminal-edit-shortcuts.d.ts} +0 -0
  144. /package/dist/app/{terminal-edit-shortcuts.js → input/terminal-edit-shortcuts.js} +0 -0
  145. /package/dist/app/{model-usage-controller.d.ts → model/model-usage-controller.d.ts} +0 -0
  146. /package/dist/app/{conversation-viewport.js → rendering/conversation-viewport.js} +0 -0
  147. /package/dist/app/{dcp-stats.d.ts → rendering/dcp-stats.d.ts} +0 -0
  148. /package/dist/app/{blink-controller.d.ts → screen/blink-controller.d.ts} +0 -0
  149. /package/dist/app/{clipboard.d.ts → screen/clipboard.d.ts} +0 -0
  150. /package/dist/app/{clipboard.js → screen/clipboard.js} +0 -0
  151. /package/dist/app/{file-link-opener.d.ts → screen/file-link-opener.d.ts} +0 -0
  152. /package/dist/app/{file-link-opener.js → screen/file-link-opener.js} +0 -0
  153. /package/dist/app/{file-links.d.ts → screen/file-links.d.ts} +0 -0
  154. /package/dist/app/{file-links.js → screen/file-links.js} +0 -0
  155. /package/dist/app/{image-click-targets.js → screen/image-click-targets.js} +0 -0
  156. /package/dist/app/{image-opener.js → screen/image-opener.js} +0 -0
  157. /package/dist/app/{screen-selection.js → screen/screen-selection.js} +0 -0
  158. /package/dist/app/{request-history.d.ts → session/request-history.d.ts} +0 -0
  159. /package/dist/app/{nerd-font-controller.d.ts → terminal/nerd-font-controller.d.ts} +0 -0
  160. /package/dist/app/{nerd-font-controller.js → terminal/nerd-font-controller.js} +0 -0
  161. /package/dist/app/{terminal-bell-sound-controller.d.ts → terminal/terminal-bell-sound-controller.d.ts} +0 -0
  162. /package/dist/app/{terminal-controller.d.ts → terminal/terminal-controller.d.ts} +0 -0
  163. /package/dist/app/{terminal-output-buffer.d.ts → terminal/terminal-output-buffer.d.ts} +0 -0
  164. /package/dist/app/{terminal-output-buffer.js → terminal/terminal-output-buffer.js} +0 -0
  165. /package/dist/app/{workspace-undo.d.ts → workspace/workspace-undo.d.ts} +0 -0
  166. /package/dist/app/{workspace-undo.js → workspace/workspace-undo.js} +0 -0
package/README.md CHANGED
@@ -185,6 +185,40 @@ Example fallback icon configuration:
185
185
  - Click a tool row: expand or collapse that tool result.
186
186
  - Click the right-aligned microphone/language status widget: toggle voice input and switch Russian/English dictation.
187
187
 
188
+ ## Slash commands
189
+
190
+ Type `/` in the prompt to open the command picker. Commands that accept arguments can also be called directly with inline arguments.
191
+
192
+ | Command | Arguments | Description |
193
+ |---|---|---|
194
+ | `/settings` | — | Show current session, model, theme, and key settings. |
195
+ | `/model` | `[provider/model[:thinking]]` | Select the active model. Without arguments, opens the model picker. With a reference like `anthropic/claude-sonnet-4-20250514:medium`, sets the model and optional thinking level directly. |
196
+ | `/scoped-models` | `[refs…\|reset]` | Show or set the models used by the model selector and cycling. Pass one or more `provider/model[:thinking]` references separated by spaces or commas. Use `reset` to restore the default favorites. |
197
+ | `/thinking` | `[level]` | Select the thinking level. Without arguments, opens the thinking picker. Accepts an explicit level (`off`, `minimal`, `low`, `medium`, `high`, `xhigh`). |
198
+ | `/enhance` | — | Improve the current prompt draft using the prompt enhancer model. |
199
+ | `/export` | `[path]` | Export the session. Defaults to HTML. Pass a `.jsonl` path to export as JSONL. |
200
+ | `/import` | `<path.jsonl>` | Import and resume a session from a JSONL file. |
201
+ | `/share` | — | Share the session as a private GitHub gist (requires `gh` CLI). |
202
+ | `/copy` | — | Copy the last agent message to the clipboard. |
203
+ | `/name` | `[name]` | Show or set the session display name. |
204
+ | `/session` | — | Show session info: message counts, token usage, and cost. |
205
+ | `/usage` | — | Show local account quota usage and context window utilization. |
206
+ | `/changelog` | — | Show the Pi package changelog. |
207
+ | `/update` | `[--force\|--help]` | Check for Pix package updates. `/update` is check-only; run `pix update` in a shell to install. |
208
+ | `/hotkeys` | — | Show keyboard shortcuts. |
209
+ | `/fork` | `[entry-id]` | Fork the session from the latest or specified user-message entry. |
210
+ | `/clone` | — | Duplicate the current session at the current position. |
211
+ | `/jump` | `[query]` | Jump to a previous user message. Opens the message picker, optionally filtered by query. |
212
+ | `/search` | `<text>` | Search sessions for matching text and open a result in a new tab. |
213
+ | `/reload` | — | Reload keybindings, extensions, skills, prompts, and themes from disk. |
214
+ | `/resume` | `[path\|query]` | Resume a different session. Without arguments, opens the session picker. |
215
+ | `/new` | — | Start a fresh session in the current tab. |
216
+ | `/new_tab` | — | Open a fresh session in a new tab. |
217
+ | `/compact` | `[instructions]` | Manually compact the session context, optionally with custom instructions for the compaction. |
218
+ | `/quit`, `/exit` | — | Quit the renderer. |
219
+
220
+ Extensions, prompt templates, and skills may register additional slash commands that appear in the command picker alongside the built-in ones.
221
+
188
222
  ## Voice input
189
223
 
190
224
  Pix can dictate into the prompt through local Vosk. The first start for each language downloads the small model into the gitignored `models/vosk/` directory inside this project:
package/bin/pix.mjs CHANGED
@@ -9,8 +9,8 @@ const minimumNodeVersionLabel = "22.19.0";
9
9
  const launcherPath = fileURLToPath(import.meta.url);
10
10
  const packageRoot = dirname(dirname(launcherPath));
11
11
  const mainPath = fileURLToPath(new URL("../dist/main.js", import.meta.url));
12
- const updatePath = fileURLToPath(new URL("../dist/app/update.js", import.meta.url));
13
- const installPath = fileURLToPath(new URL("../dist/app/install.js", import.meta.url));
12
+ const updatePath = fileURLToPath(new URL("../dist/app/cli/update.js", import.meta.url));
13
+ const installPath = fileURLToPath(new URL("../dist/app/cli/install.js", import.meta.url));
14
14
  const distPath = dirname(mainPath);
15
15
  const rawArgs = process.argv.slice(2);
16
16
  const childArgs = [];
@@ -39,7 +39,7 @@ if (childArgs[0] === "update") {
39
39
  console.error("pix update is not built yet. Run `npm run build:pix` or update from a published package.");
40
40
  process.exit(1);
41
41
  }
42
- const { runPixUpdateCli } = await import(new URL("../dist/app/update.js", import.meta.url));
42
+ const { runPixUpdateCli } = await import(new URL("../dist/app/cli/update.js", import.meta.url));
43
43
  process.exit(await runPixUpdateCli(childArgs.slice(1)));
44
44
  }
45
45
 
@@ -48,7 +48,7 @@ if (childArgs[0] === "install" || childArgs[0] === "setup") {
48
48
  console.error("pix install is not built yet. Run `npm run build:pix` or update from a published package.");
49
49
  process.exit(1);
50
50
  }
51
- const { runPixInstallCli } = await import(new URL("../dist/app/install.js", import.meta.url));
51
+ const { runPixInstallCli } = await import(new URL("../dist/app/cli/install.js", import.meta.url));
52
52
  process.exit(await runPixInstallCli(childArgs.slice(1), { env: pixChildEnv() }));
53
53
  }
54
54
 
package/dist/app/app.js CHANGED
@@ -1,47 +1,47 @@
1
1
  import { THEMES } from "../theme.js";
2
2
  import { InputEditor } from "../input-editor.js";
3
3
  import { compileOutputFilterPatterns, loadPixConfig, resolveToolRule, } from "../config.js";
4
- import { AppCommandController } from "./command-controller.js";
5
- import { ConversationViewport } from "./conversation-viewport.js";
6
- import { EditorLayoutRenderer } from "./editor-layout-renderer.js";
7
- import { AppExtensionActionsController } from "./extension-actions-controller.js";
8
- import { ExtensionUiController } from "./extension-ui-controller.js";
9
- import { AppInputActionController } from "./input-action-controller.js";
10
- import { AppInputController } from "./input-controller.js";
11
- import { AppBlinkController } from "./blink-controller.js";
4
+ import { AppCommandController } from "./commands/command-controller.js";
5
+ import { ConversationViewport } from "./rendering/conversation-viewport.js";
6
+ import { EditorLayoutRenderer } from "./rendering/editor-layout-renderer.js";
7
+ import { AppExtensionActionsController } from "./extensions/extension-actions-controller.js";
8
+ import { ExtensionUiController } from "./extensions/extension-ui-controller.js";
9
+ import { AppInputActionController } from "./input/input-action-controller.js";
10
+ import { AppInputController } from "./input/input-controller.js";
11
+ import { AppBlinkController } from "./screen/blink-controller.js";
12
12
  import { isRecord } from "./guards.js";
13
- import { AppMenuItemsController } from "./menu-items-controller.js";
14
- import { AppMouseController } from "./mouse-controller.js";
13
+ import { AppMenuItemsController } from "./popup/menu-items-controller.js";
14
+ import { AppMouseController } from "./screen/mouse-controller.js";
15
15
  import { createId } from "./id.js";
16
- import { NerdFontController } from "./nerd-font-controller.js";
17
- import { AppPopupActionController } from "./popup-action-controller.js";
18
- import { AppPopupMenuController } from "./popup-menu-controller.js";
19
- import { AppPromptEnhancerController } from "./prompt-enhancer-controller.js";
20
- import { AppQueuedMessageController } from "./queued-message-controller.js";
21
- import { AppRequestHistory } from "./request-history.js";
22
- import { AppRenderController } from "./render-controller.js";
16
+ import { NerdFontController } from "./terminal/nerd-font-controller.js";
17
+ import { AppPopupActionController } from "./popup/popup-action-controller.js";
18
+ import { AppPopupMenuController } from "./popup/popup-menu-controller.js";
19
+ import { AppPromptEnhancerController } from "./input/prompt-enhancer-controller.js";
20
+ import { AppQueuedMessageController } from "./session/queued-message-controller.js";
21
+ import { AppRequestHistory } from "./session/request-history.js";
22
+ import { AppRenderController } from "./rendering/render-controller.js";
23
23
  import { createPixRuntime } from "./runtime.js";
24
- import { ScreenStyler } from "./screen-styler.js";
25
- import { AppScrollController } from "./scroll-controller.js";
26
- import { searchResultScrollNeedles, searchResultTargetEntry } from "./session-search.js";
27
- import { AppSessionLifecycleController } from "./session-lifecycle-controller.js";
28
- import { AppShellController } from "./shell-controller.js";
29
- import { runInteractiveShellCommand } from "./shell-command.js";
30
- import { AppSessionEventController } from "./session-event-controller.js";
31
- import { AppStatusController } from "./status-controller.js";
32
- import { StatusLineRenderer } from "./status-line-renderer.js";
33
- import { AppModelUsageController } from "./model-usage-controller.js";
34
- import { AppWorkspaceActionsController } from "./workspace-actions-controller.js";
35
- import { AppSubagentsWidgetController } from "./subagents-widget-controller.js";
36
- import { AppTodoWidgetController } from "./todo-widget-controller.js";
37
- import { AppTabsController } from "./tabs-controller.js";
38
- import { TabLineRenderer } from "./tab-line-renderer.js";
39
- import { AppTerminalController } from "./terminal-controller.js";
40
- import { TerminalBellSoundController } from "./terminal-bell-sound-controller.js";
41
- import { AppToastController } from "./toast-controller.js";
42
- import { checkPixUpdate, formatPixStartupUpdateDialog } from "./update.js";
43
- import { AppVoiceController } from "./voice-controller.js";
44
- import { createIsolatedExtensionEventBus } from "./extension-event-bus.js";
24
+ import { ScreenStyler } from "./screen/screen-styler.js";
25
+ import { AppScrollController } from "./screen/scroll-controller.js";
26
+ import { searchResultScrollNeedles, searchResultTargetEntry } from "./session/session-search.js";
27
+ import { AppSessionLifecycleController } from "./session/session-lifecycle-controller.js";
28
+ import { AppShellController } from "./commands/shell-controller.js";
29
+ import { runInteractiveShellCommand } from "./commands/shell-command.js";
30
+ import { AppSessionEventController } from "./session/session-event-controller.js";
31
+ import { AppStatusController } from "./screen/status-controller.js";
32
+ import { StatusLineRenderer } from "./rendering/status-line-renderer.js";
33
+ import { AppModelUsageController } from "./model/model-usage-controller.js";
34
+ import { AppWorkspaceActionsController } from "./workspace/workspace-actions-controller.js";
35
+ import { AppSubagentsWidgetController } from "./subagents/subagents-widget-controller.js";
36
+ import { AppTodoWidgetController } from "./todo/todo-widget-controller.js";
37
+ import { AppTabsController } from "./session/tabs-controller.js";
38
+ import { TabLineRenderer } from "./rendering/tab-line-renderer.js";
39
+ import { AppTerminalController } from "./terminal/terminal-controller.js";
40
+ import { TerminalBellSoundController } from "./terminal/terminal-bell-sound-controller.js";
41
+ import { AppToastController } from "./rendering/toast-controller.js";
42
+ import { checkPixUpdate, formatPixStartupUpdateDialog } from "./cli/update.js";
43
+ import { AppVoiceController } from "./input/voice-controller.js";
44
+ import { createIsolatedExtensionEventBus } from "./extensions/extension-event-bus.js";
45
45
  import { setAppIconTheme } from "./icons.js";
46
46
  const TERMINAL_BELL_ATTENTION_EVENT = "pix:terminal-bell:attention";
47
47
  const SUBAGENTS_LIVE_STATE_EVENT = "pi-tools-suite:async-subagents:live-state";
@@ -1,4 +1,4 @@
1
- import type { AppOptions } from "./types.js";
1
+ import type { AppOptions } from "../types.js";
2
2
  export type ResumeCommandOptions = {
3
3
  cwd: string;
4
4
  sessionPath: string;
@@ -1,5 +1,5 @@
1
1
  import { resolve } from "node:path";
2
- import { parseThemeName } from "../theme.js";
2
+ import { parseThemeName } from "../../theme.js";
3
3
  export function usage() {
4
4
  return `Usage: pix [--cwd <path>] [--no-session] [--session <path>] [--theme dark|light] [--model <provider/model[:thinking]>]
5
5
  pix update [--check] [--force]
@@ -1,8 +1,8 @@
1
1
  import { spawn } from "node:child_process";
2
2
  import { existsSync } from "node:fs";
3
3
  import { join } from "node:path";
4
- import { FONT_FAMILY_NAME, installJetBrainsNerdFont, isJetBrainsNerdFontInstalled, } from "./nerd-font-controller.js";
5
- import { clipboardInstallHint, clipboardSupportAvailable } from "./clipboard.js";
4
+ import { FONT_FAMILY_NAME, installJetBrainsNerdFont, isJetBrainsNerdFontInstalled, } from "../terminal/nerd-font-controller.js";
5
+ import { clipboardInstallHint, clipboardSupportAvailable } from "../screen/clipboard.js";
6
6
  export function pixInstallUsage() {
7
7
  return `Usage: pix install [--check]
8
8
  pix setup [--check]
@@ -1,5 +1,5 @@
1
1
  import type { CommandControllerHost } from "./command-host.js";
2
- import type { PopupMenuPlacement, SessionModel, SlashCommand, ThinkingLevel } from "./types.js";
2
+ import type { PopupMenuPlacement, SessionModel, SlashCommand, ThinkingLevel } from "../types.js";
3
3
  export declare class AppCommandController {
4
4
  private readonly host;
5
5
  readonly slashCommands: readonly SlashCommand[];
@@ -1,7 +1,7 @@
1
1
  import type { AgentSession, AgentSessionRuntime, SessionInfo } from "@earendil-works/pi-coding-agent";
2
- import type { SessionSearchResult } from "./session-search.js";
3
- import type { ActivePopupMenu, AppOptions, Entry, ModelMenuValue, PixMenuItem, PixMenuOptions, PopupMenuPlacement, ScopedSessionModel, SessionModel, ThinkingMenuValue } from "./types.js";
4
- import type { ToastNotifier } from "../ui.js";
2
+ import type { SessionSearchResult } from "../session/session-search.js";
3
+ import type { ActivePopupMenu, AppOptions, Entry, ModelMenuValue, PixMenuItem, PixMenuOptions, PopupMenuPlacement, ScopedSessionModel, SessionModel, ThinkingMenuValue } from "../types.js";
4
+ import type { ToastNotifier } from "../../ui.js";
5
5
  export type DirectPopupMenu = Exclude<ActivePopupMenu, "slash">;
6
6
  export type CommandControllerHost = {
7
7
  readonly options: AppOptions;
@@ -1,5 +1,5 @@
1
1
  import type { CommandControllerHost } from "./command-host.js";
2
- import type { SessionModel, ThinkingLevel } from "./types.js";
2
+ import type { SessionModel, ThinkingLevel } from "../types.js";
3
3
  export declare class ModelCommandActions {
4
4
  private readonly host;
5
5
  constructor(host: CommandControllerHost);
@@ -1,6 +1,6 @@
1
1
  import { getIdleRuntime, getRuntime } from "./command-runtime.js";
2
- import { createId } from "./id.js";
3
- import { isThinkingLevel, parseScopedModelRef } from "./model-ref.js";
2
+ import { createId } from "../id.js";
3
+ import { isThinkingLevel, parseScopedModelRef } from "../model/model-ref.js";
4
4
  export class ModelCommandActions {
5
5
  host;
6
6
  constructor(host) {
@@ -1,5 +1,5 @@
1
1
  import type { CommandControllerHost } from "./command-host.js";
2
- import type { PopupMenuPlacement } from "./types.js";
2
+ import type { PopupMenuPlacement } from "../types.js";
3
3
  export declare class NavigationCommandActions {
4
4
  private readonly host;
5
5
  constructor(host: CommandControllerHost);
@@ -1,11 +1,11 @@
1
1
  import { resolve } from "node:path";
2
2
  import { SessionManager } from "@earendil-works/pi-coding-agent";
3
3
  import { getIdleRuntime, getRuntime } from "./command-runtime.js";
4
- import { createId } from "./id.js";
5
- import { isRecord } from "./guards.js";
6
- import { renderContent } from "./message-content.js";
7
- import { sanitizeText } from "./render-text.js";
8
- import { createSessionSearchMenuItems, searchSessions } from "./session-search.js";
4
+ import { createId } from "../id.js";
5
+ import { isRecord } from "../guards.js";
6
+ import { renderContent } from "../rendering/message-content.js";
7
+ import { sanitizeText } from "../rendering/render-text.js";
8
+ import { createSessionSearchMenuItems, searchSessions } from "../session/session-search.js";
9
9
  export class NavigationCommandActions {
10
10
  host;
11
11
  constructor(host) {
@@ -1,5 +1,5 @@
1
1
  import type { CommandControllerHost } from "./command-host.js";
2
- import type { SlashCommand } from "./types.js";
2
+ import type { SlashCommand } from "../types.js";
3
3
  export type CommandRegistryActions = {
4
4
  runSettingsCommand(): Promise<void>;
5
5
  runModelSlashCommand(argumentsText: string): Promise<void>;
@@ -1,4 +1,4 @@
1
- import { createId } from "./id.js";
1
+ import { createId } from "../id.js";
2
2
  export function getRuntime(host, commandName) {
3
3
  const runtime = host.runtime();
4
4
  if (!runtime) {
@@ -5,9 +5,9 @@ import { dirname, join, resolve } from "node:path";
5
5
  import { fileURLToPath } from "node:url";
6
6
  import { copyToClipboard, getAgentDir } from "@earendil-works/pi-coding-agent";
7
7
  import { getIdleRuntime, getRuntime, parsePathArgument } from "./command-runtime.js";
8
- import { createId } from "./id.js";
9
- import { formatAccountUsageReport, queryAccountUsageReport } from "./model-usage-status.js";
10
- import { checkPixUpdate, formatPixUpdateCheck, parsePixUpdateArgs, pixUpdateUsage } from "./update.js";
8
+ import { createId } from "../id.js";
9
+ import { formatAccountUsageReport, queryAccountUsageReport } from "../model/model-usage-status.js";
10
+ import { checkPixUpdate, formatPixUpdateCheck, parsePixUpdateArgs, pixUpdateUsage } from "../cli/update.js";
11
11
  export class SessionCommandActions {
12
12
  host;
13
13
  constructor(host) {
@@ -1,5 +1,5 @@
1
1
  import { type InteractiveShellCommandResult } from "./shell-command.js";
2
- import type { Entry, SessionActivity } from "./types.js";
2
+ import type { Entry, SessionActivity } from "../types.js";
3
3
  export type AppShellControllerHost = {
4
4
  readonly cwd: string;
5
5
  isRunning(): boolean;
@@ -1,4 +1,4 @@
1
- import { createId } from "./id.js";
1
+ import { createId } from "../id.js";
2
2
  import { runChatShellCommand } from "./shell-command.js";
3
3
  const SHELL_RENDER_THROTTLE_MS = 33;
4
4
  export class AppShellController {
@@ -1,6 +1,6 @@
1
1
  import type { AgentSessionRuntime } from "@earendil-works/pi-coding-agent";
2
- import { type FuzzyMatch } from "../fuzzy.js";
3
- import type { ParsedSlashInput, SlashCommand } from "./types.js";
2
+ import { type FuzzyMatch } from "../../fuzzy.js";
3
+ import type { ParsedSlashInput, SlashCommand } from "../types.js";
4
4
  export declare function parseSlashInput(text: string): ParsedSlashInput | undefined;
5
5
  export declare function getResourceSlashCommands(runtime: AgentSessionRuntime | undefined, builtInCommands: readonly SlashCommand[]): SlashCommand[];
6
6
  export declare function getSlashCommandMatches(commands: readonly SlashCommand[], query: string, limit?: number): FuzzyMatch<SlashCommand>[];
@@ -1,4 +1,4 @@
1
- import { fuzzySearch } from "../fuzzy.js";
1
+ import { fuzzySearch } from "../../fuzzy.js";
2
2
  export function parseSlashInput(text) {
3
3
  if (!text.startsWith("/"))
4
4
  return undefined;
@@ -1,5 +1,5 @@
1
1
  import type { AgentSessionRuntime, ExtensionCommandContextActions, ExtensionError } from "@earendil-works/pi-coding-agent";
2
- import type { Entry } from "./types.js";
2
+ import type { Entry } from "../types.js";
3
3
  export type AppExtensionActionsHost = {
4
4
  isRunning(): boolean;
5
5
  getInput(): string;
@@ -1,4 +1,4 @@
1
- import { createId } from "./id.js";
1
+ import { createId } from "../id.js";
2
2
  export class AppExtensionActionsController {
3
3
  host;
4
4
  constructor(host) {
@@ -1,6 +1,6 @@
1
- import { type Theme } from "../theme.js";
2
- import { type ToastKind, type ToastNotifier } from "../ui.js";
3
- import type { Entry, ExtensionInputMouseEvent, ExtensionWidgetRegistration, ExtensionWidgetTheme, PixExtensionUIContext, PixMenuController, WidgetPlacement, WidgetTuiHandle } from "./types.js";
1
+ import { type Theme } from "../../theme.js";
2
+ import { type ToastKind, type ToastNotifier } from "../../ui.js";
3
+ import type { Entry, ExtensionInputMouseEvent, ExtensionWidgetRegistration, ExtensionWidgetTheme, PixExtensionUIContext, PixMenuController, WidgetPlacement, WidgetTuiHandle } from "../types.js";
4
4
  export type ExtensionTerminalInputResult = {
5
5
  consume: boolean;
6
6
  data?: string;
@@ -1,6 +1,6 @@
1
- import { ANSI_RESET, colorize, THEMES } from "../theme.js";
2
- import { isToastKind } from "../ui.js";
3
- import { ellipsizeDisplay, sanitizeText } from "./render-text.js";
1
+ import { ANSI_RESET, colorize, THEMES } from "../../theme.js";
2
+ import { isToastKind } from "../../ui.js";
3
+ import { ellipsizeDisplay, sanitizeText } from "../rendering/render-text.js";
4
4
  const CUSTOM_UI_WIDGET_KEY = "pix-custom-ui";
5
5
  export class ExtensionUiController {
6
6
  host;
@@ -1,11 +1,11 @@
1
- import type { InputEditor } from "../input-editor.js";
1
+ import type { InputEditor } from "../../input-editor.js";
2
2
  import type { AgentSessionRuntime } from "@earendil-works/pi-coding-agent";
3
- import type { AppPopupActionController } from "./popup-action-controller.js";
4
- import type { AppPopupMenuController } from "./popup-menu-controller.js";
5
- import type { AppQueuedMessageController } from "./queued-message-controller.js";
6
- import type { AppRequestHistory } from "./request-history.js";
7
- import { type InteractiveShellCommandResult } from "./shell-command.js";
8
- import type { Entry, SessionActivity } from "./types.js";
3
+ import type { AppPopupActionController } from "../popup/popup-action-controller.js";
4
+ import type { AppPopupMenuController } from "../popup/popup-menu-controller.js";
5
+ import type { AppQueuedMessageController } from "../session/queued-message-controller.js";
6
+ import type { AppRequestHistory } from "../session/request-history.js";
7
+ import { type InteractiveShellCommandResult } from "../commands/shell-command.js";
8
+ import type { Entry, SessionActivity } from "../types.js";
9
9
  export type AppInputActionControllerHost = {
10
10
  runtime(): AgentSessionRuntime | undefined;
11
11
  isRunning(): boolean;
@@ -1,6 +1,6 @@
1
- import { createId } from "./id.js";
2
- import { stringifyUnknown } from "./message-content.js";
3
- import { bangShellCommandFromInput, formatShellCommandEntry, } from "./shell-command.js";
1
+ import { createId } from "../id.js";
2
+ import { stringifyUnknown } from "../rendering/message-content.js";
3
+ import { bangShellCommandFromInput, formatShellCommandEntry, } from "../commands/shell-command.js";
4
4
  const ABORT_STATUS_RESTORE_MS = 1200;
5
5
  export class AppInputActionController {
6
6
  host;
@@ -1,6 +1,6 @@
1
- import { InputEditor } from "../input-editor.js";
2
- import type { ExtensionTerminalInputResult } from "./extension-ui-controller.js";
3
- import type { MouseEvent, ActivePopupMenu } from "./types.js";
1
+ import { InputEditor } from "../../input-editor.js";
2
+ import type { ExtensionTerminalInputResult } from "../extensions/extension-ui-controller.js";
3
+ import type { MouseEvent, ActivePopupMenu } from "../types.js";
4
4
  type DirectPopupMenu = Exclude<ActivePopupMenu, "slash">;
5
5
  export type InputControllerHost = {
6
6
  readonly inputEditor: InputEditor;
@@ -42,7 +42,7 @@ export class AppInputController {
42
42
  }
43
43
  drainInputBuffer() {
44
44
  while (this.inputBuffer.length > 0) {
45
- const mouseMatch = /^\x1b\[<(\d+);(\d+);(\d+)([mM])/.exec(this.inputBuffer);
45
+ const mouseMatch = /^\x1b\[<(\d+);(-?\d+);(-?\d+)([mM])/.exec(this.inputBuffer);
46
46
  if (mouseMatch) {
47
47
  this.inputBuffer = this.inputBuffer.slice(mouseMatch[0].length);
48
48
  this.host.handleMouse({
@@ -1,4 +1,4 @@
1
- import { InputEditor } from "../input-editor.js";
1
+ import { InputEditor } from "../../input-editor.js";
2
2
  export type InputPasteHost = {
3
3
  readonly inputEditor: InputEditor;
4
4
  readonly cwd: string;
@@ -1,9 +1,9 @@
1
1
  import { createHash } from "node:crypto";
2
2
  import { stat } from "node:fs/promises";
3
3
  import { isAbsolute, relative, resolve } from "node:path";
4
- import { isImagePath, looksLikeFilePath, quoteFilePathForInput, readClipboardImage } from "../input-editor.js";
5
- import { PASTE_DUPLICATE_WINDOW_MS } from "./constants.js";
6
- import { normalizePastedTextForDuplicateKey } from "./render-text.js";
4
+ import { isImagePath, looksLikeFilePath, quoteFilePathForInput, readClipboardImage } from "../../input-editor.js";
5
+ import { PASTE_DUPLICATE_WINDOW_MS } from "../constants.js";
6
+ import { normalizePastedTextForDuplicateKey } from "../rendering/render-text.js";
7
7
  export class InputPasteHandler {
8
8
  host;
9
9
  pasteBuffer = "";
@@ -1,8 +1,8 @@
1
1
  import { createRequire } from "node:module";
2
2
  import { dirname, join } from "node:path";
3
3
  import { fileURLToPath } from "node:url";
4
- import { TERMINAL_COMMAND_MODIFIER_FLAG } from "./constants.js";
5
- import { isRecord } from "./guards.js";
4
+ import { TERMINAL_COMMAND_MODIFIER_FLAG } from "../constants.js";
5
+ import { isRecord } from "../guards.js";
6
6
  const cjsRequire = createRequire(import.meta.url);
7
7
  let nativeModifiersHelper;
8
8
  export function isNativeShiftPressed() {
@@ -1,9 +1,9 @@
1
1
  import { type AgentSessionRuntime } from "@earendil-works/pi-coding-agent";
2
- import type { PromptEnhancerConfig } from "../config.js";
3
- import type { InputEditor } from "../input-editor.js";
4
- import type { ToastNotifier } from "../ui.js";
5
- import type { TabInputState } from "./tabs-controller.js";
6
- import type { SessionActivity } from "./types.js";
2
+ import type { PromptEnhancerConfig } from "../../config.js";
3
+ import type { InputEditor } from "../../input-editor.js";
4
+ import type { ToastNotifier } from "../../ui.js";
5
+ import type { TabInputState } from "../session/tabs-controller.js";
6
+ import type { SessionActivity } from "../types.js";
7
7
  export type AppPromptEnhancerControllerHost = {
8
8
  runtime(): AgentSessionRuntime | undefined;
9
9
  inputEditor(): InputEditor;
@@ -1,7 +1,7 @@
1
1
  import { createAgentSessionFromServices, createAgentSessionServices, SessionManager, } from "@earendil-works/pi-coding-agent";
2
- import { APP_ICONS } from "./icons.js";
3
- import { stringifyUnknown } from "./message-content.js";
4
- import { parseModelRef } from "./model-ref.js";
2
+ import { APP_ICONS } from "../icons.js";
3
+ import { stringifyUnknown } from "../rendering/message-content.js";
4
+ import { parseModelRef } from "../model/model-ref.js";
5
5
  const PROMPT_ENHANCER_SYSTEM_PROMPT = `You improve prompts for a coding agent.
6
6
 
7
7
  Rewrite the user's draft into a clearer, more actionable prompt.
@@ -1,4 +1,4 @@
1
- import { type DictationConfig } from "../config.js";
1
+ import { type DictationConfig } from "../../config.js";
2
2
  export type VoiceLanguage = string;
3
3
  export type VoiceInputState = "idle" | "installing" | "downloading" | "loading" | "listening";
4
4
  export type AppVoiceControllerHost = {
@@ -6,8 +6,8 @@ import https from "node:https";
6
6
  import { createRequire } from "node:module";
7
7
  import { join } from "node:path";
8
8
  import { fileURLToPath } from "node:url";
9
- import { savePixDictationLanguage } from "../config.js";
10
- import { APP_ICONS } from "./icons.js";
9
+ import { savePixDictationLanguage } from "../../config.js";
10
+ import { APP_ICONS } from "../icons.js";
11
11
  const SAMPLE_RATE = 16_000;
12
12
  const require = createRequire(import.meta.url);
13
13
  const projectRoot = fileURLToPath(new URL("../..", import.meta.url));
@@ -1,4 +1,4 @@
1
- import type { ThinkingLevel } from "./types.js";
1
+ import type { ThinkingLevel } from "../types.js";
2
2
  export declare function parseModelRef(value: string): {
3
3
  provider: string;
4
4
  modelId: string;
@@ -1,4 +1,4 @@
1
- import { THINKING_LEVELS } from "./constants.js";
1
+ import { THINKING_LEVELS } from "../constants.js";
2
2
  export function parseModelRef(value) {
3
3
  const [modelPart, thinkingPart] = value.split(":", 2);
4
4
  if (!modelPart)
@@ -1,4 +1,4 @@
1
- import { MODEL_USAGE_POLL_INTERVAL_MS, MODEL_USAGE_STATUS_TICK_MS } from "./constants.js";
1
+ import { MODEL_USAGE_POLL_INTERVAL_MS, MODEL_USAGE_STATUS_TICK_MS } from "../constants.js";
2
2
  import { formatModelUsageStatusLabel, modelUsageDescriptor, queryModelUsageStatus, } from "./model-usage-status.js";
3
3
  export class AppModelUsageController {
4
4
  host;
@@ -1,4 +1,4 @@
1
- import type { SessionModel } from "./types.js";
1
+ import type { SessionModel } from "../types.js";
2
2
  type BaseModelUsageDescriptor = {
3
3
  readonly modelKey: string;
4
4
  };
@@ -4,7 +4,7 @@ import { readFile } from "node:fs/promises";
4
4
  import { homedir } from "node:os";
5
5
  import { join } from "node:path";
6
6
  import { getAgentDir } from "@earendil-works/pi-coding-agent";
7
- import { formatCompactProgressBar } from "../context-progress-bar.js";
7
+ import { formatCompactProgressBar } from "../../context-progress-bar.js";
8
8
  const OPENAI_USAGE_URL = "https://chatgpt.com/backend-api/wham/usage";
9
9
  const ZAI_QUOTA_URL = "https://api.z.ai/api/monitor/usage/quota/limit";
10
10
  const ZHIPU_QUOTA_URL = "https://bigmodel.cn/api/monitor/usage/quota/limit";
@@ -1,6 +1,6 @@
1
1
  import type { AgentSessionRuntime, SessionInfo } from "@earendil-works/pi-coding-agent";
2
- import type { PopupMenuItem } from "../ui.js";
3
- import type { Entry, ModelMenuValue, QueueMessageMenuValue, ResumeMenuValue, ScopedSessionModel, SessionModel, SlashCommand, ThinkingMenuValue, UserMessageJumpMenuValue, UserMessageMenuValue } from "./types.js";
2
+ import type { PopupMenuItem } from "../../ui.js";
3
+ import type { Entry, ModelMenuValue, QueueMessageMenuValue, ResumeMenuValue, ScopedSessionModel, SessionModel, SlashCommand, ThinkingMenuValue, UserMessageJumpMenuValue, UserMessageMenuValue } from "../types.js";
4
4
  export type AppMenuItemsControllerHost = {
5
5
  runtime(): AgentSessionRuntime | undefined;
6
6
  getBuiltinSlashCommands(): readonly SlashCommand[];
@@ -11,9 +11,9 @@ export declare class AppMenuItemsController {
11
11
  private readonly host;
12
12
  private resumeMenuLoaderCache;
13
13
  constructor(host: AppMenuItemsControllerHost);
14
- parseSlashInput(text: string): import("./types.js").ParsedSlashInput | undefined;
14
+ parseSlashInput(text: string): import("../types.js").ParsedSlashInput | undefined;
15
15
  getResourceSlashCommands(): SlashCommand[];
16
- getSlashCommandMatches(query: string, limit?: number): import("../fuzzy.js").FuzzyMatch<SlashCommand>[];
16
+ getSlashCommandMatches(query: string, limit?: number): import("../../fuzzy.js").FuzzyMatch<SlashCommand>[];
17
17
  getSlashCommandMenuItems(query: string): PopupMenuItem<SlashCommand>[];
18
18
  modelRef(model: SessionModel): string;
19
19
  getFavoriteScopedModels(): ScopedSessionModel[];
@@ -1,10 +1,10 @@
1
1
  import { resolve } from "node:path";
2
- import { fuzzySearch } from "../fuzzy.js";
3
- import { PI_FAVORITE_MODEL_REFS, THINKING_LEVELS } from "./constants.js";
4
- import { APP_ICONS } from "./icons.js";
5
- import { parseScopedModelRef } from "./model-ref.js";
2
+ import { fuzzySearch } from "../../fuzzy.js";
3
+ import { PI_FAVORITE_MODEL_REFS, THINKING_LEVELS } from "../constants.js";
4
+ import { APP_ICONS } from "../icons.js";
5
+ import { parseScopedModelRef } from "../model/model-ref.js";
6
6
  import { buildUserMessageJumpItems, createSessionInfoMenuItemsLoader } from "./popup-menu-controller.js";
7
- import { getResourceSlashCommands, getSlashCommandMatches, parseSlashInput } from "./slash-commands.js";
7
+ import { getResourceSlashCommands, getSlashCommandMatches, parseSlashInput } from "../commands/slash-commands.js";
8
8
  export class AppMenuItemsController {
9
9
  host;
10
10
  resumeMenuLoaderCache;
@@ -1,10 +1,10 @@
1
1
  import type { AgentSession, AgentSessionRuntime } from "@earendil-works/pi-coding-agent";
2
- import type { AppCommandController } from "./command-controller.js";
2
+ import type { AppCommandController } from "../commands/command-controller.js";
3
3
  import type { AppMenuItemsController } from "./menu-items-controller.js";
4
4
  import type { AppPopupMenuController } from "./popup-menu-controller.js";
5
- import type { AppQueuedMessageController } from "./queued-message-controller.js";
6
- import type { Entry, SlashCommand } from "./types.js";
7
- import type { AppWorkspaceActionsController } from "./workspace-actions-controller.js";
5
+ import type { AppQueuedMessageController } from "../session/queued-message-controller.js";
6
+ import type { Entry, SlashCommand } from "../types.js";
7
+ import type { AppWorkspaceActionsController } from "../workspace/workspace-actions-controller.js";
8
8
  export type AppPopupActionControllerHost = {
9
9
  runtime(): AgentSessionRuntime | undefined;
10
10
  getBuiltinSlashCommands(): readonly SlashCommand[];
@@ -1,5 +1,5 @@
1
- import { createId } from "./id.js";
2
- import { stringifyUnknown } from "./message-content.js";
1
+ import { createId } from "../id.js";
2
+ import { stringifyUnknown } from "../rendering/message-content.js";
3
3
  export class AppPopupActionController {
4
4
  host;
5
5
  popupMenus;