@oh-my-pi/pi-coding-agent 8.0.20 → 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 (421) hide show
  1. package/CHANGELOG.md +125 -0
  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 +54 -23
  38. package/scripts/format-prompts.ts +0 -1
  39. package/src/capability/context-file.ts +3 -4
  40. package/src/capability/extension-module.ts +3 -4
  41. package/src/capability/extension.ts +3 -4
  42. package/src/capability/fs.ts +20 -21
  43. package/src/capability/hook.ts +3 -4
  44. package/src/capability/index.ts +15 -16
  45. package/src/capability/instruction.ts +3 -4
  46. package/src/capability/mcp.ts +3 -4
  47. package/src/capability/prompt.ts +3 -4
  48. package/src/capability/rule.ts +3 -4
  49. package/src/capability/settings.ts +2 -3
  50. package/src/capability/skill.ts +3 -4
  51. package/src/capability/slash-command.ts +3 -4
  52. package/src/capability/ssh.ts +3 -4
  53. package/src/capability/system-prompt.ts +3 -4
  54. package/src/capability/tool.ts +3 -4
  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 -25
  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 +307 -0
  66. package/src/commit/agentic/fallback.ts +96 -0
  67. package/src/commit/agentic/index.ts +351 -0
  68. package/src/commit/agentic/prompts/analyze-file.md +22 -0
  69. package/src/commit/agentic/prompts/session-user.md +26 -0
  70. package/src/commit/agentic/prompts/split-confirm.md +1 -0
  71. package/src/commit/agentic/prompts/system.md +40 -0
  72. package/src/commit/agentic/state.ts +69 -0
  73. package/src/commit/agentic/tools/analyze-file.ts +131 -0
  74. package/src/commit/agentic/tools/git-file-diff.ts +194 -0
  75. package/src/commit/agentic/tools/git-hunk.ts +50 -0
  76. package/src/commit/agentic/tools/git-overview.ts +84 -0
  77. package/src/commit/agentic/tools/index.ts +56 -0
  78. package/src/commit/agentic/tools/propose-changelog.ts +128 -0
  79. package/src/commit/agentic/tools/propose-commit.ts +154 -0
  80. package/src/commit/agentic/tools/recent-commits.ts +81 -0
  81. package/src/commit/agentic/tools/split-commit.ts +280 -0
  82. package/src/commit/agentic/topo-sort.ts +44 -0
  83. package/src/commit/agentic/trivial.ts +51 -0
  84. package/src/commit/agentic/validation.ts +200 -0
  85. package/src/commit/analysis/conventional.ts +165 -0
  86. package/src/commit/analysis/index.ts +4 -0
  87. package/src/commit/analysis/scope.ts +242 -0
  88. package/src/commit/analysis/summary.ts +112 -0
  89. package/src/commit/analysis/validation.ts +66 -0
  90. package/src/commit/changelog/detect.ts +36 -0
  91. package/src/commit/changelog/generate.ts +110 -0
  92. package/src/commit/changelog/index.ts +233 -0
  93. package/src/commit/changelog/parse.ts +44 -0
  94. package/src/commit/cli.ts +93 -0
  95. package/src/commit/git/diff.ts +148 -0
  96. package/src/commit/git/errors.ts +11 -0
  97. package/src/commit/git/index.ts +212 -0
  98. package/src/commit/git/operations.ts +53 -0
  99. package/src/commit/index.ts +5 -0
  100. package/src/commit/map-reduce/index.ts +63 -0
  101. package/src/commit/map-reduce/map-phase.ts +178 -0
  102. package/src/commit/map-reduce/reduce-phase.ts +145 -0
  103. package/src/commit/map-reduce/utils.ts +9 -0
  104. package/src/commit/message.ts +11 -0
  105. package/src/commit/model-selection.ts +80 -0
  106. package/src/commit/pipeline.ts +240 -0
  107. package/src/commit/prompts/analysis-system.md +155 -0
  108. package/src/commit/prompts/analysis-user.md +41 -0
  109. package/src/commit/prompts/changelog-system.md +56 -0
  110. package/src/commit/prompts/changelog-user.md +19 -0
  111. package/src/commit/prompts/file-observer-system.md +26 -0
  112. package/src/commit/prompts/file-observer-user.md +9 -0
  113. package/src/commit/prompts/reduce-system.md +60 -0
  114. package/src/commit/prompts/reduce-user.md +17 -0
  115. package/src/commit/prompts/summary-retry.md +4 -0
  116. package/src/commit/prompts/summary-system.md +52 -0
  117. package/src/commit/prompts/summary-user.md +13 -0
  118. package/src/commit/prompts/types-description.md +2 -0
  119. package/src/commit/types.ts +109 -0
  120. package/src/commit/utils/exclusions.ts +42 -0
  121. package/src/config/file-lock.ts +121 -0
  122. package/src/config/keybindings.ts +6 -8
  123. package/src/config/model-registry.ts +65 -38
  124. package/src/config/model-resolver.ts +18 -19
  125. package/src/config/prompt-templates.ts +11 -11
  126. package/src/config/settings-manager.ts +141 -50
  127. package/src/config.ts +64 -66
  128. package/src/cursor.ts +11 -9
  129. package/src/discovery/agents-md.ts +11 -12
  130. package/src/discovery/builtin.ts +68 -73
  131. package/src/discovery/claude.ts +41 -42
  132. package/src/discovery/cline.ts +11 -12
  133. package/src/discovery/codex.ts +52 -53
  134. package/src/discovery/cursor.ts +9 -10
  135. package/src/discovery/gemini.ts +17 -22
  136. package/src/discovery/github.ts +13 -14
  137. package/src/discovery/helpers.ts +35 -34
  138. package/src/discovery/index.ts +22 -24
  139. package/src/discovery/mcp-json.ts +8 -9
  140. package/src/discovery/ssh.ts +8 -9
  141. package/src/discovery/vscode.ts +4 -5
  142. package/src/discovery/windsurf.ts +6 -7
  143. package/src/exa/company.ts +1 -2
  144. package/src/exa/index.ts +2 -3
  145. package/src/exa/linkedin.ts +1 -2
  146. package/src/exa/mcp-client.ts +14 -16
  147. package/src/exa/render.ts +10 -11
  148. package/src/exa/researcher.ts +1 -2
  149. package/src/exa/search.ts +1 -2
  150. package/src/exa/types.ts +0 -1
  151. package/src/exa/websets.ts +1 -2
  152. package/src/exec/bash-executor.ts +3 -4
  153. package/src/exec/exec.ts +0 -1
  154. package/src/export/custom-share.ts +5 -6
  155. package/src/export/html/index.ts +24 -21
  156. package/src/export/ttsr.ts +2 -3
  157. package/src/extensibility/custom-commands/bundled/review/index.ts +7 -8
  158. package/src/extensibility/custom-commands/loader.ts +18 -15
  159. package/src/extensibility/custom-commands/types.ts +2 -3
  160. package/src/extensibility/custom-tools/loader.ts +11 -12
  161. package/src/extensibility/custom-tools/types.ts +7 -8
  162. package/src/extensibility/custom-tools/wrapper.ts +2 -3
  163. package/src/extensibility/extensions/loader.ts +76 -54
  164. package/src/extensibility/extensions/runner.ts +11 -12
  165. package/src/extensibility/extensions/types.ts +20 -27
  166. package/src/extensibility/extensions/wrapper.ts +3 -4
  167. package/src/extensibility/hooks/index.ts +1 -1
  168. package/src/extensibility/hooks/loader.ts +9 -10
  169. package/src/extensibility/hooks/runner.ts +7 -8
  170. package/src/extensibility/hooks/tool-wrapper.ts +0 -1
  171. package/src/extensibility/hooks/types.ts +11 -18
  172. package/src/extensibility/plugins/doctor.ts +3 -3
  173. package/src/extensibility/plugins/installer.ts +27 -27
  174. package/src/extensibility/plugins/loader.ts +59 -56
  175. package/src/extensibility/plugins/manager.ts +211 -171
  176. package/src/extensibility/plugins/parser.ts +1 -1
  177. package/src/extensibility/plugins/paths.ts +8 -8
  178. package/src/extensibility/skills.ts +63 -60
  179. package/src/extensibility/slash-commands.ts +10 -10
  180. package/src/index.ts +54 -54
  181. package/src/internal-urls/agent-protocol.ts +21 -11
  182. package/src/internal-urls/artifact-protocol.ts +17 -13
  183. package/src/internal-urls/router.ts +1 -2
  184. package/src/internal-urls/rule-protocol.ts +3 -4
  185. package/src/internal-urls/skill-protocol.ts +3 -4
  186. package/src/ipy/executor.ts +109 -9
  187. package/src/ipy/gateway-coordinator.ts +79 -90
  188. package/src/ipy/kernel.ts +32 -30
  189. package/src/ipy/modules.ts +13 -13
  190. package/src/lsp/client.ts +21 -10
  191. package/src/lsp/clients/biome-client.ts +1 -2
  192. package/src/lsp/clients/index.ts +3 -3
  193. package/src/lsp/clients/lsp-linter-client.ts +4 -5
  194. package/src/lsp/config.ts +15 -15
  195. package/src/lsp/edits.ts +4 -5
  196. package/src/lsp/index.ts +43 -44
  197. package/src/lsp/lspmux.ts +8 -8
  198. package/src/lsp/render.ts +99 -61
  199. package/src/lsp/utils.ts +3 -3
  200. package/src/main.ts +71 -37
  201. package/src/mcp/client.ts +2 -3
  202. package/src/mcp/config.ts +5 -6
  203. package/src/mcp/json-rpc.ts +0 -1
  204. package/src/mcp/loader.ts +6 -7
  205. package/src/mcp/manager.ts +17 -18
  206. package/src/mcp/tool-bridge.ts +4 -9
  207. package/src/mcp/tool-cache.ts +2 -3
  208. package/src/mcp/transports/http.ts +2 -4
  209. package/src/mcp/transports/stdio.ts +1 -2
  210. package/src/migrations.ts +63 -52
  211. package/src/modes/components/armin.ts +4 -5
  212. package/src/modes/components/assistant-message.ts +33 -5
  213. package/src/modes/components/bash-execution.ts +7 -8
  214. package/src/modes/components/bordered-loader.ts +3 -3
  215. package/src/modes/components/branch-summary-message.ts +3 -3
  216. package/src/modes/components/compaction-summary-message.ts +3 -3
  217. package/src/modes/components/countdown-timer.ts +0 -1
  218. package/src/modes/components/custom-message.ts +5 -5
  219. package/src/modes/components/diff.ts +1 -1
  220. package/src/modes/components/dynamic-border.ts +2 -2
  221. package/src/modes/components/extensions/extension-dashboard.ts +6 -7
  222. package/src/modes/components/extensions/extension-list.ts +2 -3
  223. package/src/modes/components/extensions/inspector-panel.ts +3 -4
  224. package/src/modes/components/extensions/state-manager.ts +25 -26
  225. package/src/modes/components/extensions/types.ts +1 -2
  226. package/src/modes/components/footer.ts +47 -43
  227. package/src/modes/components/history-search.ts +2 -2
  228. package/src/modes/components/hook-editor.ts +3 -4
  229. package/src/modes/components/hook-input.ts +2 -3
  230. package/src/modes/components/hook-message.ts +5 -5
  231. package/src/modes/components/hook-selector.ts +2 -3
  232. package/src/modes/components/keybinding-hints.ts +2 -3
  233. package/src/modes/components/login-dialog.ts +2 -2
  234. package/src/modes/components/model-selector.ts +12 -12
  235. package/src/modes/components/oauth-selector.ts +2 -2
  236. package/src/modes/components/plugin-settings.ts +20 -20
  237. package/src/modes/components/python-execution.ts +7 -8
  238. package/src/modes/components/queue-mode-selector.ts +3 -3
  239. package/src/modes/components/read-tool-group.ts +2 -2
  240. package/src/modes/components/session-selector.ts +4 -4
  241. package/src/modes/components/settings-defs.ts +77 -69
  242. package/src/modes/components/settings-selector.ts +16 -16
  243. package/src/modes/components/show-images-selector.ts +2 -2
  244. package/src/modes/components/status-line/segments.ts +4 -4
  245. package/src/modes/components/status-line/separators.ts +1 -1
  246. package/src/modes/components/status-line/types.ts +2 -2
  247. package/src/modes/components/status-line-segment-editor.ts +7 -8
  248. package/src/modes/components/status-line.ts +12 -12
  249. package/src/modes/components/theme-selector.ts +8 -7
  250. package/src/modes/components/thinking-selector.ts +4 -4
  251. package/src/modes/components/todo-display.ts +2 -2
  252. package/src/modes/components/todo-reminder.ts +4 -4
  253. package/src/modes/components/tool-execution.ts +16 -19
  254. package/src/modes/components/tree-selector.ts +12 -12
  255. package/src/modes/components/ttsr-notification.ts +5 -5
  256. package/src/modes/components/user-message-selector.ts +1 -1
  257. package/src/modes/components/user-message.ts +1 -1
  258. package/src/modes/components/visual-truncate.ts +0 -1
  259. package/src/modes/components/welcome.ts +4 -4
  260. package/src/modes/controllers/command-controller.ts +46 -47
  261. package/src/modes/controllers/event-controller.ts +16 -20
  262. package/src/modes/controllers/extension-ui-controller.ts +40 -46
  263. package/src/modes/controllers/input-controller.ts +17 -18
  264. package/src/modes/controllers/selector-controller.ts +103 -91
  265. package/src/modes/index.ts +3 -3
  266. package/src/modes/interactive-mode.ts +31 -31
  267. package/src/modes/print-mode.ts +12 -13
  268. package/src/modes/rpc/rpc-client.ts +7 -8
  269. package/src/modes/rpc/rpc-mode.ts +24 -28
  270. package/src/modes/rpc/rpc-types.ts +3 -4
  271. package/src/modes/theme/mermaid-cache.ts +89 -0
  272. package/src/modes/theme/theme.ts +130 -53
  273. package/src/modes/types.ts +10 -10
  274. package/src/modes/utils/ui-helpers.ts +17 -17
  275. package/src/patch/applicator.ts +18 -19
  276. package/src/patch/diff.ts +1 -2
  277. package/src/patch/fuzzy.ts +1 -2
  278. package/src/patch/index.ts +11 -18
  279. package/src/patch/normalize.ts +4 -4
  280. package/src/patch/normative.ts +1 -2
  281. package/src/patch/parser.ts +8 -9
  282. package/src/patch/shared.ts +43 -16
  283. package/src/prompts/tools/task.md +2 -0
  284. package/src/sdk.ts +100 -65
  285. package/src/session/agent-session.ts +84 -85
  286. package/src/session/agent-storage.ts +43 -39
  287. package/src/session/artifacts.ts +32 -10
  288. package/src/session/auth-storage.ts +50 -39
  289. package/src/session/compaction/branch-summarization.ts +7 -10
  290. package/src/session/compaction/compaction.ts +8 -19
  291. package/src/session/compaction/utils.ts +6 -9
  292. package/src/session/history-storage.ts +10 -10
  293. package/src/session/messages.ts +4 -5
  294. package/src/session/session-manager.ts +76 -65
  295. package/src/session/session-storage.ts +57 -69
  296. package/src/session/storage-migration.ts +14 -56
  297. package/src/session/streaming-output.ts +2 -2
  298. package/src/ssh/connection-manager.ts +43 -50
  299. package/src/ssh/ssh-executor.ts +2 -2
  300. package/src/ssh/sshfs-mount.ts +11 -18
  301. package/src/system-prompt.ts +28 -35
  302. package/src/task/agents.ts +45 -30
  303. package/src/task/commands.ts +6 -7
  304. package/src/task/discovery.ts +39 -76
  305. package/src/task/executor.ts +14 -15
  306. package/src/task/index.ts +40 -34
  307. package/src/task/output-manager.ts +93 -0
  308. package/src/task/parallel.ts +0 -1
  309. package/src/task/render.ts +24 -30
  310. package/src/task/subprocess-tool-registry.ts +1 -2
  311. package/src/task/worker-protocol.ts +3 -3
  312. package/src/task/worker.ts +33 -39
  313. package/src/task/worktree.ts +19 -19
  314. package/src/tools/ask.ts +41 -20
  315. package/src/tools/bash-interceptor.ts +1 -5
  316. package/src/tools/bash.ts +91 -97
  317. package/src/tools/calculator.ts +49 -47
  318. package/src/tools/complete.ts +4 -5
  319. package/src/tools/context.ts +2 -2
  320. package/src/tools/fetch.ts +84 -124
  321. package/src/tools/find.ts +94 -98
  322. package/src/tools/gemini-image.ts +14 -14
  323. package/src/tools/grep.ts +100 -116
  324. package/src/tools/index.ts +80 -55
  325. package/src/tools/list-limit.ts +1 -1
  326. package/src/tools/ls.ts +44 -70
  327. package/src/tools/notebook.ts +51 -67
  328. package/src/tools/output-meta.ts +3 -4
  329. package/src/tools/output-utils.ts +2 -2
  330. package/src/tools/path-utils.ts +5 -5
  331. package/src/tools/python.ts +104 -217
  332. package/src/tools/read.ts +92 -33
  333. package/src/tools/render-utils.ts +8 -23
  334. package/src/tools/renderers.ts +6 -7
  335. package/src/tools/review.ts +8 -11
  336. package/src/tools/ssh.ts +69 -49
  337. package/src/tools/todo-write.ts +37 -25
  338. package/src/tools/tool-errors.ts +3 -3
  339. package/src/tools/tool-result.ts +3 -8
  340. package/src/tools/write.ts +99 -75
  341. package/src/tui/code-cell.ts +109 -0
  342. package/src/tui/file-list.ts +47 -0
  343. package/src/tui/index.ts +11 -0
  344. package/src/tui/output-block.ts +72 -0
  345. package/src/tui/status-line.ts +39 -0
  346. package/src/tui/tree-list.ts +55 -0
  347. package/src/tui/types.ts +16 -0
  348. package/src/tui/utils.ts +48 -0
  349. package/src/utils/changelog.ts +9 -10
  350. package/src/utils/clipboard.ts +11 -11
  351. package/src/utils/file-mentions.ts +4 -10
  352. package/src/utils/frontmatter.ts +6 -3
  353. package/src/utils/fuzzy.ts +2 -2
  354. package/src/utils/image-convert.ts +1 -1
  355. package/src/utils/image-resize.ts +1 -1
  356. package/src/utils/mime.ts +2 -2
  357. package/src/utils/shell-snapshot.ts +11 -13
  358. package/src/utils/shell.ts +4 -5
  359. package/src/utils/title-generator.ts +8 -9
  360. package/src/utils/tools-manager.ts +23 -23
  361. package/src/vendor/photon/index.js +1099 -1059
  362. package/src/vendor/photon/photon_rs_bg.wasm +0 -0
  363. package/src/web/scrapers/artifacthub.ts +1 -1
  364. package/src/web/scrapers/arxiv.ts +2 -2
  365. package/src/web/scrapers/bluesky.ts +2 -2
  366. package/src/web/scrapers/cheatsh.ts +1 -1
  367. package/src/web/scrapers/chocolatey.ts +2 -2
  368. package/src/web/scrapers/choosealicense.ts +5 -5
  369. package/src/web/scrapers/cisa-kev.ts +1 -1
  370. package/src/web/scrapers/crossref.ts +2 -2
  371. package/src/web/scrapers/devto.ts +3 -3
  372. package/src/web/scrapers/discogs.ts +3 -4
  373. package/src/web/scrapers/discourse.ts +1 -1
  374. package/src/web/scrapers/dockerhub.ts +1 -1
  375. package/src/web/scrapers/fdroid.ts +2 -2
  376. package/src/web/scrapers/firefox-addons.ts +3 -3
  377. package/src/web/scrapers/flathub.ts +1 -1
  378. package/src/web/scrapers/github.ts +3 -3
  379. package/src/web/scrapers/gitlab.ts +4 -4
  380. package/src/web/scrapers/hackernews.ts +2 -2
  381. package/src/web/scrapers/huggingface.ts +1 -1
  382. package/src/web/scrapers/iacr.ts +2 -2
  383. package/src/web/scrapers/index.ts +0 -1
  384. package/src/web/scrapers/jetbrains-marketplace.ts +1 -1
  385. package/src/web/scrapers/lemmy.ts +2 -2
  386. package/src/web/scrapers/maven.ts +2 -2
  387. package/src/web/scrapers/mdn.ts +2 -4
  388. package/src/web/scrapers/metacpan.ts +2 -2
  389. package/src/web/scrapers/musicbrainz.ts +1 -2
  390. package/src/web/scrapers/npm.ts +1 -1
  391. package/src/web/scrapers/nuget.ts +2 -2
  392. package/src/web/scrapers/nvd.ts +3 -3
  393. package/src/web/scrapers/ollama.ts +7 -9
  394. package/src/web/scrapers/opencorporates.ts +2 -2
  395. package/src/web/scrapers/openlibrary.ts +6 -6
  396. package/src/web/scrapers/orcid.ts +0 -1
  397. package/src/web/scrapers/osv.ts +2 -2
  398. package/src/web/scrapers/packagist.ts +1 -1
  399. package/src/web/scrapers/pubmed.ts +1 -2
  400. package/src/web/scrapers/rawg.ts +2 -2
  401. package/src/web/scrapers/readthedocs.ts +1 -2
  402. package/src/web/scrapers/repology.ts +2 -2
  403. package/src/web/scrapers/rfc.ts +1 -1
  404. package/src/web/scrapers/searchcode.ts +2 -2
  405. package/src/web/scrapers/semantic-scholar.ts +1 -1
  406. package/src/web/scrapers/snapcraft.ts +2 -2
  407. package/src/web/scrapers/sourcegraph.ts +1 -1
  408. package/src/web/scrapers/spdx.ts +3 -3
  409. package/src/web/scrapers/spotify.ts +0 -1
  410. package/src/web/scrapers/twitter.ts +1 -1
  411. package/src/web/scrapers/types.ts +1 -2
  412. package/src/web/scrapers/utils.ts +5 -5
  413. package/src/web/scrapers/wikidata.ts +3 -3
  414. package/src/web/scrapers/youtube.ts +9 -14
  415. package/src/web/search/auth.ts +5 -10
  416. package/src/web/search/index.ts +11 -21
  417. package/src/web/search/providers/anthropic.ts +3 -9
  418. package/src/web/search/providers/exa.ts +6 -10
  419. package/src/web/search/providers/perplexity.ts +5 -5
  420. package/src/web/search/render.ts +129 -175
  421. package/tsconfig.json +0 -42
package/CHANGELOG.md CHANGED
@@ -2,6 +2,131 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [8.2.0] - 2026-01-24
6
+
7
+ ### Added
8
+ - Added `omp commit` command to generate conventional commits with changelog updates
9
+ - Added agentic commit mode with commit-specific tools and `--legacy` fallback
10
+ - Added configurable settings for map-reduce analysis including concurrency, timeout, file thresholds, and token limits
11
+ - Added support for excluding YAML lock files (`.lock.yml`, `.lock.yaml`, `-lock.yml`, `-lock.yaml`) from commit analysis
12
+ - Added new TUI component library with reusable rendering utilities including code cells, file lists, tree lists, status lines, and output blocks
13
+ - Added renderCodeCell component for displaying code with optional output sections, supporting syntax highlighting and status indicators
14
+ - Added renderFileList component for rendering file/directory listings with language icons and metadata
15
+ - Added renderTreeList component for hierarchical tree-based item rendering with expand/collapse support
16
+ - Added renderStatusLine component for standardized tool status headers with icons, descriptions, and metadata
17
+ - Added renderOutputBlock component for bordered output containers with structured sections
18
+ - Added renderOutputBlock to Bash tool for improved output formatting with status indicators
19
+ - Added `--legacy` flag to `omp commit` for using the deterministic pipeline instead of agentic mode
20
+ - Added split commit support to automatically create multiple atomic commits for unrelated changes
21
+ - Added git hunk inspection tools for fine-grained diff analysis in commit generation
22
+ - Added commit message validation with filler word and meta phrase detection
23
+ - Added automatic unicode normalization in commit summaries
24
+ - Added real-time progress output to agentic commit mode showing thinking status, tool calls, and completion summary
25
+ - Added hunk-level staging support in split commits allowing partial file changes per commit
26
+ - Added dependency ordering for split commits ensuring commits are applied in correct sequence
27
+ - Added circular dependency detection with validation errors for split commit plans
28
+ - Added parallel file analysis with cross-file context awareness via `analyze_files` tool
29
+ - Added AGENTS.md context file discovery for commit generation
30
+ - Added progress indicators during changelog generation and model resolution
31
+ - Added propose_changelog tool for agent-provided changelog entries in agentic commit workflow
32
+ - Added fallback commit generation when agentic mode fails, using file pattern analysis and heuristic-based type inference
33
+ - Added trivial change detection to automatically classify whitespace-only and import-reorganization commits
34
+ - Added support for pre-computed file observations in commit agent to skip redundant analyze_files calls
35
+ - Added diff content caching with smart file prioritization to optimize token usage in large changesets
36
+ - Added lock file filtering (17 patterns including Cargo.lock, package-lock.json, bun.lock) from commit analysis
37
+ - Added changelog deletion support to remove outdated entries via the changelog proposal interface
38
+ - Added support for pre-computed changelog entries in commit agent to display existing unreleased sections for potential deletion
39
+ - Added `ExistingChangelogEntries` interface to track changelog sections by path for changelog proposal context
40
+ - Added conditional `analyze_files` skipping in commit agent when pre-analyzed observations are provided
41
+ - Added guidance to commit agent prompts instructing subagents to write files directly instead of returning changes for manual application
42
+ - Added mermaid diagram rendering with terminal graphics support (Kitty/iTerm2) for markdown output
43
+ - Added renderMermaidToPng utility for converting mermaid code blocks to terminal-displayable PNG images via mmdc CLI
44
+ - Added mermaid block extraction with content-addressed hashing for deduplication and cache lookup
45
+ - Added background mermaid pre-rendering in assistant messages for responsive diagram display
46
+ - Added two-level mermaid caching with pending deduplication to prevent redundant renders
47
+ - Added Python kernel session pooling with MAX_KERNEL_SESSIONS limit and automatic eviction of oldest sessions
48
+ - Added automatic idle kernel session cleanup timer (5-minute timeout, 30-second interval)
49
+ - Added types/assets/index.d.ts for global TypeScript module declarations supporting `.md`, `.py`, and `.wasm?raw` imports
50
+ - Added bunfig.toml loader configuration for importing markdown, Python, and WASM files as text modules
51
+ - Added color manipulation utilities (hexToHsv, hsvToHex, shiftHue) to pi-utils for accessible theme adjustments
52
+ - Added color-blind mode setting for improved accessibility
53
+ - Added filesystem error type guards (isEnoent, isEacces, isPerm, isEnotempty, isFsError, hasFsCode) to pi-utils for safe error handling
54
+ - Added tarball installation test Dockerfile to validate npm publish/install flow
55
+
56
+ ### Changed
57
+ - Changed changelog diff truncation limit to be configurable via settings
58
+ - Changed tool result rendering to use new TUI component library across multiple tools (bash, calculator, fetch, find, grep, ls, notebook, python, read, ssh, write, lsp, web search) for consistent output formatting
59
+ - Changed Bash tool output rendering to use renderOutputBlock with proper section handling and width-aware truncation
60
+ - Changed Python tool output rendering to use renderCodeCell component for code cell display with status indicators
61
+ - Changed Read tool output rendering to use renderCodeCell with syntax highlighting and warnings display
62
+ - Changed Write tool output rendering to use renderCodeCell for code display with streaming preview support
63
+ - Changed Fetch tool output rendering to use renderOutputBlock with metadata and content preview sections
64
+ - Changed LSP tool output rendering to use renderStatusLine and renderOutputBlock for structured output display
65
+ - Changed Web Search result rendering to use renderOutputBlock with answer, sources, related questions, and metadata sections
66
+ - Changed Find, Grep, and Ls tools to use renderFileList and renderTreeList for consistent file/item listing
67
+ - Changed Calculator tool result rendering to use renderTreeList for result item display
68
+ - Changed Notebook and TodoWrite tools to use new TUI rendering components for consistent output format
69
+ - Refactored render-utils to move tree-related utilities to TUI module (getTreeBranch, getTreeContinuePrefix)
70
+ - Changed import organization in sdk.ts for consistency
71
+ - Changed tool result rendering to merge call and result displays, showing tool arguments (command, pattern, query, path) in result headers for Bash, Calculator, Fetch, Find, Grep, Ls, LSP, Notebook, Read, SSH, TodoWrite, Web Search, and Write tools
72
+ - Changed Read tool title to display line range when offset or limit arguments are provided
73
+ - Changed worker instantiation to use direct URL import instead of pre-bundled worker files
74
+ - Changed `omp commit` to use agentic mode by default with tool-based git inspection
75
+ - Changed agentic commit progress output to show real-time thinking previews and structured tool argument details
76
+ - Changed agentic commit progress output to display full multi-line assistant messages and render tool arguments with tree-style formatting for improved readability
77
+ - Changed agentic commit progress output to render assistant messages as formatted Markdown with proper word wrapping
78
+ - Changed output block border color to reflect state (error, success, warning) for improved visual feedback
79
+ - Changed LSP hover rendering to display documentation text before code blocks in both collapsed and expanded views
80
+ - Changed Write tool to show streaming preview of content being written with syntax highlighting
81
+ - Changed Read tool to display resolved path information when reading from URLs or symlinks
82
+ - Changed Calculator tool result display to show both expression and output (e.g., `2+2 = 4`) instead of just the result
83
+ - Changed Python tool output to group status information under a labeled section for clearer organization
84
+ - Changed SSH tool output to apply consistent styling to non-ANSI output lines
85
+ - Changed Todo Write tool to respect expanded/collapsed state and use standard preview limits
86
+ - Changed Web Search related questions to respect expanded/collapsed state instead of always showing all items
87
+ - Changed empty and error state rendering across multiple tools (Find, Grep, Ls, Notebook, Calculator, Ask) to include consistent status headers
88
+ - Changed split commit to support hunk selectors (all, indices, or line ranges) instead of whole-file staging
89
+ - Changed `analyze_file` tool to `analyze_files` for batch parallel analysis of multiple files
90
+ - Switched agentic commit from auto-generated changelogs to agent-proposed entries with validation and retry logic
91
+ - Commit agent now resolves a separate smaller model for commit generation instead of reusing the primary model
92
+ - Normalized code formatting and indentation across tool renderers and UI components
93
+ - Changed git-file-diff tool to prioritize files by type and respect token budget limits with intelligent truncation
94
+ - Changed git-overview tool to filter and report excluded lock files separately from staged files
95
+ - Changed analyze-file tool to include file type inference and enriched related files with line counts
96
+ - Changed propose-changelog tool to support optional deletion entries for removing existing changelog items
97
+ - Changed commit agent to accept pre-computed file observations and format them into session prompts
98
+ - Changed changelog skip condition in `applyChangelogProposals` to also check for empty deletions object
99
+ - Changed `createCommitTools()` to build tools array incrementally with conditional `analyze_files` inclusion based on `enableAnalyzeFiles` flag
100
+ - Changed system prompt guidance to clarify that pre-computed observations prevent redundant `analyze_files` calls
101
+ - Removed map-reduce preprocessing phase from commit agent for faster iteration
102
+ - Changed commit agent to process full diff text directly instead of pre-computed file observations
103
+ - Changed commit agent initialization to load settingsManager, authStorage, modelRegistry, and stagedFiles in parallel
104
+ - Changed commit agent prompt to remove pre-computed observations guidance and encourage direct analyze_files usage
105
+ - Changed AuthStorage from constructor-based instantiation to async factory method (AuthStorage.create())
106
+ - Changed Python kernel resource management with gateway shutdown on session disposal
107
+ - Updated TypeScript configuration for better publish-time configuration handling with tsconfig.publish.json
108
+ - Updated TypeScript and Bun configuration for monorepo-wide build consistency and reduced boilerplate
109
+ - Removed WASM base64 encoding build script; imports now use Bun loader with `wasm?raw` query parameter
110
+ - Unified TypeScript checking pipeline with tsgo-based configuration instead of per-package tsconfig.publish.json boilerplate
111
+ - Refactored scanDirectoryForSkills to use async/await with concurrent directory scanning via Promise.all
112
+ - Improved error logging in settings manager for config file access failures
113
+ - Migrated node module imports from named to namespace imports across all packages for consistency with project guidelines
114
+ - Improved filesystem error handling in extension loader with additional type guards (isEacces, hasFsCode) for permission and EPERM errors
115
+ - Changed model discovery to synchronous file operations for more immediate initialization
116
+
117
+ ### Fixed
118
+ - Fixed database busy errors during concurrent access by adding retry logic with exponential backoff when opening storage
119
+ - Find tool now rejects searches from root directory and enforces a 5-second timeout on fd operations
120
+ - Commit command now exits cleanly with exit code 0 on success
121
+ - Handle undefined code parameter in code cell renderer
122
+ - Fixed indentation formatting in split-commit tool function signature
123
+ - Fixed changelog application to process proposals containing only deletion entries without additions
124
+ - Fixed indentation formatting in Python tool output renderer
125
+ - Fixed Python kernel resource management with proper timing instrumentation for performance monitoring
126
+ - Fixed model discovery to re-check file existence after JSON to YAML migration
127
+ - Fixed branch change callbacks in footer component to properly update state after git resolution
128
+ - Added guard clause in plugin-settings to prevent null reference when settings list is undefined
129
+ - Fixed agent task discovery to support symlinks and improved error handling for file access failures
5
130
  ## [8.0.0] - 2026-01-23
6
131
  ### Added
7
132
 
package/docs/session.md CHANGED
@@ -31,10 +31,10 @@ All entries (except `SessionHeader`) extend `SessionEntryBase`:
31
31
 
32
32
  ```typescript
33
33
  interface SessionEntryBase {
34
- type: string;
35
- id: string; // 8-char hex ID
36
- parentId: string | null; // Parent entry ID (null for first entry)
37
- timestamp: string; // ISO timestamp
34
+ type: string;
35
+ id: string; // 8-char hex ID
36
+ parentId: string | null; // Parent entry ID (null for first entry)
37
+ timestamp: string; // ISO timestamp
38
38
  }
39
39
  ```
40
40
 
@@ -45,13 +45,20 @@ interface SessionEntryBase {
45
45
  First line of the file. Metadata only, not part of the tree (no `id`/`parentId`).
46
46
 
47
47
  ```json
48
- {"type":"session","version":2,"id":"uuid","timestamp":"2024-12-03T14:00:00.000Z","cwd":"/path/to/project"}
48
+ { "type": "session", "version": 2, "id": "uuid", "timestamp": "2024-12-03T14:00:00.000Z", "cwd": "/path/to/project" }
49
49
  ```
50
50
 
51
51
  For sessions with a parent (created via `/branch` or `newSession({ parentSession })`):
52
52
 
53
53
  ```json
54
- {"type":"session","version":2,"id":"uuid","timestamp":"2024-12-03T14:00:00.000Z","cwd":"/path/to/project","parentSession":"/path/to/original/session.jsonl"}
54
+ {
55
+ "type": "session",
56
+ "version": 2,
57
+ "id": "uuid",
58
+ "timestamp": "2024-12-03T14:00:00.000Z",
59
+ "cwd": "/path/to/project",
60
+ "parentSession": "/path/to/original/session.jsonl"
61
+ }
55
62
  ```
56
63
 
57
64
  ### SessionMessageEntry
@@ -69,7 +76,14 @@ A message in the conversation. The `message` field contains an `AgentMessage`.
69
76
  Emitted when the user switches models mid-session.
70
77
 
71
78
  ```json
72
- {"type":"model_change","id":"d4e5f6g7","parentId":"c3d4e5f6","timestamp":"2024-12-03T14:05:00.000Z","provider":"openai","modelId":"gpt-4o"}
79
+ {
80
+ "type": "model_change",
81
+ "id": "d4e5f6g7",
82
+ "parentId": "c3d4e5f6",
83
+ "timestamp": "2024-12-03T14:05:00.000Z",
84
+ "provider": "openai",
85
+ "modelId": "gpt-4o"
86
+ }
73
87
  ```
74
88
 
75
89
  ### ThinkingLevelChangeEntry
@@ -77,7 +91,13 @@ Emitted when the user switches models mid-session.
77
91
  Emitted when the user changes the thinking/reasoning level.
78
92
 
79
93
  ```json
80
- {"type":"thinking_level_change","id":"e5f6g7h8","parentId":"d4e5f6g7","timestamp":"2024-12-03T14:06:00.000Z","thinkingLevel":"high"}
94
+ {
95
+ "type": "thinking_level_change",
96
+ "id": "e5f6g7h8",
97
+ "parentId": "d4e5f6g7",
98
+ "timestamp": "2024-12-03T14:06:00.000Z",
99
+ "thinkingLevel": "high"
100
+ }
81
101
  ```
82
102
 
83
103
  ### CompactionEntry
@@ -85,10 +105,19 @@ Emitted when the user changes the thinking/reasoning level.
85
105
  Created when context is compacted. Stores a summary of earlier messages.
86
106
 
87
107
  ```json
88
- {"type":"compaction","id":"f6g7h8i9","parentId":"e5f6g7h8","timestamp":"2024-12-03T14:10:00.000Z","summary":"User discussed X, Y, Z...","firstKeptEntryId":"c3d4e5f6","tokensBefore":50000}
108
+ {
109
+ "type": "compaction",
110
+ "id": "f6g7h8i9",
111
+ "parentId": "e5f6g7h8",
112
+ "timestamp": "2024-12-03T14:10:00.000Z",
113
+ "summary": "User discussed X, Y, Z...",
114
+ "firstKeptEntryId": "c3d4e5f6",
115
+ "tokensBefore": 50000
116
+ }
89
117
  ```
90
118
 
91
119
  Optional fields:
120
+
92
121
  - `details`: Compaction-implementation specific data (e.g., file operations for default implementation, or custom data for custom hook implementations)
93
122
  - `fromHook`: `true` if generated by a hook, `false`/`undefined` if omp-generated
94
123
 
@@ -97,10 +126,18 @@ Optional fields:
97
126
  Created when switching branches via `/tree` with an LLM generated summary of the left branch up to the common ancestor. Captures context from the abandoned path.
98
127
 
99
128
  ```json
100
- {"type":"branch_summary","id":"g7h8i9j0","parentId":"a1b2c3d4","timestamp":"2024-12-03T14:15:00.000Z","fromId":"f6g7h8i9","summary":"Branch explored approach A..."}
129
+ {
130
+ "type": "branch_summary",
131
+ "id": "g7h8i9j0",
132
+ "parentId": "a1b2c3d4",
133
+ "timestamp": "2024-12-03T14:15:00.000Z",
134
+ "fromId": "f6g7h8i9",
135
+ "summary": "Branch explored approach A..."
136
+ }
101
137
  ```
102
138
 
103
139
  Optional fields:
140
+
104
141
  - `details`: File tracking data (`{ readFiles: string[], modifiedFiles: string[] }`) for default implementation, arbitrary for custom implementation
105
142
  - `fromHook`: `true` if generated by a hook
106
143
 
@@ -109,7 +146,14 @@ Optional fields:
109
146
  Hook state persistence. Does NOT participate in LLM context.
110
147
 
111
148
  ```json
112
- {"type":"custom","id":"h8i9j0k1","parentId":"g7h8i9j0","timestamp":"2024-12-03T14:20:00.000Z","customType":"my-hook","data":{"count":42}}
149
+ {
150
+ "type": "custom",
151
+ "id": "h8i9j0k1",
152
+ "parentId": "g7h8i9j0",
153
+ "timestamp": "2024-12-03T14:20:00.000Z",
154
+ "customType": "my-hook",
155
+ "data": { "count": 42 }
156
+ }
113
157
  ```
114
158
 
115
159
  Use `customType` to identify your hook's entries on reload.
@@ -119,10 +163,19 @@ Use `customType` to identify your hook's entries on reload.
119
163
  Hook-injected messages that DO participate in LLM context.
120
164
 
121
165
  ```json
122
- {"type":"custom_message","id":"i9j0k1l2","parentId":"h8i9j0k1","timestamp":"2024-12-03T14:25:00.000Z","customType":"my-hook","content":"Injected context...","display":true}
166
+ {
167
+ "type": "custom_message",
168
+ "id": "i9j0k1l2",
169
+ "parentId": "h8i9j0k1",
170
+ "timestamp": "2024-12-03T14:25:00.000Z",
171
+ "customType": "my-hook",
172
+ "content": "Injected context...",
173
+ "display": true
174
+ }
123
175
  ```
124
176
 
125
177
  Fields:
178
+
126
179
  - `content`: String or `(TextContent | ImageContent)[]` (same as UserMessage)
127
180
  - `display`: `true` = show in TUI with purple styling, `false` = hidden
128
181
  - `details`: Optional hook-specific metadata (not sent to LLM)
@@ -132,7 +185,14 @@ Fields:
132
185
  User-defined bookmark/marker on an entry.
133
186
 
134
187
  ```json
135
- {"type":"label","id":"j0k1l2m3","parentId":"i9j0k1l2","timestamp":"2024-12-03T14:30:00.000Z","targetId":"a1b2c3d4","label":"checkpoint-1"}
188
+ {
189
+ "type": "label",
190
+ "id": "j0k1l2m3",
191
+ "parentId": "i9j0k1l2",
192
+ "timestamp": "2024-12-03T14:30:00.000Z",
193
+ "targetId": "a1b2c3d4",
194
+ "label": "checkpoint-1"
195
+ }
136
196
  ```
137
197
 
138
198
  Set `label` to `undefined` to clear a label.
@@ -140,6 +200,7 @@ Set `label` to `undefined` to clear a label.
140
200
  ## Tree Structure
141
201
 
142
202
  Entries form a tree:
203
+
143
204
  - First entry has `parentId: null`
144
205
  - Each subsequent entry points to its parent via `parentId`
145
206
  - Branching creates new children from an earlier entry
@@ -166,42 +227,42 @@ Entries form a tree:
166
227
  ## Parsing Example
167
228
 
168
229
  ```typescript
169
- import { readFileSync } from "fs";
230
+ import * as fs from "node:fs";
170
231
 
171
- const lines = readFileSync("session.jsonl", "utf8").trim().split("\n");
232
+ const lines = fs.readFileSync("session.jsonl", "utf8").trim().split("\n");
172
233
 
173
234
  for (const line of lines) {
174
- const entry = JSON.parse(line);
175
-
176
- switch (entry.type) {
177
- case "session":
178
- console.log(`Session v${entry.version ?? 1}: ${entry.id}`);
179
- break;
180
- case "message":
181
- console.log(`[${entry.id}] ${entry.message.role}: ${JSON.stringify(entry.message.content)}`);
182
- break;
183
- case "compaction":
184
- console.log(`[${entry.id}] Compaction: ${entry.tokensBefore} tokens summarized`);
185
- break;
186
- case "branch_summary":
187
- console.log(`[${entry.id}] Branch from ${entry.fromId}`);
188
- break;
189
- case "custom":
190
- console.log(`[${entry.id}] Custom (${entry.customType}): ${JSON.stringify(entry.data)}`);
191
- break;
192
- case "custom_message":
193
- console.log(`[${entry.id}] Hook message (${entry.customType}): ${entry.content}`);
194
- break;
195
- case "label":
196
- console.log(`[${entry.id}] Label "${entry.label}" on ${entry.targetId}`);
197
- break;
198
- case "model_change":
199
- console.log(`[${entry.id}] Model: ${entry.provider}/${entry.modelId}`);
200
- break;
201
- case "thinking_level_change":
202
- console.log(`[${entry.id}] Thinking: ${entry.thinkingLevel}`);
203
- break;
204
- }
235
+ const entry = JSON.parse(line);
236
+
237
+ switch (entry.type) {
238
+ case "session":
239
+ console.log(`Session v${entry.version ?? 1}: ${entry.id}`);
240
+ break;
241
+ case "message":
242
+ console.log(`[${entry.id}] ${entry.message.role}: ${JSON.stringify(entry.message.content)}`);
243
+ break;
244
+ case "compaction":
245
+ console.log(`[${entry.id}] Compaction: ${entry.tokensBefore} tokens summarized`);
246
+ break;
247
+ case "branch_summary":
248
+ console.log(`[${entry.id}] Branch from ${entry.fromId}`);
249
+ break;
250
+ case "custom":
251
+ console.log(`[${entry.id}] Custom (${entry.customType}): ${JSON.stringify(entry.data)}`);
252
+ break;
253
+ case "custom_message":
254
+ console.log(`[${entry.id}] Hook message (${entry.customType}): ${entry.content}`);
255
+ break;
256
+ case "label":
257
+ console.log(`[${entry.id}] Label "${entry.label}" on ${entry.targetId}`);
258
+ break;
259
+ case "model_change":
260
+ console.log(`[${entry.id}] Model: ${entry.provider}/${entry.modelId}`);
261
+ break;
262
+ case "thinking_level_change":
263
+ console.log(`[${entry.id}] Thinking: ${entry.thinkingLevel}`);
264
+ break;
265
+ }
205
266
  }
206
267
  ```
207
268
 
@@ -210,12 +271,14 @@ for (const line of lines) {
210
271
  Key methods for working with sessions programmatically:
211
272
 
212
273
  ### Creation
274
+
213
275
  - `SessionManager.create(cwd, sessionDir?)` - New session
214
276
  - `SessionManager.open(path, sessionDir?)` - Open existing
215
277
  - `SessionManager.continueRecent(cwd, sessionDir?)` - Continue most recent or create new
216
278
  - `SessionManager.inMemory(cwd?)` - No file persistence
217
279
 
218
280
  ### Appending (all return entry ID)
281
+
219
282
  - `appendMessage(message)` - Add message
220
283
  - `appendThinkingLevelChange(level)` - Record thinking change
221
284
  - `appendModelChange(provider, modelId)` - Record model change
@@ -225,6 +288,7 @@ Key methods for working with sessions programmatically:
225
288
  - `appendLabelChange(targetId, label)` - Set/clear label
226
289
 
227
290
  ### Tree Navigation
291
+
228
292
  - `getLeafId()` - Current position
229
293
  - `getEntry(id)` - Get entry by ID
230
294
  - `getPath(fromId?)` - Walk from entry to root
@@ -235,6 +299,7 @@ Key methods for working with sessions programmatically:
235
299
  - `branchWithSummary(entryId, summary, details?, fromHook?)` - Branch with context summary
236
300
 
237
301
  ### Context
302
+
238
303
  - `buildSessionContext()` - Get messages for LLM
239
304
  - `getEntries()` - All entries (excluding header)
240
305
  - `getHeader()` - Session metadata
@@ -1,6 +1,6 @@
1
1
  import type { CustomToolFactory } from "@oh-my-pi/pi-coding-agent";
2
2
 
3
- const factory: CustomToolFactory = (pi) => ({
3
+ const factory: CustomToolFactory = pi => ({
4
4
  name: "hello",
5
5
  label: "Hello",
6
6
  description: "A simple greeting tool",
@@ -7,7 +7,6 @@
7
7
  *
8
8
  * The onSession callback reconstructs state by scanning past tool results.
9
9
  */
10
-
11
10
  import type {
12
11
  CustomTool,
13
12
  CustomToolContext,
@@ -29,7 +28,7 @@ interface TodoDetails {
29
28
  error?: string;
30
29
  }
31
30
 
32
- const factory: CustomToolFactory = (pi) => {
31
+ const factory: CustomToolFactory = pi => {
33
32
  const { Type } = pi.typebox;
34
33
  const { StringEnum, Text } = pi.pi;
35
34
 
@@ -85,7 +84,7 @@ const factory: CustomToolFactory = (pi) => {
85
84
  {
86
85
  type: "text",
87
86
  text: todos.length
88
- ? todos.map((t) => `[${t.done ? "x" : " "}] #${t.id}: ${t.text}`).join("\n")
87
+ ? todos.map(t => `[${t.done ? "x" : " "}] #${t.id}: ${t.text}`).join("\n")
89
88
  : "No todos",
90
89
  },
91
90
  ],
@@ -114,7 +113,7 @@ const factory: CustomToolFactory = (pi) => {
114
113
  details: { action: "toggle", todos: [...todos], nextId, error: "id required" },
115
114
  };
116
115
  }
117
- const todo = todos.find((t) => t.id === params.id);
116
+ const todo = todos.find(t => t.id === params.id);
118
117
  if (!todo) {
119
118
  return {
120
119
  content: [{ type: "text", text: `Todo #${params.id} not found` }],
@@ -5,7 +5,6 @@
5
5
  * These features are now exposed directly on the ExtensionAPI, matching
6
6
  * the CustomToolAPI interface.
7
7
  */
8
-
9
8
  import type { ExtensionAPI } from "@oh-my-pi/pi-coding-agent";
10
9
 
11
10
  export default function (pi: ExtensionAPI) {
@@ -2,7 +2,6 @@
2
2
  * Example extension that uses a 3rd party dependency (chalk).
3
3
  * Tests that jiti can resolve npm modules correctly.
4
4
  */
5
-
6
5
  import type { ExtensionAPI } from "@oh-my-pi/pi-coding-agent";
7
6
  import chalk from "chalk";
8
7
 
@@ -14,12 +13,12 @@ export default function (pi: ExtensionAPI) {
14
13
  console.log(`${chalk.blue("[chalk-logger]")} Agent starting`);
15
14
  });
16
15
 
17
- pi.on("tool_call", async (event) => {
16
+ pi.on("tool_call", async event => {
18
17
  console.log(`${chalk.yellow("[chalk-logger]")} Tool: ${chalk.cyan(event.toolName)}`);
19
18
  return undefined;
20
19
  });
21
20
 
22
- pi.on("agent_end", async (event) => {
21
+ pi.on("agent_end", async event => {
23
22
  const count = event.messages.length;
24
23
  console.log(`${chalk.green("[chalk-logger]")} Done with ${chalk.bold(String(count))} messages`);
25
24
  });
@@ -3,7 +3,6 @@
3
3
  *
4
4
  * Demonstrates using ExtensionAPI's logger, typebox, and pi module access.
5
5
  */
6
-
7
6
  import type { ExtensionAPI } from "@oh-my-pi/pi-coding-agent";
8
7
 
9
8
  export default function (pi: ExtensionAPI) {
@@ -9,7 +9,6 @@
9
9
  * 2. Use /pirate to toggle pirate mode
10
10
  * 3. When enabled, the agent will respond like a pirate
11
11
  */
12
-
13
12
  import type { ExtensionAPI } from "@oh-my-pi/pi-coding-agent";
14
13
 
15
14
  export default function pirateExtension(pi: ExtensionAPI) {
@@ -18,7 +18,6 @@
18
18
  * 2. Use /plan to toggle plan mode on/off
19
19
  * 3. Or start in plan mode with --plan flag
20
20
  */
21
-
22
21
  import type { ExtensionAPI, ExtensionContext } from "@oh-my-pi/pi-coding-agent";
23
22
  import { Key } from "@oh-my-pi/pi-tui";
24
23
 
@@ -120,12 +119,12 @@ const SAFE_COMMANDS = [
120
119
  ];
121
120
 
122
121
  function isSafeCommand(command: string): boolean {
123
- if (SAFE_COMMANDS.some((pattern) => pattern.test(command))) {
124
- if (!DESTRUCTIVE_PATTERNS.some((pattern) => pattern.test(command))) {
122
+ if (SAFE_COMMANDS.some(pattern => pattern.test(command))) {
123
+ if (!DESTRUCTIVE_PATTERNS.some(pattern => pattern.test(command))) {
125
124
  return true;
126
125
  }
127
126
  }
128
- if (DESTRUCTIVE_PATTERNS.some((pattern) => pattern.test(command))) {
127
+ if (DESTRUCTIVE_PATTERNS.some(pattern => pattern.test(command))) {
129
128
  return false;
130
129
  }
131
130
  return true;
@@ -223,7 +222,7 @@ export default function planModeExtension(pi: ExtensionAPI) {
223
222
  // Helper to update status displays
224
223
  function updateStatus(ctx: ExtensionContext) {
225
224
  if (executionMode && todoItems.length > 0) {
226
- const completed = todoItems.filter((t) => t.completed).length;
225
+ const completed = todoItems.filter(t => t.completed).length;
227
226
  ctx.ui.setStatus("plan-mode", ctx.ui.theme.fg("accent", `📋 ${completed}/${todoItems.length}`));
228
227
  } else if (planModeEnabled) {
229
228
  ctx.ui.setStatus("plan-mode", ctx.ui.theme.fg("warning", "⏸ plan"));
@@ -293,13 +292,13 @@ export default function planModeExtension(pi: ExtensionAPI) {
293
292
  // Register Shift+P shortcut
294
293
  pi.registerShortcut(Key.shift("p"), {
295
294
  description: "Toggle plan mode",
296
- handler: async (ctx) => {
295
+ handler: async ctx => {
297
296
  await togglePlanMode(ctx);
298
297
  },
299
298
  });
300
299
 
301
300
  // Block destructive bash in plan mode
302
- pi.on("tool_call", async (event) => {
301
+ pi.on("tool_call", async event => {
303
302
  if (!planModeEnabled) return;
304
303
  if (event.toolName !== "bash") return;
305
304
 
@@ -319,7 +318,7 @@ export default function planModeExtension(pi: ExtensionAPI) {
319
318
  if (!executionMode || todoItems.length === 0) return;
320
319
 
321
320
  // Mark the first uncompleted step as done when any tool succeeds
322
- const nextStep = todoItems.find((t) => !t.completed);
321
+ const nextStep = todoItems.find(t => !t.completed);
323
322
  if (nextStep) {
324
323
  nextStep.completed = true;
325
324
  updateStatus(ctx);
@@ -328,7 +327,7 @@ export default function planModeExtension(pi: ExtensionAPI) {
328
327
 
329
328
  // Filter out stale plan mode context messages from LLM context
330
329
  // This ensures the agent only sees the CURRENT state (plan mode on/off)
331
- pi.on("context", async (event) => {
330
+ pi.on("context", async event => {
332
331
  // Only filter when NOT in plan mode (i.e., when executing)
333
332
  if (planModeEnabled) {
334
333
  return;
@@ -336,7 +335,7 @@ export default function planModeExtension(pi: ExtensionAPI) {
336
335
 
337
336
  // Remove any previous plan-mode-context messages
338
337
  const _beforeCount = event.messages.length;
339
- const filtered = event.messages.filter((m) => {
338
+ const filtered = event.messages.filter(m => {
340
339
  if (m.role === "user" && Array.isArray(m.content)) {
341
340
  const hasOldContext = m.content.some(
342
341
  (c: { type: string; text?: string }) => c.type === "text" && c.text?.includes("[PLAN MODE ACTIVE]"),
@@ -381,8 +380,8 @@ Do NOT attempt to make changes - just describe what you would do.`,
381
380
  }
382
381
 
383
382
  if (executionMode && todoItems.length > 0) {
384
- const remaining = todoItems.filter((t) => !t.completed);
385
- const todoList = remaining.map((t) => `${t.step}. ${t.text}`).join("\n");
383
+ const remaining = todoItems.filter(t => !t.completed);
384
+ const todoList = remaining.map(t => `${t.step}. ${t.text}`).join("\n");
386
385
  return {
387
386
  message: {
388
387
  customType: "plan-execution-context",
@@ -402,10 +401,10 @@ Execute each step in order.`,
402
401
  pi.on("agent_end", async (event, ctx) => {
403
402
  // In execution mode, check if all steps complete
404
403
  if (executionMode && todoItems.length > 0) {
405
- const allComplete = todoItems.every((t) => t.completed);
404
+ const allComplete = todoItems.every(t => t.completed);
406
405
  if (allComplete) {
407
406
  // Show final completed list in chat
408
- const completedList = todoItems.map((t) => `~~${t.text}~~`).join("\n");
407
+ const completedList = todoItems.map(t => `~~${t.text}~~`).join("\n");
409
408
  pi.sendMessage(
410
409
  {
411
410
  customType: "plan-complete",
@@ -428,7 +427,7 @@ Execute each step in order.`,
428
427
 
429
428
  // Extract todos from last message
430
429
  const messages = event.messages;
431
- const lastAssistant = [...messages].reverse().find((m) => m.role === "assistant");
430
+ const lastAssistant = [...messages].reverse().find(m => m.role === "assistant");
432
431
  if (lastAssistant && Array.isArray(lastAssistant.content)) {
433
432
  const textContent = lastAssistant.content
434
433
  .filter(
@@ -541,7 +540,7 @@ Execute each step in order.`,
541
540
  // If no tools were called this turn, the agent was doing analysis/explanation
542
541
  // Mark the next uncompleted step as done
543
542
  if (!toolsCalledThisTurn) {
544
- const nextStep = todoItems.find((t) => !t.completed);
543
+ const nextStep = todoItems.find(t => !t.completed);
545
544
  if (nextStep) {
546
545
  nextStep.completed = true;
547
546
  updateStatus(ctx);
@@ -9,7 +9,6 @@
9
9
  * proper branching - when you branch, the todo state is automatically
10
10
  * correct for that point in history.
11
11
  */
12
-
13
12
  import { StringEnum } from "@oh-my-pi/pi-ai";
14
13
  import type { ExtensionAPI, ExtensionContext, Theme } from "@oh-my-pi/pi-coding-agent";
15
14
  import { matchesKey, Text, truncateToWidth } from "@oh-my-pi/pi-tui";
@@ -74,7 +73,7 @@ class TodoListComponent {
74
73
  if (this.todos.length === 0) {
75
74
  lines.push(truncateToWidth(` ${th.fg("dim", "No todos yet. Ask the agent to add some!")}`, width));
76
75
  } else {
77
- const done = this.todos.filter((t) => t.done).length;
76
+ const done = this.todos.filter(t => t.done).length;
78
77
  const total = this.todos.length;
79
78
  lines.push(truncateToWidth(` ${th.fg("muted", `${done}/${total} completed`)}`, width));
80
79
  lines.push("");
@@ -149,7 +148,7 @@ export default function (pi: ExtensionAPI) {
149
148
  {
150
149
  type: "text",
151
150
  text: todos.length
152
- ? todos.map((t) => `[${t.done ? "x" : " "}] #${t.id}: ${t.text}`).join("\n")
151
+ ? todos.map(t => `[${t.done ? "x" : " "}] #${t.id}: ${t.text}`).join("\n")
153
152
  : "No todos",
154
153
  },
155
154
  ],
@@ -178,7 +177,7 @@ export default function (pi: ExtensionAPI) {
178
177
  details: { action: "toggle", todos: [...todos], nextId, error: "id required" } as TodoDetails,
179
178
  };
180
179
  }
181
- const todo = todos.find((t) => t.id === params.id);
180
+ const todo = todos.find(t => t.id === params.id);
182
181
  if (!todo) {
183
182
  return {
184
183
  content: [{ type: "text", text: `Todo #${params.id} not found` }],