@oh-my-pi/pi-coding-agent 17.0.8 → 17.1.0

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 (340) hide show
  1. package/CHANGELOG.md +87 -1
  2. package/README.md +1 -1
  3. package/dist/cli.js +5495 -5021
  4. package/dist/types/async/job-manager.d.ts +37 -1
  5. package/dist/types/cli/args.d.ts +2 -0
  6. package/dist/types/cli/bench-cli.d.ts +41 -0
  7. package/dist/types/commands/bench.d.ts +15 -3
  8. package/dist/types/commands/launch.d.ts +4 -0
  9. package/dist/types/config/__tests__/model-registry.test.d.ts +1 -0
  10. package/dist/types/config/model-registry.d.ts +30 -1
  11. package/dist/types/config/models-config-schema.d.ts +18 -6
  12. package/dist/types/config/models-config.d.ts +14 -5
  13. package/dist/types/config/provider-globals.d.ts +2 -2
  14. package/dist/types/config/service-tier.d.ts +5 -1
  15. package/dist/types/config/settings-schema.d.ts +350 -50
  16. package/dist/types/config/settings.d.ts +7 -0
  17. package/dist/types/dap/client.d.ts +20 -0
  18. package/dist/types/exec/bash-executor.d.ts +38 -0
  19. package/dist/types/exec/direnv.d.ts +33 -0
  20. package/dist/types/export/html/args.d.ts +15 -0
  21. package/dist/types/export/html/index.d.ts +11 -26
  22. package/dist/types/export/html/web-palette.d.ts +55 -116
  23. package/dist/types/extensibility/extensions/loader.d.ts +3 -0
  24. package/dist/types/extensibility/extensions/types.d.ts +17 -2
  25. package/dist/types/extensibility/legacy-pi-coding-agent-shim.d.ts +1 -0
  26. package/dist/types/extensibility/legacy-pi-tui-shim.d.ts +10 -0
  27. package/dist/types/extensibility/plugins/legacy-pi-compat.d.ts +14 -1
  28. package/dist/types/internal-urls/registry-helpers.d.ts +11 -0
  29. package/dist/types/live/controller.d.ts +40 -0
  30. package/dist/types/live/protocol.d.ts +85 -0
  31. package/dist/types/live/protocol.test.d.ts +1 -0
  32. package/dist/types/live/transport.d.ts +48 -0
  33. package/dist/types/live/visualizer.d.ts +33 -0
  34. package/dist/types/lsp/client.d.ts +18 -1
  35. package/dist/types/mcp/config-writer.test.d.ts +1 -0
  36. package/dist/types/mcp/manager.d.ts +6 -2
  37. package/dist/types/mcp/oauth-discovery.d.ts +2 -0
  38. package/dist/types/mcp/render.d.ts +2 -2
  39. package/dist/types/mcp/smithery-auth.d.ts +1 -1
  40. package/dist/types/mcp/smithery-auth.test.d.ts +1 -0
  41. package/dist/types/mcp/tool-bridge.d.ts +7 -3
  42. package/dist/types/mcp/types.d.ts +6 -0
  43. package/dist/types/memory-backend/tool-names.d.ts +2 -0
  44. package/dist/types/modes/components/login-dialog.d.ts +2 -2
  45. package/dist/types/modes/components/oauth-selector.d.ts +8 -0
  46. package/dist/types/modes/components/plan-review-overlay.d.ts +26 -0
  47. package/dist/types/modes/components/settings-defs.d.ts +8 -1
  48. package/dist/types/modes/components/status-line/component.jj-cache.test.d.ts +1 -0
  49. package/dist/types/modes/components/tool-execution.d.ts +9 -1
  50. package/dist/types/modes/controllers/command-controller.d.ts +1 -1
  51. package/dist/types/modes/controllers/event-controller.d.ts +6 -1
  52. package/dist/types/modes/controllers/live-command-controller.d.ts +14 -0
  53. package/dist/types/modes/controllers/mcp-command-controller.d.ts +3 -0
  54. package/dist/types/modes/interactive-mode.d.ts +5 -0
  55. package/dist/types/modes/rpc/rpc-client.d.ts +10 -1
  56. package/dist/types/modes/rpc/rpc-frame.d.ts +16 -0
  57. package/dist/types/modes/rpc/rpc-messages.d.ts +26 -0
  58. package/dist/types/modes/rpc/rpc-types.d.ts +40 -0
  59. package/dist/types/modes/setup-wizard/scenes/sign-in.d.ts +1 -1
  60. package/dist/types/modes/setup-wizard/scenes/types.d.ts +9 -1
  61. package/dist/types/modes/setup-wizard/scenes/web-search.d.ts +1 -1
  62. package/dist/types/modes/theme/theme.d.ts +1 -1
  63. package/dist/types/modes/types.d.ts +3 -1
  64. package/dist/types/modes/utils/context-usage.d.ts +12 -2
  65. package/dist/types/plan-mode/plan-files.d.ts +10 -0
  66. package/dist/types/registry/agent-lifecycle.d.ts +21 -9
  67. package/dist/types/registry/agent-registry.d.ts +11 -4
  68. package/dist/types/sdk.d.ts +15 -1
  69. package/dist/types/secrets/index.d.ts +15 -2
  70. package/dist/types/secrets/obfuscator.d.ts +113 -15
  71. package/dist/types/session/acp-permission-gate.d.ts +19 -0
  72. package/dist/types/session/agent-session-events.d.ts +84 -0
  73. package/dist/types/session/agent-session-types.d.ts +314 -0
  74. package/dist/types/session/agent-session.d.ts +120 -750
  75. package/dist/types/session/async-job-delivery.d.ts +28 -0
  76. package/dist/types/session/bash-runner.d.ts +75 -0
  77. package/dist/types/session/blob-store.d.ts +11 -1
  78. package/dist/types/session/blob-store.test.d.ts +1 -0
  79. package/dist/types/session/checkpoint-entries.d.ts +28 -0
  80. package/dist/types/session/eval-runner.d.ts +49 -0
  81. package/dist/types/session/irc-bridge.d.ts +46 -0
  82. package/dist/types/session/messages.d.ts +22 -0
  83. package/dist/types/session/model-controls.d.ts +180 -0
  84. package/dist/types/session/prewalk.d.ts +46 -0
  85. package/dist/types/session/queued-messages.d.ts +22 -0
  86. package/dist/types/session/redis-session-storage.d.ts +1 -0
  87. package/dist/types/session/retry-fallback-chains.d.ts +74 -0
  88. package/dist/types/session/role-models.d.ts +15 -0
  89. package/dist/types/session/session-advisors.d.ts +228 -0
  90. package/dist/types/session/session-entries.d.ts +8 -0
  91. package/dist/types/session/session-handoff.d.ts +70 -0
  92. package/dist/types/session/session-history-format.d.ts +6 -1
  93. package/dist/types/session/session-loader.d.ts +6 -4
  94. package/dist/types/session/session-maintenance.d.ts +246 -0
  95. package/dist/types/session/session-manager.d.ts +41 -0
  96. package/dist/types/session/session-memory.d.ts +56 -0
  97. package/dist/types/session/session-provider-boundary.d.ts +62 -0
  98. package/dist/types/session/session-stats.d.ts +48 -0
  99. package/dist/types/session/session-tools.d.ts +143 -0
  100. package/dist/types/session/session-workspace.d.ts +32 -0
  101. package/dist/types/session/stream-guards.d.ts +44 -0
  102. package/dist/types/session/todo-tracker.d.ts +56 -0
  103. package/dist/types/session/ttsr-coordinator.d.ts +51 -0
  104. package/dist/types/session/turn-recovery.d.ts +225 -0
  105. package/dist/types/system-prompt.d.ts +2 -0
  106. package/dist/types/task/executor.d.ts +4 -1
  107. package/dist/types/task/output-manager.d.ts +3 -1
  108. package/dist/types/task/types.d.ts +14 -0
  109. package/dist/types/tools/approval.d.ts +1 -0
  110. package/dist/types/tools/browser/launch.d.ts +5 -0
  111. package/dist/types/tools/hub/jobs.d.ts +1 -1
  112. package/dist/types/tools/image-gen.d.ts +4 -4
  113. package/dist/types/tools/image-providers.d.ts +38 -0
  114. package/dist/types/tools/index.d.ts +8 -0
  115. package/dist/types/tools/path-utils.d.ts +8 -0
  116. package/dist/types/tools/report-tool-issue.d.ts +24 -9
  117. package/dist/types/tools/todo.d.ts +10 -4
  118. package/dist/types/tools/xdev.d.ts +5 -1
  119. package/dist/types/tts/streaming-player.d.ts +14 -0
  120. package/dist/types/tts/vocalizer.d.ts +5 -0
  121. package/dist/types/utils/jj.d.ts +29 -0
  122. package/dist/types/utils/lang-from-path.d.ts +1 -0
  123. package/dist/types/utils/title-generator.d.ts +30 -0
  124. package/dist/types/vibe/runtime.d.ts +36 -8
  125. package/dist/types/web/search/index.d.ts +1 -1
  126. package/dist/types/web/search/provider.d.ts +15 -5
  127. package/dist/types/web/search/providers/firecrawl.d.ts +9 -0
  128. package/dist/types/web/search/types.d.ts +95 -1
  129. package/package.json +13 -12
  130. package/scripts/generate-share-viewer.ts +4 -6
  131. package/scripts/legacy-pi-virtual-module.ts +1 -1
  132. package/src/advisor/__tests__/advisor.test.ts +643 -0
  133. package/src/advisor/runtime.ts +144 -43
  134. package/src/async/job-manager.ts +90 -2
  135. package/src/cli/args.ts +2 -0
  136. package/src/cli/auth-gateway-cli.ts +18 -3
  137. package/src/cli/bench-cli.ts +395 -29
  138. package/src/cli/flag-tables.ts +3 -0
  139. package/src/cli/gc-cli.ts +2 -2
  140. package/src/cli/grievances-cli.ts +2 -2
  141. package/src/cli/usage-cli.ts +11 -2
  142. package/src/collab/host.ts +3 -2
  143. package/src/commands/bench.ts +18 -4
  144. package/src/commands/launch.ts +4 -0
  145. package/src/config/__tests__/model-registry.test.ts +147 -0
  146. package/src/config/model-registry.ts +50 -2
  147. package/src/config/model-resolver.ts +0 -1
  148. package/src/config/models-config-schema.ts +15 -4
  149. package/src/config/provider-globals.ts +9 -9
  150. package/src/config/service-tier.ts +26 -1
  151. package/src/config/settings-schema.ts +250 -54
  152. package/src/config/settings.ts +81 -2
  153. package/src/dap/client.ts +37 -4
  154. package/src/edit/index.ts +49 -12
  155. package/src/eval/py/executor.ts +103 -33
  156. package/src/exec/bash-executor.ts +89 -6
  157. package/src/exec/direnv.ts +145 -0
  158. package/src/export/html/args.ts +20 -0
  159. package/src/export/html/index.ts +45 -47
  160. package/src/export/html/template.css +19 -1
  161. package/src/export/html/template.html +6 -0
  162. package/src/export/html/template.js +21 -0
  163. package/src/export/html/tool-views.generated.js +31 -31
  164. package/src/export/html/web-palette.ts +116 -132
  165. package/src/export/share.ts +249 -49
  166. package/src/extensibility/extensions/loader.ts +29 -1
  167. package/src/extensibility/extensions/runner.ts +6 -0
  168. package/src/extensibility/extensions/types.ts +33 -2
  169. package/src/extensibility/legacy-pi-coding-agent-shim.ts +1 -0
  170. package/src/extensibility/legacy-pi-tui-shim.ts +10 -0
  171. package/src/extensibility/plugins/legacy-pi-compat.ts +870 -311
  172. package/src/hindsight/state.ts +64 -6
  173. package/src/internal-urls/local-protocol.ts +2 -1
  174. package/src/internal-urls/memory-protocol.ts +2 -2
  175. package/src/internal-urls/registry-helpers.ts +40 -0
  176. package/src/internal-urls/skill-protocol.ts +2 -2
  177. package/src/internal-urls/ssh-protocol.ts +2 -1
  178. package/src/internal-urls/vault-protocol.ts +2 -1
  179. package/src/live/audio-worklet.txt +59 -0
  180. package/src/live/browser-runtime.txt +221 -0
  181. package/src/live/controller.ts +464 -0
  182. package/src/live/prompts/agent-final-message.md +3 -0
  183. package/src/live/prompts/live-instructions.md +23 -0
  184. package/src/live/protocol.test.ts +140 -0
  185. package/src/live/protocol.ts +233 -0
  186. package/src/live/transport.ts +490 -0
  187. package/src/live/visualizer.ts +234 -0
  188. package/src/lsp/client.ts +52 -9
  189. package/src/lsp/clients/biome-client.ts +3 -4
  190. package/src/lsp/index.ts +44 -11
  191. package/src/main.ts +9 -1
  192. package/src/mcp/config-writer.test.ts +43 -0
  193. package/src/mcp/config-writer.ts +109 -82
  194. package/src/mcp/manager.ts +39 -8
  195. package/src/mcp/oauth-discovery.ts +10 -2
  196. package/src/mcp/render.ts +94 -35
  197. package/src/mcp/smithery-auth.test.ts +29 -0
  198. package/src/mcp/smithery-auth.ts +3 -2
  199. package/src/mcp/tool-bridge.ts +107 -11
  200. package/src/mcp/types.ts +7 -0
  201. package/src/memories/index.ts +40 -20
  202. package/src/memory-backend/tool-names.ts +2 -0
  203. package/src/mnemopi/backend.ts +24 -7
  204. package/src/modes/acp/acp-agent.ts +56 -10
  205. package/src/modes/acp/acp-event-mapper.ts +8 -1
  206. package/src/modes/components/agent-hub.ts +27 -10
  207. package/src/modes/components/login-dialog.ts +14 -4
  208. package/src/modes/components/oauth-selector.ts +24 -7
  209. package/src/modes/components/plan-review-overlay.ts +350 -35
  210. package/src/modes/components/settings-defs.ts +28 -3
  211. package/src/modes/components/settings-selector.ts +178 -6
  212. package/src/modes/components/status-line/component.jj-cache.test.ts +229 -0
  213. package/src/modes/components/status-line/component.ts +123 -2
  214. package/src/modes/components/tool-execution.test.ts +63 -2
  215. package/src/modes/components/tool-execution.ts +11 -2
  216. package/src/modes/controllers/command-controller.ts +70 -22
  217. package/src/modes/controllers/event-controller.ts +111 -16
  218. package/src/modes/controllers/extension-ui-controller.test.ts +1 -0
  219. package/src/modes/controllers/extension-ui-controller.ts +20 -4
  220. package/src/modes/controllers/live-command-controller.ts +178 -0
  221. package/src/modes/controllers/mcp-command-controller.ts +80 -41
  222. package/src/modes/controllers/omfg-controller.ts +44 -40
  223. package/src/modes/controllers/selector-controller.ts +18 -10
  224. package/src/modes/controllers/session-focus-controller.ts +6 -1
  225. package/src/modes/interactive-mode.ts +160 -38
  226. package/src/modes/rpc/rpc-client.ts +94 -3
  227. package/src/modes/rpc/rpc-frame.ts +164 -4
  228. package/src/modes/rpc/rpc-messages.ts +127 -0
  229. package/src/modes/rpc/rpc-mode.ts +79 -7
  230. package/src/modes/rpc/rpc-types.ts +34 -2
  231. package/src/modes/runtime-init.ts +2 -0
  232. package/src/modes/setup-wizard/scenes/model.ts +5 -7
  233. package/src/modes/setup-wizard/scenes/providers.ts +3 -2
  234. package/src/modes/setup-wizard/scenes/sign-in.ts +8 -2
  235. package/src/modes/setup-wizard/scenes/theme.ts +13 -3
  236. package/src/modes/setup-wizard/scenes/types.ts +9 -1
  237. package/src/modes/setup-wizard/scenes/web-search.ts +23 -10
  238. package/src/modes/setup-wizard/wizard-overlay.ts +1 -1
  239. package/src/modes/theme/theme.ts +1 -1
  240. package/src/modes/types.ts +3 -1
  241. package/src/modes/utils/context-usage.ts +23 -7
  242. package/src/modes/utils/ui-helpers.ts +10 -5
  243. package/src/plan-mode/plan-files.ts +40 -0
  244. package/src/prompts/bench/cache-prefix-chunk.md +1 -0
  245. package/src/prompts/bench/cache-prefix.md +3 -0
  246. package/src/prompts/bench/cache-suffix.md +1 -0
  247. package/src/prompts/goals/guided-goal-system.md +24 -3
  248. package/src/prompts/system/custom-system-prompt.md +1 -1
  249. package/src/prompts/system/project-prompt.md +8 -1
  250. package/src/prompts/system/subagent-async-pending.md +6 -0
  251. package/src/prompts/system/system-prompt.md +1 -1
  252. package/src/prompts/system/workflow-notice.md +48 -40
  253. package/src/prompts/system/xdev-mount-notice.md +4 -0
  254. package/src/prompts/tools/task.md +12 -2
  255. package/src/prompts/tools/todo.md +3 -1
  256. package/src/registry/agent-lifecycle.ts +116 -46
  257. package/src/registry/agent-registry.ts +35 -8
  258. package/src/registry/persisted-agents.ts +26 -2
  259. package/src/sdk.ts +255 -139
  260. package/src/secrets/index.ts +127 -4
  261. package/src/secrets/obfuscator.ts +2328 -105
  262. package/src/session/acp-permission-gate.ts +165 -0
  263. package/src/session/agent-session-error-log.test.ts +1 -1
  264. package/src/session/agent-session-events.ts +66 -0
  265. package/src/session/agent-session-types.ts +334 -0
  266. package/src/session/agent-session.ts +1910 -12213
  267. package/src/session/artifacts.ts +6 -5
  268. package/src/session/async-job-delivery.ts +74 -0
  269. package/src/session/bash-runner.ts +326 -0
  270. package/src/session/blob-store.test.ts +56 -0
  271. package/src/session/blob-store.ts +18 -2
  272. package/src/session/checkpoint-entries.ts +81 -0
  273. package/src/session/eval-runner.ts +212 -0
  274. package/src/session/indexed-session-storage.ts +9 -2
  275. package/src/session/irc-bridge.ts +203 -0
  276. package/src/session/messages.ts +263 -1
  277. package/src/session/model-controls.ts +714 -0
  278. package/src/session/prewalk.ts +252 -0
  279. package/src/session/queued-messages.ts +93 -0
  280. package/src/session/redis-session-storage.ts +51 -11
  281. package/src/session/retry-fallback-chains.ts +455 -0
  282. package/src/session/role-models.ts +85 -0
  283. package/src/session/session-advisors.ts +1679 -0
  284. package/src/session/session-context.test.ts +224 -1
  285. package/src/session/session-context.ts +47 -5
  286. package/src/session/session-entries.ts +8 -0
  287. package/src/session/session-handoff.ts +308 -0
  288. package/src/session/session-history-format.ts +20 -9
  289. package/src/session/session-loader.ts +10 -51
  290. package/src/session/session-maintenance.ts +2983 -0
  291. package/src/session/session-manager.ts +390 -30
  292. package/src/session/session-memory.ts +222 -0
  293. package/src/session/session-provider-boundary.ts +307 -0
  294. package/src/session/session-stats.ts +293 -0
  295. package/src/session/session-tools.ts +943 -0
  296. package/src/session/session-workspace.ts +53 -0
  297. package/src/session/stream-guards.ts +417 -0
  298. package/src/session/todo-tracker.ts +380 -0
  299. package/src/session/ttsr-coordinator.ts +496 -0
  300. package/src/session/turn-recovery.ts +1629 -0
  301. package/src/slash-commands/builtin-registry.ts +92 -11
  302. package/src/slash-commands/helpers/usage-report.ts +25 -4
  303. package/src/system-prompt.ts +41 -17
  304. package/src/task/executor.ts +288 -70
  305. package/src/task/index.ts +148 -111
  306. package/src/task/output-manager.ts +25 -3
  307. package/src/task/persisted-revive.ts +4 -3
  308. package/src/task/structured-subagent.ts +4 -1
  309. package/src/task/types.ts +16 -0
  310. package/src/tools/approval.ts +55 -10
  311. package/src/tools/bash-interactive.ts +26 -0
  312. package/src/tools/bash-skill-urls.ts +28 -2
  313. package/src/tools/bash.ts +339 -123
  314. package/src/tools/browser/launch.ts +9 -1
  315. package/src/tools/browser/tab-supervisor.ts +8 -5
  316. package/src/tools/browser.ts +94 -47
  317. package/src/tools/hub/index.ts +1 -1
  318. package/src/tools/hub/jobs.ts +67 -8
  319. package/src/tools/image-gen.ts +20 -28
  320. package/src/tools/image-providers.ts +50 -0
  321. package/src/tools/index.ts +12 -0
  322. package/src/tools/path-utils.ts +49 -2
  323. package/src/tools/read.ts +156 -88
  324. package/src/tools/renderers.ts +7 -1
  325. package/src/tools/report-tool-issue.ts +79 -28
  326. package/src/tools/todo.ts +101 -11
  327. package/src/tools/vibe.ts +1 -2
  328. package/src/tools/write.ts +51 -1
  329. package/src/tools/xdev.ts +67 -3
  330. package/src/tts/streaming-player.ts +62 -4
  331. package/src/tts/vocalizer.ts +18 -1
  332. package/src/utils/jj.ts +125 -4
  333. package/src/utils/lang-from-path.ts +7 -0
  334. package/src/utils/title-generator.ts +137 -1
  335. package/src/vibe/runtime.ts +852 -72
  336. package/src/web/search/index.ts +3 -6
  337. package/src/web/search/provider.ts +31 -16
  338. package/src/web/search/providers/firecrawl.ts +46 -13
  339. package/src/web/search/providers/xai.ts +7 -1
  340. package/src/web/search/types.ts +8 -1
@@ -0,0 +1,33 @@
1
+ import { type Component } from "@oh-my-pi/pi-tui";
2
+ /** Distinct states of a realtime call connection. */
3
+ export type LivePhase = "connecting" | "listening" | "working" | "speaking" | "muted" | "error";
4
+ /** A transcribed turn in the realtime call. */
5
+ export interface LiveTranscript {
6
+ role: "user" | "assistant";
7
+ text: string;
8
+ }
9
+ /** Configuration callbacks for user interactions in the visualizer. */
10
+ export interface LiveVisualizerOptions {
11
+ onStop(): void;
12
+ onToggleMute(): void;
13
+ }
14
+ /** A compact, fixed-height terminal component for displaying a realtime call. */
15
+ export declare class LiveVisualizer implements Component {
16
+ #private;
17
+ readonly wantsKeyRelease = false;
18
+ constructor(options: LiveVisualizerOptions);
19
+ /** Updates the current call phase. */
20
+ setPhase(phase: LivePhase): void;
21
+ /** Updates the current input and output volume levels (0..1). */
22
+ setLevels(input: number, output: number): void;
23
+ /** Updates the latest transcript fragment. */
24
+ setTranscript(transcript: LiveTranscript | undefined): void;
25
+ /** Updates the animation frame for spinners and waveforms. */
26
+ setFrame(frame: number): void;
27
+ /** Processes user keypresses. */
28
+ handleInput(data: string): void;
29
+ /** Clears the render cache. */
30
+ invalidate(): void;
31
+ /** Renders the visualizer into a fixed array of rows at the given width. */
32
+ render(width: number): readonly string[];
33
+ }
@@ -30,6 +30,8 @@ export declare const WARMUP_TIMEOUT_MS = 5000;
30
30
  * timeout/cancel instead of falling back to the internal 30s default.
31
31
  */
32
32
  export declare function getOrCreateClient(config: ServerConfig, cwd: string, initTimeoutMs?: number, signal?: AbortSignal): Promise<LspClient>;
33
+ /** Return an active or already-starting client without starting a language server. */
34
+ export declare function getActiveOrPendingClient(config: ServerConfig, cwd: string, signal?: AbortSignal): Promise<LspClient | undefined>;
33
35
  /**
34
36
  * Ensure a file is opened in the LSP client.
35
37
  * Sends didOpen notification if the file is not already tracked.
@@ -67,10 +69,25 @@ export declare function notifyWorkspaceWatchedFiles(cwd: string, changes: readon
67
69
  * Increments version, sends didChange and didSave notifications.
68
70
  */
69
71
  export declare function refreshFile(client: LspClient, filePath: string, signal?: AbortSignal): Promise<void>;
72
+ /**
73
+ * Tear down a specific client instance using the LSP shutdown/exit handshake.
74
+ *
75
+ * Removes the client from the registry by identity first (never evicting a
76
+ * newer client already republished under the same key), then performs a bounded
77
+ * graceful shutdown, force-killing and awaiting confirmed process exit.
78
+ *
79
+ * @returns `true` once the process is confirmed exited, `false` if it outlived
80
+ * the shutdown budget — callers reporting a restart must treat `false` as a
81
+ * failed teardown, not a completed restart.
82
+ */
83
+ export declare function shutdownClientInstance(client: LspClient): Promise<boolean>;
70
84
  /**
71
85
  * Shutdown a specific client by key.
86
+ *
87
+ * @returns `true` when the client is gone (already absent or confirmed exited),
88
+ * `false` if a live process outlived the shutdown budget.
72
89
  */
73
- export declare function shutdownClient(key: string): Promise<void>;
90
+ export declare function shutdownClient(key: string): Promise<boolean>;
74
91
  /**
75
92
  * Send an LSP request and wait for response.
76
93
  *
@@ -0,0 +1 @@
1
+ export {};
@@ -5,7 +5,7 @@ import { type AuthStorage } from "../session/auth-storage.js";
5
5
  import type { McpConnectionStatusEvent } from "./startup-events.js";
6
6
  import type { MCPToolDetails } from "./tool-bridge.js";
7
7
  import type { MCPToolCache } from "./tool-cache.js";
8
- import type { MCPGetPromptResult, MCPPrompt, MCPRequestOptions, MCPResource, MCPResourceReadResult, MCPResourceTemplate, MCPServerConfig, MCPServerConnection } from "./types.js";
8
+ import type { MCPAuthChallenge, MCPGetPromptResult, MCPPrompt, MCPRequestOptions, MCPResource, MCPResourceReadResult, MCPResourceTemplate, MCPServerConfig, MCPServerConnection } from "./types.js";
9
9
  /**
10
10
  * Stable, total ordering on MCP tools by name.
11
11
  *
@@ -42,6 +42,8 @@ export interface MCPDiscoverOptions {
42
42
  /** Called when MCP server connection state changes. */
43
43
  onStatus?: (event: McpConnectionStatusEvent) => void;
44
44
  }
45
+ /** Handles an MCP `WWW-Authenticate` challenge and returns refreshed config. */
46
+ export type MCPAuthHandler = (serverName: string, challenge: MCPAuthChallenge) => Promise<MCPServerConfig | undefined>;
45
47
  /**
46
48
  * MCP Server Manager.
47
49
  *
@@ -79,6 +81,8 @@ export declare class MCPManager {
79
81
  * Set the auth storage for resolving OAuth credentials.
80
82
  */
81
83
  setAuthStorage(authStorage: AuthStorage): void;
84
+ /** Set the callback used to complete OAuth after a tool-level auth challenge. */
85
+ setAuthHandler(handler: MCPAuthHandler | undefined): void;
82
86
  /**
83
87
  * Discover and connect to all MCP servers from .mcp.json files.
84
88
  * Returns tools and any connection errors.
@@ -149,7 +153,6 @@ export declare class MCPManager {
149
153
  * the same server share one reconnection attempt. Returns the new
150
154
  * connection, or `null` if reconnection failed or the per-server crash
151
155
  * burst limit (see {@link RECONNECT_BURST_LIMIT}) is exceeded.
152
- *
153
156
  * @param options.manual - When `true`, resets the crash-burst window so a
154
157
  * user-driven retry (e.g. `/mcp reconnect`) is never blocked by an
155
158
  * earlier storm. Defaults to `false`; the transport `onClose` callback
@@ -157,6 +160,7 @@ export declare class MCPManager {
157
160
  */
158
161
  reconnectServer(name: string, options?: {
159
162
  manual?: boolean;
163
+ authChallenge?: MCPAuthChallenge;
160
164
  }): Promise<MCPServerConnection | null>;
161
165
  /**
162
166
  * Refresh tools from a specific server.
@@ -55,6 +55,7 @@ export declare function analyzeAuthError(error: Error, serverUrl?: string): Auth
55
55
  */
56
56
  export declare function fetchResourceMetadataScopes(resourceMetadataUrl: string, opts?: {
57
57
  fetch?: FetchImpl;
58
+ signal?: AbortSignal;
58
59
  }): Promise<string | undefined>;
59
60
  /**
60
61
  * Try to discover OAuth endpoints by querying the server's well-known endpoints.
@@ -64,4 +65,5 @@ export declare function discoverOAuthEndpoints(serverUrl: string, authServerUrl?
64
65
  fetch?: FetchImpl;
65
66
  protectedResource?: string;
66
67
  protectedScopes?: string;
68
+ signal?: AbortSignal;
67
69
  }): Promise<OAuthEndpoints | null>;
@@ -4,9 +4,9 @@
4
4
  * Provides structured display of MCP tool calls and results,
5
5
  * showing args and output in JSON tree format similar to task tool.
6
6
  */
7
- import type { Component } from "@oh-my-pi/pi-tui";
7
+ import { type Component } from "@oh-my-pi/pi-tui";
8
8
  import type { RenderResultOptions } from "../extensibility/custom-tools/types.js";
9
- import type { Theme } from "../modes/theme/theme.js";
9
+ import { type Theme } from "../modes/theme/theme.js";
10
10
  import type { MCPToolDetails } from "./tool-bridge.js";
11
11
  /**
12
12
  * Render MCP tool call.
@@ -2,7 +2,7 @@ type SmitheryCliAuthSession = {
2
2
  sessionId: string;
3
3
  authUrl: string;
4
4
  };
5
- type SmitheryCliPollResponse = {
5
+ export type SmitheryCliPollResponse = {
6
6
  status: "pending" | "success" | "error";
7
7
  apiKey?: string;
8
8
  message?: string;
@@ -0,0 +1 @@
1
+ export {};
@@ -9,9 +9,11 @@ import type { SourceMeta } from "../capability/types.js";
9
9
  import type { CustomTool, CustomToolContext, CustomToolResult, RenderResultOptions } from "../extensibility/custom-tools/types.js";
10
10
  import type { Theme } from "../modes/theme/theme.js";
11
11
  import type { OutputMeta } from "../tools/output-meta.js";
12
- import type { MCPContent, MCPServerConnection, MCPToolDefinition } from "./types.js";
13
- /** Reconnect callback: tears down stale connection, returns new one or null. */
14
- export type MCPReconnect = () => Promise<MCPServerConnection | null>;
12
+ import type { MCPAuthChallenge, MCPContent, MCPServerConnection, MCPToolDefinition } from "./types.js";
13
+ /** Reconnect callback: tears down a stale connection, optionally authorizing first. */
14
+ export type MCPReconnect = (options?: {
15
+ authChallenge?: MCPAuthChallenge;
16
+ }) => Promise<MCPServerConnection | null>;
15
17
  export declare function isRetriableConnectionError(error: unknown): boolean;
16
18
  /** Details included in MCP tool results for rendering */
17
19
  export interface MCPToolDetails {
@@ -23,6 +25,8 @@ export interface MCPToolDetails {
23
25
  isError?: boolean;
24
26
  /** Raw content from MCP response */
25
27
  rawContent?: MCPContent[];
28
+ /** Structured metadata from the MCP response */
29
+ mcpMeta?: Record<string, unknown>;
26
30
  /** Provider ID (e.g., "claude", "mcp-json") */
27
31
  provider?: string;
28
32
  /** Provider display name (e.g., "Claude Code", "MCP Config") */
@@ -175,10 +175,16 @@ export interface MCPResourceContent {
175
175
  };
176
176
  }
177
177
  export type MCPContent = MCPTextContent | MCPImageContent | MCPResourceContent;
178
+ /** Structured authentication challenge returned in a tool result. */
179
+ export interface MCPAuthChallenge {
180
+ /** Values from `_meta["mcp/www_authenticate"]`. */
181
+ readonly wwwAuthenticate: readonly string[];
182
+ }
178
183
  /** tools/call response */
179
184
  export interface MCPToolCallResult {
180
185
  content: MCPContent[];
181
186
  isError?: boolean;
187
+ _meta?: Record<string, unknown>;
182
188
  }
183
189
  export interface MCPRequestOptions {
184
190
  /** Abort signal (e.g. Escape-to-interrupt) */
@@ -0,0 +1,2 @@
1
+ /** Built-in tools whose availability depends on the selected memory backend. */
2
+ export declare const MEMORY_BACKEND_TOOL_NAMES: readonly ["retain", "recall", "reflect", "memory_edit", "learn"];
@@ -15,8 +15,8 @@ export declare class LoginDialogComponent extends Container {
15
15
  * is offered as an additional local shortcut so narrow local terminals still
16
16
  * have a truncation-safe copy target (viewport clipping on a long authorize
17
17
  * URL silently drops trailing OAuth query parameters — e.g.
18
- * `code_challenge_method=S256`). The OSC 8 hyperlink carries the full URL
19
- * for terminals that support click-through.
18
+ * `code_challenge_method=S256`). Every physical URL row carries its own OSC 8
19
+ * link to the full URL, so clicking any wrapped fragment opens the same target.
20
20
  */
21
21
  showAuth(url: string, instructions?: string, launchUrl?: string): void;
22
22
  /**
@@ -10,6 +10,14 @@ export declare class OAuthSelectorComponent extends Container {
10
10
  requestRender?: () => void;
11
11
  });
12
12
  stopValidation(): void;
13
+ /**
14
+ * Fit the selector into `lines` rendered rows by shrinking the visible list
15
+ * window (the window is centered on the selection, so the selected row is
16
+ * always visible at any height). Prefers keeping the full chrome — borders,
17
+ * spacers, title, search status — but sacrifices the trailing spacer/border
18
+ * (clipped by the host) before dropping below three visible rows.
19
+ */
20
+ setMaxHeight(lines: number): void;
13
21
  handleInput(keyData: string): void;
14
22
  /** Move the selection one step for a wheel notch (clamped, no wrap). */
15
23
  handleWheel(delta: -1 | 1): void;
@@ -18,6 +18,28 @@
18
18
  */
19
19
  import { type Component } from "@oh-my-pi/pi-tui";
20
20
  import type { HookSelectorSlider } from "./hook-selector.js";
21
+ /** Serializable annotations retained by the plan-review owner between overlays. */
22
+ export interface PlanReviewAnnotationState {
23
+ annotations: Array<{
24
+ section: {
25
+ index: number;
26
+ title: string;
27
+ /** Heading ancestry from the document root, when emitted by this overlay. */
28
+ path?: string[];
29
+ /** Hash of the section source, used to reject ambiguous moved headings. */
30
+ contentHash?: string;
31
+ };
32
+ target: {
33
+ kind: "section";
34
+ } | {
35
+ kind: "line";
36
+ row: number;
37
+ context: string;
38
+ contextTruncated?: boolean;
39
+ };
40
+ note: string;
41
+ }>;
42
+ }
21
43
  export interface PlanReviewOverlayCallbacks {
22
44
  /** Invoked with the chosen option label (never a disabled one). */
23
45
  onPick: (label: string) => void;
@@ -33,6 +55,8 @@ export interface PlanReviewOverlayCallbacks {
33
55
  onPlanEdited?: (content: string) => void;
34
56
  /** Invoked with the Refine feedback markdown whenever annotations change. */
35
57
  onFeedbackChange?: (feedback: string) => void;
58
+ /** Invoked with a serializable annotation snapshot whenever annotations change. */
59
+ onAnnotationStateChange?: (state: PlanReviewAnnotationState) => void;
36
60
  }
37
61
  export interface PlanReviewOverlayOptions {
38
62
  /** Prompt rendered above the options (e.g. "Plan mode - next step"). */
@@ -48,6 +72,8 @@ export interface PlanReviewOverlayOptions {
48
72
  slider?: HookSelectorSlider;
49
73
  /** Display label for the external-editor key, surfaced in the footer help. */
50
74
  externalEditorLabel?: string;
75
+ /** Serializable annotations restored into this overlay instance. */
76
+ annotationState?: PlanReviewAnnotationState;
51
77
  }
52
78
  export declare class PlanReviewOverlay implements Component {
53
79
  #private;
@@ -40,11 +40,18 @@ export interface SubmenuSettingDef extends BaseSettingDef {
40
40
  }
41
41
  export interface TextInputSettingDef extends BaseSettingDef {
42
42
  type: "text";
43
+ secret: boolean;
43
44
  }
44
45
  export interface ProviderLimitsSettingDef extends BaseSettingDef {
45
46
  type: "providerLimits";
46
47
  }
47
- export type SettingDef = BooleanSettingDef | EnumSettingDef | SubmenuSettingDef | TextInputSettingDef | ProviderLimitsSettingDef;
48
+ /** Array-of-enum setting edited as a toggle list; `ordered` lists render positions and support reordering. */
49
+ export interface MultiSelectSettingDef extends BaseSettingDef {
50
+ type: "multiselect";
51
+ options: OptionList;
52
+ ordered: boolean;
53
+ }
54
+ export type SettingDef = BooleanSettingDef | EnumSettingDef | SubmenuSettingDef | TextInputSettingDef | ProviderLimitsSettingDef | MultiSelectSettingDef;
48
55
  /** Get all setting definitions with UI */
49
56
  export declare function getAllSettingDefs(): SettingDef[];
50
57
  /**
@@ -92,7 +92,15 @@ export declare class ToolExecutionComponent extends Container implements NativeS
92
92
  * immutable native scrollback before the result replaces them.
93
93
  */
94
94
  getNativeScrollbackLiveRegionStart(): number | undefined;
95
- /** Keeps the in-flight `vibe_wait` TV wall out of immutable native scrollback. */
95
+ /**
96
+ * Keeps in-flight TV-wall frames out of immutable native scrollback: the
97
+ * `vibe_wait` wall and displaceable snapshots (`hub` waiting polls, `todo`
98
+ * lists). Their frames replace each other rather than append, and their
99
+ * rows mutate every spinner tick — an unpinned commit records a per-tick
100
+ * frozen snapshot AND force-seals the block (see TranscriptContainer's
101
+ * committed-snapshot seal), so the next poll stacks a new frame instead of
102
+ * displacing this one.
103
+ */
96
104
  isNativeScrollbackLiveRegionPinned(): boolean;
97
105
  /**
98
106
  * Whether this block has reached a terminal state for transcript freezing.
@@ -60,4 +60,4 @@ export declare function renderProviderSection(details: ProviderDetails, uiTheme:
60
60
  * Example output: `Quota: 7d window · 67% used · resets in 3.2d`
61
61
  */
62
62
  export declare function formatCompactQuota(provider: string, reports: UsageReport[], nowMs: number, activeAccount?: OAuthAccountIdentity): string | null;
63
- export declare function renderUsageReports(reports: UsageReport[], uiTheme: typeof theme, nowMs: number, availableWidth: number, resolveActiveAccount?: (provider: string) => OAuthAccountIdentity | undefined): string;
63
+ export declare function renderUsageReports(reports: UsageReport[], uiTheme: typeof theme, nowMs: number, availableWidth: number, resolveActiveAccount?: (provider: string) => OAuthAccountIdentity | undefined, usageModelSelectors?: readonly string[]): string;
@@ -24,5 +24,10 @@ export declare class EventController {
24
24
  * Drops the candidate when it is no longer a displaceable todo.
25
25
  */
26
26
  inheritDisplaceableTodo(component: ToolExecutionComponent | null | undefined): void;
27
- sendCompletionNotification(): void;
27
+ sendErrorNotification(event: Extract<AgentSessionEvent, {
28
+ type: "agent_end";
29
+ }>): void;
30
+ sendCompletionNotification(event: Extract<AgentSessionEvent, {
31
+ type: "agent_end";
32
+ }>): void;
28
33
  }
@@ -0,0 +1,14 @@
1
+ import type { InteractiveModeContext } from "../types.js";
2
+ /** Owns the editor-replacing visualizer and realtime session lifecycle for `/live`. */
3
+ export declare class LiveCommandController {
4
+ #private;
5
+ constructor(ctx: InteractiveModeContext);
6
+ /** Whether a live session is connected, connecting, or closing. */
7
+ get active(): boolean;
8
+ /** Start live mode, or stop the currently active session. */
9
+ handleCommand(): Promise<void>;
10
+ /** Stop the active live session and restore the editor. */
11
+ stop(): Promise<void>;
12
+ /** Release UI resources during synchronous InteractiveMode teardown. */
13
+ dispose(): void;
14
+ }
@@ -1,4 +1,5 @@
1
1
  import { type Component } from "@oh-my-pi/pi-tui";
2
+ import type { MCPAuthChallenge, MCPServerConfig } from "../../mcp/types.js";
2
3
  import type { InteractiveModeContext } from "../types.js";
3
4
  /**
4
5
  * Renders the MCP OAuth fallback URL. Always shows the full authorization URL
@@ -41,4 +42,6 @@ export declare class MCPCommandController {
41
42
  * Handle /mcp command and route to subcommands
42
43
  */
43
44
  handle(text: string): Promise<void>;
45
+ /** Reauthorize a server after a tool-level OAuth challenge. */
46
+ handleMCPAuthChallenge(name: string, challenge: MCPAuthChallenge): Promise<MCPServerConfig | undefined>;
44
47
  }
@@ -27,6 +27,7 @@ import type { EvalExecutionComponent } from "./components/eval-execution.js";
27
27
  import type { HookEditorComponent } from "./components/hook-editor.js";
28
28
  import type { HookInputComponent } from "./components/hook-input.js";
29
29
  import type { HookSelectorComponent, HookSelectorSlider } from "./components/hook-selector.js";
30
+ import { type PlanReviewAnnotationState } from "./components/plan-review-overlay.js";
30
31
  import { StatusLineComponent } from "./components/status-line/index.js";
31
32
  import type { ToolExecutionHandle } from "./components/tool-execution.js";
32
33
  import { TranscriptContainer } from "./components/transcript-container.js";
@@ -247,6 +248,8 @@ export declare class InteractiveMode implements InteractiveModeContext {
247
248
  onExternalEditor?: () => void;
248
249
  onPlanEdited?: (content: string) => void;
249
250
  onFeedbackChange?: (feedback: string) => void;
251
+ annotationState?: PlanReviewAnnotationState;
252
+ onAnnotationStateChange?: (state: PlanReviewAnnotationState) => void;
250
253
  initialIndex?: number;
251
254
  }, extra?: {
252
255
  slider?: HookSelectorSlider;
@@ -340,6 +343,8 @@ export declare class InteractiveMode implements InteractiveModeContext {
340
343
  handleRenameCommand(title: string): Promise<void>;
341
344
  handleMemoryCommand(text: string): Promise<void>;
342
345
  handleSTTToggle(): Promise<void>;
346
+ /** Start or stop the Codex-backed realtime voice surface. */
347
+ handleLiveCommand(): Promise<void>;
343
348
  showDebugSelector(): Promise<void>;
344
349
  showAgentHub(options?: {
345
350
  requireContent?: boolean;
@@ -8,6 +8,7 @@ import type { CompactionResult } from "@oh-my-pi/pi-agent-core/compaction";
8
8
  import type { ImageContent, Model } from "@oh-my-pi/pi-ai";
9
9
  import type { BashResult } from "../../exec/bash-executor.js";
10
10
  import type { AgentSessionEvent, SessionStats } from "../../session/agent-session.js";
11
+ import { type RpcMessagesPage, type RpcMessagesPageOptions } from "./rpc-messages.js";
11
12
  import type { RpcAvailableSlashCommand, RpcHandoffResult, RpcHostToolDefinition, RpcSessionState, RpcSubagentEventFrame, RpcSubagentLifecycleFrame, RpcSubagentMessagesResult, RpcSubagentProgressFrame, RpcSubagentSnapshot, RpcSubagentSubscriptionLevel } from "./rpc-types.js";
12
13
  export interface RpcClientOptions {
13
14
  /** Path to the CLI entry point (default: searches for dist/cli.js) */
@@ -45,6 +46,12 @@ export interface RpcClientCustomTool<TParams extends Record<string, unknown> = R
45
46
  execute(params: TParams, context: RpcClientToolContext<TDetails>): Promise<RpcClientToolResult<TDetails>> | RpcClientToolResult<TDetails>;
46
47
  }
47
48
  export declare function defineRpcClientTool<TParams extends Record<string, unknown> = Record<string, unknown>, TDetails = unknown>(tool: RpcClientCustomTool<TParams, TDetails>): RpcClientCustomTool<TParams, TDetails>;
49
+ /** Failed RPC command; `code` mirrors the server's machine-readable error code when present. */
50
+ export declare class RpcCommandError extends Error {
51
+ readonly command: string;
52
+ readonly code?: string | undefined;
53
+ constructor(message: string, command: string, code?: string | undefined);
54
+ }
48
55
  export declare class RpcClient {
49
56
  #private;
50
57
  private options;
@@ -254,8 +261,10 @@ export declare class RpcClient {
254
261
  */
255
262
  getLastAssistantText(): Promise<string | null>;
256
263
  /**
257
- * Get all messages in the session.
264
+ * Get one stable, byte-bounded message page.
258
265
  */
266
+ getMessagesPage(options?: RpcMessagesPageOptions): Promise<RpcMessagesPage>;
267
+ /** Get all messages, draining stable pages when protocol v2 is available. */
259
268
  getMessages(): Promise<AgentMessage[]>;
260
269
  /**
261
270
  * Get list of OAuth providers available for login, with their current authentication status.
@@ -1,9 +1,25 @@
1
1
  /** Maximum UTF-8 size of one newline-delimited RPC frame, including the newline. */
2
2
  export declare const MAX_RPC_FRAME_BYTES: number;
3
+ /** Maximum UTF-8 size of one logical frame reassembled by protocol v2. */
4
+ export declare const MAX_RPC_REASSEMBLED_BYTES: number;
5
+ export type RpcProtocolVersion = 1 | 2;
6
+ /** Reassemble protocol v2 chunk frames after each JSONL line has been parsed. */
7
+ export declare class RpcFrameDecoder {
8
+ #private;
9
+ push(value: unknown): object | undefined;
10
+ }
3
11
  /** Serialize a complete JSONL frame while enforcing the transport byte ceiling. */
4
12
  export declare function encodeRpcFrame(frame: object, streamedMessageCount?: number, streamedMessages?: readonly unknown[]): string;
5
13
  /** Stateful encoder that tracks which messages a client has already received. */
6
14
  export declare class RpcFrameEncoder {
7
15
  #private;
16
+ setProtocolVersion(version: number): void;
17
+ /**
18
+ * Encode one logical frame into physical JSONL lines. Encoder bookkeeping runs
19
+ * eagerly; only chunk emission is lazy, so a chunked result can be streamed to
20
+ * stdout with backpressure without holding the whole transport in memory. The
21
+ * returned iterable MUST be fully consumed exactly once.
22
+ */
23
+ encodeFrames(frame: object): Iterable<string>;
8
24
  encode(frame: object): string;
9
25
  }
@@ -0,0 +1,26 @@
1
+ import type { AgentMessage } from "@oh-my-pi/pi-agent-core";
2
+ export declare const RPC_MESSAGES_PAGE_BUSY_ERROR = "Cannot page messages while the session is changing";
3
+ export declare const RPC_MESSAGES_PAGE_STALE_ERROR = "RPC message cursor is stale";
4
+ /** Machine-readable reasons a `get_messages_page` request can fail; carried as `code` on the error response. */
5
+ export type RpcMessagesPageErrorCode = "session_busy" | "stale_cursor";
6
+ /** Paging failure that maps to a structured wire `code`, so clients can react without matching message text. */
7
+ export declare class RpcMessagesPageError extends Error {
8
+ readonly code: RpcMessagesPageErrorCode;
9
+ constructor(message: string, code: RpcMessagesPageErrorCode);
10
+ }
11
+ export interface RpcMessageSnapshot {
12
+ sessionId: string;
13
+ leafId: string | null;
14
+ messageCount: number;
15
+ }
16
+ export interface RpcMessagesPage {
17
+ messages: AgentMessage[];
18
+ nextCursor?: string;
19
+ totalMessages: number;
20
+ }
21
+ export interface RpcMessagesPageOptions {
22
+ cursor?: string;
23
+ limit?: number;
24
+ }
25
+ /** Page one stable in-memory message snapshot without crossing the v1 frame budget. */
26
+ export declare function pageRpcMessages(messages: readonly AgentMessage[], snapshot: RpcMessageSnapshot, options?: RpcMessagesPageOptions): RpcMessagesPage;
@@ -14,7 +14,12 @@ import type { FileEntry } from "../../session/session-entries.js";
14
14
  import type { AvailableSlashCommandSource } from "../../slash-commands/available-commands.js";
15
15
  import type { AgentProgress, SubagentEventPayload, SubagentLifecyclePayload, SubagentProgressPayload } from "../../task/index.js";
16
16
  import type { TodoPhase } from "../../tools/todo.js";
17
+ import type { RpcMessagesPage } from "./rpc-messages.js";
17
18
  export type RpcCommand = {
19
+ id?: string;
20
+ type: "negotiate_protocol";
21
+ protocolVersion: number;
22
+ } | {
18
23
  id?: string;
19
24
  type: "prompt";
20
25
  message: string;
@@ -157,6 +162,11 @@ export type RpcCommand = {
157
162
  } | {
158
163
  id?: string;
159
164
  type: "get_messages";
165
+ } | {
166
+ id?: string;
167
+ type: "get_messages_page";
168
+ cursor?: string;
169
+ limit?: number;
160
170
  } | {
161
171
  id?: string;
162
172
  type: "get_login_providers";
@@ -214,6 +224,21 @@ export interface RpcPromptResultFrame {
214
224
  id?: string;
215
225
  agentInvoked: boolean;
216
226
  }
227
+ export interface RpcReadyFrame {
228
+ type: "ready";
229
+ protocolVersion: 1;
230
+ supportedProtocolVersions: [1, 2];
231
+ maxFrameBytes: number;
232
+ maxReassembledFrameBytes: number;
233
+ }
234
+ export interface RpcChunkFrame {
235
+ type: "rpc_chunk";
236
+ chunkId: string;
237
+ index: number;
238
+ count: number;
239
+ byteLength: number;
240
+ data: string;
241
+ }
217
242
  export interface RpcHandoffResult {
218
243
  savedPath?: string;
219
244
  }
@@ -241,6 +266,14 @@ export interface RpcSubagentMessagesResult {
241
266
  messages: AgentMessage[];
242
267
  }
243
268
  export type RpcResponse = {
269
+ id?: string;
270
+ type: "response";
271
+ command: "negotiate_protocol";
272
+ success: true;
273
+ data: {
274
+ protocolVersion: 2;
275
+ };
276
+ } | {
244
277
  id?: string;
245
278
  type: "response";
246
279
  command: "prompt";
@@ -489,6 +522,12 @@ export type RpcResponse = {
489
522
  data: {
490
523
  messages: AgentMessage[];
491
524
  };
525
+ } | {
526
+ id?: string;
527
+ type: "response";
528
+ command: "get_messages_page";
529
+ success: true;
530
+ data: RpcMessagesPage;
492
531
  } | {
493
532
  id?: string;
494
533
  type: "response";
@@ -516,6 +555,7 @@ export type RpcResponse = {
516
555
  command: string;
517
556
  success: false;
518
557
  error: string;
558
+ code?: string;
519
559
  };
520
560
  export interface RpcSubagentLifecycleFrame {
521
561
  type: "subagent_lifecycle";
@@ -18,5 +18,5 @@ export declare class SignInTab implements SetupTab {
18
18
  handleInput(data: string): void;
19
19
  /** Forward mouse to the provider selector; pointer is inert during an active login or code prompt. */
20
20
  routeMouse(event: SgrMouseEvent, line: number, col: number): void;
21
- render(width: number): readonly string[];
21
+ render(width: number, maxLines?: number): readonly string[];
22
22
  }
@@ -14,6 +14,13 @@ export interface SetupSceneController extends Component {
14
14
  onMount?(): void | Promise<void>;
15
15
  onUnmount?(): void;
16
16
  dispose?(): void;
17
+ /**
18
+ * Render the scene body. `maxLines` is the number of body rows the wizard
19
+ * will actually display (header and footer already subtracted); scenes
20
+ * shrink list windows and drop decorative chrome so the selected row stays
21
+ * inside the budget. Overflow beyond `maxLines` is clipped by the wizard.
22
+ */
23
+ render(width: number, maxLines?: number): readonly string[];
17
24
  /**
18
25
  * Route an SGR mouse report (tracking is on while the wizard holds the
19
26
  * alternate screen). `line`/`col` are 0-based within this controller's
@@ -34,7 +41,8 @@ export interface SetupTab {
34
41
  * login). The parent scene MUST NOT switch tabs or finish while modal.
35
42
  */
36
43
  readonly modal: boolean;
37
- render(width: number): readonly string[];
44
+ /** See {@link SetupSceneController.render}: `maxLines` is the tab-local row budget. */
45
+ render(width: number, maxLines?: number): readonly string[];
38
46
  handleInput(data: string): void;
39
47
  invalidate(): void;
40
48
  /** Called when the tab becomes active (including initial mount). */
@@ -19,5 +19,5 @@ export declare class WebSearchTab implements SetupTab {
19
19
  routeMouse(event: SgrMouseEvent, line: number, _col: number): void;
20
20
  invalidate(): void;
21
21
  dispose(): void;
22
- render(width: number): readonly string[];
22
+ render(width: number, maxLines?: number): readonly string[];
23
23
  }
@@ -1,7 +1,7 @@
1
1
  import type { ThinkingLevel } from "@oh-my-pi/pi-agent-core";
2
2
  import type { Effort } from "@oh-my-pi/pi-ai";
3
3
  import type { EditorTheme, MarkdownTheme, SelectListTheme, SettingsListTheme, SymbolTheme } from "@oh-my-pi/pi-tui";
4
- export { getLanguageFromPath } from "../../utils/lang-from-path.js";
4
+ export { getLanguageFromPath, isMarkdownPath } from "../../utils/lang-from-path.js";
5
5
  export type SymbolPreset = "unicode" | "nerd" | "ascii";
6
6
  /**
7
7
  * All available symbol keys organized by category.
@@ -61,7 +61,7 @@ export type SubmittedUserInput = {
61
61
  cancelled: boolean;
62
62
  started: boolean;
63
63
  };
64
- export type TodoStatus = "pending" | "in_progress" | "completed" | "abandoned";
64
+ export type TodoStatus = "pending" | "in_progress" | "completed" | "abandoned" | "blocked";
65
65
  export type TodoItem = {
66
66
  content: string;
67
67
  status: TodoStatus;
@@ -334,6 +334,8 @@ export interface InteractiveModeContext {
334
334
  handleRenameCommand(title: string): Promise<void>;
335
335
  handleMemoryCommand(text: string): Promise<void>;
336
336
  handleSTTToggle(): Promise<void>;
337
+ /** Start or stop the Codex-backed realtime voice session. */
338
+ handleLiveCommand(): Promise<void>;
337
339
  executeCompaction(customInstructionsOrOptions?: string | CompactOptions, isAuto?: boolean): Promise<CompactionOutcome>;
338
340
  openInBrowser(urlOrPath: string): void;
339
341
  refreshSlashCommandState(cwd?: string): Promise<void>;