@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
package/CHANGELOG.md CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [8.2.0] - 2026-01-24
6
+
5
7
  ### Added
6
8
  - Added `omp commit` command to generate conventional commits with changelog updates
7
9
  - Added agentic commit mode with commit-specific tools and `--legacy` fallback
@@ -44,7 +46,12 @@
44
46
  - Added two-level mermaid caching with pending deduplication to prevent redundant renders
45
47
  - Added Python kernel session pooling with MAX_KERNEL_SESSIONS limit and automatic eviction of oldest sessions
46
48
  - Added automatic idle kernel session cleanup timer (5-minute timeout, 30-second interval)
47
- - Added WASM binary generation script for photon module distribution
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
48
55
 
49
56
  ### Changed
50
57
  - Changed changelog diff truncation limit to be configurable via settings
@@ -98,6 +105,14 @@
98
105
  - Changed AuthStorage from constructor-based instantiation to async factory method (AuthStorage.create())
99
106
  - Changed Python kernel resource management with gateway shutdown on session disposal
100
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
101
116
 
102
117
  ### Fixed
103
118
  - Fixed database busy errors during concurrent access by adding retry logic with exponential backoff when opening storage
@@ -107,6 +122,11 @@
107
122
  - Fixed indentation formatting in split-commit tool function signature
108
123
  - Fixed changelog application to process proposals containing only deletion entries without additions
109
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
110
130
  ## [8.0.0] - 2026-01-23
111
131
  ### Added
112
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` }],
@@ -8,7 +8,6 @@
8
8
  * 1. Copy this file to ~/.omp/agent/extensions/ (legacy: ~/.pi/agent/extensions/) or your project's .omp/extensions/
9
9
  * 2. Use /tools to open the tool selector
10
10
  */
11
-
12
11
  import type { ExtensionAPI, ExtensionContext } from "@oh-my-pi/pi-coding-agent";
13
12
  import { getSettingsListTheme } from "@oh-my-pi/pi-coding-agent";
14
13
  import { Container, type SettingItem, SettingsList } from "@oh-my-pi/pi-tui";
@@ -71,7 +70,7 @@ export default function toolsExtension(pi: ExtensionAPI) {
71
70
 
72
71
  await ctx.ui.custom((tui, theme, done) => {
73
72
  // Build settings items for each tool
74
- const items: SettingItem[] = allTools.map((tool) => ({
73
+ const items: SettingItem[] = allTools.map(tool => ({
75
74
  id: tool,
76
75
  label: tool,
77
76
  currentValue: enabledTools.has(tool) ? "enabled" : "disabled",
@@ -4,7 +4,6 @@
4
4
  *
5
5
  * Requires: npm install in this directory
6
6
  */
7
-
8
7
  import type { ExtensionAPI } from "@oh-my-pi/pi-coding-agent";
9
8
  import { Type } from "@sinclair/typebox";
10
9
  import ms from "ms";
@@ -4,7 +4,6 @@
4
4
  * Automatically commits changes when the agent exits.
5
5
  * Uses the last assistant message to generate a commit message.
6
6
  */
7
-
8
7
  import type { HookAPI } from "@oh-my-pi/pi-coding-agent";
9
8
 
10
9
  export default function (pi: HookAPI) {
@@ -27,7 +26,7 @@ export default function (pi: HookAPI) {
27
26
  if (Array.isArray(content)) {
28
27
  lastAssistantText = content
29
28
  .filter((c): c is { type: "text"; text: string } => c.type === "text")
30
- .map((c) => c.text)
29
+ .map(c => c.text)
31
30
  .join("\n");
32
31
  }
33
32
  break;
@@ -4,7 +4,6 @@
4
4
  * Prompts for confirmation before destructive session actions (clear, switch, branch).
5
5
  * Demonstrates how to cancel session events using the before_* events.
6
6
  */
7
-
8
7
  import type { HookAPI, SessionBeforeSwitchEvent, SessionMessageEntry } from "@oh-my-pi/pi-coding-agent";
9
8
 
10
9
  export default function (pi: HookAPI) {
@@ -12,7 +12,6 @@
12
12
  * Usage:
13
13
  * omp --hook examples/hooks/custom-compaction.ts
14
14
  */
15
-
16
15
  import { complete, getModel } from "@oh-my-pi/pi-ai";
17
16
  import type { HookAPI } from "@oh-my-pi/pi-coding-agent";
18
17
  import { convertToLlm, serializeConversation } from "@oh-my-pi/pi-coding-agent";
@@ -89,7 +88,7 @@ ${conversationText}
89
88
 
90
89
  const summary = response.content
91
90
  .filter((c): c is { type: "text"; text: string } => c.type === "text")
92
- .map((c) => c.text)
91
+ .map(c => c.text)
93
92
  .join("\n");
94
93
 
95
94
  if (!summary.trim()) {
@@ -4,7 +4,6 @@
4
4
  * Prevents session changes when there are uncommitted git changes.
5
5
  * Useful to ensure work is committed before switching context.
6
6
  */
7
-
8
7
  import type { HookAPI, HookContext } from "@oh-my-pi/pi-coding-agent";
9
8
 
10
9
  async function checkDirtyRepo(pi: HookAPI, ctx: HookContext, action: string): Promise<{ cancel: boolean } | undefined> {