@oh-my-pi/pi-coding-agent 8.1.0 → 8.2.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 (402) hide show
  1. package/CHANGELOG.md +21 -1
  2. package/docs/session.md +111 -46
  3. package/examples/custom-tools/hello/index.ts +1 -1
  4. package/examples/custom-tools/todo/index.ts +3 -4
  5. package/examples/extensions/api-demo.ts +0 -1
  6. package/examples/extensions/chalk-logger.ts +2 -3
  7. package/examples/extensions/hello.ts +0 -1
  8. package/examples/extensions/pirate.ts +0 -1
  9. package/examples/extensions/plan-mode.ts +15 -16
  10. package/examples/extensions/todo.ts +3 -4
  11. package/examples/extensions/tools.ts +1 -2
  12. package/examples/extensions/with-deps/index.ts +0 -1
  13. package/examples/hooks/auto-commit-on-exit.ts +1 -2
  14. package/examples/hooks/confirm-destructive.ts +0 -1
  15. package/examples/hooks/custom-compaction.ts +1 -2
  16. package/examples/hooks/dirty-repo-guard.ts +0 -1
  17. package/examples/hooks/file-trigger.ts +3 -4
  18. package/examples/hooks/git-checkpoint.ts +0 -1
  19. package/examples/hooks/handoff.ts +3 -4
  20. package/examples/hooks/permission-gate.ts +1 -2
  21. package/examples/hooks/protected-paths.ts +1 -2
  22. package/examples/hooks/qna.ts +2 -3
  23. package/examples/hooks/snake.ts +4 -5
  24. package/examples/hooks/status-line.ts +0 -1
  25. package/examples/sdk/01-minimal.ts +2 -3
  26. package/examples/sdk/02-custom-model.ts +2 -3
  27. package/examples/sdk/03-custom-prompt.ts +3 -4
  28. package/examples/sdk/04-skills.ts +2 -3
  29. package/examples/sdk/06-extensions.ts +1 -2
  30. package/examples/sdk/06-hooks.ts +6 -7
  31. package/examples/sdk/07-context-files.ts +0 -1
  32. package/examples/sdk/08-prompt-templates.ts +0 -1
  33. package/examples/sdk/08-slash-commands.ts +0 -1
  34. package/examples/sdk/09-api-keys-and-oauth.ts +0 -1
  35. package/examples/sdk/10-settings.ts +0 -1
  36. package/examples/sdk/11-sessions.ts +0 -1
  37. package/package.json +51 -23
  38. package/scripts/format-prompts.ts +0 -1
  39. package/src/capability/context-file.ts +2 -3
  40. package/src/capability/extension-module.ts +2 -3
  41. package/src/capability/extension.ts +2 -3
  42. package/src/capability/fs.ts +20 -21
  43. package/src/capability/hook.ts +2 -3
  44. package/src/capability/index.ts +15 -16
  45. package/src/capability/instruction.ts +2 -3
  46. package/src/capability/mcp.ts +2 -3
  47. package/src/capability/prompt.ts +2 -3
  48. package/src/capability/rule.ts +2 -3
  49. package/src/capability/settings.ts +1 -2
  50. package/src/capability/skill.ts +2 -3
  51. package/src/capability/slash-command.ts +2 -3
  52. package/src/capability/ssh.ts +2 -3
  53. package/src/capability/system-prompt.ts +2 -3
  54. package/src/capability/tool.ts +2 -3
  55. package/src/cli/args.ts +5 -6
  56. package/src/cli/config-cli.ts +6 -7
  57. package/src/cli/file-processor.ts +19 -17
  58. package/src/cli/jupyter-cli.ts +105 -0
  59. package/src/cli/list-models.ts +10 -11
  60. package/src/cli/plugin-cli.ts +20 -21
  61. package/src/cli/session-picker.ts +2 -3
  62. package/src/cli/setup-cli.ts +2 -3
  63. package/src/cli/stats-cli.ts +2 -3
  64. package/src/cli/update-cli.ts +25 -22
  65. package/src/commit/agentic/agent.ts +21 -23
  66. package/src/commit/agentic/fallback.ts +9 -9
  67. package/src/commit/agentic/index.ts +30 -38
  68. package/src/commit/agentic/state.ts +1 -6
  69. package/src/commit/agentic/tools/analyze-file.ts +15 -15
  70. package/src/commit/agentic/tools/git-file-diff.ts +3 -3
  71. package/src/commit/agentic/tools/git-hunk.ts +7 -7
  72. package/src/commit/agentic/tools/git-overview.ts +5 -5
  73. package/src/commit/agentic/tools/index.ts +14 -14
  74. package/src/commit/agentic/tools/propose-changelog.ts +6 -6
  75. package/src/commit/agentic/tools/propose-commit.ts +8 -8
  76. package/src/commit/agentic/tools/recent-commits.ts +2 -2
  77. package/src/commit/agentic/tools/split-commit.ts +19 -23
  78. package/src/commit/agentic/topo-sort.ts +1 -1
  79. package/src/commit/agentic/trivial.ts +3 -3
  80. package/src/commit/agentic/validation.ts +12 -12
  81. package/src/commit/analysis/conventional.ts +7 -11
  82. package/src/commit/analysis/index.ts +4 -4
  83. package/src/commit/analysis/scope.ts +4 -4
  84. package/src/commit/analysis/summary.ts +7 -9
  85. package/src/commit/analysis/validation.ts +1 -1
  86. package/src/commit/changelog/detect.ts +6 -6
  87. package/src/commit/changelog/generate.ts +7 -9
  88. package/src/commit/changelog/index.ts +13 -13
  89. package/src/commit/changelog/parse.ts +2 -2
  90. package/src/commit/cli.ts +1 -1
  91. package/src/commit/git/diff.ts +3 -3
  92. package/src/commit/git/index.ts +19 -24
  93. package/src/commit/index.ts +1 -1
  94. package/src/commit/map-reduce/index.ts +9 -9
  95. package/src/commit/map-reduce/map-phase.ts +19 -34
  96. package/src/commit/map-reduce/reduce-phase.ts +9 -11
  97. package/src/commit/message.ts +2 -2
  98. package/src/commit/model-selection.ts +3 -7
  99. package/src/commit/pipeline.ts +20 -22
  100. package/src/commit/utils/exclusions.ts +3 -3
  101. package/src/config/file-lock.ts +17 -7
  102. package/src/config/keybindings.ts +6 -8
  103. package/src/config/model-registry.ts +55 -37
  104. package/src/config/model-resolver.ts +18 -19
  105. package/src/config/prompt-templates.ts +11 -11
  106. package/src/config/settings-manager.ts +50 -34
  107. package/src/config.ts +60 -62
  108. package/src/cursor.ts +11 -9
  109. package/src/discovery/agents-md.ts +11 -12
  110. package/src/discovery/builtin.ts +68 -73
  111. package/src/discovery/claude.ts +41 -42
  112. package/src/discovery/cline.ts +11 -12
  113. package/src/discovery/codex.ts +52 -53
  114. package/src/discovery/cursor.ts +9 -10
  115. package/src/discovery/gemini.ts +17 -22
  116. package/src/discovery/github.ts +13 -14
  117. package/src/discovery/helpers.ts +35 -34
  118. package/src/discovery/index.ts +16 -18
  119. package/src/discovery/mcp-json.ts +8 -9
  120. package/src/discovery/ssh.ts +8 -9
  121. package/src/discovery/vscode.ts +4 -5
  122. package/src/discovery/windsurf.ts +6 -7
  123. package/src/exa/company.ts +1 -2
  124. package/src/exa/index.ts +2 -3
  125. package/src/exa/linkedin.ts +1 -2
  126. package/src/exa/mcp-client.ts +14 -16
  127. package/src/exa/render.ts +10 -11
  128. package/src/exa/researcher.ts +1 -2
  129. package/src/exa/search.ts +1 -2
  130. package/src/exa/types.ts +0 -1
  131. package/src/exa/websets.ts +1 -2
  132. package/src/exec/bash-executor.ts +3 -4
  133. package/src/exec/exec.ts +0 -1
  134. package/src/export/custom-share.ts +5 -6
  135. package/src/export/html/index.ts +24 -21
  136. package/src/export/ttsr.ts +2 -3
  137. package/src/extensibility/custom-commands/bundled/review/index.ts +7 -8
  138. package/src/extensibility/custom-commands/loader.ts +17 -14
  139. package/src/extensibility/custom-commands/types.ts +1 -2
  140. package/src/extensibility/custom-tools/loader.ts +10 -11
  141. package/src/extensibility/custom-tools/types.ts +6 -7
  142. package/src/extensibility/custom-tools/wrapper.ts +2 -3
  143. package/src/extensibility/extensions/loader.ts +75 -53
  144. package/src/extensibility/extensions/runner.ts +11 -12
  145. package/src/extensibility/extensions/types.ts +19 -26
  146. package/src/extensibility/extensions/wrapper.ts +3 -4
  147. package/src/extensibility/hooks/index.ts +1 -1
  148. package/src/extensibility/hooks/loader.ts +8 -9
  149. package/src/extensibility/hooks/runner.ts +7 -8
  150. package/src/extensibility/hooks/tool-wrapper.ts +0 -1
  151. package/src/extensibility/hooks/types.ts +10 -17
  152. package/src/extensibility/plugins/doctor.ts +3 -3
  153. package/src/extensibility/plugins/installer.ts +27 -27
  154. package/src/extensibility/plugins/loader.ts +59 -56
  155. package/src/extensibility/plugins/manager.ts +211 -171
  156. package/src/extensibility/plugins/parser.ts +1 -1
  157. package/src/extensibility/plugins/paths.ts +8 -8
  158. package/src/extensibility/skills.ts +63 -60
  159. package/src/extensibility/slash-commands.ts +10 -10
  160. package/src/index.ts +46 -46
  161. package/src/internal-urls/agent-protocol.ts +21 -11
  162. package/src/internal-urls/artifact-protocol.ts +17 -13
  163. package/src/internal-urls/router.ts +1 -2
  164. package/src/internal-urls/rule-protocol.ts +3 -4
  165. package/src/internal-urls/skill-protocol.ts +3 -4
  166. package/src/ipy/executor.ts +14 -10
  167. package/src/ipy/gateway-coordinator.ts +79 -90
  168. package/src/ipy/kernel.ts +32 -30
  169. package/src/ipy/modules.ts +13 -13
  170. package/src/lsp/client.ts +21 -10
  171. package/src/lsp/clients/biome-client.ts +1 -2
  172. package/src/lsp/clients/index.ts +3 -3
  173. package/src/lsp/clients/lsp-linter-client.ts +4 -5
  174. package/src/lsp/config.ts +15 -15
  175. package/src/lsp/edits.ts +4 -5
  176. package/src/lsp/index.ts +43 -44
  177. package/src/lsp/lspmux.ts +8 -8
  178. package/src/lsp/render.ts +10 -16
  179. package/src/lsp/utils.ts +3 -3
  180. package/src/main.ts +55 -34
  181. package/src/mcp/client.ts +2 -3
  182. package/src/mcp/config.ts +5 -6
  183. package/src/mcp/json-rpc.ts +0 -1
  184. package/src/mcp/loader.ts +3 -4
  185. package/src/mcp/manager.ts +17 -18
  186. package/src/mcp/tool-bridge.ts +4 -9
  187. package/src/mcp/tool-cache.ts +2 -3
  188. package/src/mcp/transports/http.ts +2 -4
  189. package/src/mcp/transports/stdio.ts +1 -2
  190. package/src/migrations.ts +60 -49
  191. package/src/modes/components/armin.ts +4 -5
  192. package/src/modes/components/assistant-message.ts +6 -6
  193. package/src/modes/components/bash-execution.ts +7 -8
  194. package/src/modes/components/bordered-loader.ts +3 -3
  195. package/src/modes/components/branch-summary-message.ts +3 -3
  196. package/src/modes/components/compaction-summary-message.ts +3 -3
  197. package/src/modes/components/countdown-timer.ts +0 -1
  198. package/src/modes/components/custom-message.ts +5 -5
  199. package/src/modes/components/diff.ts +1 -1
  200. package/src/modes/components/dynamic-border.ts +2 -2
  201. package/src/modes/components/extensions/extension-dashboard.ts +6 -7
  202. package/src/modes/components/extensions/extension-list.ts +2 -3
  203. package/src/modes/components/extensions/inspector-panel.ts +3 -4
  204. package/src/modes/components/extensions/state-manager.ts +25 -26
  205. package/src/modes/components/extensions/types.ts +1 -2
  206. package/src/modes/components/footer.ts +47 -43
  207. package/src/modes/components/history-search.ts +2 -2
  208. package/src/modes/components/hook-editor.ts +3 -4
  209. package/src/modes/components/hook-input.ts +2 -3
  210. package/src/modes/components/hook-message.ts +5 -5
  211. package/src/modes/components/hook-selector.ts +2 -3
  212. package/src/modes/components/keybinding-hints.ts +2 -3
  213. package/src/modes/components/login-dialog.ts +2 -2
  214. package/src/modes/components/model-selector.ts +12 -12
  215. package/src/modes/components/oauth-selector.ts +2 -2
  216. package/src/modes/components/plugin-settings.ts +20 -20
  217. package/src/modes/components/python-execution.ts +7 -8
  218. package/src/modes/components/queue-mode-selector.ts +3 -3
  219. package/src/modes/components/read-tool-group.ts +2 -2
  220. package/src/modes/components/session-selector.ts +4 -4
  221. package/src/modes/components/settings-defs.ts +77 -69
  222. package/src/modes/components/settings-selector.ts +16 -16
  223. package/src/modes/components/show-images-selector.ts +2 -2
  224. package/src/modes/components/status-line/segments.ts +4 -4
  225. package/src/modes/components/status-line/separators.ts +1 -1
  226. package/src/modes/components/status-line/types.ts +2 -2
  227. package/src/modes/components/status-line-segment-editor.ts +7 -8
  228. package/src/modes/components/status-line.ts +12 -12
  229. package/src/modes/components/theme-selector.ts +8 -7
  230. package/src/modes/components/thinking-selector.ts +4 -4
  231. package/src/modes/components/todo-display.ts +2 -2
  232. package/src/modes/components/todo-reminder.ts +4 -4
  233. package/src/modes/components/tool-execution.ts +11 -16
  234. package/src/modes/components/tree-selector.ts +11 -11
  235. package/src/modes/components/ttsr-notification.ts +5 -5
  236. package/src/modes/components/user-message-selector.ts +1 -1
  237. package/src/modes/components/user-message.ts +1 -1
  238. package/src/modes/components/visual-truncate.ts +0 -1
  239. package/src/modes/components/welcome.ts +4 -4
  240. package/src/modes/controllers/command-controller.ts +46 -47
  241. package/src/modes/controllers/event-controller.ts +16 -20
  242. package/src/modes/controllers/extension-ui-controller.ts +40 -46
  243. package/src/modes/controllers/input-controller.ts +17 -18
  244. package/src/modes/controllers/selector-controller.ts +103 -91
  245. package/src/modes/index.ts +3 -3
  246. package/src/modes/interactive-mode.ts +27 -29
  247. package/src/modes/print-mode.ts +12 -13
  248. package/src/modes/rpc/rpc-client.ts +7 -8
  249. package/src/modes/rpc/rpc-mode.ts +24 -25
  250. package/src/modes/rpc/rpc-types.ts +3 -4
  251. package/src/modes/theme/mermaid-cache.ts +2 -2
  252. package/src/modes/theme/theme.ts +128 -53
  253. package/src/modes/types.ts +10 -10
  254. package/src/modes/utils/ui-helpers.ts +17 -17
  255. package/src/patch/applicator.ts +18 -19
  256. package/src/patch/diff.ts +1 -2
  257. package/src/patch/fuzzy.ts +1 -2
  258. package/src/patch/index.ts +10 -11
  259. package/src/patch/normalize.ts +4 -4
  260. package/src/patch/normative.ts +1 -2
  261. package/src/patch/parser.ts +8 -9
  262. package/src/patch/shared.ts +12 -13
  263. package/src/sdk.ts +60 -63
  264. package/src/session/agent-session.ts +83 -84
  265. package/src/session/agent-storage.ts +11 -11
  266. package/src/session/artifacts.ts +8 -9
  267. package/src/session/auth-storage.ts +25 -29
  268. package/src/session/compaction/branch-summarization.ts +7 -10
  269. package/src/session/compaction/compaction.ts +8 -19
  270. package/src/session/compaction/utils.ts +6 -9
  271. package/src/session/history-storage.ts +10 -10
  272. package/src/session/messages.ts +4 -5
  273. package/src/session/session-manager.ts +76 -65
  274. package/src/session/session-storage.ts +57 -69
  275. package/src/session/storage-migration.ts +2 -3
  276. package/src/session/streaming-output.ts +2 -2
  277. package/src/ssh/connection-manager.ts +43 -50
  278. package/src/ssh/ssh-executor.ts +2 -2
  279. package/src/ssh/sshfs-mount.ts +11 -18
  280. package/src/system-prompt.ts +27 -34
  281. package/src/task/agents.ts +45 -30
  282. package/src/task/commands.ts +6 -7
  283. package/src/task/discovery.ts +39 -76
  284. package/src/task/executor.ts +14 -15
  285. package/src/task/index.ts +33 -36
  286. package/src/task/output-manager.ts +3 -4
  287. package/src/task/parallel.ts +0 -1
  288. package/src/task/render.ts +19 -20
  289. package/src/task/subprocess-tool-registry.ts +1 -2
  290. package/src/task/worker-protocol.ts +3 -3
  291. package/src/task/worker.ts +32 -38
  292. package/src/task/worktree.ts +19 -19
  293. package/src/tools/ask.ts +8 -9
  294. package/src/tools/bash-interceptor.ts +1 -5
  295. package/src/tools/bash.ts +19 -18
  296. package/src/tools/calculator.ts +12 -12
  297. package/src/tools/complete.ts +3 -4
  298. package/src/tools/context.ts +2 -2
  299. package/src/tools/fetch.ts +23 -26
  300. package/src/tools/find.ts +15 -16
  301. package/src/tools/gemini-image.ts +14 -14
  302. package/src/tools/grep.ts +27 -27
  303. package/src/tools/index.ts +78 -56
  304. package/src/tools/list-limit.ts +1 -1
  305. package/src/tools/ls.ts +7 -7
  306. package/src/tools/notebook.ts +5 -5
  307. package/src/tools/output-meta.ts +3 -4
  308. package/src/tools/output-utils.ts +1 -1
  309. package/src/tools/path-utils.ts +5 -5
  310. package/src/tools/python.ts +36 -37
  311. package/src/tools/read.ts +23 -23
  312. package/src/tools/render-utils.ts +8 -9
  313. package/src/tools/renderers.ts +6 -7
  314. package/src/tools/review.ts +8 -11
  315. package/src/tools/ssh.ts +31 -30
  316. package/src/tools/todo-write.ts +13 -13
  317. package/src/tools/tool-errors.ts +3 -3
  318. package/src/tools/tool-result.ts +3 -8
  319. package/src/tools/write.ts +11 -16
  320. package/src/tui/code-cell.ts +3 -9
  321. package/src/tui/file-list.ts +3 -4
  322. package/src/tui/output-block.ts +1 -2
  323. package/src/tui/status-line.ts +2 -3
  324. package/src/tui/tree-list.ts +2 -3
  325. package/src/tui/types.ts +1 -2
  326. package/src/tui/utils.ts +2 -3
  327. package/src/utils/changelog.ts +9 -10
  328. package/src/utils/clipboard.ts +11 -11
  329. package/src/utils/file-mentions.ts +4 -10
  330. package/src/utils/frontmatter.ts +6 -3
  331. package/src/utils/fuzzy.ts +2 -2
  332. package/src/utils/image-convert.ts +1 -1
  333. package/src/utils/image-resize.ts +1 -1
  334. package/src/utils/mime.ts +2 -2
  335. package/src/utils/shell-snapshot.ts +11 -13
  336. package/src/utils/shell.ts +4 -5
  337. package/src/utils/title-generator.ts +8 -9
  338. package/src/utils/tools-manager.ts +23 -23
  339. package/src/vendor/photon/index.js +1099 -1059
  340. package/src/vendor/photon/photon_rs_bg.wasm +0 -0
  341. package/src/web/scrapers/artifacthub.ts +1 -1
  342. package/src/web/scrapers/arxiv.ts +2 -2
  343. package/src/web/scrapers/bluesky.ts +2 -2
  344. package/src/web/scrapers/cheatsh.ts +1 -1
  345. package/src/web/scrapers/chocolatey.ts +2 -2
  346. package/src/web/scrapers/choosealicense.ts +5 -5
  347. package/src/web/scrapers/cisa-kev.ts +1 -1
  348. package/src/web/scrapers/crossref.ts +2 -2
  349. package/src/web/scrapers/devto.ts +3 -3
  350. package/src/web/scrapers/discogs.ts +3 -4
  351. package/src/web/scrapers/discourse.ts +1 -1
  352. package/src/web/scrapers/dockerhub.ts +1 -1
  353. package/src/web/scrapers/fdroid.ts +2 -2
  354. package/src/web/scrapers/firefox-addons.ts +3 -3
  355. package/src/web/scrapers/flathub.ts +1 -1
  356. package/src/web/scrapers/github.ts +3 -3
  357. package/src/web/scrapers/gitlab.ts +4 -4
  358. package/src/web/scrapers/hackernews.ts +2 -2
  359. package/src/web/scrapers/huggingface.ts +1 -1
  360. package/src/web/scrapers/iacr.ts +2 -2
  361. package/src/web/scrapers/index.ts +0 -1
  362. package/src/web/scrapers/jetbrains-marketplace.ts +1 -1
  363. package/src/web/scrapers/lemmy.ts +2 -2
  364. package/src/web/scrapers/maven.ts +2 -2
  365. package/src/web/scrapers/mdn.ts +2 -4
  366. package/src/web/scrapers/metacpan.ts +2 -2
  367. package/src/web/scrapers/musicbrainz.ts +1 -2
  368. package/src/web/scrapers/npm.ts +1 -1
  369. package/src/web/scrapers/nuget.ts +2 -2
  370. package/src/web/scrapers/nvd.ts +3 -3
  371. package/src/web/scrapers/ollama.ts +7 -9
  372. package/src/web/scrapers/opencorporates.ts +2 -2
  373. package/src/web/scrapers/openlibrary.ts +6 -6
  374. package/src/web/scrapers/orcid.ts +0 -1
  375. package/src/web/scrapers/osv.ts +2 -2
  376. package/src/web/scrapers/packagist.ts +1 -1
  377. package/src/web/scrapers/pubmed.ts +1 -2
  378. package/src/web/scrapers/rawg.ts +2 -2
  379. package/src/web/scrapers/readthedocs.ts +1 -2
  380. package/src/web/scrapers/repology.ts +2 -2
  381. package/src/web/scrapers/rfc.ts +1 -1
  382. package/src/web/scrapers/searchcode.ts +2 -2
  383. package/src/web/scrapers/semantic-scholar.ts +1 -1
  384. package/src/web/scrapers/snapcraft.ts +2 -2
  385. package/src/web/scrapers/sourcegraph.ts +1 -1
  386. package/src/web/scrapers/spdx.ts +3 -3
  387. package/src/web/scrapers/spotify.ts +0 -1
  388. package/src/web/scrapers/twitter.ts +1 -1
  389. package/src/web/scrapers/types.ts +1 -2
  390. package/src/web/scrapers/utils.ts +5 -5
  391. package/src/web/scrapers/wikidata.ts +3 -3
  392. package/src/web/scrapers/youtube.ts +9 -14
  393. package/src/web/search/auth.ts +4 -9
  394. package/src/web/search/index.ts +11 -21
  395. package/src/web/search/providers/anthropic.ts +3 -9
  396. package/src/web/search/providers/exa.ts +6 -10
  397. package/src/web/search/providers/perplexity.ts +5 -5
  398. package/src/web/search/render.ts +16 -18
  399. package/scripts/generate-wasm-b64.ts +0 -24
  400. package/src/commit/map-reduce/.map-phase.ts.kate-swp +0 -0
  401. package/src/task/.executor.ts.kate-swp +0 -0
  402. package/src/vendor/photon/photon_rs_bg.wasm.b64.js +0 -1
@@ -1,29 +1,30 @@
1
1
  import type { ThinkingLevel } from "@oh-my-pi/pi-agent-core";
2
2
  import type { OAuthProvider } from "@oh-my-pi/pi-ai";
3
- import { getAgentDbPath } from "@oh-my-pi/pi-coding-agent/config";
4
- import { disableProvider, enableProvider } from "@oh-my-pi/pi-coding-agent/discovery";
5
- import { AssistantMessageComponent } from "@oh-my-pi/pi-coding-agent/modes/components/assistant-message";
6
- import { ExtensionDashboard } from "@oh-my-pi/pi-coding-agent/modes/components/extensions";
7
- import { HistorySearchComponent } from "@oh-my-pi/pi-coding-agent/modes/components/history-search";
8
- import { ModelSelectorComponent } from "@oh-my-pi/pi-coding-agent/modes/components/model-selector";
9
- import { OAuthSelectorComponent } from "@oh-my-pi/pi-coding-agent/modes/components/oauth-selector";
10
- import { SessionSelectorComponent } from "@oh-my-pi/pi-coding-agent/modes/components/session-selector";
11
- import { SettingsSelectorComponent } from "@oh-my-pi/pi-coding-agent/modes/components/settings-selector";
12
- import { ToolExecutionComponent } from "@oh-my-pi/pi-coding-agent/modes/components/tool-execution";
13
- import { TreeSelectorComponent } from "@oh-my-pi/pi-coding-agent/modes/components/tree-selector";
14
- import { UserMessageSelectorComponent } from "@oh-my-pi/pi-coding-agent/modes/components/user-message-selector";
3
+ import type { Component } from "@oh-my-pi/pi-tui";
4
+ import { Input, Loader, Spacer, Text } from "@oh-my-pi/pi-tui";
5
+ import { getAgentDbPath } from "../../config";
6
+ import { disableProvider, enableProvider } from "../../discovery";
7
+ import { AssistantMessageComponent } from "../../modes/components/assistant-message";
8
+ import { ExtensionDashboard } from "../../modes/components/extensions";
9
+ import { HistorySearchComponent } from "../../modes/components/history-search";
10
+ import { ModelSelectorComponent } from "../../modes/components/model-selector";
11
+ import { OAuthSelectorComponent } from "../../modes/components/oauth-selector";
12
+ import { SessionSelectorComponent } from "../../modes/components/session-selector";
13
+ import { SettingsSelectorComponent } from "../../modes/components/settings-selector";
14
+ import { ToolExecutionComponent } from "../../modes/components/tool-execution";
15
+ import { TreeSelectorComponent } from "../../modes/components/tree-selector";
16
+ import { UserMessageSelectorComponent } from "../../modes/components/user-message-selector";
15
17
  import {
16
18
  getAvailableThemes,
17
19
  getSymbolTheme,
20
+ setColorBlindMode,
18
21
  setSymbolPreset,
19
22
  setTheme,
20
23
  theme,
21
- } from "@oh-my-pi/pi-coding-agent/modes/theme/theme";
22
- import type { InteractiveModeContext } from "@oh-my-pi/pi-coding-agent/modes/types";
23
- import { SessionManager } from "@oh-my-pi/pi-coding-agent/session/session-manager";
24
- import { setPreferredImageProvider, setPreferredWebSearchProvider } from "@oh-my-pi/pi-coding-agent/tools";
25
- import type { Component } from "@oh-my-pi/pi-tui";
26
- import { Input, Loader, Spacer, Text } from "@oh-my-pi/pi-tui";
24
+ } from "../../modes/theme/theme";
25
+ import type { InteractiveModeContext } from "../../modes/types";
26
+ import { SessionManager } from "../../session/session-manager";
27
+ import { setPreferredImageProvider, setPreferredWebSearchProvider } from "../../tools";
27
28
 
28
29
  export class SelectorController {
29
30
  constructor(private ctx: InteractiveModeContext) {}
@@ -46,49 +47,52 @@ export class SelectorController {
46
47
  }
47
48
 
48
49
  showSettingsSelector(): void {
49
- this.showSelector((done) => {
50
- const selector = new SettingsSelectorComponent(
51
- this.ctx.settingsManager,
52
- {
53
- availableThinkingLevels: this.ctx.session.getAvailableThinkingLevels(),
54
- thinkingLevel: this.ctx.session.thinkingLevel,
55
- availableThemes: getAvailableThemes(),
56
- cwd: process.cwd(),
57
- },
58
- {
59
- onChange: (id, value) => this.handleSettingChange(id, value),
60
- onThemePreview: (themeName) => {
61
- const result = setTheme(themeName, true);
62
- if (result.success) {
63
- this.ctx.ui.invalidate();
64
- this.ctx.ui.requestRender();
65
- }
50
+ getAvailableThemes().then(availableThemes => {
51
+ this.showSelector(done => {
52
+ const selector = new SettingsSelectorComponent(
53
+ this.ctx.settingsManager,
54
+ {
55
+ availableThinkingLevels: this.ctx.session.getAvailableThinkingLevels(),
56
+ thinkingLevel: this.ctx.session.thinkingLevel,
57
+ availableThemes,
58
+ cwd: process.cwd(),
66
59
  },
67
- onStatusLinePreview: (settings) => {
68
- // Update status line with preview settings
69
- const currentSettings = this.ctx.settingsManager.getStatusLineSettings();
70
- this.ctx.statusLine.updateSettings({ ...currentSettings, ...settings });
71
- this.ctx.updateEditorTopBorder();
72
- this.ctx.ui.requestRender();
73
- },
74
- getStatusLinePreview: () => {
75
- // Return the rendered status line for inline preview
76
- const width = this.ctx.ui.getWidth();
77
- return this.ctx.statusLine.getTopBorder(width).content;
78
- },
79
- onPluginsChanged: () => {
80
- this.ctx.ui.requestRender();
81
- },
82
- onCancel: () => {
83
- done();
84
- // Restore status line to saved settings
85
- this.ctx.statusLine.updateSettings(this.ctx.settingsManager.getStatusLineSettings());
86
- this.ctx.updateEditorTopBorder();
87
- this.ctx.ui.requestRender();
60
+ {
61
+ onChange: (id, value) => this.handleSettingChange(id, value),
62
+ onThemePreview: themeName => {
63
+ setTheme(themeName, true).then(result => {
64
+ if (result.success) {
65
+ this.ctx.ui.invalidate();
66
+ this.ctx.ui.requestRender();
67
+ }
68
+ });
69
+ },
70
+ onStatusLinePreview: settings => {
71
+ // Update status line with preview settings
72
+ const currentSettings = this.ctx.settingsManager.getStatusLineSettings();
73
+ this.ctx.statusLine.updateSettings({ ...currentSettings, ...settings });
74
+ this.ctx.updateEditorTopBorder();
75
+ this.ctx.ui.requestRender();
76
+ },
77
+ getStatusLinePreview: () => {
78
+ // Return the rendered status line for inline preview
79
+ const width = this.ctx.ui.getWidth();
80
+ return this.ctx.statusLine.getTopBorder(width).content;
81
+ },
82
+ onPluginsChanged: () => {
83
+ this.ctx.ui.requestRender();
84
+ },
85
+ onCancel: () => {
86
+ done();
87
+ // Restore status line to saved settings
88
+ this.ctx.statusLine.updateSettings(this.ctx.settingsManager.getStatusLineSettings());
89
+ this.ctx.updateEditorTopBorder();
90
+ this.ctx.ui.requestRender();
91
+ },
88
92
  },
89
- },
90
- );
91
- return { component: selector, focus: selector };
93
+ );
94
+ return { component: selector, focus: selector };
95
+ });
92
96
  });
93
97
  }
94
98
 
@@ -96,10 +100,10 @@ export class SelectorController {
96
100
  const historyStorage = this.ctx.historyStorage;
97
101
  if (!historyStorage) return;
98
102
 
99
- this.showSelector((done) => {
103
+ this.showSelector(done => {
100
104
  const component = new HistorySearchComponent(
101
105
  historyStorage,
102
- (prompt) => {
106
+ prompt => {
103
107
  done();
104
108
  this.ctx.editor.setText(prompt);
105
109
  this.ctx.ui.requestRender();
@@ -123,7 +127,7 @@ export class SelectorController {
123
127
  this.ctx.settingsManager,
124
128
  this.ctx.ui.terminal.rows,
125
129
  );
126
- this.showSelector((done) => {
130
+ this.showSelector(done => {
127
131
  dashboard.onClose = () => {
128
132
  done();
129
133
  this.ctx.ui.requestRender();
@@ -189,20 +193,28 @@ export class SelectorController {
189
193
  this.ctx.rebuildChatFromMessages();
190
194
  break;
191
195
  case "theme": {
192
- const result = setTheme(value as string, true);
193
- this.ctx.statusLine.invalidate();
194
- this.ctx.updateEditorTopBorder();
195
- this.ctx.ui.invalidate();
196
- if (!result.success) {
197
- this.ctx.showError(`Failed to load theme "${value}": ${result.error}\nFell back to dark theme.`);
198
- }
196
+ setTheme(value as string, true).then(result => {
197
+ this.ctx.statusLine.invalidate();
198
+ this.ctx.updateEditorTopBorder();
199
+ this.ctx.ui.invalidate();
200
+ if (!result.success) {
201
+ this.ctx.showError(`Failed to load theme "${value}": ${result.error}\nFell back to dark theme.`);
202
+ }
203
+ });
199
204
  break;
200
205
  }
201
206
  case "symbolPreset": {
202
- setSymbolPreset(value as "unicode" | "nerd" | "ascii");
203
- this.ctx.statusLine.invalidate();
204
- this.ctx.updateEditorTopBorder();
205
- this.ctx.ui.invalidate();
207
+ setSymbolPreset(value as "unicode" | "nerd" | "ascii").then(() => {
208
+ this.ctx.statusLine.invalidate();
209
+ this.ctx.updateEditorTopBorder();
210
+ this.ctx.ui.invalidate();
211
+ });
212
+ break;
213
+ }
214
+ case "colorBlindMode": {
215
+ setColorBlindMode(value === "true" || value === true).then(() => {
216
+ this.ctx.ui.invalidate();
217
+ });
206
218
  break;
207
219
  }
208
220
  case "statusLinePreset":
@@ -239,7 +251,7 @@ export class SelectorController {
239
251
  }
240
252
 
241
253
  showModelSelector(options?: { temporaryOnly?: boolean }): void {
242
- this.showSelector((done) => {
254
+ this.showSelector(done => {
243
255
  const selector = new ModelSelectorComponent(
244
256
  this.ctx.ui,
245
257
  this.ctx.session.model,
@@ -291,10 +303,10 @@ export class SelectorController {
291
303
  return;
292
304
  }
293
305
 
294
- this.showSelector((done) => {
306
+ this.showSelector(done => {
295
307
  const selector = new UserMessageSelectorComponent(
296
- userMessages.map((m) => ({ id: m.entryId, text: m.text })),
297
- async (entryId) => {
308
+ userMessages.map(m => ({ id: m.entryId, text: m.text })),
309
+ async entryId => {
298
310
  const result = await this.ctx.session.branch(entryId);
299
311
  if (result.cancelled) {
300
312
  // Hook cancelled the branch
@@ -336,12 +348,12 @@ export class SelectorController {
336
348
  return;
337
349
  }
338
350
 
339
- this.showSelector((done) => {
351
+ this.showSelector(done => {
340
352
  const selector = new TreeSelectorComponent(
341
353
  tree,
342
354
  visibleLeafId,
343
355
  this.ctx.ui.terminal.rows,
344
- async (entryId) => {
356
+ async entryId => {
345
357
  // Selecting the visible leaf is a no-op (already there)
346
358
  if (entryId === visibleLeafId) {
347
359
  done();
@@ -396,8 +408,8 @@ export class SelectorController {
396
408
  this.ctx.chatContainer.addChild(new Spacer(1));
397
409
  summaryLoader = new Loader(
398
410
  this.ctx.ui,
399
- (spinner) => theme.fg("accent", spinner),
400
- (text) => theme.fg("muted", text),
411
+ spinner => theme.fg("accent", spinner),
412
+ text => theme.fg("muted", text),
401
413
  "Summarizing branch... (esc to cancel)",
402
414
  getSymbolTheme().spinnerFrames,
403
415
  );
@@ -453,15 +465,15 @@ export class SelectorController {
453
465
  });
454
466
  }
455
467
 
456
- showSessionSelector(): void {
457
- this.showSelector((done) => {
458
- const sessions = SessionManager.list(
459
- this.ctx.sessionManager.getCwd(),
460
- this.ctx.sessionManager.getSessionDir(),
461
- );
468
+ async showSessionSelector(): Promise<void> {
469
+ const sessions = await SessionManager.list(
470
+ this.ctx.sessionManager.getCwd(),
471
+ this.ctx.sessionManager.getSessionDir(),
472
+ );
473
+ this.showSelector(done => {
462
474
  const selector = new SessionSelectorComponent(
463
475
  sessions,
464
- async (sessionPath) => {
476
+ async sessionPath => {
465
477
  done();
466
478
  await this.handleResumeSession(sessionPath);
467
479
  },
@@ -505,14 +517,14 @@ export class SelectorController {
505
517
  async showOAuthSelector(mode: "login" | "logout"): Promise<void> {
506
518
  if (mode === "logout") {
507
519
  const providers = this.ctx.session.modelRegistry.authStorage.list();
508
- const loggedInProviders = providers.filter((p) => this.ctx.session.modelRegistry.authStorage.hasOAuth(p));
520
+ const loggedInProviders = providers.filter(p => this.ctx.session.modelRegistry.authStorage.hasOAuth(p));
509
521
  if (loggedInProviders.length === 0) {
510
522
  this.ctx.showStatus("No OAuth providers logged in. Use /login first.");
511
523
  return;
512
524
  }
513
525
  }
514
526
 
515
- this.showSelector((done) => {
527
+ this.showSelector(done => {
516
528
  const selector = new OAuthSelectorComponent(
517
529
  mode,
518
530
  this.ctx.session.modelRegistry.authStorage,
@@ -546,7 +558,7 @@ export class SelectorController {
546
558
  }
547
559
  this.ctx.ui.requestRender();
548
560
 
549
- return new Promise<string>((resolve) => {
561
+ return new Promise<string>(resolve => {
550
562
  const codeInput = new Input();
551
563
  codeInput.onSubmit = () => {
552
564
  const code = codeInput.getValue();
@@ -1,3 +1,6 @@
1
+ import { emergencyTerminalRestore } from "@oh-my-pi/pi-tui";
2
+ import { postmortem } from "@oh-my-pi/pi-utils";
3
+
1
4
  /**
2
5
  * Run modes for the coding agent.
3
6
  */
@@ -7,9 +10,6 @@ export { type ModelInfo, RpcClient, type RpcClientOptions, type RpcEventListener
7
10
  export { runRpcMode } from "./rpc/rpc-mode";
8
11
  export type { RpcCommand, RpcResponse, RpcSessionState } from "./rpc/rpc-types";
9
12
 
10
- import { emergencyTerminalRestore } from "@oh-my-pi/pi-tui";
11
- import { postmortem } from "@oh-my-pi/pi-utils";
12
-
13
13
  postmortem.register("terminal-restore", () => {
14
14
  emergencyTerminalRestore();
15
15
  });
@@ -2,20 +2,9 @@
2
2
  * Interactive mode for the coding agent.
3
3
  * Handles TUI rendering and user interaction, delegating business logic to AgentSession.
4
4
  */
5
-
6
5
  import * as path from "node:path";
7
6
  import type { AgentMessage } from "@oh-my-pi/pi-agent-core";
8
7
  import type { AssistantMessage, ImageContent, Message, UsageReport } from "@oh-my-pi/pi-ai";
9
- import { KeybindingsManager } from "@oh-my-pi/pi-coding-agent/config/keybindings";
10
- import type { SettingsManager } from "@oh-my-pi/pi-coding-agent/config/settings-manager";
11
- import type { ExtensionUIContext } from "@oh-my-pi/pi-coding-agent/extensibility/extensions";
12
- import type { CompactOptions } from "@oh-my-pi/pi-coding-agent/extensibility/extensions/types";
13
- import { loadSlashCommands } from "@oh-my-pi/pi-coding-agent/extensibility/slash-commands";
14
- import type { AgentSession, AgentSessionEvent } from "@oh-my-pi/pi-coding-agent/session/agent-session";
15
- import { HistoryStorage } from "@oh-my-pi/pi-coding-agent/session/history-storage";
16
- import type { SessionContext, SessionManager } from "@oh-my-pi/pi-coding-agent/session/session-manager";
17
- import { getRecentSessions } from "@oh-my-pi/pi-coding-agent/session/session-manager";
18
- import { setTerminalTitle } from "@oh-my-pi/pi-coding-agent/utils/title-generator";
19
8
  import type { Component, Loader, SlashCommand } from "@oh-my-pi/pi-tui";
20
9
  import {
21
10
  CombinedAutocompleteProvider,
@@ -26,8 +15,18 @@ import {
26
15
  Text,
27
16
  TUI,
28
17
  } from "@oh-my-pi/pi-tui";
29
- import { logger, postmortem } from "@oh-my-pi/pi-utils";
18
+ import { isEnoent, logger, postmortem } from "@oh-my-pi/pi-utils";
30
19
  import chalk from "chalk";
20
+ import { KeybindingsManager } from "../config/keybindings";
21
+ import type { SettingsManager } from "../config/settings-manager";
22
+ import type { ExtensionUIContext } from "../extensibility/extensions";
23
+ import type { CompactOptions } from "../extensibility/extensions/types";
24
+ import { loadSlashCommands } from "../extensibility/slash-commands";
25
+ import type { AgentSession, AgentSessionEvent } from "../session/agent-session";
26
+ import { HistoryStorage } from "../session/history-storage";
27
+ import type { SessionContext, SessionManager } from "../session/session-manager";
28
+ import { getRecentSessions } from "../session/session-manager";
29
+ import { setTerminalTitle } from "../utils/title-generator";
31
30
  import type { AssistantMessageComponent } from "./components/assistant-message";
32
31
  import type { BashExecutionComponent } from "./components/bash-execution";
33
32
  import { CustomEditor } from "./components/custom-editor";
@@ -207,14 +206,14 @@ export class InteractiveMode implements InteractiveModeContext {
207
206
  ];
208
207
 
209
208
  // Convert hook commands to SlashCommand format
210
- const hookCommands: SlashCommand[] = (this.session.extensionRunner?.getRegisteredCommands() ?? []).map((cmd) => ({
209
+ const hookCommands: SlashCommand[] = (this.session.extensionRunner?.getRegisteredCommands() ?? []).map(cmd => ({
211
210
  name: cmd.name,
212
211
  description: cmd.description ?? "(hook command)",
213
212
  getArgumentCompletions: cmd.getArgumentCompletions,
214
213
  }));
215
214
 
216
215
  // Convert custom commands (TypeScript) to SlashCommand format
217
- const customCommands: SlashCommand[] = this.session.customCommands.map((loaded) => ({
216
+ const customCommands: SlashCommand[] = this.session.customCommands.map(loaded => ({
218
217
  name: loaded.command.name,
219
218
  description: `${loaded.command.description} (${loaded.source})`,
220
219
  }));
@@ -250,8 +249,8 @@ export class InteractiveMode implements InteractiveModeContext {
250
249
 
251
250
  // Load and convert file commands to SlashCommand format (async)
252
251
  const fileCommands = await loadSlashCommands({ cwd: process.cwd() });
253
- this.fileSlashCommands = new Set(fileCommands.map((cmd) => cmd.name));
254
- const fileSlashCommands: SlashCommand[] = fileCommands.map((cmd) => ({
252
+ this.fileSlashCommands = new Set(fileCommands.map(cmd => cmd.name));
253
+ const fileSlashCommands: SlashCommand[] = fileCommands.map(cmd => ({
255
254
  name: cmd.name,
256
255
  description: cmd.description,
257
256
  }));
@@ -268,14 +267,14 @@ export class InteractiveMode implements InteractiveModeContext {
268
267
  const providerName = this.session.model?.provider ?? "Unknown";
269
268
 
270
269
  // Get recent sessions
271
- const recentSessions = getRecentSessions(this.sessionManager.getSessionDir()).map((s) => ({
270
+ const recentSessions = (await getRecentSessions(this.sessionManager.getSessionDir())).map(s => ({
272
271
  name: s.name,
273
272
  timeAgo: s.timeAgo,
274
273
  }));
275
274
 
276
275
  // Convert LSP servers to welcome format
277
276
  const lspServerInfo =
278
- this.lspServers?.map((s) => ({
277
+ this.lspServers?.map(s => ({
279
278
  name: s.name,
280
279
  status: s.status as "ready" | "error" | "connecting",
281
280
  fileTypes: s.fileTypes,
@@ -364,7 +363,7 @@ export class InteractiveMode implements InteractiveModeContext {
364
363
 
365
364
  async getUserInput(): Promise<{ text: string; images?: ImageContent[] }> {
366
365
  const { promise, resolve } = Promise.withResolvers<{ text: string; images?: ImageContent[] }>();
367
- this.onInputCallback = (input) => {
366
+ this.onInputCallback = input => {
368
367
  this.onInputCallback = undefined;
369
368
  resolve(input);
370
369
  };
@@ -452,17 +451,16 @@ export class InteractiveMode implements InteractiveModeContext {
452
451
  }
453
452
  const artifactsDir = sessionFile.slice(0, -6);
454
453
  const todoPath = path.join(artifactsDir, TODO_FILE_NAME);
455
- const file = Bun.file(todoPath);
456
- if (!(await file.exists())) {
457
- this.renderTodoList();
458
- return;
459
- }
460
454
  try {
461
- const data = (await file.json()) as { todos?: TodoItem[] };
455
+ const data = (await Bun.file(todoPath).json()) as { todos?: TodoItem[] };
462
456
  if (data?.todos && Array.isArray(data.todos)) {
463
457
  this.todoItems = data.todos;
464
458
  }
465
459
  } catch (error) {
460
+ if (isEnoent(error)) {
461
+ this.renderTodoList();
462
+ return;
463
+ }
466
464
  logger.warn("Failed to load todos", { path: todoPath, error: String(error) });
467
465
  }
468
466
  this.renderTodoList();
@@ -612,16 +610,16 @@ export class InteractiveMode implements InteractiveModeContext {
612
610
  return this.commandController.handleCopyCommand();
613
611
  }
614
612
 
615
- handleSessionCommand(): void {
616
- this.commandController.handleSessionCommand();
613
+ handleSessionCommand(): Promise<void> {
614
+ return this.commandController.handleSessionCommand();
617
615
  }
618
616
 
619
617
  handleUsageCommand(reports?: UsageReport[] | null): Promise<void> {
620
618
  return this.commandController.handleUsageCommand(reports);
621
619
  }
622
620
 
623
- handleChangelogCommand(): void {
624
- this.commandController.handleChangelogCommand();
621
+ async handleChangelogCommand(): Promise<void> {
622
+ await this.commandController.handleChangelogCommand();
625
623
  }
626
624
 
627
625
  handleHotkeysCommand(): void {
@@ -5,9 +5,8 @@
5
5
  * - `omp -p "prompt"` - text output
6
6
  * - `omp --mode json "prompt"` - JSON event stream
7
7
  */
8
-
9
8
  import type { AssistantMessage, ImageContent } from "@oh-my-pi/pi-ai";
10
- import type { AgentSession } from "@oh-my-pi/pi-coding-agent/session/agent-session";
9
+ import type { AgentSession } from "../session/agent-session";
11
10
 
12
11
  /**
13
12
  * Options for print mode.
@@ -44,12 +43,12 @@ export async function runPrintMode(session: AgentSession, options: PrintModeOpti
44
43
  // ExtensionActions
45
44
  {
46
45
  sendMessage: (message, options) => {
47
- session.sendCustomMessage(message, options).catch((e) => {
46
+ session.sendCustomMessage(message, options).catch(e => {
48
47
  process.stderr.write(`Extension sendMessage failed: ${e instanceof Error ? e.message : String(e)}\n`);
49
48
  });
50
49
  },
51
50
  sendUserMessage: (content, options) => {
52
- session.sendUserMessage(content, options).catch((e) => {
51
+ session.sendUserMessage(content, options).catch(e => {
53
52
  process.stderr.write(
54
53
  `Extension sendUserMessage failed: ${e instanceof Error ? e.message : String(e)}\n`,
55
54
  );
@@ -64,14 +63,14 @@ export async function runPrintMode(session: AgentSession, options: PrintModeOpti
64
63
  getActiveTools: () => session.getActiveToolNames(),
65
64
  getAllTools: () => session.getAllToolNames(),
66
65
  setActiveTools: (toolNames: string[]) => session.setActiveToolsByName(toolNames),
67
- setModel: async (model) => {
66
+ setModel: async model => {
68
67
  const key = await session.modelRegistry.getApiKey(model);
69
68
  if (!key) return false;
70
69
  await session.setModel(model);
71
70
  return true;
72
71
  },
73
72
  getThinkingLevel: () => session.thinkingLevel,
74
- setThinkingLevel: (level) => session.setThinkingLevel(level),
73
+ setThinkingLevel: level => session.setThinkingLevel(level),
75
74
  },
76
75
  // ExtensionContextActions
77
76
  {
@@ -81,7 +80,7 @@ export async function runPrintMode(session: AgentSession, options: PrintModeOpti
81
80
  hasPendingMessages: () => session.queuedMessageCount > 0,
82
81
  shutdown: () => {},
83
82
  getContextUsage: () => session.getContextUsage(),
84
- compact: async (instructionsOrOptions) => {
83
+ compact: async instructionsOrOptions => {
85
84
  const instructions = typeof instructionsOrOptions === "string" ? instructionsOrOptions : undefined;
86
85
  const options =
87
86
  instructionsOrOptions && typeof instructionsOrOptions === "object"
@@ -94,14 +93,14 @@ export async function runPrintMode(session: AgentSession, options: PrintModeOpti
94
93
  {
95
94
  getContextUsage: () => session.getContextUsage(),
96
95
  waitForIdle: () => session.agent.waitForIdle(),
97
- newSession: async (options) => {
96
+ newSession: async options => {
98
97
  const success = await session.newSession({ parentSession: options?.parentSession });
99
98
  if (success && options?.setup) {
100
99
  await options.setup(session.sessionManager);
101
100
  }
102
101
  return { cancelled: !success };
103
102
  },
104
- branch: async (entryId) => {
103
+ branch: async entryId => {
105
104
  const result = await session.branch(entryId);
106
105
  return { cancelled: result.cancelled };
107
106
  },
@@ -109,7 +108,7 @@ export async function runPrintMode(session: AgentSession, options: PrintModeOpti
109
108
  const result = await session.navigateTree(targetId, { summarize: options?.summarize });
110
109
  return { cancelled: result.cancelled };
111
110
  },
112
- compact: async (instructionsOrOptions) => {
111
+ compact: async instructionsOrOptions => {
113
112
  const instructions = typeof instructionsOrOptions === "string" ? instructionsOrOptions : undefined;
114
113
  const options =
115
114
  instructionsOrOptions && typeof instructionsOrOptions === "object"
@@ -120,7 +119,7 @@ export async function runPrintMode(session: AgentSession, options: PrintModeOpti
120
119
  },
121
120
  // No UI context
122
121
  );
123
- extensionRunner.onError((err) => {
122
+ extensionRunner.onError(err => {
124
123
  process.stderr.write(`Extension error (${err.extensionPath}): ${err.error}\n`);
125
124
  });
126
125
  // Emit session_start event
@@ -130,7 +129,7 @@ export async function runPrintMode(session: AgentSession, options: PrintModeOpti
130
129
  }
131
130
 
132
131
  // Always subscribe to enable session persistence via _handleAgentEvent
133
- session.subscribe((event) => {
132
+ session.subscribe(event => {
134
133
  // In JSON mode, output all events
135
134
  if (mode === "json") {
136
135
  process.stdout.write(`${JSON.stringify(event)}\n`);
@@ -173,7 +172,7 @@ export async function runPrintMode(session: AgentSession, options: PrintModeOpti
173
172
  // Ensure stdout is fully flushed before returning
174
173
  // This prevents race conditions where the process exits before all output is written
175
174
  await new Promise<void>((resolve, reject) => {
176
- process.stdout.write("", (err) => {
175
+ process.stdout.write("", err => {
177
176
  if (err) reject(err);
178
177
  else resolve();
179
178
  });
@@ -3,13 +3,12 @@
3
3
  *
4
4
  * Spawns the agent in RPC mode and provides a typed API for all operations.
5
5
  */
6
-
7
6
  import type { AgentEvent, AgentMessage, ThinkingLevel } from "@oh-my-pi/pi-agent-core";
8
7
  import type { ImageContent } from "@oh-my-pi/pi-ai";
9
- import type { BashResult } from "@oh-my-pi/pi-coding-agent/exec/bash-executor";
10
- import type { SessionStats } from "@oh-my-pi/pi-coding-agent/session/agent-session";
11
- import type { CompactionResult } from "@oh-my-pi/pi-coding-agent/session/compaction";
12
8
  import { createSanitizerStream, createSplitterStream, createTextDecoderStream, ptree } from "@oh-my-pi/pi-utils";
9
+ import type { BashResult } from "../../exec/bash-executor";
10
+ import type { SessionStats } from "../../session/agent-session";
11
+ import type { CompactionResult } from "../../session/compaction";
13
12
  import type { RpcCommand, RpcResponse, RpcSessionState } from "./rpc-types";
14
13
 
15
14
  /** Distributive Omit that works with union types */
@@ -372,7 +371,7 @@ export class RpcClient {
372
371
  waitForIdle(timeout = 60000): Promise<void> {
373
372
  const { promise, resolve, reject } = Promise.withResolvers<void>();
374
373
  let settled = false;
375
- const unsubscribe = this.onEvent((event) => {
374
+ const unsubscribe = this.onEvent(event => {
376
375
  if (event.type === "agent_end") {
377
376
  settled = true;
378
377
  unsubscribe();
@@ -397,7 +396,7 @@ export class RpcClient {
397
396
  const { promise, resolve, reject } = Promise.withResolvers<AgentEvent[]>();
398
397
  const events: AgentEvent[] = [];
399
398
  let settled = false;
400
- const unsubscribe = this.onEvent((event) => {
399
+ const unsubscribe = this.onEvent(event => {
401
400
  events.push(event);
402
401
  if (event.type === "agent_end") {
403
402
  settled = true;
@@ -470,12 +469,12 @@ export class RpcClient {
470
469
  })();
471
470
 
472
471
  this.pendingRequests.set(id, {
473
- resolve: (response) => {
472
+ resolve: response => {
474
473
  if (settled) return;
475
474
  settled = true;
476
475
  resolve(response);
477
476
  },
478
- reject: (error) => {
477
+ reject: error => {
479
478
  if (settled) return;
480
479
  settled = true;
481
480
  reject(error);