@xopcai/xopc 0.0.123 → 0.0.124

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 (264) hide show
  1. package/README.md +28 -11
  2. package/README.zh-CN.md +28 -11
  3. package/dist/browser-ext/manifest.json +1 -1
  4. package/dist/extensions/telegram/xopc.extension.json +1 -1
  5. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-Bicr3ZBg.js → agent-avatar-dicebear-B5uSVAyJ.js} +1 -1
  6. package/dist/gateway/static/root/assets/agents-BjIxt67Z.js +2 -0
  7. package/dist/gateway/static/root/assets/{app-management-settings-panel-CbEy9sR1.js → app-management-settings-panel-CYCONLIL.js} +1 -1
  8. package/dist/gateway/static/root/assets/{appearance-settings-CTHja6n9.js → appearance-settings-Clw3ryKg.js} +1 -1
  9. package/dist/gateway/static/root/assets/apps-page-QICTeGjX.js +1 -0
  10. package/dist/gateway/static/root/assets/{archive-plugin-Bpy64GjU.js → archive-plugin-CXUGRp2i.js} +1 -1
  11. package/dist/gateway/static/root/assets/{attachment-load-DMkp4xSb.js → attachment-load-Cmiub3Wg.js} +1 -1
  12. package/dist/gateway/static/root/assets/{automation-suggestion-card-KnYaP7NT.js → automation-suggestion-card-CU0-4nQ-.js} +1 -1
  13. package/dist/gateway/static/root/assets/automations-page-Car-jtiz.js +1 -0
  14. package/dist/gateway/static/root/assets/{binary-plugins-DA9C5mCw.js → binary-plugins-0Izz-N3p.js} +1 -1
  15. package/dist/gateway/static/root/assets/{block-editor-CiSXk_YC.js → block-editor-C1Kv0IkJ.js} +6 -6
  16. package/dist/gateway/static/root/assets/browser-settings-page-CMeBJzlS.js +8 -0
  17. package/dist/gateway/static/root/assets/{capability-presets-api-CEJ44WCU.js → capability-presets-api-BmQTM9Il.js} +1 -1
  18. package/dist/gateway/static/root/assets/capability-presets-settings-panel-DZEJEoCF.js +1 -0
  19. package/dist/gateway/static/root/assets/{channel-recipient-api-CDhrhfhN.js → channel-recipient-api-BeA2aVor.js} +1 -1
  20. package/dist/gateway/static/root/assets/channels-settings-kkW-xFau.js +1 -0
  21. package/dist/gateway/static/root/assets/connectors-page-BvaQvO5F.js +2 -0
  22. package/dist/gateway/static/root/assets/{directory-picker-path-field-7jKfbH0J.js → directory-picker-path-field-2rjzUu57.js} +1 -1
  23. package/dist/gateway/static/root/assets/{dreaming-settings-m1-wmz4o.js → dreaming-settings-DnHO686d.js} +1 -1
  24. package/dist/gateway/static/root/assets/{extension-debug-page-C9qQQrBS.js → extension-debug-page-BGLRuWVN.js} +1 -1
  25. package/dist/gateway/static/root/assets/{extension-page-DcBBMEGl.js → extension-page-D978ePp9.js} +1 -1
  26. package/dist/gateway/static/root/assets/{extension-settings-page-BQ-jMMP9.js → extension-settings-page-B6Ih4Swx.js} +1 -1
  27. package/dist/gateway/static/root/assets/{fetch-Dtpbbe0s.js → fetch-BU5S0Sn7.js} +1 -1
  28. package/dist/gateway/static/root/assets/{gateway-config-api-BN6pyX2c.js → gateway-config-api-BIPGwrl1.js} +1 -1
  29. package/dist/gateway/static/root/assets/gateway-settings-CMEA3r5u.js +1 -0
  30. package/dist/gateway/static/root/assets/{gateway-startup-retry-BIET2x3y.js → gateway-startup-retry-Cd0Zz30N.js} +1 -1
  31. package/dist/gateway/static/root/assets/{goal-create-dialog-BuIMDx6C.js → goal-create-dialog-B-KHKeXN.js} +1 -1
  32. package/dist/gateway/static/root/assets/goal-detail-page-BxrSoWdj.js +1 -0
  33. package/dist/gateway/static/root/assets/{goals-config-api-CQm2r1Ty.js → goals-config-api-B95KdGMj.js} +1 -1
  34. package/dist/gateway/static/root/assets/goals-page-BTJzIl28.js +2 -0
  35. package/dist/gateway/static/root/assets/{goals-settings-DDrdRMxB.js → goals-settings-BJyEuLLm.js} +1 -1
  36. package/dist/gateway/static/root/assets/heartbeat-settings-wkOjYNQT.js +1 -0
  37. package/dist/gateway/static/root/assets/{index-CBDr5xjB.css → index-BLaXr6Ev.css} +1 -1
  38. package/dist/gateway/static/root/assets/index-c_9TVr_C.js +191 -0
  39. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-C2TuQppb.js → keyboard-shortcuts-settings-BT8T4DyC.js} +1 -1
  40. package/dist/gateway/static/root/assets/logs-page-CrxBJUgI.js +2 -0
  41. package/dist/gateway/static/root/assets/{markdown-split-DhONQ81k.js → markdown-split-Dv66bO2b.js} +1 -1
  42. package/dist/gateway/static/root/assets/{media-plugins-DS44pJzr.js → media-plugins-BhIQU5yS.js} +1 -1
  43. package/dist/gateway/static/root/assets/messages-O6TAtdFC.js +3 -0
  44. package/dist/gateway/static/root/assets/models-hub-panel-DOOpz6y1.js +2 -0
  45. package/dist/gateway/static/root/assets/notes-page-Br16pK9v.js +1 -0
  46. package/dist/gateway/static/root/assets/notes-workbench-PSJAi0ZC.js +2 -0
  47. package/dist/gateway/static/root/assets/{preview-open-alternatives-Dej6zHnr.js → preview-open-alternatives-DGzet1d7.js} +1 -1
  48. package/dist/gateway/static/root/assets/project-detail-page-CIGGgKuw.js +1 -0
  49. package/dist/gateway/static/root/assets/projects-page-B2grhsBt.js +1 -0
  50. package/dist/gateway/static/root/assets/remote-access-hub-CXMORxBD.js +1 -0
  51. package/dist/gateway/static/root/assets/{save-bar-controls-Zu1FzH6z.js → save-bar-controls-Cqgb-jqa.js} +1 -1
  52. package/dist/gateway/static/root/assets/{schedule-field-BW78mKc0.js → schedule-field-DVZcI8Yt.js} +1 -1
  53. package/dist/gateway/static/root/assets/{schema-form-Cc-IOydE.js → schema-form-Bj7sOxC8.js} +1 -1
  54. package/dist/gateway/static/root/assets/sessions-page-Bi2wkBzU.js +1 -0
  55. package/dist/gateway/static/root/assets/settings-advanced-gate-B1L3G4IA.js +1 -0
  56. package/dist/gateway/static/root/assets/{settings-collapsible-section-DIpIYht_.js → settings-collapsible-section-BmXn-8N6.js} +1 -1
  57. package/dist/gateway/static/root/assets/{settings-form-section-BFxBNxOG.js → settings-form-section-BnqYMWHR.js} +1 -1
  58. package/dist/gateway/static/root/assets/settings-page-BfRSHJmO.js +1 -0
  59. package/dist/gateway/static/root/assets/{settings-page-layout-CLx4o2PN.js → settings-page-layout-CdWZU1hd.js} +1 -1
  60. package/dist/gateway/static/root/assets/setup-status-panel-CWtPM7RK.js +1 -0
  61. package/dist/gateway/static/root/assets/{share-preview-page-ZswWCrDu.js → share-preview-page-IB1v8i86.js} +1 -1
  62. package/dist/gateway/static/root/assets/shares-settings-ngbsBgij.js +1 -0
  63. package/dist/gateway/static/root/assets/skill-reload-api-BIe442Gv.js +1 -0
  64. package/dist/gateway/static/root/assets/skills-page-BfchZRVa.js +2 -0
  65. package/dist/gateway/static/root/assets/{system-settings-panel-3ZNcGRhS.js → system-settings-panel-BxQ384RC.js} +1 -1
  66. package/dist/gateway/static/root/assets/{typed-models-lib-bpzZjiVF.js → typed-models-lib-BkcpvFYO.js} +1 -1
  67. package/dist/gateway/static/root/assets/{use-channel-catalog-BCjZLZ3O.js → use-channel-catalog-Cd0FaEQ4.js} +1 -1
  68. package/dist/gateway/static/root/assets/{user-profile-settings-panel-CIXafITi.js → user-profile-settings-panel-DQ7NnRSY.js} +1 -1
  69. package/dist/gateway/static/root/assets/{utils-DXMtz5j_.js → utils-YKhVf7Ka.js} +1 -1
  70. package/dist/gateway/static/root/assets/voice-api-key-field-C5Ov8Uk_.js +1 -0
  71. package/dist/gateway/static/root/assets/workflow-run-setup-panel-BYD9BtOq.js +3 -0
  72. package/dist/gateway/static/root/assets/{workflow-start-dialog-B4sZpTDQ.js → workflow-start-dialog-BNJVCWoS.js} +1 -1
  73. package/dist/gateway/static/root/assets/workflows-page-BYF29ANm.js +18 -0
  74. package/dist/gateway/static/root/index.html +5 -5
  75. package/dist/package.js +1 -1
  76. package/dist/src/agent/agent-manager.d.ts +6 -1
  77. package/dist/src/agent/agent-manager.js +28 -12
  78. package/dist/src/agent/agent-manager.js.map +1 -1
  79. package/dist/src/agent/context/workspace-templates/AGENTS.md +1 -1
  80. package/dist/src/agent/embedded/xopc-tools-bridge.js +11 -7
  81. package/dist/src/agent/embedded/xopc-tools-bridge.js.map +1 -1
  82. package/dist/src/agent/lifecycle/progress.js +3 -1
  83. package/dist/src/agent/lifecycle/progress.js.map +1 -1
  84. package/dist/src/agent/lifecycle/timeout-wrapper.d.ts +2 -2
  85. package/dist/src/agent/lifecycle/timeout-wrapper.js +4 -4
  86. package/dist/src/agent/lifecycle/timeout-wrapper.js.map +1 -1
  87. package/dist/src/agent/memory/summary-generator.d.ts +1 -1
  88. package/dist/src/agent/memory/summary-generator.js +1 -2
  89. package/dist/src/agent/memory/summary-generator.js.map +1 -1
  90. package/dist/src/agent/middleware/index.d.ts +1 -1
  91. package/dist/src/agent/middleware/self-verify.d.ts +44 -14
  92. package/dist/src/agent/middleware/self-verify.js +214 -44
  93. package/dist/src/agent/middleware/self-verify.js.map +1 -1
  94. package/dist/src/agent/orchestration/agent-event-handler.js +57 -15
  95. package/dist/src/agent/orchestration/agent-event-handler.js.map +1 -1
  96. package/dist/src/agent/prompt/sections/tooling.js +18 -13
  97. package/dist/src/agent/prompt/sections/tooling.js.map +1 -1
  98. package/dist/src/agent/prompt/system-reminder.js +2 -2
  99. package/dist/src/agent/prompt/system-reminder.js.map +1 -1
  100. package/dist/src/agent/sandbox/sanitize-env-vars.d.ts +2 -2
  101. package/dist/src/agent/sandbox/sanitize-env-vars.js +2 -2
  102. package/dist/src/agent/sandbox/sanitize-env-vars.js.map +1 -1
  103. package/dist/src/agent/sandbox/types.d.ts +2 -2
  104. package/dist/src/agent/sandbox/types.js.map +1 -1
  105. package/dist/src/agent/service/btw-query.js +1 -1
  106. package/dist/src/agent/service/btw-query.js.map +1 -1
  107. package/dist/src/agent/service/process-direct-one-shot.js +6 -2
  108. package/dist/src/agent/service/process-direct-one-shot.js.map +1 -1
  109. package/dist/src/agent/service/process-direct-streaming.js +12 -7
  110. package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
  111. package/dist/src/agent/service.js +2 -1
  112. package/dist/src/agent/service.js.map +1 -1
  113. package/dist/src/agent/skills/skill-tool-gating.js +1 -1
  114. package/dist/src/agent/skills/skill-tool-gating.js.map +1 -1
  115. package/dist/src/agent/starter-agents.js +9 -9
  116. package/dist/src/agent/starter-agents.js.map +1 -1
  117. package/dist/src/agent/tools/apply-patch.d.ts +25 -0
  118. package/dist/src/agent/tools/apply-patch.js +256 -0
  119. package/dist/src/agent/tools/apply-patch.js.map +1 -0
  120. package/dist/src/agent/tools/delegate-tool.d.ts +1 -1
  121. package/dist/src/agent/tools/delegate-tool.js +3 -3
  122. package/dist/src/agent/tools/delegate-tool.js.map +1 -1
  123. package/dist/src/agent/tools/exec-command.d.ts +30 -0
  124. package/dist/src/agent/tools/exec-command.js +224 -0
  125. package/dist/src/agent/tools/exec-command.js.map +1 -0
  126. package/dist/src/agent/tools/execute-code-tool.js +7 -4
  127. package/dist/src/agent/tools/execute-code-tool.js.map +1 -1
  128. package/dist/src/agent/tools/factory.d.ts +3 -3
  129. package/dist/src/agent/tools/factory.js +7 -8
  130. package/dist/src/agent/tools/factory.js.map +1 -1
  131. package/dist/src/agent/tools/index.d.ts +3 -2
  132. package/dist/src/agent/tools/index.js +5 -4
  133. package/dist/src/agent/tools/skills-tools.d.ts +1 -1
  134. package/dist/src/agent/tools/skills-tools.js.map +1 -1
  135. package/dist/src/agent/tools/update-plan-tool.d.ts +11 -0
  136. package/dist/src/agent/tools/update-plan-tool.js +72 -0
  137. package/dist/src/agent/tools/update-plan-tool.js.map +1 -0
  138. package/dist/src/agent/workflow/builtins/debug-incident.d.ts +1 -1
  139. package/dist/src/agent/workflow/builtins/debug-incident.js +1 -1
  140. package/dist/src/agent/workflow/builtins/debug-incident.js.map +1 -1
  141. package/dist/src/agent/workflow/builtins/pr-review.d.ts +1 -1
  142. package/dist/src/agent/workflow/builtins/pr-review.js +1 -1
  143. package/dist/src/agent/workflow/builtins/pr-review.js.map +1 -1
  144. package/dist/src/agent/workflow/builtins/release-check.d.ts +1 -1
  145. package/dist/src/agent/workflow/builtins/release-check.js +1 -1
  146. package/dist/src/agent/workflow/builtins/release-check.js.map +1 -1
  147. package/dist/src/agent/workflow/step-labels.js +7 -3
  148. package/dist/src/agent/workflow/step-labels.js.map +1 -1
  149. package/dist/src/chat-commands/agent-edit.js +1 -1
  150. package/dist/src/chat-commands/agent-edit.js.map +1 -1
  151. package/dist/src/chat-commands/builtins/review.d.ts +1 -0
  152. package/dist/src/chat-commands/builtins/review.js +167 -0
  153. package/dist/src/chat-commands/builtins/review.js.map +1 -0
  154. package/dist/src/chat-commands/index.d.ts +1 -0
  155. package/dist/src/chat-commands/index.js +3 -1
  156. package/dist/src/chat-commands/index.js.map +1 -1
  157. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  158. package/dist/src/cli/commands/gateway/lifecycle.js +1 -1
  159. package/dist/src/gateway/agent-builtin-tools.d.ts +1 -1
  160. package/dist/src/gateway/agent-builtin-tools.js +3 -2
  161. package/dist/src/gateway/agent-builtin-tools.js.map +1 -1
  162. package/dist/src/gateway/chat-stream/mapper.d.ts +6 -0
  163. package/dist/src/gateway/chat-stream/mapper.js +149 -6
  164. package/dist/src/gateway/chat-stream/mapper.js.map +1 -1
  165. package/dist/src/gateway/chat-stream/protocol.d.ts +51 -1
  166. package/dist/src/gateway/hono/routes/commands-skills.js +21 -0
  167. package/dist/src/gateway/hono/routes/commands-skills.js.map +1 -1
  168. package/dist/src/gateway/hono/routes/index.js +2 -0
  169. package/dist/src/gateway/hono/routes/index.js.map +1 -1
  170. package/dist/src/gateway/hono/routes/lazy-bundles.js +1 -0
  171. package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
  172. package/dist/src/gateway/hono/routes/projects.js +40 -2
  173. package/dist/src/gateway/hono/routes/projects.js.map +1 -1
  174. package/dist/src/gateway/hono/routes/search.d.ts +3 -0
  175. package/dist/src/gateway/hono/routes/search.js +47 -0
  176. package/dist/src/gateway/hono/routes/search.js.map +1 -0
  177. package/dist/src/gateway/security/dangerous-tools.js +1 -1
  178. package/dist/src/gateway/security/dangerous-tools.js.map +1 -1
  179. package/dist/src/infra/update-restart.js +1 -1
  180. package/dist/src/mcp/channel-bridge.js +1 -1
  181. package/dist/src/projects/index.d.ts +2 -0
  182. package/dist/src/projects/index.js +3 -1
  183. package/dist/src/projects/project-agent-suggestion.d.ts +14 -0
  184. package/dist/src/projects/project-agent-suggestion.js +19 -0
  185. package/dist/src/projects/project-agent-suggestion.js.map +1 -0
  186. package/dist/src/projects/project-kind.d.ts +13 -0
  187. package/dist/src/projects/project-kind.js +147 -0
  188. package/dist/src/projects/project-kind.js.map +1 -0
  189. package/dist/src/projects/project-service.d.ts +1 -0
  190. package/dist/src/projects/project-service.js +1 -1
  191. package/dist/src/projects/project-service.js.map +1 -1
  192. package/dist/src/projects/project-store.js +32 -8
  193. package/dist/src/projects/project-store.js.map +1 -1
  194. package/dist/src/projects/types.d.ts +1 -0
  195. package/dist/src/review/review-git.d.ts +48 -0
  196. package/dist/src/review/review-git.js +333 -0
  197. package/dist/src/review/review-git.js.map +1 -0
  198. package/dist/src/review/review-types.d.ts +22 -0
  199. package/dist/src/review/review-types.js +29 -0
  200. package/dist/src/review/review-types.js.map +1 -0
  201. package/dist/src/session/session-context-for-llm.js +151 -0
  202. package/dist/src/session/session-context-for-llm.js.map +1 -1
  203. package/dist/src/storage/sqlite/migrations/021_projects_fts.sql +21 -0
  204. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  205. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  206. package/dist/src/storage/sqlite/migrations/runner.js.map +1 -1
  207. package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
  208. package/dist/src/storage/sqlite/schema.js +1 -1
  209. package/dist/src/tui/backends/embedded-backend.d.ts +1 -0
  210. package/dist/src/tui/backends/embedded-backend.js +20 -0
  211. package/dist/src/tui/backends/embedded-backend.js.map +1 -1
  212. package/dist/src/tui/backends/gateway-sse-backend.d.ts +2 -0
  213. package/dist/src/tui/backends/gateway-sse-backend.js +7 -0
  214. package/dist/src/tui/backends/gateway-sse-backend.js.map +1 -1
  215. package/dist/src/tui/components/assistant-message.js +35 -0
  216. package/dist/src/tui/components/assistant-message.js.map +1 -1
  217. package/dist/src/tui/tui-agent-events.js +25 -0
  218. package/dist/src/tui/tui-agent-events.js.map +1 -1
  219. package/dist/src/tui/tui-backend.d.ts +4 -0
  220. package/dist/src/tui/tui-commands.d.ts +1 -0
  221. package/dist/src/tui/tui-commands.js +110 -4
  222. package/dist/src/tui/tui-commands.js.map +1 -1
  223. package/dist/src/tui/tui-picker-overlay.d.ts +2 -0
  224. package/dist/src/tui/tui-picker-overlay.js +153 -1
  225. package/dist/src/tui/tui-picker-overlay.js.map +1 -1
  226. package/dist/src/tui/tui.js +16 -3
  227. package/dist/src/tui/tui.js.map +1 -1
  228. package/package.json +1 -1
  229. package/dist/gateway/static/root/assets/agents-CxDSFHGx.js +0 -2
  230. package/dist/gateway/static/root/assets/apps-page-CyZdgqvm.js +0 -1
  231. package/dist/gateway/static/root/assets/automations-page-8VLKM4au.js +0 -1
  232. package/dist/gateway/static/root/assets/browser-settings-page-5tPg0DcP.js +0 -8
  233. package/dist/gateway/static/root/assets/capability-presets-settings-panel-BJW3aVST.js +0 -1
  234. package/dist/gateway/static/root/assets/channels-settings-CorUCTrs.js +0 -1
  235. package/dist/gateway/static/root/assets/connectors-page-VKstC3sP.js +0 -2
  236. package/dist/gateway/static/root/assets/gateway-settings-hQtgVmSR.js +0 -1
  237. package/dist/gateway/static/root/assets/goal-detail-page-FEypCq74.js +0 -1
  238. package/dist/gateway/static/root/assets/goals-page-C4-2_MLG.js +0 -2
  239. package/dist/gateway/static/root/assets/heartbeat-settings-BJVok3Sl.js +0 -1
  240. package/dist/gateway/static/root/assets/index-T0SaNd5a.js +0 -191
  241. package/dist/gateway/static/root/assets/logs-page-DwkwPgid.js +0 -2
  242. package/dist/gateway/static/root/assets/messages-avfvyZuQ.js +0 -3
  243. package/dist/gateway/static/root/assets/models-hub-panel-huNY4A1G.js +0 -2
  244. package/dist/gateway/static/root/assets/notes-page-DdfGuEZ1.js +0 -1
  245. package/dist/gateway/static/root/assets/notes-workbench-B0bT9Hqa.js +0 -2
  246. package/dist/gateway/static/root/assets/project-detail-page-CjxhPorG.js +0 -1
  247. package/dist/gateway/static/root/assets/projects-page-C4Z5OJMF.js +0 -1
  248. package/dist/gateway/static/root/assets/remote-access-hub-CVCOPUVd.js +0 -1
  249. package/dist/gateway/static/root/assets/sessions-page-B4qExXHC.js +0 -1
  250. package/dist/gateway/static/root/assets/settings-advanced-gate-Ce8yLTBi.js +0 -1
  251. package/dist/gateway/static/root/assets/settings-page-C4fivemT.js +0 -1
  252. package/dist/gateway/static/root/assets/setup-status-panel-Kyc4eUf0.js +0 -1
  253. package/dist/gateway/static/root/assets/shares-settings-Bu76CMiC.js +0 -1
  254. package/dist/gateway/static/root/assets/skill-reload-api-D-CFg86j.js +0 -1
  255. package/dist/gateway/static/root/assets/skills-page-CUU4f6Ss.js +0 -2
  256. package/dist/gateway/static/root/assets/voice-api-key-field-C1MrQD8R.js +0 -1
  257. package/dist/gateway/static/root/assets/workflow-run-setup-panel-DqizIcY5.js +0 -3
  258. package/dist/gateway/static/root/assets/workflows-page-B3sVNPFk.js +0 -18
  259. package/dist/src/agent/tools/edit.d.ts +0 -14
  260. package/dist/src/agent/tools/edit.js +0 -132
  261. package/dist/src/agent/tools/edit.js.map +0 -1
  262. package/dist/src/agent/tools/shell.d.ts +0 -15
  263. package/dist/src/agent/tools/shell.js +0 -158
  264. package/dist/src/agent/tools/shell.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"tui-picker-overlay.js","names":[],"sources":["../../../src/tui/tui-picker-overlay.ts"],"sourcesContent":["import type { KeybindingsManager, SelectItem } from '@earendil-works/pi-tui';\n\nimport { ScopedModelsSelector } from './components/scoped-models-selector.js';\nimport { SettingsSelector } from './components/settings-selector.js';\nimport { SearchableSelectList } from './components/searchable-select-list.js';\nimport { SessionSelector } from './components/session-selector.js';\nimport { ThinkingSelector } from './components/thinking-selector.js';\nimport { formatKeyIds } from './format-tui-hotkeys.js';\nimport type { TuiAgentInfo, TuiSessionItem } from './tui-backend.js';\nimport type { PickerServices } from './tui-picker-services.js';\nimport { formatSessionPickerDescription } from './tui-session-format.js';\nimport { searchableSelectListTheme, theme } from './theme.js';\nimport { filterTuiTranscriptTreeEntries } from './tui-transcript-tree.js';\nimport {\n defaultTranscriptForkKey,\n formatTranscriptTreeFilterHint,\n formatUserMessageForkOpenedHint,\n TranscriptTreeSelectList,\n userMessageForkSelectItems,\n} from './tui-transcript-tree-picker.js';\nimport {\n listThinkingLevels,\n normalizeThinkLevel,\n type ThinkLevel,\n} from '../agent/transcript/thinking-types.js';\nimport { parseAgentSessionKey } from '../routing/agent-session-key.js';\nimport {\n getProjectTrustOptions,\n hasTrustRequiringProjectResources,\n} from '../project-trust/trust-store.js';\n\nfunction formatSelectNavigationHint(keybindings: KeybindingsManager): string {\n const up = formatKeyIds(keybindings, 'tui.select.up', { capitalize: true });\n const down = formatKeyIds(keybindings, 'tui.select.down', { capitalize: true });\n return `${up}/${down}`;\n}\n\nexport function formatScopedModelsOpenedHint(keybindings: KeybindingsManager): string {\n const modelCycle = formatKeyIds(keybindings, 'app.model.cycleForward', { capitalize: true });\n return `Scoped models for ${modelCycle}`;\n}\n\nexport function formatScopedModelsSavedHint(params: {\n refs: string[] | null;\n total: number;\n keybindings: KeybindingsManager;\n}): string {\n const modelCycle = formatKeyIds(params.keybindings, 'app.model.cycleForward', {\n capitalize: true,\n });\n if (params.refs === null) {\n return `${modelCycle} cycles all ${params.total} models`;\n }\n const count = params.refs.length;\n return `${modelCycle} cycles ${count} scoped model${count === 1 ? '' : 's'}`;\n}\n\nexport function formatSettingsOpenedHint(keybindings: KeybindingsManager): string {\n const nav = formatSelectNavigationHint(keybindings);\n const confirm = formatKeyIds(keybindings, 'tui.select.confirm', { capitalize: true });\n const cancel = formatKeyIds(keybindings, 'tui.select.cancel', { capitalize: true });\n return `Settings (${nav} · ${confirm} toggle · ${cancel} close)`;\n}\n\nexport function formatThinkingSelectorHint(keybindings: KeybindingsManager): string {\n const nav = formatSelectNavigationHint(keybindings);\n const confirm = formatKeyIds(keybindings, 'tui.select.confirm', { capitalize: true });\n const cancel = formatKeyIds(keybindings, 'tui.select.cancel', { capitalize: true });\n return `Thinking level (${nav} · ${confirm} select · ${cancel} close)`;\n}\n\nexport function formatThinkingLevelSavedHint(level: ThinkLevel): string {\n return `Thinking level: ${level}`;\n}\n\nexport function formatProjectTrustOpenedHint(keybindings: KeybindingsManager): string {\n const nav = formatSelectNavigationHint(keybindings);\n const confirm = formatKeyIds(keybindings, 'tui.select.confirm', { capitalize: true });\n const cancel = formatKeyIds(keybindings, 'tui.select.cancel', { capitalize: true });\n return `Project trust (${nav} · ${confirm} select · ${cancel} close)`;\n}\n\nexport function formatAgentPickerOpenedHint(keybindings: KeybindingsManager): string {\n const nav = formatSelectNavigationHint(keybindings);\n const confirm = formatKeyIds(keybindings, 'tui.select.confirm', { capitalize: true });\n const cancel = formatKeyIds(keybindings, 'tui.select.cancel', { capitalize: true });\n return `Switch agent (${nav} · ${confirm} select · ${cancel} close)`;\n}\n\nfunction agentSelectItems(agents: TuiAgentInfo[], currentAgentId?: string): SelectItem[] {\n const current = currentAgentId?.trim().toLowerCase();\n return [...agents]\n .filter((agent) => agent.enabled !== false)\n .sort((a, b) => {\n if (a.id === current && b.id !== current) return -1;\n if (b.id === current && a.id !== current) return 1;\n if (a.id === 'coder' && b.id !== 'coder') return -1;\n if (b.id === 'coder' && a.id !== 'coder') return 1;\n return a.id.localeCompare(b.id);\n })\n .map((agent) => ({\n label: agent.id === current ? `${agent.id} (current)` : agent.id,\n value: agent.id,\n description: agent.displayName,\n }));\n}\n\nexport function formatSessionTreeOpenedHint(keybindings: KeybindingsManager): string {\n const nav = formatSelectNavigationHint(keybindings);\n const confirm = formatKeyIds(keybindings, 'tui.select.confirm', { capitalize: true });\n const cancel = formatKeyIds(keybindings, 'tui.select.cancel', { capitalize: true });\n return `Session tree (${nav} · type to filter · ${confirm} resume · ${cancel} close)`;\n}\n\nfunction resumeSession(svc: PickerServices, sessionKey: string): void {\n svc.setSessionKey(sessionKey);\n svc.clearChatForSessionSwitch();\n svc.chatLog.addSystem(`Session: ${sessionKey}`);\n void svc\n .refreshSessionInfo()\n .then(() => svc.loadSessionHistory())\n .then(() => {\n svc.updateHeader();\n svc.tui.requestRender();\n });\n svc.tui.requestRender();\n}\n\nfunction sessionTreeGroup(session: TuiSessionItem): { agentId: string; root: string; leaf: string } {\n const raw = session.key.trim();\n const parts = raw.split(':').filter(Boolean);\n if (parts.length >= 3 && parts[0] === 'agent') {\n const rest = parts.slice(2);\n return {\n agentId: parts[1] ?? 'main',\n root: rest[0] ?? raw,\n leaf: rest.length > 1 ? rest.slice(1).join(':') : rest.join(':') || raw,\n };\n }\n return { agentId: 'legacy', root: raw || 'session', leaf: raw || 'session' };\n}\n\nexport function sessionTreeSelectItems(\n sessions: TuiSessionItem[],\n currentSessionKey?: string,\n): SelectItem[] {\n const byKey = new Map(sessions.map((session) => [session.key, session]));\n return [...sessions]\n .sort((a, b) => {\n const ga = sessionTreeGroup(a);\n const gb = sessionTreeGroup(b);\n const groupCmp = `${ga.agentId}:${ga.root}`.localeCompare(`${gb.agentId}:${gb.root}`);\n if (groupCmp !== 0) return groupCmp;\n return (b.updatedAt ?? 0) - (a.updatedAt ?? 0);\n })\n .map((session) => {\n const group = sessionTreeGroup(session);\n const current = session.key === currentSessionKey ? '* ' : ' ';\n const label = session.displayName?.trim() || group.leaf;\n const parent = session.forkedFromSessionKey\n ? (byKey.get(session.forkedFromSessionKey)?.displayName?.trim() ?? session.forkedFromSessionKey)\n : null;\n const description = [\n `${group.agentId}/${group.root}`,\n formatSessionPickerDescription(session, { showKey: Boolean(session.displayName) }),\n parent ? `forked from ${parent}` : '',\n ]\n .filter(Boolean)\n .join(' · ');\n return {\n value: session.key,\n label: `${current}${label}`,\n description,\n searchText: `${session.key} ${session.displayName ?? ''} ${session.model ?? ''} ${parent ?? ''}`,\n };\n });\n}\n\n\n\n\n\nexport async function openAgentPickerOverlay(svc: PickerServices): Promise<void> {\n const parsed = parseAgentSessionKey(svc.state.currentSessionKey);\n if (!parsed) {\n svc.chatLog.addSystem('Cannot switch agent: current session is not an agent session.');\n svc.tui.requestRender();\n return;\n }\n if (svc.state.activeRunId) {\n svc.chatLog.addSystem('Cannot switch agent while a run is active. Abort first.');\n svc.tui.requestRender();\n return;\n }\n if (!svc.switchAgentSession) {\n svc.chatLog.addSystem('Agent switching is not available in this mode.');\n svc.tui.requestRender();\n return;\n }\n const agents = await svc.client.listAgents();\n const items = agentSelectItems(agents, parsed.agentId);\n if (items.length === 0) {\n svc.chatLog.addSystem('No agents available.');\n svc.tui.requestRender();\n return;\n }\n svc.chatLog.addSystem(theme.dim(formatAgentPickerOpenedHint(svc.keybindings)));\n const list = new SearchableSelectList(items, Math.min(10, items.length), searchableSelectListTheme, {\n searchPromptText: 'agent> ',\n });\n const closeSelector = svc.openEditorSelector(list, list);\n list.onSelect = (item) => {\n closeSelector();\n const targetAgentId = item.value;\n if (targetAgentId === parsed.agentId) {\n svc.chatLog.addSystem(`Already using agent: ${targetAgentId}`);\n svc.tui.requestRender();\n return;\n }\n const targetSessionKey = `agent:${targetAgentId}:${parsed.rest}`;\n void Promise.resolve(svc.switchAgentSession?.(targetSessionKey, targetAgentId))\n .then(() => {\n svc.chatLog.addSystem(`Switched to agent: ${targetAgentId}\\nSession: ${targetSessionKey}`);\n })\n .catch((err: unknown) => {\n const errorMessage = err instanceof Error ? err.message : String(err);\n svc.chatLog.addSystem(`Agent switch failed: ${errorMessage}`);\n })\n .finally(() => svc.tui.requestRender());\n svc.tui.requestRender();\n };\n list.onCancel = () => closeSelector();\n svc.tui.requestRender();\n}\n\n/** Ctrl+Shift+P — session picker with rename/delete. */\nexport async function openSessionPickerOverlay(svc: PickerServices): Promise<void> {\n const sessions = await svc.client.listSessions();\n if (sessions.length === 0) {\n svc.chatLog.addSystem('No sessions listed.');\n svc.tui.requestRender();\n return;\n }\n\n const selector = new SessionSelector(\n sessions,\n {\n onResume: (sessionKey) => {\n svc.closeOverlay();\n svc.tui.setFocus(svc.editor);\n resumeSession(svc, sessionKey);\n },\n onRename: async (sessionKey, name) => {\n const result = await svc.client.renameSession(sessionKey, name);\n return result.ok ? { ok: true } : { ok: false, error: 'Rename failed' };\n },\n onDelete: async (sessionKey) => {\n if (sessionKey === svc.state.currentSessionKey) {\n return { ok: false, error: 'Switch away before deleting the active session' };\n }\n const result = await svc.client.deleteSession(sessionKey);\n return result.ok ? { ok: true } : { ok: false, error: 'Delete failed' };\n },\n onCancel: () => {\n svc.closeOverlay();\n svc.tui.setFocus(svc.editor);\n svc.tui.requestRender();\n },\n requestRender: () => svc.tui.requestRender(),\n },\n svc.keybindings,\n sessions.find((s) => s.key === svc.state.currentSessionKey)?.cwd ?? process.cwd(),\n svc.state.currentSessionKey,\n );\n\n svc.openOverlay(selector);\n svc.chatLog.addSystem(theme.dim('Session picker'));\n svc.tui.requestRender();\n}\n\n/** Searchable session tree navigation overlay. */\nexport async function openSessionTreeOverlay(svc: PickerServices): Promise<void> {\n const sessions = await svc.client.listSessions();\n if (sessions.length === 0) {\n svc.chatLog.addSystem('No sessions listed.');\n svc.tui.requestRender();\n return;\n }\n\n const items = sessionTreeSelectItems(sessions, svc.state.currentSessionKey);\n const list = new SearchableSelectList(items, Math.min(14, items.length), searchableSelectListTheme);\n list.onSelect = (item) => {\n svc.closeOverlay();\n svc.tui.setFocus(svc.editor);\n resumeSession(svc, item.value);\n };\n list.onCancel = () => {\n svc.closeOverlay();\n svc.tui.setFocus(svc.editor);\n svc.tui.requestRender();\n };\n\n svc.openOverlay(list);\n svc.chatLog.addSystem(theme.dim(formatSessionTreeOpenedHint(svc.keybindings)));\n svc.tui.requestRender();\n}\n\n/** Searchable current-transcript tree overlay. */\nexport async function openTranscriptTreeOverlay(svc: PickerServices): Promise<void> {\n const entries = await svc.client.loadTranscriptTree(svc.state.currentSessionKey);\n const filterMode = svc.getTuiSettings().treeFilterMode;\n const visibleEntries = filterTuiTranscriptTreeEntries(entries, filterMode);\n if (visibleEntries.length === 0) {\n svc.chatLog.addSystem('No transcript entries found.');\n svc.tui.requestRender();\n return;\n }\n\n const byId = new Map(entries.map((entry) => [entry.id, entry]));\n const list = new TranscriptTreeSelectList(entries, filterMode, svc.keybindings, Math.min(16, visibleEntries.length));\n list.onSelect = (item) => {\n const entry = byId.get(item.value);\n svc.closeOverlay();\n svc.tui.setFocus(svc.editor);\n if (!entry) {\n svc.tui.requestRender();\n return;\n }\n const targetKey = defaultTranscriptForkKey(svc.state.currentSessionKey, entry.id);\n const sourceSessionKey = svc.state.currentSessionKey;\n svc.chatLog.addSystem(theme.dim(`Forking transcript at ${entry.id}...`));\n void svc.client\n .forkSessionAt(sourceSessionKey, targetKey, entry.id)\n .then((result) => {\n resumeSession(svc, result.sessionKey);\n svc.chatLog.addBranchSummary({\n sourceSessionKey,\n targetSessionKey: result.sessionKey,\n rowCount: result.rowCount,\n entryId: entry.id,\n });\n })\n .catch((err) => {\n const errorMessage = err instanceof Error ? err.message : String(err);\n svc.chatLog.addSystem(`Fork failed: ${errorMessage}`);\n svc.tui.requestRender();\n });\n svc.tui.requestRender();\n };\n list.onCancel = () => {\n svc.closeOverlay();\n svc.tui.setFocus(svc.editor);\n svc.tui.requestRender();\n };\n list.onFilterChange = (mode) => {\n svc.chatLog.addSystem(theme.dim(`Transcript tree filter: ${mode}`));\n svc.tui.requestRender();\n };\n list.onLabelSubmit = (entry, label) => {\n void svc.client\n .setTranscriptLabel(svc.state.currentSessionKey, entry.id, label)\n .then(() => {\n list.updateEntryLabel(entry.id, label);\n svc.chatLog.addSystem(\n theme.dim(label?.trim() ? `Labeled ${entry.id}: ${label.trim()}` : `Cleared label for ${entry.id}`),\n );\n svc.tui.requestRender();\n })\n .catch((err) => {\n const errorMessage = err instanceof Error ? err.message : String(err);\n svc.chatLog.addSystem(`Label failed: ${errorMessage}`);\n svc.tui.requestRender();\n });\n };\n\n svc.openOverlay(list);\n svc.chatLog.addSystem(theme.dim(formatTranscriptTreeFilterHint(svc.keybindings, filterMode)));\n svc.tui.requestRender();\n}\n\n/** Pi-style `/fork` overlay: select a previous user message and branch there. */\nexport async function openUserMessageForkOverlay(svc: PickerServices): Promise<void> {\n const entries = await svc.client.loadTranscriptTree(svc.state.currentSessionKey);\n const byId = new Map(entries.map((entry) => [entry.id, entry]));\n const items = userMessageForkSelectItems(entries);\n if (items.length === 0) {\n svc.chatLog.addSystem('No messages to fork from.');\n svc.tui.requestRender();\n return;\n }\n\n const list = new SearchableSelectList(items, Math.min(10, items.length), searchableSelectListTheme, {\n wrapNavigation: true,\n });\n list.setSelectedIndex(items.length - 1);\n list.onSelect = (item) => {\n svc.closeOverlay();\n svc.tui.setFocus(svc.editor);\n const entry = byId.get(item.value);\n const targetKey = defaultTranscriptForkKey(svc.state.currentSessionKey, item.value);\n const sourceSessionKey = svc.state.currentSessionKey;\n svc.chatLog.addSystem(theme.dim(`Forking from ${item.value}...`));\n void svc.client\n .forkSessionAt(sourceSessionKey, targetKey, item.value)\n .then((result) => {\n resumeSession(svc, result.sessionKey);\n if (entry?.contentText) {\n svc.setEditorText(entry.contentText);\n }\n svc.chatLog.addBranchSummary({\n sourceSessionKey,\n targetSessionKey: result.sessionKey,\n rowCount: result.rowCount,\n entryId: item.value,\n restoredText: entry?.contentText,\n });\n })\n .catch((err) => {\n const errorMessage = err instanceof Error ? err.message : String(err);\n svc.chatLog.addSystem(`Fork failed: ${errorMessage}`);\n svc.tui.requestRender();\n });\n svc.tui.requestRender();\n };\n list.onCancel = () => {\n svc.closeOverlay();\n svc.tui.setFocus(svc.editor);\n svc.tui.requestRender();\n };\n\n svc.openOverlay(list);\n svc.chatLog.addSystem(theme.dim(formatUserMessageForkOpenedHint(svc.keybindings)));\n svc.tui.requestRender();\n}\n\n/** `/scoped-models` — limit Ctrl+P model cycle set. */\nexport async function openScopedModelsOverlay(svc: PickerServices): Promise<void> {\n const catalog = await svc.client.listModels();\n svc.setModelChoices(catalog);\n if (catalog.length === 0) {\n svc.chatLog.addSystem('No models available.');\n svc.tui.requestRender();\n return;\n }\n\n const selector = new ScopedModelsSelector(\n catalog,\n svc.getScopedModelRefs(),\n {\n onSave: (refs) => {\n svc.setScopedModelRefs(refs);\n svc.refreshCycleModels();\n svc.closeOverlay();\n svc.tui.setFocus(svc.editor);\n svc.chatLog.addSystem(\n theme.dim(formatScopedModelsSavedHint({\n refs,\n total: catalog.length,\n keybindings: svc.keybindings,\n })),\n );\n svc.tui.requestRender();\n },\n onCancel: () => {\n svc.closeOverlay();\n svc.tui.setFocus(svc.editor);\n svc.tui.requestRender();\n },\n requestRender: () => svc.tui.requestRender(),\n },\n svc.keybindings,\n );\n\n svc.openOverlay(selector);\n svc.chatLog.addSystem(theme.dim(formatScopedModelsOpenedHint(svc.keybindings)));\n svc.tui.requestRender();\n}\n\n/** `/settings` — TUI preferences overlay. */\nexport function openSettingsOverlay(svc: PickerServices): void {\n const selector = new SettingsSelector(svc.getTuiSettings(), {\n onChange: (settings) => svc.applyTuiSettings(settings),\n onThemePreview: (themeId) => svc.previewTheme(themeId),\n onReloadKeybindings: () => svc.reloadKeybindings(),\n onCancel: () => {\n svc.previewTheme(svc.getTuiSettings().theme);\n svc.closeOverlay();\n svc.tui.setFocus(svc.editor);\n svc.tui.requestRender();\n },\n });\n\n svc.openOverlay(selector);\n svc.chatLog.addSystem(theme.dim(formatSettingsOpenedHint(svc.keybindings)));\n svc.tui.requestRender();\n}\n\n/** `/think` — select and persist the current session thinking level. */\nexport function openThinkingSelectorOverlay(svc: PickerServices): void {\n const current = normalizeThinkLevel(svc.state.sessionInfo.thinkingLevel) ?? 'medium';\n const levels = listThinkingLevels(\n svc.state.sessionInfo.modelProvider,\n svc.state.sessionInfo.model,\n ).map((level) => (level === 'on' ? 'low' : level)) as ThinkLevel[];\n const uniqueLevels = [...new Set(levels)];\n\n const selector = new ThinkingSelector(current, uniqueLevels, {\n onSelect: (level) => {\n void svc.setThinkingLevel(level).then(() => {\n svc.closeOverlay();\n svc.tui.setFocus(svc.editor);\n });\n },\n onCancel: () => {\n svc.closeOverlay();\n svc.tui.setFocus(svc.editor);\n svc.tui.requestRender();\n },\n }, svc.keybindings);\n\n svc.openOverlay(selector);\n svc.chatLog.addSystem(theme.dim(formatThinkingSelectorHint(svc.keybindings)));\n svc.tui.requestRender();\n}\n\nexport function openProjectTrustOverlay(svc: PickerServices): void {\n const cwd = process.cwd();\n const trustStore = svc.getProjectTrustStore();\n const currentStored = trustStore.getEntry(cwd);\n const sessionDecision = svc.getProjectTrustSessionDecision();\n const hasProjectResources = hasTrustRequiringProjectResources(cwd);\n const options = getProjectTrustOptions(cwd, { includeSessionOnly: true });\n const optionsByLabel = new Map(options.map((option) => [option.label, option]));\n const items: SelectItem[] = options.map((option) => ({\n value: option.label,\n label: option.label,\n description: option.savedPath ?? 'Current TUI session only',\n }));\n const list = new SearchableSelectList(items, Math.min(8, items.length), searchableSelectListTheme, {\n searchPromptText: 'trust: ',\n });\n\n list.onSelect = (item) => {\n const selected = optionsByLabel.get(item.value);\n if (!selected) return;\n if (selected.updates.length > 0) {\n trustStore.setMany(selected.updates);\n svc.setProjectTrustSessionDecision(null);\n } else {\n svc.setProjectTrustSessionDecision(selected.trusted);\n }\n svc.closeOverlay();\n svc.tui.setFocus(svc.editor);\n const scope = selected.savedPath ? `saved for ${selected.savedPath}` : 'this session only';\n svc.chatLog.addSystem(theme.dim(`Project trust: ${selected.trusted ? 'trusted' : 'not trusted'} (${scope})`));\n svc.tui.requestRender();\n };\n list.onCancel = () => {\n svc.closeOverlay();\n svc.tui.setFocus(svc.editor);\n svc.tui.requestRender();\n };\n\n svc.openOverlay(list);\n const storedLabel = currentStored\n ? `${currentStored.decision ? 'trusted' : 'not trusted'} from ${currentStored.path}`\n : 'not saved';\n const sessionLabel = sessionDecision === null ? 'none' : sessionDecision ? 'trusted' : 'not trusted';\n svc.chatLog.addSystem(\n theme.dim(\n [\n formatProjectTrustOpenedHint(svc.keybindings),\n `Project resources: ${hasProjectResources ? 'detected' : 'none detected'}`,\n `Stored: ${storedLabel}`,\n `Session: ${sessionLabel}`,\n ].join('\\n'),\n ),\n );\n svc.tui.requestRender();\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"tui-picker-overlay.js","names":[],"sources":["../../../src/tui/tui-picker-overlay.ts"],"sourcesContent":["import type { KeybindingsManager, SelectItem } from '@earendil-works/pi-tui';\n\nimport { ScopedModelsSelector } from './components/scoped-models-selector.js';\nimport { SettingsSelector } from './components/settings-selector.js';\nimport { SearchableSelectList } from './components/searchable-select-list.js';\nimport { SessionSelector } from './components/session-selector.js';\nimport { ThinkingSelector } from './components/thinking-selector.js';\nimport { formatKeyIds } from './format-tui-hotkeys.js';\nimport type { TuiAgentInfo, TuiSessionItem } from './tui-backend.js';\nimport type { PickerServices } from './tui-picker-services.js';\nimport { formatSessionPickerDescription } from './tui-session-format.js';\nimport { searchableSelectListTheme, theme } from './theme.js';\nimport { filterTuiTranscriptTreeEntries } from './tui-transcript-tree.js';\nimport {\n defaultTranscriptForkKey,\n formatTranscriptTreeFilterHint,\n formatUserMessageForkOpenedHint,\n TranscriptTreeSelectList,\n userMessageForkSelectItems,\n} from './tui-transcript-tree-picker.js';\nimport {\n listThinkingLevels,\n normalizeThinkLevel,\n type ThinkLevel,\n} from '../agent/transcript/thinking-types.js';\nimport { parseAgentSessionKey } from '../routing/agent-session-key.js';\nimport {\n getProjectTrustOptions,\n hasTrustRequiringProjectResources,\n} from '../project-trust/trust-store.js';\nimport type { ReviewContext } from '../review/review-git.js';\n\ntype SearchableSelectItem = SelectItem & { searchText?: string };\n\nfunction formatSelectNavigationHint(keybindings: KeybindingsManager): string {\n const up = formatKeyIds(keybindings, 'tui.select.up', { capitalize: true });\n const down = formatKeyIds(keybindings, 'tui.select.down', { capitalize: true });\n return `${up}/${down}`;\n}\n\nexport function formatScopedModelsOpenedHint(keybindings: KeybindingsManager): string {\n const modelCycle = formatKeyIds(keybindings, 'app.model.cycleForward', { capitalize: true });\n return `Scoped models for ${modelCycle}`;\n}\n\nexport function formatScopedModelsSavedHint(params: {\n refs: string[] | null;\n total: number;\n keybindings: KeybindingsManager;\n}): string {\n const modelCycle = formatKeyIds(params.keybindings, 'app.model.cycleForward', {\n capitalize: true,\n });\n if (params.refs === null) {\n return `${modelCycle} cycles all ${params.total} models`;\n }\n const count = params.refs.length;\n return `${modelCycle} cycles ${count} scoped model${count === 1 ? '' : 's'}`;\n}\n\nexport function formatSettingsOpenedHint(keybindings: KeybindingsManager): string {\n const nav = formatSelectNavigationHint(keybindings);\n const confirm = formatKeyIds(keybindings, 'tui.select.confirm', { capitalize: true });\n const cancel = formatKeyIds(keybindings, 'tui.select.cancel', { capitalize: true });\n return `Settings (${nav} · ${confirm} toggle · ${cancel} close)`;\n}\n\nexport function formatThinkingSelectorHint(keybindings: KeybindingsManager): string {\n const nav = formatSelectNavigationHint(keybindings);\n const confirm = formatKeyIds(keybindings, 'tui.select.confirm', { capitalize: true });\n const cancel = formatKeyIds(keybindings, 'tui.select.cancel', { capitalize: true });\n return `Thinking level (${nav} · ${confirm} select · ${cancel} close)`;\n}\n\nexport function formatThinkingLevelSavedHint(level: ThinkLevel): string {\n return `Thinking level: ${level}`;\n}\n\nexport function formatProjectTrustOpenedHint(keybindings: KeybindingsManager): string {\n const nav = formatSelectNavigationHint(keybindings);\n const confirm = formatKeyIds(keybindings, 'tui.select.confirm', { capitalize: true });\n const cancel = formatKeyIds(keybindings, 'tui.select.cancel', { capitalize: true });\n return `Project trust (${nav} · ${confirm} select · ${cancel} close)`;\n}\n\nexport function formatReviewPickerOpenedHint(keybindings: KeybindingsManager): string {\n const nav = formatSelectNavigationHint(keybindings);\n const confirm = formatKeyIds(keybindings, 'tui.select.confirm', { capitalize: true });\n const cancel = formatKeyIds(keybindings, 'tui.select.cancel', { capitalize: true });\n return `Review (${nav} · type to filter · ${confirm} select · ${cancel} close)`;\n}\n\nexport function formatAgentPickerOpenedHint(keybindings: KeybindingsManager): string {\n const nav = formatSelectNavigationHint(keybindings);\n const confirm = formatKeyIds(keybindings, 'tui.select.confirm', { capitalize: true });\n const cancel = formatKeyIds(keybindings, 'tui.select.cancel', { capitalize: true });\n return `Switch agent (${nav} · ${confirm} select · ${cancel} close)`;\n}\n\nfunction agentSelectItems(agents: TuiAgentInfo[], currentAgentId?: string): SelectItem[] {\n const current = currentAgentId?.trim().toLowerCase();\n return [...agents]\n .filter((agent) => agent.enabled !== false)\n .sort((a, b) => {\n if (a.id === current && b.id !== current) return -1;\n if (b.id === current && a.id !== current) return 1;\n if (a.id === 'coder' && b.id !== 'coder') return -1;\n if (b.id === 'coder' && a.id !== 'coder') return 1;\n return a.id.localeCompare(b.id);\n })\n .map((agent) => ({\n label: agent.id === current ? `${agent.id} (current)` : agent.id,\n value: agent.id,\n description: agent.displayName,\n }));\n}\n\nexport function formatSessionTreeOpenedHint(keybindings: KeybindingsManager): string {\n const nav = formatSelectNavigationHint(keybindings);\n const confirm = formatKeyIds(keybindings, 'tui.select.confirm', { capitalize: true });\n const cancel = formatKeyIds(keybindings, 'tui.select.cancel', { capitalize: true });\n return `Session tree (${nav} · type to filter · ${confirm} resume · ${cancel} close)`;\n}\n\nfunction resumeSession(svc: PickerServices, sessionKey: string): void {\n svc.setSessionKey(sessionKey);\n svc.clearChatForSessionSwitch();\n svc.chatLog.addSystem(`Session: ${sessionKey}`);\n void svc\n .refreshSessionInfo()\n .then(() => svc.loadSessionHistory())\n .then(() => {\n svc.updateHeader();\n svc.tui.requestRender();\n });\n svc.tui.requestRender();\n}\n\nfunction sessionTreeGroup(session: TuiSessionItem): { agentId: string; root: string; leaf: string } {\n const raw = session.key.trim();\n const parts = raw.split(':').filter(Boolean);\n if (parts.length >= 3 && parts[0] === 'agent') {\n const rest = parts.slice(2);\n return {\n agentId: parts[1] ?? 'main',\n root: rest[0] ?? raw,\n leaf: rest.length > 1 ? rest.slice(1).join(':') : rest.join(':') || raw,\n };\n }\n return { agentId: 'legacy', root: raw || 'session', leaf: raw || 'session' };\n}\n\nexport function sessionTreeSelectItems(\n sessions: TuiSessionItem[],\n currentSessionKey?: string,\n): SelectItem[] {\n const byKey = new Map(sessions.map((session) => [session.key, session]));\n return [...sessions]\n .sort((a, b) => {\n const ga = sessionTreeGroup(a);\n const gb = sessionTreeGroup(b);\n const groupCmp = `${ga.agentId}:${ga.root}`.localeCompare(`${gb.agentId}:${gb.root}`);\n if (groupCmp !== 0) return groupCmp;\n return (b.updatedAt ?? 0) - (a.updatedAt ?? 0);\n })\n .map((session) => {\n const group = sessionTreeGroup(session);\n const current = session.key === currentSessionKey ? '* ' : ' ';\n const label = session.displayName?.trim() || group.leaf;\n const parent = session.forkedFromSessionKey\n ? (byKey.get(session.forkedFromSessionKey)?.displayName?.trim() ?? session.forkedFromSessionKey)\n : null;\n const description = [\n `${group.agentId}/${group.root}`,\n formatSessionPickerDescription(session, { showKey: Boolean(session.displayName) }),\n parent ? `forked from ${parent}` : '',\n ]\n .filter(Boolean)\n .join(' · ');\n return {\n value: session.key,\n label: `${current}${label}`,\n description,\n searchText: `${session.key} ${session.displayName ?? ''} ${session.model ?? ''} ${parent ?? ''}`,\n };\n });\n}\n\n\n\n\n\nexport async function openAgentPickerOverlay(svc: PickerServices): Promise<void> {\n const parsed = parseAgentSessionKey(svc.state.currentSessionKey);\n if (!parsed) {\n svc.chatLog.addSystem('Cannot switch agent: current session is not an agent session.');\n svc.tui.requestRender();\n return;\n }\n if (svc.state.activeRunId) {\n svc.chatLog.addSystem('Cannot switch agent while a run is active. Abort first.');\n svc.tui.requestRender();\n return;\n }\n if (!svc.switchAgentSession) {\n svc.chatLog.addSystem('Agent switching is not available in this mode.');\n svc.tui.requestRender();\n return;\n }\n const agents = await svc.client.listAgents();\n const items = agentSelectItems(agents, parsed.agentId);\n if (items.length === 0) {\n svc.chatLog.addSystem('No agents available.');\n svc.tui.requestRender();\n return;\n }\n svc.chatLog.addSystem(theme.dim(formatAgentPickerOpenedHint(svc.keybindings)));\n const list = new SearchableSelectList(items, Math.min(10, items.length), searchableSelectListTheme, {\n searchPromptText: 'agent> ',\n });\n const closeSelector = svc.openEditorSelector(list, list);\n list.onSelect = (item) => {\n closeSelector();\n const targetAgentId = item.value;\n if (targetAgentId === parsed.agentId) {\n svc.chatLog.addSystem(`Already using agent: ${targetAgentId}`);\n svc.tui.requestRender();\n return;\n }\n const targetSessionKey = `agent:${targetAgentId}:${parsed.rest}`;\n void Promise.resolve(svc.switchAgentSession?.(targetSessionKey, targetAgentId))\n .then(() => {\n svc.chatLog.addSystem(`Switched to agent: ${targetAgentId}\\nSession: ${targetSessionKey}`);\n })\n .catch((err: unknown) => {\n const errorMessage = err instanceof Error ? err.message : String(err);\n svc.chatLog.addSystem(`Agent switch failed: ${errorMessage}`);\n })\n .finally(() => svc.tui.requestRender());\n svc.tui.requestRender();\n };\n list.onCancel = () => closeSelector();\n svc.tui.requestRender();\n}\n\nfunction quoteReviewArg(value: string): string {\n return /^[A-Za-z0-9._/@:-]+$/.test(value) ? value : JSON.stringify(value);\n}\n\nfunction formatReviewStatus(status: ReviewContext['status']): string {\n if (status.isClean) return 'working tree clean';\n const parts: string[] = [];\n if (status.changedFiles > 0) parts.push(`${status.changedFiles} changed`);\n if (status.untrackedFiles > 0) parts.push(`${status.untrackedFiles} untracked`);\n return parts.join(', ');\n}\n\nfunction reviewPresetItems(context: ReviewContext): SearchableSelectItem[] {\n return [\n {\n value: 'base',\n label: 'Review against a base branch',\n description: context.defaultBaseBranch ? `PR Style · default ${context.defaultBaseBranch}` : 'PR Style',\n searchText: 'pr pull request base branch merge base',\n },\n {\n value: 'uncommitted',\n label: 'Review uncommitted changes',\n description: formatReviewStatus(context.status),\n searchText: 'workspace working tree uncommitted diff status',\n },\n {\n value: 'commit',\n label: 'Review a commit',\n description: context.commits.length > 0 ? `${context.commits.length} recent commits` : 'no commits found',\n searchText: 'commit sha history log',\n },\n {\n value: 'custom',\n label: 'Custom review instructions',\n description: 'edit prompt before sending',\n searchText: 'custom instructions focus prompt',\n },\n ];\n}\n\nfunction branchSelectItems(context: ReviewContext): SelectItem[] {\n return context.branches\n .filter((branch) => !branch.current)\n .map((branch) => ({\n value: branch.name,\n label: branch.name,\n description: [\n branch.name === context.defaultBaseBranch ? 'default' : '',\n branch.remote ? 'remote' : 'local',\n ].filter(Boolean).join(' · '),\n searchText: branch.name,\n }));\n}\n\nfunction commitSelectItems(context: ReviewContext): SelectItem[] {\n return context.commits.map((commit) => ({\n value: commit.sha,\n label: commit.subject,\n description: [commit.shortSha, commit.date?.slice(0, 10)].filter(Boolean).join(' · '),\n searchText: `${commit.sha} ${commit.shortSha} ${commit.subject}`,\n }));\n}\n\nfunction openReviewBranchSelector(svc: PickerServices, context: ReviewContext): void {\n const items = branchSelectItems(context);\n if (items.length === 0) {\n svc.closeOverlay();\n svc.tui.setFocus(svc.editor);\n svc.chatLog.addSystem('No base branches available for review.');\n svc.tui.requestRender();\n return;\n }\n const list = new SearchableSelectList(items, Math.min(10, items.length), searchableSelectListTheme, {\n searchPromptText: 'branch> ',\n });\n const defaultIndex = context.defaultBaseBranch\n ? items.findIndex((item) => item.value === context.defaultBaseBranch)\n : -1;\n if (defaultIndex >= 0) list.setSelectedIndex(defaultIndex);\n list.onSelect = (item) => {\n svc.closeOverlay();\n svc.tui.setFocus(svc.editor);\n svc.sendMessage(`/review --base ${quoteReviewArg(item.value)}`);\n };\n list.onCancel = () => {\n openReviewPresetSelector(svc, context);\n };\n svc.openOverlay(list);\n svc.chatLog.addSystem(theme.dim('Select a base branch to review'));\n svc.tui.requestRender();\n}\n\nfunction openReviewCommitSelector(svc: PickerServices, context: ReviewContext): void {\n const items = commitSelectItems(context);\n if (items.length === 0) {\n svc.closeOverlay();\n svc.tui.setFocus(svc.editor);\n svc.chatLog.addSystem('No commits available for review.');\n svc.tui.requestRender();\n return;\n }\n const list = new SearchableSelectList(items, Math.min(12, items.length), searchableSelectListTheme, {\n searchPromptText: 'commit> ',\n });\n list.onSelect = (item) => {\n svc.closeOverlay();\n svc.tui.setFocus(svc.editor);\n svc.sendMessage(`/review --commit ${item.value}`);\n };\n list.onCancel = () => {\n openReviewPresetSelector(svc, context);\n };\n svc.openOverlay(list);\n svc.chatLog.addSystem(theme.dim('Select a commit to review'));\n svc.tui.requestRender();\n}\n\nfunction openReviewPresetSelector(svc: PickerServices, context: ReviewContext): void {\n const items = reviewPresetItems(context);\n const list = new SearchableSelectList(items, Math.min(8, items.length), searchableSelectListTheme, {\n searchPromptText: 'review> ',\n });\n list.onSelect = (item) => {\n if (item.value === 'uncommitted') {\n svc.closeOverlay();\n svc.tui.setFocus(svc.editor);\n svc.sendMessage('/review --uncommitted');\n return;\n }\n if (item.value === 'custom') {\n svc.closeOverlay();\n svc.tui.setFocus(svc.editor);\n svc.setEditorText('/review --custom ');\n svc.tui.requestRender();\n return;\n }\n if (item.value === 'base') {\n openReviewBranchSelector(svc, context);\n return;\n }\n if (item.value === 'commit') {\n openReviewCommitSelector(svc, context);\n }\n };\n list.onCancel = () => {\n svc.closeOverlay();\n svc.tui.setFocus(svc.editor);\n svc.tui.requestRender();\n };\n\n svc.openOverlay(list);\n svc.chatLog.addSystem(theme.dim(formatReviewPickerOpenedHint(svc.keybindings)));\n svc.tui.requestRender();\n}\n\nexport async function openReviewLauncherOverlay(svc: PickerServices): Promise<void> {\n if (!svc.client.getReviewContext) {\n svc.chatLog.addSystem('Review picker is not available in this mode. Use /review --uncommitted, /review --base <branch>, or /review --commit <sha>.');\n svc.tui.requestRender();\n return;\n }\n let context: ReviewContext;\n try {\n context = await svc.client.getReviewContext(svc.state.currentSessionKey);\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n svc.chatLog.addSystem(`Review picker failed: ${errorMessage}`);\n svc.tui.requestRender();\n return;\n }\n openReviewPresetSelector(svc, context);\n}\n\n/** Ctrl+Shift+P — session picker with rename/delete. */\nexport async function openSessionPickerOverlay(svc: PickerServices): Promise<void> {\n const sessions = await svc.client.listSessions();\n if (sessions.length === 0) {\n svc.chatLog.addSystem('No sessions listed.');\n svc.tui.requestRender();\n return;\n }\n\n const selector = new SessionSelector(\n sessions,\n {\n onResume: (sessionKey) => {\n svc.closeOverlay();\n svc.tui.setFocus(svc.editor);\n resumeSession(svc, sessionKey);\n },\n onRename: async (sessionKey, name) => {\n const result = await svc.client.renameSession(sessionKey, name);\n return result.ok ? { ok: true } : { ok: false, error: 'Rename failed' };\n },\n onDelete: async (sessionKey) => {\n if (sessionKey === svc.state.currentSessionKey) {\n return { ok: false, error: 'Switch away before deleting the active session' };\n }\n const result = await svc.client.deleteSession(sessionKey);\n return result.ok ? { ok: true } : { ok: false, error: 'Delete failed' };\n },\n onCancel: () => {\n svc.closeOverlay();\n svc.tui.setFocus(svc.editor);\n svc.tui.requestRender();\n },\n requestRender: () => svc.tui.requestRender(),\n },\n svc.keybindings,\n sessions.find((s) => s.key === svc.state.currentSessionKey)?.cwd ?? process.cwd(),\n svc.state.currentSessionKey,\n );\n\n svc.openOverlay(selector);\n svc.chatLog.addSystem(theme.dim('Session picker'));\n svc.tui.requestRender();\n}\n\n/** Searchable session tree navigation overlay. */\nexport async function openSessionTreeOverlay(svc: PickerServices): Promise<void> {\n const sessions = await svc.client.listSessions();\n if (sessions.length === 0) {\n svc.chatLog.addSystem('No sessions listed.');\n svc.tui.requestRender();\n return;\n }\n\n const items = sessionTreeSelectItems(sessions, svc.state.currentSessionKey);\n const list = new SearchableSelectList(items, Math.min(14, items.length), searchableSelectListTheme);\n list.onSelect = (item) => {\n svc.closeOverlay();\n svc.tui.setFocus(svc.editor);\n resumeSession(svc, item.value);\n };\n list.onCancel = () => {\n svc.closeOverlay();\n svc.tui.setFocus(svc.editor);\n svc.tui.requestRender();\n };\n\n svc.openOverlay(list);\n svc.chatLog.addSystem(theme.dim(formatSessionTreeOpenedHint(svc.keybindings)));\n svc.tui.requestRender();\n}\n\n/** Searchable current-transcript tree overlay. */\nexport async function openTranscriptTreeOverlay(svc: PickerServices): Promise<void> {\n const entries = await svc.client.loadTranscriptTree(svc.state.currentSessionKey);\n const filterMode = svc.getTuiSettings().treeFilterMode;\n const visibleEntries = filterTuiTranscriptTreeEntries(entries, filterMode);\n if (visibleEntries.length === 0) {\n svc.chatLog.addSystem('No transcript entries found.');\n svc.tui.requestRender();\n return;\n }\n\n const byId = new Map(entries.map((entry) => [entry.id, entry]));\n const list = new TranscriptTreeSelectList(entries, filterMode, svc.keybindings, Math.min(16, visibleEntries.length));\n list.onSelect = (item) => {\n const entry = byId.get(item.value);\n svc.closeOverlay();\n svc.tui.setFocus(svc.editor);\n if (!entry) {\n svc.tui.requestRender();\n return;\n }\n const targetKey = defaultTranscriptForkKey(svc.state.currentSessionKey, entry.id);\n const sourceSessionKey = svc.state.currentSessionKey;\n svc.chatLog.addSystem(theme.dim(`Forking transcript at ${entry.id}...`));\n void svc.client\n .forkSessionAt(sourceSessionKey, targetKey, entry.id)\n .then((result) => {\n resumeSession(svc, result.sessionKey);\n svc.chatLog.addBranchSummary({\n sourceSessionKey,\n targetSessionKey: result.sessionKey,\n rowCount: result.rowCount,\n entryId: entry.id,\n });\n })\n .catch((err) => {\n const errorMessage = err instanceof Error ? err.message : String(err);\n svc.chatLog.addSystem(`Fork failed: ${errorMessage}`);\n svc.tui.requestRender();\n });\n svc.tui.requestRender();\n };\n list.onCancel = () => {\n svc.closeOverlay();\n svc.tui.setFocus(svc.editor);\n svc.tui.requestRender();\n };\n list.onFilterChange = (mode) => {\n svc.chatLog.addSystem(theme.dim(`Transcript tree filter: ${mode}`));\n svc.tui.requestRender();\n };\n list.onLabelSubmit = (entry, label) => {\n void svc.client\n .setTranscriptLabel(svc.state.currentSessionKey, entry.id, label)\n .then(() => {\n list.updateEntryLabel(entry.id, label);\n svc.chatLog.addSystem(\n theme.dim(label?.trim() ? `Labeled ${entry.id}: ${label.trim()}` : `Cleared label for ${entry.id}`),\n );\n svc.tui.requestRender();\n })\n .catch((err) => {\n const errorMessage = err instanceof Error ? err.message : String(err);\n svc.chatLog.addSystem(`Label failed: ${errorMessage}`);\n svc.tui.requestRender();\n });\n };\n\n svc.openOverlay(list);\n svc.chatLog.addSystem(theme.dim(formatTranscriptTreeFilterHint(svc.keybindings, filterMode)));\n svc.tui.requestRender();\n}\n\n/** Pi-style `/fork` overlay: select a previous user message and branch there. */\nexport async function openUserMessageForkOverlay(svc: PickerServices): Promise<void> {\n const entries = await svc.client.loadTranscriptTree(svc.state.currentSessionKey);\n const byId = new Map(entries.map((entry) => [entry.id, entry]));\n const items = userMessageForkSelectItems(entries);\n if (items.length === 0) {\n svc.chatLog.addSystem('No messages to fork from.');\n svc.tui.requestRender();\n return;\n }\n\n const list = new SearchableSelectList(items, Math.min(10, items.length), searchableSelectListTheme, {\n wrapNavigation: true,\n });\n list.setSelectedIndex(items.length - 1);\n list.onSelect = (item) => {\n svc.closeOverlay();\n svc.tui.setFocus(svc.editor);\n const entry = byId.get(item.value);\n const targetKey = defaultTranscriptForkKey(svc.state.currentSessionKey, item.value);\n const sourceSessionKey = svc.state.currentSessionKey;\n svc.chatLog.addSystem(theme.dim(`Forking from ${item.value}...`));\n void svc.client\n .forkSessionAt(sourceSessionKey, targetKey, item.value)\n .then((result) => {\n resumeSession(svc, result.sessionKey);\n if (entry?.contentText) {\n svc.setEditorText(entry.contentText);\n }\n svc.chatLog.addBranchSummary({\n sourceSessionKey,\n targetSessionKey: result.sessionKey,\n rowCount: result.rowCount,\n entryId: item.value,\n restoredText: entry?.contentText,\n });\n })\n .catch((err) => {\n const errorMessage = err instanceof Error ? err.message : String(err);\n svc.chatLog.addSystem(`Fork failed: ${errorMessage}`);\n svc.tui.requestRender();\n });\n svc.tui.requestRender();\n };\n list.onCancel = () => {\n svc.closeOverlay();\n svc.tui.setFocus(svc.editor);\n svc.tui.requestRender();\n };\n\n svc.openOverlay(list);\n svc.chatLog.addSystem(theme.dim(formatUserMessageForkOpenedHint(svc.keybindings)));\n svc.tui.requestRender();\n}\n\n/** `/scoped-models` — limit Ctrl+P model cycle set. */\nexport async function openScopedModelsOverlay(svc: PickerServices): Promise<void> {\n const catalog = await svc.client.listModels();\n svc.setModelChoices(catalog);\n if (catalog.length === 0) {\n svc.chatLog.addSystem('No models available.');\n svc.tui.requestRender();\n return;\n }\n\n const selector = new ScopedModelsSelector(\n catalog,\n svc.getScopedModelRefs(),\n {\n onSave: (refs) => {\n svc.setScopedModelRefs(refs);\n svc.refreshCycleModels();\n svc.closeOverlay();\n svc.tui.setFocus(svc.editor);\n svc.chatLog.addSystem(\n theme.dim(formatScopedModelsSavedHint({\n refs,\n total: catalog.length,\n keybindings: svc.keybindings,\n })),\n );\n svc.tui.requestRender();\n },\n onCancel: () => {\n svc.closeOverlay();\n svc.tui.setFocus(svc.editor);\n svc.tui.requestRender();\n },\n requestRender: () => svc.tui.requestRender(),\n },\n svc.keybindings,\n );\n\n svc.openOverlay(selector);\n svc.chatLog.addSystem(theme.dim(formatScopedModelsOpenedHint(svc.keybindings)));\n svc.tui.requestRender();\n}\n\n/** `/settings` — TUI preferences overlay. */\nexport function openSettingsOverlay(svc: PickerServices): void {\n const selector = new SettingsSelector(svc.getTuiSettings(), {\n onChange: (settings) => svc.applyTuiSettings(settings),\n onThemePreview: (themeId) => svc.previewTheme(themeId),\n onReloadKeybindings: () => svc.reloadKeybindings(),\n onCancel: () => {\n svc.previewTheme(svc.getTuiSettings().theme);\n svc.closeOverlay();\n svc.tui.setFocus(svc.editor);\n svc.tui.requestRender();\n },\n });\n\n svc.openOverlay(selector);\n svc.chatLog.addSystem(theme.dim(formatSettingsOpenedHint(svc.keybindings)));\n svc.tui.requestRender();\n}\n\n/** `/think` — select and persist the current session thinking level. */\nexport function openThinkingSelectorOverlay(svc: PickerServices): void {\n const current = normalizeThinkLevel(svc.state.sessionInfo.thinkingLevel) ?? 'medium';\n const levels = listThinkingLevels(\n svc.state.sessionInfo.modelProvider,\n svc.state.sessionInfo.model,\n ).map((level) => (level === 'on' ? 'low' : level)) as ThinkLevel[];\n const uniqueLevels = [...new Set(levels)];\n\n const selector = new ThinkingSelector(current, uniqueLevels, {\n onSelect: (level) => {\n void svc.setThinkingLevel(level).then(() => {\n svc.closeOverlay();\n svc.tui.setFocus(svc.editor);\n });\n },\n onCancel: () => {\n svc.closeOverlay();\n svc.tui.setFocus(svc.editor);\n svc.tui.requestRender();\n },\n }, svc.keybindings);\n\n svc.openOverlay(selector);\n svc.chatLog.addSystem(theme.dim(formatThinkingSelectorHint(svc.keybindings)));\n svc.tui.requestRender();\n}\n\nexport function openProjectTrustOverlay(svc: PickerServices): void {\n const cwd = process.cwd();\n const trustStore = svc.getProjectTrustStore();\n const currentStored = trustStore.getEntry(cwd);\n const sessionDecision = svc.getProjectTrustSessionDecision();\n const hasProjectResources = hasTrustRequiringProjectResources(cwd);\n const options = getProjectTrustOptions(cwd, { includeSessionOnly: true });\n const optionsByLabel = new Map(options.map((option) => [option.label, option]));\n const items: SelectItem[] = options.map((option) => ({\n value: option.label,\n label: option.label,\n description: option.savedPath ?? 'Current TUI session only',\n }));\n const list = new SearchableSelectList(items, Math.min(8, items.length), searchableSelectListTheme, {\n searchPromptText: 'trust: ',\n });\n\n list.onSelect = (item) => {\n const selected = optionsByLabel.get(item.value);\n if (!selected) return;\n if (selected.updates.length > 0) {\n trustStore.setMany(selected.updates);\n svc.setProjectTrustSessionDecision(null);\n } else {\n svc.setProjectTrustSessionDecision(selected.trusted);\n }\n svc.closeOverlay();\n svc.tui.setFocus(svc.editor);\n const scope = selected.savedPath ? `saved for ${selected.savedPath}` : 'this session only';\n svc.chatLog.addSystem(theme.dim(`Project trust: ${selected.trusted ? 'trusted' : 'not trusted'} (${scope})`));\n svc.tui.requestRender();\n };\n list.onCancel = () => {\n svc.closeOverlay();\n svc.tui.setFocus(svc.editor);\n svc.tui.requestRender();\n };\n\n svc.openOverlay(list);\n const storedLabel = currentStored\n ? `${currentStored.decision ? 'trusted' : 'not trusted'} from ${currentStored.path}`\n : 'not saved';\n const sessionLabel = sessionDecision === null ? 'none' : sessionDecision ? 'trusted' : 'not trusted';\n svc.chatLog.addSystem(\n theme.dim(\n [\n formatProjectTrustOpenedHint(svc.keybindings),\n `Project resources: ${hasProjectResources ? 'detected' : 'none detected'}`,\n `Stored: ${storedLabel}`,\n `Session: ${sessionLabel}`,\n ].join('\\n'),\n ),\n );\n svc.tui.requestRender();\n}\n"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { version } from "../../package.js";
2
2
  import { resolveStateDir, resolveXopcDatabasePath } from "../config/paths-state.js";
3
3
  import { parseAgentSessionKey } from "../routing/session-key-utils.js";
4
- import { init_agent_session_key } from "../routing/agent-session-key.js";
4
+ import { init_agent_session_key, normalizeAgentId } from "../routing/agent-session-key.js";
5
5
  import { resolveEffectiveAgentProfileForSession } from "../config/agent-profile.js";
6
6
  import { init_paths } from "../config/paths.js";
7
7
  import { loadConfig } from "../config/loader.js";
@@ -35,7 +35,7 @@ import { createLocalShellRunner } from "./tui-local-shell.js";
35
35
  import { filterModelsForCycle, loadScopedModelRefs, saveScopedModelRefs } from "./tui-scoped-models.js";
36
36
  import { openModelPickerOverlay } from "./tui-model-picker.js";
37
37
  import { runTuiOAuthLogin } from "./tui-oauth-login.js";
38
- import { openAgentPickerOverlay, openProjectTrustOverlay, openScopedModelsOverlay, openSessionPickerOverlay, openSessionTreeOverlay, openSettingsOverlay, openThinkingSelectorOverlay, openTranscriptTreeOverlay, openUserMessageForkOverlay } from "./tui-picker-overlay.js";
38
+ import { openAgentPickerOverlay, openProjectTrustOverlay, openReviewLauncherOverlay, openScopedModelsOverlay, openSessionPickerOverlay, openSessionTreeOverlay, openSettingsOverlay, openThinkingSelectorOverlay, openTranscriptTreeOverlay, openUserMessageForkOverlay } from "./tui-picker-overlay.js";
39
39
  import { formatBusyResponseHint, formatSteerUnavailableHint, formatSuspendUnsupportedHint } from "./tui-runtime-hints.js";
40
40
  import { createSessionActions } from "./tui-session-actions.js";
41
41
  import { TuiSessionSnapshot } from "./tui-session-snapshot.js";
@@ -1014,7 +1014,18 @@ async function runTui(opts) {
1014
1014
  autoCreate: true
1015
1015
  });
1016
1016
  if (!result?.project) return;
1017
- await client.patchSession(state.currentSessionKey, { projectId: result.project.id });
1017
+ const projectAgentId = result.project.defaultAgentId?.trim() ? normalizeAgentId(result.project.defaultAgentId) : void 0;
1018
+ const currentParsed = parseAgentSessionKey(state.currentSessionKey);
1019
+ if (!opts.agentId?.trim() && currentParsed?.rest && projectAgentId && projectAgentId !== currentAgentId) {
1020
+ await setSession(`agent:${projectAgentId}:${currentParsed.rest}`);
1021
+ currentAgentId = projectAgentId;
1022
+ await client.patchSession(state.currentSessionKey, {
1023
+ projectId: result.project.id,
1024
+ workingDirectory: startupWorkingDirectory
1025
+ });
1026
+ state.sessionInfo.effectiveWorkspacePath = startupWorkingDirectory;
1027
+ state.sessionInfo.workingDirectoryLocked = true;
1028
+ } else await client.patchSession(state.currentSessionKey, { projectId: result.project.id });
1018
1029
  const verb = result.created ? "Created project" : "Using project";
1019
1030
  chatLog.addStatus(theme.dim(`${verb}: ${result.project.name}`));
1020
1031
  };
@@ -1568,6 +1579,7 @@ async function runTui(opts) {
1568
1579
  const uiOverlays = {
1569
1580
  openModelPicker: (_initialSearch) => {},
1570
1581
  openAgentPicker: () => {},
1582
+ openReviewLauncher: () => {},
1571
1583
  openSessionPicker: () => {},
1572
1584
  openSessionTree: () => {},
1573
1585
  openTranscriptTree: () => {},
@@ -1837,6 +1849,7 @@ async function runTui(opts) {
1837
1849
  };
1838
1850
  uiOverlays.openModelPicker = (initialSearch) => void openModelPickerOverlay(pickerSvc, initialSearch);
1839
1851
  uiOverlays.openAgentPicker = () => void openAgentPickerOverlay(pickerSvc);
1852
+ uiOverlays.openReviewLauncher = () => void openReviewLauncherOverlay(pickerSvc);
1840
1853
  uiOverlays.openSessionPicker = () => void openSessionPickerOverlay(pickerSvc);
1841
1854
  uiOverlays.openSessionTree = () => void openSessionTreeOverlay(pickerSvc);
1842
1855
  uiOverlays.openTranscriptTree = () => void openTranscriptTreeOverlay(pickerSvc);