@oh-my-pi/pi-coding-agent 15.12.3 → 15.13.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 (457) hide show
  1. package/CHANGELOG.md +347 -7
  2. package/dist/cli.js +1615 -1231
  3. package/dist/types/async/job-manager.d.ts +15 -0
  4. package/dist/types/autolearn/controller.d.ts +25 -0
  5. package/dist/types/autolearn/managed-skills.d.ts +45 -0
  6. package/dist/types/autoresearch/state.d.ts +1 -1
  7. package/dist/types/autoresearch/tools/init-experiment.d.ts +1 -1
  8. package/dist/types/autoresearch/tools/log-experiment.d.ts +1 -1
  9. package/dist/types/autoresearch/tools/run-experiment.d.ts +1 -1
  10. package/dist/types/autoresearch/tools/update-notes.d.ts +1 -1
  11. package/dist/types/autoresearch/types.d.ts +1 -1
  12. package/dist/types/cli/args.d.ts +19 -2
  13. package/dist/types/cli/models-cli.d.ts +49 -0
  14. package/dist/types/cli/session-picker.d.ts +1 -1
  15. package/dist/types/cli/setup-cli.d.ts +1 -1
  16. package/dist/types/cli/setup-model-picker.d.ts +14 -0
  17. package/dist/types/collab/protocol.d.ts +1 -1
  18. package/dist/types/commands/launch.d.ts +0 -3
  19. package/dist/types/commands/models.d.ts +33 -0
  20. package/dist/types/commands/say.d.ts +24 -0
  21. package/dist/types/commands/token.d.ts +25 -0
  22. package/dist/types/commit/agentic/tools/analyze-file.d.ts +1 -1
  23. package/dist/types/commit/agentic/tools/git-file-diff.d.ts +1 -1
  24. package/dist/types/commit/agentic/tools/git-hunk.d.ts +1 -1
  25. package/dist/types/commit/agentic/tools/git-overview.d.ts +1 -1
  26. package/dist/types/commit/agentic/tools/propose-changelog.d.ts +1 -1
  27. package/dist/types/commit/agentic/tools/propose-commit.d.ts +1 -1
  28. package/dist/types/commit/agentic/tools/recent-commits.d.ts +1 -1
  29. package/dist/types/commit/agentic/tools/schemas.d.ts +1 -1
  30. package/dist/types/commit/agentic/tools/split-commit.d.ts +1 -1
  31. package/dist/types/commit/changelog/generate.d.ts +1 -1
  32. package/dist/types/commit/shared-llm.d.ts +1 -1
  33. package/dist/types/config/keybindings.d.ts +3 -3
  34. package/dist/types/config/model-registry.d.ts +17 -0
  35. package/dist/types/config/models-config-schema.d.ts +13 -1
  36. package/dist/types/config/models-config.d.ts +8 -2
  37. package/dist/types/config/settings-schema.d.ts +281 -58
  38. package/dist/types/edit/hashline/params.d.ts +1 -1
  39. package/dist/types/edit/modes/apply-patch.d.ts +1 -1
  40. package/dist/types/edit/modes/patch.d.ts +1 -1
  41. package/dist/types/edit/modes/replace.d.ts +1 -1
  42. package/dist/types/export/html/index.d.ts +2 -1
  43. package/dist/types/extensibility/custom-commands/types.d.ts +2 -2
  44. package/dist/types/extensibility/custom-tools/types.d.ts +2 -2
  45. package/dist/types/extensibility/extensions/model-api.d.ts +17 -0
  46. package/dist/types/extensibility/extensions/runner.d.ts +3 -1
  47. package/dist/types/extensibility/extensions/types.d.ts +49 -3
  48. package/dist/types/extensibility/hooks/index.d.ts +2 -1
  49. package/dist/types/extensibility/hooks/types.d.ts +2 -2
  50. package/dist/types/extensibility/plugins/legacy-pi-compat.d.ts +9 -0
  51. package/dist/types/extensibility/plugins/loader.d.ts +11 -0
  52. package/dist/types/extensibility/shared-events.d.ts +1 -1
  53. package/dist/types/extensibility/skills.d.ts +10 -0
  54. package/dist/types/goals/guided-setup.d.ts +18 -0
  55. package/dist/types/goals/state.d.ts +1 -1
  56. package/dist/types/goals/tools/goal-tool.d.ts +1 -1
  57. package/dist/types/hindsight/transcript.d.ts +1 -1
  58. package/dist/types/index.d.ts +5 -0
  59. package/dist/types/internal-urls/local-protocol.d.ts +4 -2
  60. package/dist/types/lsp/types.d.ts +1 -1
  61. package/dist/types/main.d.ts +4 -3
  62. package/dist/types/mcp/manager.d.ts +8 -0
  63. package/dist/types/mcp/startup-events.d.ts +11 -0
  64. package/dist/types/memories/index.d.ts +7 -0
  65. package/dist/types/memory-backend/local-backend.d.ts +4 -3
  66. package/dist/types/mnemopi/config.d.ts +28 -0
  67. package/dist/types/modes/acp/acp-agent.d.ts +1 -2
  68. package/dist/types/modes/components/agent-hub.d.ts +6 -0
  69. package/dist/types/modes/components/assistant-message.d.ts +1 -2
  70. package/dist/types/modes/components/compaction-summary-message.d.ts +15 -1
  71. package/dist/types/modes/components/custom-editor.d.ts +39 -1
  72. package/dist/types/modes/components/custom-editor.test.d.ts +1 -0
  73. package/dist/types/modes/components/index.d.ts +1 -0
  74. package/dist/types/modes/components/logout-account-selector.d.ts +8 -0
  75. package/dist/types/modes/components/session-selector.d.ts +1 -1
  76. package/dist/types/modes/components/status-line/component.d.ts +9 -5
  77. package/dist/types/modes/components/status-line/types.d.ts +2 -1
  78. package/dist/types/modes/components/tool-execution.d.ts +26 -16
  79. package/dist/types/modes/components/transcript-container.d.ts +23 -2
  80. package/dist/types/modes/components/tree-selector.d.ts +1 -1
  81. package/dist/types/modes/components/usage-row.d.ts +3 -0
  82. package/dist/types/modes/controllers/command-controller.d.ts +2 -2
  83. package/dist/types/modes/controllers/event-controller.d.ts +0 -17
  84. package/dist/types/modes/controllers/input-controller.d.ts +14 -0
  85. package/dist/types/modes/controllers/selector-controller.d.ts +3 -1
  86. package/dist/types/modes/gradient-highlight.d.ts +9 -4
  87. package/dist/types/modes/image-references.d.ts +6 -0
  88. package/dist/types/modes/interactive-mode.d.ts +27 -6
  89. package/dist/types/modes/magic-keywords.d.ts +13 -1
  90. package/dist/types/modes/rpc/rpc-mode.d.ts +35 -1
  91. package/dist/types/modes/rpc/rpc-types.d.ts +9 -1
  92. package/dist/types/modes/runtime-init.d.ts +4 -0
  93. package/dist/types/modes/theme/theme.d.ts +13 -2
  94. package/dist/types/modes/types.d.ts +8 -7
  95. package/dist/types/modes/utils/ui-helpers.d.ts +1 -1
  96. package/dist/types/registry/agent-registry.d.ts +17 -0
  97. package/dist/types/secrets/obfuscator.d.ts +1 -1
  98. package/dist/types/session/agent-session.d.ts +28 -35
  99. package/dist/types/session/agent-storage.d.ts +2 -1
  100. package/dist/types/session/indexed-session-storage.d.ts +3 -3
  101. package/dist/types/session/messages.d.ts +8 -10
  102. package/dist/types/session/session-context.d.ts +39 -0
  103. package/dist/types/session/session-entries.d.ts +159 -0
  104. package/dist/types/session/session-listing.d.ts +69 -0
  105. package/dist/types/session/session-loader.d.ts +16 -0
  106. package/dist/types/session/session-manager.d.ts +85 -462
  107. package/dist/types/session/session-migrations.d.ts +12 -0
  108. package/dist/types/session/session-paths.d.ts +25 -0
  109. package/dist/types/session/session-persistence.d.ts +8 -0
  110. package/dist/types/session/session-storage.d.ts +11 -7
  111. package/dist/types/session/snapcompact-inline.d.ts +12 -1
  112. package/dist/types/session/snapcompact-savings-journal.d.ts +46 -0
  113. package/dist/types/session/tool-choice-queue.d.ts +6 -6
  114. package/dist/types/slash-commands/helpers/logout.d.ts +15 -0
  115. package/dist/types/stt/asr-client.d.ts +90 -0
  116. package/dist/types/stt/asr-protocol.d.ts +97 -0
  117. package/dist/types/stt/asr-worker.d.ts +2 -0
  118. package/dist/types/stt/downloader.d.ts +38 -0
  119. package/dist/types/stt/endpointer.d.ts +59 -0
  120. package/dist/types/stt/index.d.ts +5 -1
  121. package/dist/types/stt/models.d.ts +120 -0
  122. package/dist/types/stt/recorder.d.ts +17 -0
  123. package/dist/types/stt/stt-controller.d.ts +6 -0
  124. package/dist/types/stt/transcriber.d.ts +5 -7
  125. package/dist/types/stt/wav.d.ts +29 -0
  126. package/dist/types/system-prompt.d.ts +4 -0
  127. package/dist/types/task/executor.d.ts +2 -0
  128. package/dist/types/task/index.d.ts +9 -1
  129. package/dist/types/task/types.d.ts +37 -1
  130. package/dist/types/tools/ask.d.ts +1 -1
  131. package/dist/types/tools/ast-edit.d.ts +1 -1
  132. package/dist/types/tools/ast-grep.d.ts +1 -1
  133. package/dist/types/tools/bash.d.ts +3 -3
  134. package/dist/types/tools/browser/cmux/cmux-tab.d.ts +202 -0
  135. package/dist/types/tools/browser/cmux/rpc.d.ts +70 -0
  136. package/dist/types/tools/browser/cmux/socket-client.d.ts +19 -0
  137. package/dist/types/tools/browser/registry.d.ts +16 -3
  138. package/dist/types/tools/browser/render.d.ts +2 -0
  139. package/dist/types/tools/browser/tab-protocol.d.ts +2 -0
  140. package/dist/types/tools/browser/tab-supervisor.d.ts +16 -4
  141. package/dist/types/tools/browser.d.ts +3 -1
  142. package/dist/types/tools/checkpoint.d.ts +1 -1
  143. package/dist/types/tools/debug.d.ts +1 -1
  144. package/dist/types/tools/eval-render.d.ts +1 -1
  145. package/dist/types/tools/eval.d.ts +1 -1
  146. package/dist/types/tools/find.d.ts +1 -1
  147. package/dist/types/tools/gh.d.ts +1 -1
  148. package/dist/types/tools/image-gen.d.ts +1 -1
  149. package/dist/types/tools/index.d.ts +14 -2
  150. package/dist/types/tools/inspect-image.d.ts +1 -1
  151. package/dist/types/tools/irc.d.ts +2 -1
  152. package/dist/types/tools/job.d.ts +1 -1
  153. package/dist/types/tools/learn.d.ts +51 -0
  154. package/dist/types/tools/manage-skill.d.ts +40 -0
  155. package/dist/types/tools/memory-edit.d.ts +1 -1
  156. package/dist/types/tools/memory-recall.d.ts +1 -1
  157. package/dist/types/tools/memory-reflect.d.ts +1 -1
  158. package/dist/types/tools/memory-retain.d.ts +1 -1
  159. package/dist/types/tools/plan-mode-guard.d.ts +10 -0
  160. package/dist/types/tools/read.d.ts +1 -1
  161. package/dist/types/tools/render-mermaid.d.ts +1 -1
  162. package/dist/types/tools/renderers.d.ts +7 -11
  163. package/dist/types/tools/resolve.d.ts +1 -1
  164. package/dist/types/tools/review.d.ts +1 -1
  165. package/dist/types/tools/search-tool-bm25.d.ts +1 -1
  166. package/dist/types/tools/search.d.ts +1 -1
  167. package/dist/types/tools/ssh.d.ts +2 -2
  168. package/dist/types/tools/todo.d.ts +2 -2
  169. package/dist/types/tools/tts.d.ts +26 -1
  170. package/dist/types/tools/write.d.ts +2 -2
  171. package/dist/types/tts/downloader.d.ts +20 -0
  172. package/dist/types/tts/index.d.ts +8 -0
  173. package/dist/types/tts/models.d.ts +82 -0
  174. package/dist/types/tts/player.d.ts +32 -0
  175. package/dist/types/tts/runtime.d.ts +6 -0
  176. package/dist/types/tts/streaming-player.d.ts +41 -0
  177. package/dist/types/tts/tts-client.d.ts +93 -0
  178. package/dist/types/tts/tts-protocol.d.ts +95 -0
  179. package/dist/types/tts/tts-worker.d.ts +2 -0
  180. package/dist/types/tts/vocalizer.d.ts +41 -0
  181. package/dist/types/tts/wav.d.ts +8 -0
  182. package/dist/types/utils/clipboard.d.ts +4 -3
  183. package/dist/types/utils/image-loading.d.ts +18 -1
  184. package/dist/types/utils/thinking-display.d.ts +17 -0
  185. package/dist/types/utils/tool-choice.d.ts +8 -0
  186. package/dist/types/utils/tools-manager.d.ts +2 -1
  187. package/dist/types/utils/tools-manager.test.d.ts +1 -0
  188. package/dist/types/web/scrapers/github.d.ts +1 -1
  189. package/dist/types/web/search/index.d.ts +1 -1
  190. package/package.json +17 -16
  191. package/src/async/job-manager.ts +49 -0
  192. package/src/autolearn/controller.ts +139 -0
  193. package/src/autolearn/managed-skills.ts +257 -0
  194. package/src/autoresearch/state.ts +1 -1
  195. package/src/autoresearch/storage.ts +2 -1
  196. package/src/autoresearch/tools/init-experiment.ts +1 -1
  197. package/src/autoresearch/tools/log-experiment.ts +1 -1
  198. package/src/autoresearch/tools/run-experiment.ts +1 -1
  199. package/src/autoresearch/tools/update-notes.ts +1 -1
  200. package/src/autoresearch/types.ts +1 -1
  201. package/src/cli/args.ts +56 -10
  202. package/src/cli/auth-gateway-cli.ts +1 -1
  203. package/src/cli/bench-cli.ts +1 -1
  204. package/src/cli/dry-balance-cli.ts +1 -1
  205. package/src/cli/models-cli.ts +427 -0
  206. package/src/cli/session-picker.ts +2 -1
  207. package/src/cli/setup-cli.ts +148 -47
  208. package/src/cli/setup-model-picker.ts +43 -0
  209. package/src/cli-commands.ts +3 -0
  210. package/src/cli.ts +45 -13
  211. package/src/collab/host.ts +10 -13
  212. package/src/collab/protocol.ts +1 -1
  213. package/src/commands/launch.ts +0 -3
  214. package/src/commands/models.ts +61 -0
  215. package/src/commands/say.ts +102 -0
  216. package/src/commands/setup.ts +1 -1
  217. package/src/commands/token.ts +89 -0
  218. package/src/commit/agentic/tools/analyze-file.ts +4 -1
  219. package/src/commit/agentic/tools/git-file-diff.ts +1 -1
  220. package/src/commit/agentic/tools/git-hunk.ts +1 -1
  221. package/src/commit/agentic/tools/git-overview.ts +1 -1
  222. package/src/commit/agentic/tools/propose-changelog.ts +1 -1
  223. package/src/commit/agentic/tools/propose-commit.ts +1 -1
  224. package/src/commit/agentic/tools/recent-commits.ts +1 -1
  225. package/src/commit/agentic/tools/schemas.ts +1 -1
  226. package/src/commit/agentic/tools/split-commit.ts +1 -1
  227. package/src/commit/analysis/summary.ts +1 -1
  228. package/src/commit/changelog/generate.ts +1 -1
  229. package/src/commit/shared-llm.ts +1 -1
  230. package/src/config/keybindings.ts +2 -2
  231. package/src/config/model-discovery.ts +11 -5
  232. package/src/config/model-registry.ts +79 -21
  233. package/src/config/model-resolver.ts +2 -2
  234. package/src/config/models-config-schema.ts +5 -2
  235. package/src/config/models-config.ts +2 -1
  236. package/src/config/settings-schema.ts +266 -32
  237. package/src/config/settings.ts +10 -0
  238. package/src/discovery/builtin.ts +23 -1
  239. package/src/discovery/claude-plugins.ts +44 -5
  240. package/src/discovery/helpers.ts +41 -1
  241. package/src/edit/hashline/params.ts +1 -1
  242. package/src/edit/modes/apply-patch.ts +1 -1
  243. package/src/edit/modes/patch.ts +1 -1
  244. package/src/edit/modes/replace.ts +1 -1
  245. package/src/eval/__tests__/budget-bridge.test.ts +1 -1
  246. package/src/eval/agent-bridge.ts +1 -1
  247. package/src/eval/completion-bridge.ts +1 -1
  248. package/src/eval/js/shared/prelude.txt +69 -17
  249. package/src/export/html/index.ts +3 -6
  250. package/src/export/html/template.js +24 -2
  251. package/src/export/html/tool-views.generated.js +2 -2
  252. package/src/extensibility/custom-commands/loader.ts +1 -1
  253. package/src/extensibility/custom-commands/types.ts +2 -2
  254. package/src/extensibility/custom-tools/loader.ts +1 -1
  255. package/src/extensibility/custom-tools/types.ts +2 -2
  256. package/src/extensibility/extensions/loader.ts +2 -2
  257. package/src/extensibility/extensions/model-api.ts +41 -0
  258. package/src/extensibility/extensions/runner.ts +4 -0
  259. package/src/extensibility/extensions/types.ts +54 -3
  260. package/src/extensibility/extensions/wrapper.ts +41 -5
  261. package/src/extensibility/hooks/index.ts +2 -1
  262. package/src/extensibility/hooks/loader.ts +1 -1
  263. package/src/extensibility/hooks/types.ts +2 -2
  264. package/src/extensibility/plugins/legacy-pi-compat.ts +43 -13
  265. package/src/extensibility/plugins/loader.ts +30 -19
  266. package/src/extensibility/plugins/manager.ts +221 -90
  267. package/src/extensibility/shared-events.ts +1 -1
  268. package/src/extensibility/skills.ts +101 -5
  269. package/src/goals/guided-setup.ts +133 -0
  270. package/src/goals/state.ts +1 -1
  271. package/src/goals/tools/goal-tool.ts +1 -1
  272. package/src/hindsight/transcript.ts +1 -1
  273. package/src/index.ts +5 -0
  274. package/src/internal-urls/docs-index.generated.ts +13 -10
  275. package/src/internal-urls/history-protocol.ts +1 -1
  276. package/src/internal-urls/local-protocol.ts +29 -7
  277. package/src/lsp/types.ts +1 -1
  278. package/src/main.ts +27 -32
  279. package/src/mcp/config-writer.ts +7 -3
  280. package/src/mcp/manager.ts +11 -0
  281. package/src/mcp/startup-events.ts +21 -0
  282. package/src/mcp/transports/stdio.ts +2 -1
  283. package/src/memories/index.ts +149 -12
  284. package/src/memories/storage.ts +2 -1
  285. package/src/memory-backend/local-backend.ts +11 -5
  286. package/src/mnemopi/backend.ts +1 -0
  287. package/src/mnemopi/config.ts +112 -12
  288. package/src/modes/acp/acp-agent.ts +8 -53
  289. package/src/modes/acp/acp-event-mapper.ts +5 -1
  290. package/src/modes/components/agent-hub.ts +51 -5
  291. package/src/modes/components/assistant-message.ts +12 -44
  292. package/src/modes/components/compaction-summary-message.ts +125 -26
  293. package/src/modes/components/custom-editor.test.ts +96 -0
  294. package/src/modes/components/custom-editor.ts +164 -8
  295. package/src/modes/components/index.ts +1 -0
  296. package/src/modes/components/logout-account-selector.ts +130 -0
  297. package/src/modes/components/mcp-add-wizard.ts +1 -1
  298. package/src/modes/components/model-selector.ts +2 -2
  299. package/src/modes/components/session-selector.ts +1 -1
  300. package/src/modes/components/settings-defs.ts +7 -0
  301. package/src/modes/components/status-line/component.ts +54 -157
  302. package/src/modes/components/status-line/segments.ts +1 -1
  303. package/src/modes/components/status-line/types.ts +2 -1
  304. package/src/modes/components/tool-execution.ts +82 -43
  305. package/src/modes/components/transcript-container.ts +70 -1
  306. package/src/modes/components/tree-selector.ts +1 -1
  307. package/src/modes/components/usage-row.ts +18 -0
  308. package/src/modes/components/user-message.ts +4 -2
  309. package/src/modes/controllers/command-controller.ts +14 -16
  310. package/src/modes/controllers/event-controller.ts +101 -73
  311. package/src/modes/controllers/extension-ui-controller.ts +6 -0
  312. package/src/modes/controllers/input-controller.ts +311 -57
  313. package/src/modes/controllers/mcp-command-controller.ts +44 -3
  314. package/src/modes/controllers/selector-controller.ts +68 -12
  315. package/src/modes/controllers/streaming-reveal.ts +4 -3
  316. package/src/modes/gradient-highlight.ts +21 -9
  317. package/src/modes/image-references.ts +20 -0
  318. package/src/modes/interactive-mode.ts +288 -48
  319. package/src/modes/magic-keywords.ts +27 -5
  320. package/src/modes/rpc/rpc-mode.ts +146 -14
  321. package/src/modes/rpc/rpc-subagents.ts +2 -2
  322. package/src/modes/rpc/rpc-types.ts +8 -2
  323. package/src/modes/runtime-init.ts +28 -3
  324. package/src/modes/theme/theme.ts +99 -51
  325. package/src/modes/types.ts +6 -7
  326. package/src/modes/utils/hotkeys-markdown.ts +1 -1
  327. package/src/modes/utils/ui-helpers.ts +36 -7
  328. package/src/priority.json +5 -1
  329. package/src/prompts/agents/task.md +1 -0
  330. package/src/prompts/goals/guided-goal-interview.md +8 -0
  331. package/src/prompts/goals/guided-goal-system.md +12 -0
  332. package/src/prompts/memories/read-path.md +6 -0
  333. package/src/prompts/system/autolearn-guidance-learn.md +1 -0
  334. package/src/prompts/system/autolearn-guidance.md +7 -0
  335. package/src/prompts/system/autolearn-nudge.md +3 -0
  336. package/src/prompts/system/eager-task.md +7 -0
  337. package/src/prompts/system/eager-todo.md +11 -6
  338. package/src/prompts/system/empty-stop-retry.md +4 -6
  339. package/src/prompts/system/subagent-system-prompt.md +4 -0
  340. package/src/prompts/system/system-prompt.md +10 -5
  341. package/src/prompts/system/title-marker-instruction.md +1 -0
  342. package/src/prompts/system/title-system-marker.md +16 -0
  343. package/src/prompts/tools/job.md +1 -0
  344. package/src/prompts/tools/learn.md +7 -0
  345. package/src/prompts/tools/manage-skill.md +9 -0
  346. package/src/prompts/tools/task.md +3 -0
  347. package/src/registry/agent-registry.ts +30 -0
  348. package/src/sdk.ts +103 -43
  349. package/src/secrets/obfuscator.ts +1 -1
  350. package/src/session/agent-session.ts +331 -318
  351. package/src/session/agent-storage.ts +18 -9
  352. package/src/session/history-storage.ts +3 -2
  353. package/src/session/indexed-session-storage.ts +7 -10
  354. package/src/session/messages.ts +9 -11
  355. package/src/session/session-context.ts +352 -0
  356. package/src/session/session-dump-format.ts +4 -2
  357. package/src/session/session-entries.ts +194 -0
  358. package/src/session/session-listing.ts +588 -0
  359. package/src/session/session-loader.ts +106 -0
  360. package/src/session/session-manager.ts +968 -3064
  361. package/src/session/session-migrations.ts +78 -0
  362. package/src/session/session-paths.ts +193 -0
  363. package/src/session/session-persistence.ts +131 -0
  364. package/src/session/session-storage.ts +91 -30
  365. package/src/session/snapcompact-inline.ts +21 -1
  366. package/src/session/snapcompact-savings-journal.ts +113 -0
  367. package/src/session/tool-choice-queue.ts +23 -11
  368. package/src/slash-commands/builtin-registry.ts +40 -4
  369. package/src/slash-commands/helpers/logout.ts +88 -0
  370. package/src/stt/asr-client.ts +520 -0
  371. package/src/stt/asr-protocol.ts +65 -0
  372. package/src/stt/asr-worker.ts +790 -0
  373. package/src/stt/downloader.ts +107 -47
  374. package/src/stt/endpointer.ts +259 -0
  375. package/src/stt/index.ts +5 -1
  376. package/src/stt/models.ts +150 -0
  377. package/src/stt/recorder.ts +247 -60
  378. package/src/stt/stt-controller.ts +201 -22
  379. package/src/stt/transcriber.ts +37 -68
  380. package/src/stt/wav.ts +173 -0
  381. package/src/system-prompt.ts +8 -0
  382. package/src/task/agents.ts +1 -2
  383. package/src/task/executor.ts +49 -15
  384. package/src/task/index.ts +60 -6
  385. package/src/task/render.ts +83 -8
  386. package/src/task/types.ts +54 -1
  387. package/src/tools/ask.ts +9 -1
  388. package/src/tools/ast-edit.ts +1 -1
  389. package/src/tools/ast-grep.ts +1 -1
  390. package/src/tools/bash.ts +5 -4
  391. package/src/tools/browser/cmux/cmux-tab.ts +1264 -0
  392. package/src/tools/browser/cmux/rpc.ts +156 -0
  393. package/src/tools/browser/cmux/socket-client.ts +309 -0
  394. package/src/tools/browser/registry.ts +37 -3
  395. package/src/tools/browser/render.ts +6 -1
  396. package/src/tools/browser/tab-protocol.ts +2 -0
  397. package/src/tools/browser/tab-supervisor.ts +189 -18
  398. package/src/tools/browser/tab-worker.ts +1 -1
  399. package/src/tools/browser.ts +16 -1
  400. package/src/tools/checkpoint.ts +1 -1
  401. package/src/tools/debug.ts +1 -1
  402. package/src/tools/eval-render.ts +4 -3
  403. package/src/tools/eval.ts +11 -6
  404. package/src/tools/fetch.ts +13 -2
  405. package/src/tools/find.ts +1 -1
  406. package/src/tools/gh.ts +1 -1
  407. package/src/tools/github-cache.ts +2 -1
  408. package/src/tools/image-gen.ts +1 -1
  409. package/src/tools/index.ts +43 -5
  410. package/src/tools/inspect-image.ts +3 -1
  411. package/src/tools/irc.ts +11 -3
  412. package/src/tools/job.ts +15 -3
  413. package/src/tools/learn.ts +144 -0
  414. package/src/tools/manage-skill.ts +104 -0
  415. package/src/tools/memory-edit.ts +1 -1
  416. package/src/tools/memory-recall.ts +1 -1
  417. package/src/tools/memory-reflect.ts +1 -1
  418. package/src/tools/memory-retain.ts +1 -1
  419. package/src/tools/plan-mode-guard.ts +53 -19
  420. package/src/tools/read.ts +8 -2
  421. package/src/tools/render-mermaid.ts +1 -1
  422. package/src/tools/renderers.ts +7 -11
  423. package/src/tools/report-tool-issue.ts +3 -2
  424. package/src/tools/resolve.ts +1 -1
  425. package/src/tools/review.ts +1 -1
  426. package/src/tools/search-tool-bm25.ts +1 -1
  427. package/src/tools/search.ts +1 -1
  428. package/src/tools/ssh.ts +5 -4
  429. package/src/tools/todo.ts +2 -2
  430. package/src/tools/tts.ts +204 -93
  431. package/src/tools/write.ts +19 -3
  432. package/src/tts/downloader.ts +64 -0
  433. package/src/tts/index.ts +8 -0
  434. package/src/tts/models.ts +137 -0
  435. package/src/tts/player.ts +137 -0
  436. package/src/tts/runtime.ts +21 -0
  437. package/src/tts/streaming-player.ts +266 -0
  438. package/src/tts/tts-client.ts +647 -0
  439. package/src/tts/tts-protocol.ts +60 -0
  440. package/src/tts/tts-worker.ts +497 -0
  441. package/src/tts/vocalizer.ts +162 -0
  442. package/src/tts/wav.ts +58 -0
  443. package/src/utils/clipboard.ts +35 -18
  444. package/src/utils/image-loading.ts +35 -4
  445. package/src/utils/thinking-display.ts +37 -0
  446. package/src/utils/title-generator.ts +48 -5
  447. package/src/utils/tool-choice.ts +16 -0
  448. package/src/utils/tools-manager.test.ts +25 -0
  449. package/src/utils/tools-manager.ts +19 -1
  450. package/src/web/scrapers/github.ts +96 -0
  451. package/src/web/search/index.ts +14 -1
  452. package/src/web/search/providers/searxng.ts +13 -1
  453. package/dist/types/cli/list-models.d.ts +0 -30
  454. package/dist/types/stt/setup.d.ts +0 -18
  455. package/src/cli/list-models.ts +0 -194
  456. package/src/stt/setup.ts +0 -52
  457. package/src/stt/transcribe.py +0 -70
@@ -46,7 +46,9 @@ import type { CheckpointState } from "../tools/checkpoint";
46
46
  import { type TodoItem, type TodoPhase } from "../tools/todo";
47
47
  import type { ClientBridge } from "./client-bridge";
48
48
  import { type CustomMessage } from "./messages";
49
- import type { BranchSummaryEntry, NewSessionOptions, SessionContext, SessionManager } from "./session-manager";
49
+ import type { SessionContext } from "./session-context";
50
+ import type { BranchSummaryEntry, NewSessionOptions } from "./session-entries";
51
+ import type { SessionManager } from "./session-manager";
50
52
  import type { ShakeMode, ShakeResult } from "./shake-types";
51
53
  import { ToolChoiceQueue } from "./tool-choice-queue";
52
54
  import { YieldQueue } from "./yield-queue";
@@ -215,6 +217,10 @@ export interface AgentSessionConfig {
215
217
  asyncJobManager?: AsyncJobManager;
216
218
  /** Agent identity (registry id like "Main" or "Alice") used for IRC routing. */
217
219
  agentId?: string;
220
+ /** Whether this session is the top-level agent or a subagent. Drives eager-task
221
+ * prelude gating so a top-level session created with a custom `agentId` still
222
+ * receives the always-mode reminder. Defaults to "main". */
223
+ agentKind?: "main" | "sub";
218
224
  /**
219
225
  * Override the provider-facing session ID for all API requests from this session.
220
226
  * When absent, `sessionManager.getSessionId()` is used. Needed when benchmark or
@@ -357,16 +363,6 @@ export declare class AgentSession {
357
363
  /** Unconditionally clear the silent-abort flag. Idempotent: safe when the
358
364
  * flag was never set OR was already consumed by `#handleAgentEvent`. */
359
365
  clearPlanCompactAbortPending(): void;
360
- /** Register a compact display string for a custom message that the caller is
361
- * about to dispatch via `promptCustomMessage` / `sendCustomMessage`.
362
- * Returns a stable tag the caller MUST embed in
363
- * `CustomMessage.details.__pendingDisplayTag` so the agent-side
364
- * `message_start` handler can remove the matching display entry when the
365
- * queued message is consumed.
366
- *
367
- * Does NOT push to the agent's steering/followUp queue — that happens
368
- * separately inside `sendCustomMessage`. */
369
- enqueueCustomMessageDisplay(text: string, mode: "steer" | "followUp"): string;
370
366
  getAsyncJobSnapshot(options?: {
371
367
  recentLimit?: number;
372
368
  }): AsyncJobSnapshot | null;
@@ -421,6 +417,7 @@ export declare class AgentSession {
421
417
  get serviceTier(): ServiceTier | undefined;
422
418
  /** Whether agent is currently streaming a response */
423
419
  get isStreaming(): boolean;
420
+ get isAborting(): boolean;
424
421
  /** Wait until streaming and deferred recovery work are fully settled. */
425
422
  waitForIdle(): Promise<void>;
426
423
  drainAsyncJobDeliveriesForAcp(options?: {
@@ -595,7 +592,9 @@ export declare class AgentSession {
595
592
  * the ACP agent) use this to know whether to expect an `agent_end` event.
596
593
  */
597
594
  prompt(text: string, options?: PromptOptions): Promise<boolean>;
598
- promptCustomMessage<T = unknown>(message: Pick<CustomMessage<T>, "customType" | "content" | "display" | "details" | "attribution">, options?: Pick<PromptOptions, "streamingBehavior" | "toolChoice">): Promise<void>;
595
+ promptCustomMessage<T = unknown>(message: Pick<CustomMessage<T>, "customType" | "content" | "display" | "details" | "attribution">, options?: Pick<PromptOptions, "streamingBehavior" | "toolChoice"> & {
596
+ queueChipText?: string;
597
+ }): Promise<void>;
599
598
  /**
600
599
  * Queue a steering message to interrupt the agent mid-run.
601
600
  */
@@ -612,11 +611,18 @@ export declare class AgentSession {
612
611
  * - Streaming: queue as steer/follow-up or store for next turn
613
612
  * - Not streaming + triggerTurn: appends to state/session, starts new turn unless the client cannot own it
614
613
  * - Not streaming + no trigger: appends to state/session, no turn
614
+ *
615
+ * @returns true iff this call synchronously started a new turn (awaited
616
+ * `agent.prompt`); false when the message was queued/appended without a turn
617
+ * — including when `triggerTurn` is downgraded because the client defers
618
+ * agent-initiated turns. Callers that must mirror the resulting `agent_end`
619
+ * use this to avoid acting on a turn that never ran.
615
620
  */
616
621
  sendCustomMessage<T = unknown>(message: Pick<CustomMessage<T>, "customType" | "content" | "display" | "details" | "attribution">, options?: {
617
622
  triggerTurn?: boolean;
618
623
  deliverAs?: "steer" | "followUp" | "nextTurn";
619
- }): Promise<void>;
624
+ queueChipText?: string;
625
+ }): Promise<boolean>;
620
626
  /**
621
627
  * Send a user message to the agent.
622
628
  * When deliverAs is set, queue the message instead of starting a new turn.
@@ -627,22 +633,13 @@ export declare class AgentSession {
627
633
  sendUserMessage(content: string | (TextContent | ImageContent)[], options?: {
628
634
  deliverAs?: "steer" | "followUp";
629
635
  }): Promise<void>;
630
- /**
631
- * Clear queued messages and return them (text plus any attached images).
632
- * Useful for restoring to editor when user aborts. The internal entry
633
- * arrays are handed out as-is — a `tag` (if any) is inert once the record
634
- * leaves the queue.
635
- */
636
+ /** Clear queued messages and return them (text plus any attached images). */
636
637
  clearQueue(): {
637
638
  steering: RestoredQueuedMessage[];
638
639
  followUp: RestoredQueuedMessage[];
639
640
  };
640
- /** Number of pending messages (includes steering, follow-up, and next-turn messages) */
641
+ /** Number of pending displayable messages (includes steering, follow-up, and next-turn messages) */
641
642
  get queuedMessageCount(): number;
642
- /** Get pending messages (read-only). Returns the public text-only view;
643
- * internal `{text, tag?}` records are mapped to `.text` so callers
644
- * (`updatePendingMessagesDisplay`, `restoreQueuedMessagesToEditor`) see
645
- * the unchanged historical shape. */
646
643
  getQueuedMessages(): {
647
644
  steering: readonly string[];
648
645
  followUp: readonly string[];
@@ -650,8 +647,6 @@ export declare class AgentSession {
650
647
  /**
651
648
  * Pop the last queued message (steering first, then follow-up).
652
649
  * Used by dequeue keybinding to restore messages to editor one at a time.
653
- * Returns the popped entry's text and images; the tag (if any) dies with
654
- * the record — no orphan state can outlive the queue entry.
655
650
  */
656
651
  popLastQueuedMessage(): RestoredQueuedMessage | undefined;
657
652
  get skillsSettings(): SkillsSettings | undefined;
@@ -673,13 +668,6 @@ export declare class AgentSession {
673
668
  goalReason?: "interrupted" | "internal";
674
669
  reason?: string;
675
670
  }): Promise<void>;
676
- /**
677
- * Abort active work, then immediately resume the agent so queued steer/follow-up
678
- * messages drain instead of waiting for another natural turn boundary.
679
- */
680
- interruptAndFlushQueuedMessages(options?: {
681
- reason?: string;
682
- }): Promise<void>;
683
671
  /**
684
672
  * Start a new session, optionally with initial messages and parent tracking.
685
673
  * Clears all messages and starts a new session.
@@ -701,7 +689,10 @@ export declare class AgentSession {
701
689
  fork(): Promise<boolean>;
702
690
  /**
703
691
  * Set model directly.
704
- * Validates API key and saves to the active session. Persists settings only when requested.
692
+ * Validates that a credential source is configured (synchronously, without
693
+ * refreshing OAuth or running command-backed key programs) and saves to the
694
+ * active session. Persists settings only when requested. The concrete key is
695
+ * resolved lazily per request, so switching never blocks the event loop.
705
696
  * @throws Error if no API key available for the model
706
697
  */
707
698
  setModel(model: Model, role?: string, options?: {
@@ -711,7 +702,9 @@ export declare class AgentSession {
711
702
  }): Promise<void>;
712
703
  /**
713
704
  * Set model temporarily (for this session only).
714
- * Validates API key, saves to session log but NOT to settings.
705
+ * Validates that a credential source is configured (synchronously, without
706
+ * refreshing OAuth or running command-backed key programs), saves to session
707
+ * log but NOT to settings.
715
708
  * @throws Error if no API key available for the model
716
709
  */
717
710
  setModelTemporary(model: Model, thinkingLevel?: ThinkingLevel, options?: {
@@ -10,7 +10,8 @@ export declare class AgentStorage {
10
10
  private constructor();
11
11
  /**
12
12
  * Returns singleton instance for the given database path, creating if needed.
13
- * Retries on SQLITE_BUSY with exponential backoff.
13
+ * Retries on the `SQLITE_BUSY` family (including `SQLITE_BUSY_RECOVERY`) with
14
+ * exponential backoff. See issue #2421.
14
15
  * @param dbPath - Path to the SQLite database file (defaults to config path)
15
16
  * @returns AgentStorage instance for the given path
16
17
  */
@@ -30,6 +30,7 @@ export declare class IndexedSessionStorage implements SessionStorage {
30
30
  readText(path: string): Promise<string>;
31
31
  readTextSlices(path: string, prefixBytes: number, suffixBytes: number): Promise<[string, string]>;
32
32
  writeText(path: string, content: string): Promise<void>;
33
+ writeTextAtomic(path: string, content: string): Promise<void>;
33
34
  rename(src: string, dst: string): Promise<void>;
34
35
  unlink(path: string): Promise<void>;
35
36
  deleteSessionWithArtifacts(sessionPath: string): Promise<void>;
@@ -49,10 +50,9 @@ declare class IndexedSessionStorageWriter implements SessionStorageWriter {
49
50
  flags?: "a" | "w";
50
51
  onError?: (err: Error) => void;
51
52
  });
52
- writeLineSync(line: string): void;
53
- writeLine(line: string): Promise<void>;
53
+ append(line: string): Promise<void>;
54
54
  flush(): Promise<void>;
55
- fsync(): Promise<void>;
55
+ isOpen(): boolean;
56
56
  close(): Promise<void>;
57
57
  getError(): Error | undefined;
58
58
  }
@@ -16,13 +16,11 @@ export interface SkillPromptDetails {
16
16
  path: string;
17
17
  args?: string;
18
18
  lineCount: number;
19
- /** Internal: tag used by AgentSession to remove the pending-display chip
20
- * from `#steeringMessages` / `#followUpMessages` when the agent consumes
21
- * this message. Not surfaced to renderers; the `__` prefix signals
22
- * "private". Optional — non-streaming skill prompts never set it. Stripped
23
- * from persisted `details` by `SessionManager.appendCustomMessageEntry`
24
- * via the `INTERNAL_DETAILS_FIELDS` allowlist below. */
25
- __pendingDisplayTag?: string;
19
+ /** Internal: compact label shown for a queued custom message. Optional —
20
+ * non-streaming skill prompts never set it. Stripped from persisted
21
+ * `details` by `SessionManager.appendCustomMessageEntry` via the
22
+ * `INTERNAL_DETAILS_FIELDS` allowlist below. */
23
+ __queueChipText?: string;
26
24
  }
27
25
  /** Sentinel value for `AssistantMessage.errorMessage` indicating that the abort
28
26
  * was an *expected internal transition* (plan-mode → execution compaction)
@@ -55,16 +53,16 @@ export declare function shouldRenderAbortReason(errorMessage: string | undefined
55
53
  * `shouldRenderAbortReason` before rendering when user interrupts should stay
56
54
  * visually quiet. */
57
55
  export declare function resolveAbortLabel(errorMessage: string | undefined, retryAttempt?: number): string;
58
- /** Extract the optional `__pendingDisplayTag` field from a CustomMessage's
56
+ /** Extract the optional `__queueChipText` field from a CustomMessage's
59
57
  * `details` blob. Safe over `unknown`; returns undefined when the field is
60
58
  * absent or non-string. */
61
- export declare function readPendingDisplayTag(details: unknown): string | undefined;
59
+ export declare function readQueueChipText(details: unknown): string | undefined;
62
60
  /** Explicit allowlist of `details` field names that are AgentSession-internal
63
61
  * transient bookkeeping and MUST be removed before SessionManager persists
64
62
  * the CustomMessageEntry to disk. Scoped intentionally narrow: only fields
65
63
  * declared here are stripped. Adding a new entry is a deliberate, reviewed
66
64
  * change — unrelated future payload fields are never silently dropped. */
67
- export declare const INTERNAL_DETAILS_FIELDS: readonly ["__pendingDisplayTag"];
65
+ export declare const INTERNAL_DETAILS_FIELDS: readonly ["__queueChipText"];
68
66
  /** Return a `details` copy with every key in `INTERNAL_DETAILS_FIELDS`
69
67
  * removed. Returns the input unchanged when there is nothing to strip
70
68
  * (null/non-object, or no listed fields present) so callers don't pay a
@@ -0,0 +1,39 @@
1
+ import type { AgentMessage } from "@oh-my-pi/pi-agent-core";
2
+ import type { ServiceTier } from "@oh-my-pi/pi-ai";
3
+ import { type CompactionEntry, type SessionEntry } from "./session-entries";
4
+ export interface SessionContext {
5
+ messages: AgentMessage[];
6
+ thinkingLevel?: string;
7
+ serviceTier?: ServiceTier;
8
+ /** Model roles: { default: "provider/modelId", small: "provider/modelId", ... } */
9
+ models: Record<string, string>;
10
+ /** Names of TTSR rules that have been injected this session */
11
+ injectedTtsrRules: string[];
12
+ /** MCP tool names selected through discovery for this session branch. */
13
+ selectedMCPToolNames: string[];
14
+ /** Whether this branch contains an explicit persisted MCP selection entry. */
15
+ hasPersistedMCPToolSelection: boolean;
16
+ /** Active mode (e.g. "plan") or "none" if no special mode is active */
17
+ mode: string;
18
+ /** Mode-specific data from the last mode_change entry */
19
+ modeData?: Record<string, unknown>;
20
+ }
21
+ /** Lists session model strings to try when restoring, in fallback order. */
22
+ export declare function getRestorableSessionModels(models: Readonly<Record<string, string>>, lastModelChangeRole: string | undefined): string[];
23
+ export declare function getLatestCompactionEntry(entries: SessionEntry[]): CompactionEntry | null;
24
+ export interface BuildSessionContextOptions {
25
+ /**
26
+ * Build the full-history display transcript instead of the LLM context:
27
+ * every path entry in chronological order, with each compaction emitted
28
+ * inline as a `compactionSummary` message at the position it fired rather
29
+ * than replacing the history before it. Display-only — never send the
30
+ * result to a provider.
31
+ */
32
+ transcript?: boolean;
33
+ }
34
+ /**
35
+ * Build the session context from entries using tree traversal.
36
+ * If leafId is provided, walks from that entry to root.
37
+ * Handles compaction and branch summaries along the path.
38
+ */
39
+ export declare function buildSessionContext(entries: SessionEntry[], leafId?: string | null, byId?: Map<string, SessionEntry>, options?: BuildSessionContextOptions): SessionContext;
@@ -0,0 +1,159 @@
1
+ import type { AgentMessage } from "@oh-my-pi/pi-agent-core";
2
+ import type { ImageContent, MessageAttribution, ServiceTier, TextContent } from "@oh-my-pi/pi-ai";
3
+ export declare const CURRENT_SESSION_VERSION = 3;
4
+ export declare const EPHEMERAL_MODEL_CHANGE_ROLE = "fallback";
5
+ export interface SessionHeader {
6
+ type: "session";
7
+ version?: number;
8
+ id: string;
9
+ title?: string;
10
+ titleSource?: "auto" | "user";
11
+ timestamp: string;
12
+ cwd: string;
13
+ parentSession?: string;
14
+ }
15
+ export interface NewSessionOptions {
16
+ parentSession?: string;
17
+ /** Skip flushing the current session and delete it instead of saving. */
18
+ drop?: boolean;
19
+ }
20
+ export interface SessionEntryBase {
21
+ type: string;
22
+ id: string;
23
+ parentId: string | null;
24
+ timestamp: string;
25
+ }
26
+ export interface SessionMessageEntry extends SessionEntryBase {
27
+ type: "message";
28
+ message: AgentMessage;
29
+ }
30
+ export interface ThinkingLevelChangeEntry extends SessionEntryBase {
31
+ type: "thinking_level_change";
32
+ thinkingLevel?: string | null;
33
+ }
34
+ export interface ModelChangeEntry extends SessionEntryBase {
35
+ type: "model_change";
36
+ /** Model in "provider/modelId" format */
37
+ model: string;
38
+ /** Role: "default", "smol", "slow", etc. Undefined treated as "default" */
39
+ role?: string;
40
+ }
41
+ export interface ServiceTierChangeEntry extends SessionEntryBase {
42
+ type: "service_tier_change";
43
+ serviceTier: ServiceTier | null;
44
+ }
45
+ export interface CompactionEntry<T = unknown> extends SessionEntryBase {
46
+ type: "compaction";
47
+ summary: string;
48
+ shortSummary?: string;
49
+ firstKeptEntryId: string;
50
+ tokensBefore: number;
51
+ /** Extension-specific data (e.g., ArtifactIndex, version markers for structured compaction) */
52
+ details?: T;
53
+ /** Hook-provided data to persist across compaction */
54
+ preserveData?: Record<string, unknown>;
55
+ /** True if generated by an extension, undefined/false if pi-generated (backward compatible) */
56
+ fromExtension?: boolean;
57
+ }
58
+ export interface BranchSummaryEntry<T = unknown> extends SessionEntryBase {
59
+ type: "branch_summary";
60
+ fromId: string;
61
+ summary: string;
62
+ /** Extension-specific data (not sent to LLM) */
63
+ details?: T;
64
+ /** True if generated by an extension, false if pi-generated */
65
+ fromExtension?: boolean;
66
+ }
67
+ /**
68
+ * Custom entry for extensions to store extension-specific data in the session.
69
+ * Use customType to identify your extension's entries.
70
+ *
71
+ * Purpose: Persist extension state across session reloads. On reload, extensions can
72
+ * scan entries for their customType and reconstruct internal state.
73
+ *
74
+ * Does NOT participate in LLM context (ignored by buildSessionContext).
75
+ * For injecting content into context, see CustomMessageEntry.
76
+ */
77
+ export interface CustomEntry<T = unknown> extends SessionEntryBase {
78
+ type: "custom";
79
+ customType: string;
80
+ data?: T;
81
+ }
82
+ /** Label entry for user-defined bookmarks/markers on entries. */
83
+ export interface LabelEntry extends SessionEntryBase {
84
+ type: "label";
85
+ targetId: string;
86
+ label: string | undefined;
87
+ }
88
+ /** TTSR injection entry - tracks which time-traveling rules have been injected this session. */
89
+ export interface TtsrInjectionEntry extends SessionEntryBase {
90
+ type: "ttsr_injection";
91
+ /** Names of rules that were injected */
92
+ injectedRules: string[];
93
+ }
94
+ /** Persisted MCP discovery selection state for a session branch. */
95
+ export interface MCPToolSelectionEntry extends SessionEntryBase {
96
+ type: "mcp_tool_selection";
97
+ /** MCP tool names selected for visibility in discovery mode. */
98
+ selectedToolNames: string[];
99
+ }
100
+ /** Session init entry - captures initial context for subagent sessions (debugging/replay). */
101
+ export interface SessionInitEntry extends SessionEntryBase {
102
+ type: "session_init";
103
+ /** Full system prompt sent to the model */
104
+ systemPrompt: string;
105
+ /** Initial task/user message */
106
+ task: string;
107
+ /** Tools available to the agent */
108
+ tools: string[];
109
+ /** Output schema if structured output was requested */
110
+ outputSchema?: unknown;
111
+ }
112
+ /** Mode change entry - tracks agent mode transitions (e.g. plan mode). */
113
+ export interface ModeChangeEntry extends SessionEntryBase {
114
+ type: "mode_change";
115
+ /** Current mode name, or "none" when exiting a mode */
116
+ mode: string;
117
+ /** Optional mode-specific data (e.g. plan file path) */
118
+ data?: Record<string, unknown>;
119
+ }
120
+ /**
121
+ * Custom message entry for extensions to inject messages into LLM context.
122
+ * Use customType to identify your extension's entries.
123
+ *
124
+ * Unlike CustomEntry, this DOES participate in LLM context.
125
+ * The content participates in LLM context through convertToLlm().
126
+ * Use details for extension-specific metadata (not sent to LLM).
127
+ *
128
+ * display controls TUI rendering:
129
+ * - false: hidden entirely
130
+ * - true: rendered with distinct styling (different from user messages)
131
+ */
132
+ export interface CustomMessageEntry<T = unknown> extends SessionEntryBase {
133
+ type: "custom_message";
134
+ customType: string;
135
+ content: string | (TextContent | ImageContent)[];
136
+ details?: T;
137
+ display: boolean;
138
+ /** Who initiated this message for billing/attribution semantics. */
139
+ attribution?: MessageAttribution;
140
+ }
141
+ /** Session entry - has id/parentId for tree structure (returned by "read" methods in SessionManager) */
142
+ export type SessionEntry = SessionMessageEntry | ThinkingLevelChangeEntry | ModelChangeEntry | ServiceTierChangeEntry | CompactionEntry | BranchSummaryEntry | CustomEntry | CustomMessageEntry | LabelEntry | TtsrInjectionEntry | MCPToolSelectionEntry | SessionInitEntry | ModeChangeEntry;
143
+ /** Raw file entry (includes header) */
144
+ export type FileEntry = SessionHeader | SessionEntry;
145
+ /** Tree node for getTree() - defensive copy of session structure */
146
+ export interface SessionTreeNode {
147
+ entry: SessionEntry;
148
+ children: SessionTreeNode[];
149
+ /** Resolved label for this entry, if any */
150
+ label?: string;
151
+ }
152
+ export interface UsageStatistics {
153
+ input: number;
154
+ output: number;
155
+ cacheRead: number;
156
+ cacheWrite: number;
157
+ premiumRequests: number;
158
+ cost: number;
159
+ }
@@ -0,0 +1,69 @@
1
+ import { type SessionStorage } from "./session-storage";
2
+ /**
3
+ * Coarse lifecycle status of a session, derived from its last persisted message.
4
+ *
5
+ * - `complete` — the last assistant turn ended with no unanswered tool calls, i.e.
6
+ * the agent yielded control back to the user.
7
+ * - `interrupted` — work was cut off mid-flight: a trailing assistant turn with
8
+ * pending tool calls, a trailing tool result the agent never continued from, or
9
+ * a length-truncated turn.
10
+ * - `aborted` — the last assistant turn was cancelled by the user.
11
+ * - `error` — the last assistant turn ended in an error.
12
+ * - `pending` — a trailing user message with no assistant reply persisted after it.
13
+ * - `unknown` — status could not be determined (empty/header-only session, or the
14
+ * final message was larger than the tail window that was read).
15
+ */
16
+ export type SessionStatus = "complete" | "interrupted" | "aborted" | "error" | "pending" | "unknown";
17
+ export interface SessionInfo {
18
+ path: string;
19
+ id: string;
20
+ /** Working directory where the session was started. Empty string for old sessions. */
21
+ cwd: string;
22
+ title?: string;
23
+ /** Path to the parent session (if this session was forked). */
24
+ parentSessionPath?: string;
25
+ created: Date;
26
+ modified: Date;
27
+ messageCount: number;
28
+ /** File size in bytes on disk; used for compact list rendering. */
29
+ size: number;
30
+ firstMessage: string;
31
+ allMessagesText: string;
32
+ /**
33
+ * Coarse lifecycle status from the session's last persisted message. Optional:
34
+ * synthesized {@link SessionInfo}s (cross-project stubs, tests) leave it unset.
35
+ */
36
+ status?: SessionStatus;
37
+ }
38
+ export interface ResolvedSessionMatch {
39
+ session: SessionInfo;
40
+ scope: "local" | "global";
41
+ }
42
+ /** Lightweight metadata for a recent session, used in welcome/picker UI. */
43
+ export interface RecentSessionInfo {
44
+ path: string;
45
+ name: string;
46
+ timeAgo: string;
47
+ }
48
+ /**
49
+ * Promote orphaned `<basename>.jsonl.<snowflake>.bak` backups created by the
50
+ * EPERM-rewrite path back to their primary path when the primary is missing.
51
+ * This runs once per session-dir scan, before the main `*.jsonl` glob, so a
52
+ * crash between the two renames in the EPERM-rewrite path does not leave the
53
+ * user's last good state stranded outside the loader's view.
54
+ *
55
+ * Exported for testing.
56
+ */
57
+ export declare function recoverOrphanedBackups(sessionDir: string, storage: SessionStorage): Promise<void>;
58
+ /**
59
+ * List sessions in a resolved session directory (newest first), reading each
60
+ * file's lifecycle {@link SessionStatus}.
61
+ */
62
+ export declare function listSessions(sessionDir: string, storage: SessionStorage): Promise<SessionInfo[]>;
63
+ /** List all sessions across all project directories (newest first). */
64
+ export declare function listAllSessions(storage?: SessionStorage): Promise<SessionInfo[]>;
65
+ /** Exported for testing */
66
+ export declare function findMostRecentSession(sessionDir: string, storage?: SessionStorage): Promise<string | null>;
67
+ /** Get recent sessions for display in the welcome screen. */
68
+ export declare function getRecentSessions(sessionDir: string, limit?: number, storage?: SessionStorage): Promise<RecentSessionInfo[]>;
69
+ export declare function resolveResumableSession(sessionArg: string, cwd: string, sessionDir?: string, storage?: SessionStorage): Promise<ResolvedSessionMatch | undefined>;
@@ -0,0 +1,16 @@
1
+ import type { AgentMessage } from "@oh-my-pi/pi-agent-core";
2
+ import { BlobStore } from "./blob-store";
3
+ import type { FileEntry } from "./session-entries";
4
+ import { type SessionStorage } from "./session-storage";
5
+ /** Exported for compaction.test.ts */
6
+ export declare function parseSessionEntries(content: string): FileEntry[];
7
+ /** Exported for testing */
8
+ export declare function loadEntriesFromFile(filePath: string, storage?: SessionStorage): Promise<FileEntry[]>;
9
+ export declare function resolveBlobRefsInEntries(entries: FileEntry[], blobStore: BlobStore): Promise<void>;
10
+ /**
11
+ * Read-only message view of a session file: load entries, migrate to the
12
+ * current version, resolve blob refs, and build the context along the
13
+ * persisted leaf path (last entry). Does NOT create a writer or take the
14
+ * session lock — safe to call against a file another session is writing.
15
+ */
16
+ export declare function loadSessionMessagesReadOnly(filePath: string): Promise<AgentMessage[]>;