@xopcai/xopc 0.0.118 → 0.0.119

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 (468) hide show
  1. package/README.md +2 -1
  2. package/README.zh-CN.md +2 -1
  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-dzUrQoeZ.js → agent-avatar-dicebear-CU8J6zou.js} +1 -1
  6. package/dist/gateway/static/root/assets/agents-B0hkpLhP.js +2 -0
  7. package/dist/gateway/static/root/assets/app-management-settings-panel-B9vfYoEr.js +1 -0
  8. package/dist/gateway/static/root/assets/appearance-settings-ClOzIO24.js +1 -0
  9. package/dist/gateway/static/root/assets/{apps-page--wMEL00f.js → apps-page-DU0dz9Zo.js} +1 -1
  10. package/dist/gateway/static/root/assets/{archive-plugin-Cki4SfU2.js → archive-plugin-BkVIgZzA.js} +1 -1
  11. package/dist/gateway/static/root/assets/{attachment-load-D-KnS2Do.js → attachment-load-CaCMWh1D.js} +1 -1
  12. package/dist/gateway/static/root/assets/automation-suggestion-card-DhGDpKP3.js +1 -0
  13. package/dist/gateway/static/root/assets/automations-page-CTedroVo.js +1 -0
  14. package/dist/gateway/static/root/assets/{binary-plugins-D2sgvJja.js → binary-plugins-B4TO_bsn.js} +1 -1
  15. package/dist/gateway/static/root/assets/{block-editor-DIq-4Gvb.js → block-editor-DJRWwWNI.js} +28 -28
  16. package/dist/gateway/static/root/assets/browser-settings-page-FCDwOOBK.js +8 -0
  17. package/dist/gateway/static/root/assets/capability-presets-api-Befi89CL.js +1 -0
  18. package/dist/gateway/static/root/assets/capability-presets-settings-panel-_G8eb2vJ.js +1 -0
  19. package/dist/gateway/static/root/assets/channel-recipient-api-BNSuJb5f.js +1 -0
  20. package/dist/gateway/static/root/assets/channels-settings-C3d5JBJX.js +1 -0
  21. package/dist/gateway/static/root/assets/cn-BQ_8x0bT.js +1 -0
  22. package/dist/gateway/static/root/assets/connectors-page-yaUNvt5u.js +2 -0
  23. package/dist/gateway/static/root/assets/cron-expression-B3B1eqnr.js +2 -0
  24. package/dist/gateway/static/root/assets/dreaming-settings-DNrdg1Ve.js +1 -0
  25. package/dist/gateway/static/root/assets/{extension-debug-page-DYu1KaFQ.js → extension-debug-page-DYh402XV.js} +1 -1
  26. package/dist/gateway/static/root/assets/{extension-page-B3W6QwlZ.js → extension-page-Cr_TizrN.js} +1 -1
  27. package/dist/gateway/static/root/assets/{extension-settings-page-D7VQ-cxE.js → extension-settings-page-BU1KoKRj.js} +1 -1
  28. package/dist/gateway/static/root/assets/{fetch-B7xDPu-R.js → fetch-Y7AEX4H3.js} +1 -1
  29. package/dist/gateway/static/root/assets/format-cron-label-arqgGlVV.js +1 -0
  30. package/dist/gateway/static/root/assets/{gateway-config-api-BTBLSeUu.js → gateway-config-api-RbMmAOpX.js} +1 -1
  31. package/dist/gateway/static/root/assets/gateway-settings-C79wkXef.js +1 -0
  32. package/dist/gateway/static/root/assets/{gateway-startup-retry-CYj9FWCp.js → gateway-startup-retry-DiD_Tx4N.js} +1 -1
  33. package/dist/gateway/static/root/assets/goal-detail-page-9paXuHdo.js +1 -0
  34. package/dist/gateway/static/root/assets/{goals-config-api-CQQgzPr3.js → goals-config-api-DqxVi0p5.js} +1 -1
  35. package/dist/gateway/static/root/assets/{goals-page-BHitvJAv.js → goals-page-CS0R-Af2.js} +2 -2
  36. package/dist/gateway/static/root/assets/goals-settings-CSuzZ8Ae.js +1 -0
  37. package/dist/gateway/static/root/assets/heartbeat-settings-DXPaYJm3.js +1 -0
  38. package/dist/gateway/static/root/assets/index-BoKafJIZ.js +191 -0
  39. package/dist/gateway/static/root/assets/index-CArhCcYn.css +1 -0
  40. package/dist/gateway/static/root/assets/keyboard-shortcuts-settings-Dvg53qnd.js +1 -0
  41. package/dist/gateway/static/root/assets/{logs-page-C2Uqvae9.js → logs-page-DLXPcksQ.js} +2 -2
  42. package/dist/gateway/static/root/assets/{markdown-split-BwOFrJ2E.js → markdown-split-CpHxbtWJ.js} +1 -1
  43. package/dist/gateway/static/root/assets/{media-plugins-Cnz6Q5G6.js → media-plugins-SFPQRSxq.js} +1 -1
  44. package/dist/gateway/static/root/assets/messages-CrDHEbss.js +3 -0
  45. package/dist/gateway/static/root/assets/models-hub-panel-BDF2iyRk.js +2 -0
  46. package/dist/gateway/static/root/assets/note-detail-page-CSb_hwig.js +2 -0
  47. package/dist/gateway/static/root/assets/{note-image-lightbox-B-Svpmza.js → note-image-lightbox-BUYURRgn.js} +1 -1
  48. package/dist/gateway/static/root/assets/notes-page-BsIBSFyZ.js +1 -0
  49. package/dist/gateway/static/root/assets/{preview-open-alternatives-Bss4TiwP.js → preview-open-alternatives-BHz9iWYA.js} +1 -1
  50. package/dist/gateway/static/root/assets/remote-access-hub-CwzSovcS.js +1 -0
  51. package/dist/gateway/static/root/assets/{save-bar-controls-BRNjdgKq.js → save-bar-controls-CefkOlRg.js} +1 -1
  52. package/dist/gateway/static/root/assets/schedule-field-CmTRoOcE.js +1 -0
  53. package/dist/gateway/static/root/assets/{schema-form-Dub9sy8r.js → schema-form-FMKv1vGu.js} +1 -1
  54. package/dist/gateway/static/root/assets/sessions-page-PHmX-NmA.js +1 -0
  55. package/dist/gateway/static/root/assets/settings-advanced-gate-BRAeKJN4.js +1 -0
  56. package/dist/gateway/static/root/assets/{settings-collapsible-section-BeFLavGi.js → settings-collapsible-section-BouO6JTi.js} +1 -1
  57. package/dist/gateway/static/root/assets/{settings-form-section-dmyaPOTG.js → settings-form-section-D-4lBl6X.js} +1 -1
  58. package/dist/gateway/static/root/assets/settings-page-KKrbFjy8.js +1 -0
  59. package/dist/gateway/static/root/assets/settings-page-layout-BJ4Gsef5.js +1 -0
  60. package/dist/gateway/static/root/assets/setup-status-panel-CrUjHPQo.js +1 -0
  61. package/dist/gateway/static/root/assets/{share-preview-page-C8glrdqe.js → share-preview-page-BDy2btRN.js} +1 -1
  62. package/dist/gateway/static/root/assets/shares-settings-B18OBmH5.js +1 -0
  63. package/dist/gateway/static/root/assets/skill-reload-api-C28-2uKQ.js +1 -0
  64. package/dist/gateway/static/root/assets/skills-page-Bm2ebkwl.js +2 -0
  65. package/dist/gateway/static/root/assets/system-settings-panel-CRngrlnZ.js +1 -0
  66. package/dist/gateway/static/root/assets/typed-models-lib-BltBc0b-.js +1 -0
  67. package/dist/gateway/static/root/assets/{use-channel-catalog-DqlWTsDb.js → use-channel-catalog-CjN-51e6.js} +1 -1
  68. package/dist/gateway/static/root/assets/user-profile-settings-panel-DJ1dKwZy.js +1 -0
  69. package/dist/gateway/static/root/assets/utils-B5M5-YvK.js +1 -0
  70. package/dist/gateway/static/root/assets/{voice-api-key-field-C73IVZeC.js → voice-api-key-field-CeEevm7z.js} +1 -1
  71. package/dist/gateway/static/root/assets/{voice-player-store-C_ArLJPM.js → voice-player-store-B7ykUlHM.js} +1 -1
  72. package/dist/gateway/static/root/assets/workflow-run-setup-panel-C4PzUQjB.js +3 -0
  73. package/dist/gateway/static/root/assets/workflows-page-BL84_-Ky.js +18 -0
  74. package/dist/gateway/static/root/index.html +6 -7
  75. package/dist/package.js +1 -1
  76. package/dist/src/agent/agent-manager.d.ts +4 -5
  77. package/dist/src/agent/agent-manager.js +4 -8
  78. package/dist/src/agent/agent-manager.js.map +1 -1
  79. package/dist/src/agent/embedded/run-for-session.js +102 -14
  80. package/dist/src/agent/embedded/run-for-session.js.map +1 -1
  81. package/dist/src/agent/fallback/candidates.d.ts +0 -8
  82. package/dist/src/agent/fallback/candidates.js.map +1 -1
  83. package/dist/src/agent/index.js +1 -1
  84. package/dist/src/agent/lifecycle/handlers/compaction.d.ts +1 -3
  85. package/dist/src/agent/lifecycle/handlers/compaction.js +1 -16
  86. package/dist/src/agent/lifecycle/handlers/compaction.js.map +1 -1
  87. package/dist/src/agent/lifecycle/progress.d.ts +0 -1
  88. package/dist/src/agent/lifecycle/progress.js +1 -6
  89. package/dist/src/agent/lifecycle/progress.js.map +1 -1
  90. package/dist/src/agent/lifecycle/timeout-wrapper.d.ts +1 -2
  91. package/dist/src/agent/lifecycle/timeout-wrapper.js +1 -7
  92. package/dist/src/agent/lifecycle/timeout-wrapper.js.map +1 -1
  93. package/dist/src/agent/middleware/self-verify.d.ts +0 -1
  94. package/dist/src/agent/middleware/self-verify.js +0 -2
  95. package/dist/src/agent/middleware/self-verify.js.map +1 -1
  96. package/dist/src/agent/models/index.d.ts +1 -1
  97. package/dist/src/agent/models/manager.d.ts +4 -20
  98. package/dist/src/agent/models/manager.js +9 -126
  99. package/dist/src/agent/models/manager.js.map +1 -1
  100. package/dist/src/agent/orchestration/agent-orchestrator.d.ts +0 -4
  101. package/dist/src/agent/orchestration/agent-orchestrator.js +1 -9
  102. package/dist/src/agent/orchestration/agent-orchestrator.js.map +1 -1
  103. package/dist/src/agent/prompt/sections/tooling.js +2 -2
  104. package/dist/src/agent/prompt/sections/tooling.js.map +1 -1
  105. package/dist/src/agent/prompt/service-prompt-builder.d.ts +0 -1
  106. package/dist/src/agent/prompt/service-prompt-builder.js +0 -12
  107. package/dist/src/agent/prompt/service-prompt-builder.js.map +1 -1
  108. package/dist/src/agent/prompt/subagent-context.js +1 -1
  109. package/dist/src/agent/prompt/subagent-context.js.map +1 -1
  110. package/dist/src/agent/prompt/types.d.ts +1 -1
  111. package/dist/src/agent/service.d.ts +1 -9
  112. package/dist/src/agent/service.js +3 -40
  113. package/dist/src/agent/service.js.map +1 -1
  114. package/dist/src/agent/service.types.d.ts +2 -2
  115. package/dist/src/agent/session/session-config-service.d.ts +11 -11
  116. package/dist/src/agent/session/session-config-service.js +14 -14
  117. package/dist/src/agent/session/session-config-service.js.map +1 -1
  118. package/dist/src/agent/session/session-inspector.js +3 -2
  119. package/dist/src/agent/session/session-inspector.js.map +1 -1
  120. package/dist/src/agent/starter-agents.js +12 -12
  121. package/dist/src/agent/starter-agents.js.map +1 -1
  122. package/dist/src/agent/tools/automation-tool.d.ts +14 -0
  123. package/dist/src/agent/tools/automation-tool.js +102 -0
  124. package/dist/src/agent/tools/automation-tool.js.map +1 -0
  125. package/dist/src/agent/tools/delegate-tool.js +1 -1
  126. package/dist/src/agent/tools/delegate-tool.js.map +1 -1
  127. package/dist/src/agent/tools/factory.d.ts +3 -3
  128. package/dist/src/agent/tools/factory.js +2 -2
  129. package/dist/src/agent/tools/factory.js.map +1 -1
  130. package/dist/src/agent/tools/index.d.ts +1 -1
  131. package/dist/src/agent/tools/index.js +2 -2
  132. package/dist/src/agent-manifest/resolver.d.ts +1 -0
  133. package/dist/src/agent-manifest/resolver.js +1 -0
  134. package/dist/src/agent-manifest/resolver.js.map +1 -1
  135. package/dist/src/agent-manifest/schema.d.ts +6 -0
  136. package/dist/src/agent-manifest/schema.js +12 -3
  137. package/dist/src/agent-manifest/schema.js.map +1 -1
  138. package/dist/src/ai-assist/text-assist.d.ts +1 -1
  139. package/dist/src/ai-assist/text-assist.js +56 -0
  140. package/dist/src/ai-assist/text-assist.js.map +1 -1
  141. package/dist/src/auth/profiles/store.js.map +1 -1
  142. package/dist/src/automations/api/routes.d.ts +3 -0
  143. package/dist/src/automations/api/routes.js +193 -0
  144. package/dist/src/automations/api/routes.js.map +1 -0
  145. package/dist/src/automations/domain/index.d.ts +3 -0
  146. package/dist/src/automations/domain/index.js +3 -0
  147. package/dist/src/automations/domain/schedule.d.ts +4 -0
  148. package/dist/src/automations/domain/schedule.js +37 -0
  149. package/dist/src/automations/domain/schedule.js.map +1 -0
  150. package/dist/src/automations/domain/types.d.ts +160 -0
  151. package/dist/src/automations/domain/validation.d.ts +370 -0
  152. package/dist/src/automations/domain/validation.js +149 -0
  153. package/dist/src/automations/domain/validation.js.map +1 -0
  154. package/dist/src/automations/draft/automation-draft-prompt.d.ts +26 -0
  155. package/dist/src/automations/draft/automation-draft-prompt.js +127 -0
  156. package/dist/src/automations/draft/automation-draft-prompt.js.map +1 -0
  157. package/dist/src/automations/draft/automation-draft-service.d.ts +12 -0
  158. package/dist/src/automations/draft/automation-draft-service.js +135 -0
  159. package/dist/src/automations/draft/automation-draft-service.js.map +1 -0
  160. package/dist/src/automations/draft/automation-draft-validator.d.ts +99 -0
  161. package/dist/src/automations/draft/automation-draft-validator.js +105 -0
  162. package/dist/src/automations/draft/automation-draft-validator.js.map +1 -0
  163. package/dist/src/automations/draft/automation-draft.types.d.ts +40 -0
  164. package/dist/src/automations/draft/index.d.ts +3 -0
  165. package/dist/src/automations/draft/index.js +3 -0
  166. package/dist/src/automations/index.d.ts +3 -0
  167. package/dist/src/automations/index.js +8 -0
  168. package/dist/src/automations/product-events.d.ts +5 -0
  169. package/dist/src/automations/product-events.js +21 -0
  170. package/dist/src/automations/product-events.js.map +1 -0
  171. package/dist/src/automations/service/action-executor.d.ts +9 -0
  172. package/dist/src/automations/service/action-executor.js +157 -0
  173. package/dist/src/automations/service/action-executor.js.map +1 -0
  174. package/dist/src/automations/service/automation-service.d.ts +54 -0
  175. package/dist/src/automations/service/automation-service.js +404 -0
  176. package/dist/src/automations/service/automation-service.js.map +1 -0
  177. package/dist/src/automations/service/index.d.ts +2 -0
  178. package/dist/src/automations/service/index.js +3 -0
  179. package/dist/src/automations/storage/automation-repository.d.ts +6 -0
  180. package/dist/src/automations/storage/automation-repository.js +61 -0
  181. package/dist/src/automations/storage/automation-repository.js.map +1 -0
  182. package/dist/src/automations/storage/automation-run-repository.d.ts +17 -0
  183. package/dist/src/automations/storage/automation-run-repository.js +130 -0
  184. package/dist/src/automations/storage/automation-run-repository.js.map +1 -0
  185. package/dist/src/automations/storage/index.d.ts +2 -0
  186. package/dist/src/automations/storage/index.js +3 -0
  187. package/dist/src/channels/plugin-types.d.ts +3 -0
  188. package/dist/src/chat-commands/builtins/thinking.js.map +1 -1
  189. package/dist/src/cli/command-catalog.js +0 -39
  190. package/dist/src/cli/command-catalog.js.map +1 -1
  191. package/dist/src/cli/command-loaders.js +0 -1
  192. package/dist/src/cli/command-loaders.js.map +1 -1
  193. package/dist/src/cli/command-manifest.js +0 -4
  194. package/dist/src/cli/command-manifest.js.map +1 -1
  195. package/dist/src/cli/commands/agents.js +7 -6
  196. package/dist/src/cli/commands/agents.js.map +1 -1
  197. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  198. package/dist/src/cli/commands/doctor/checks/{cron-health.d.ts → migrations.d.ts} +1 -1
  199. package/dist/src/cli/commands/doctor/checks/migrations.js +40 -0
  200. package/dist/src/cli/commands/doctor/checks/migrations.js.map +1 -0
  201. package/dist/src/cli/commands/doctor/flow.js +2 -2
  202. package/dist/src/cli/commands/doctor/flow.js.map +1 -1
  203. package/dist/src/cli/commands/gateway/call.js +2 -2
  204. package/dist/src/cli/commands/gateway/call.js.map +1 -1
  205. package/dist/src/cli/commands/gateway/lifecycle.js +1 -1
  206. package/dist/src/cli/commands/gateway/run-foreground.js +4 -2
  207. package/dist/src/cli/commands/gateway/run-foreground.js.map +1 -1
  208. package/dist/src/cli/commands/init.js +26 -8
  209. package/dist/src/cli/commands/init.js.map +1 -1
  210. package/dist/src/cli/commands/tui.js +24 -2
  211. package/dist/src/cli/commands/tui.js.map +1 -1
  212. package/dist/src/cli/utils/init-workspace-core.js +2 -0
  213. package/dist/src/cli/utils/init-workspace-core.js.map +1 -1
  214. package/dist/src/commands/agents.config.d.ts +9 -0
  215. package/dist/src/commands/agents.config.js +40 -2
  216. package/dist/src/commands/agents.config.js.map +1 -1
  217. package/dist/src/config/agent-profile.js +4 -3
  218. package/dist/src/config/agent-profile.js.map +1 -1
  219. package/dist/src/config/agent-typed-models.js.map +1 -1
  220. package/dist/src/config/config-surface.d.ts +3 -0
  221. package/dist/src/config/index.d.ts +0 -1
  222. package/dist/src/config/index.js +3 -3
  223. package/dist/src/config/index.js.map +1 -1
  224. package/dist/src/config/paths.d.ts +0 -9
  225. package/dist/src/config/paths.js +1 -14
  226. package/dist/src/config/paths.js.map +1 -1
  227. package/dist/src/config/profile.js +0 -1
  228. package/dist/src/config/profile.js.map +1 -1
  229. package/dist/src/config/rules.js +0 -5
  230. package/dist/src/config/rules.js.map +1 -1
  231. package/dist/src/config/schema.d.ts +13 -12
  232. package/dist/src/config/schema.js +22 -26
  233. package/dist/src/config/schema.js.map +1 -1
  234. package/dist/src/config/web-patch.d.ts +0 -12
  235. package/dist/src/config/web-patch.js +2 -29
  236. package/dist/src/config/web-patch.js.map +1 -1
  237. package/dist/src/extensions/api.d.ts +2 -0
  238. package/dist/src/extensions/api.js +10 -0
  239. package/dist/src/extensions/api.js.map +1 -1
  240. package/dist/src/extensions/extension-registry-impl.d.ts +4 -1
  241. package/dist/src/extensions/extension-registry-impl.js +8 -0
  242. package/dist/src/extensions/extension-registry-impl.js.map +1 -1
  243. package/dist/src/extensions/loader.d.ts +3 -3
  244. package/dist/src/extensions/loader.js +3 -3
  245. package/dist/src/extensions/loader.js.map +1 -1
  246. package/dist/src/extensions/sdk/testing.d.ts +2 -0
  247. package/dist/src/extensions/sdk/testing.js +7 -0
  248. package/dist/src/extensions/sdk/testing.js.map +1 -1
  249. package/dist/src/extensions/types/core.d.ts +10 -1
  250. package/dist/src/extensions/types/index.d.ts +1 -1
  251. package/dist/src/extensions/types/{phase4.d.ts → registration.d.ts} +2 -2
  252. package/dist/src/gateway/agent-builtin-tools.d.ts +1 -1
  253. package/dist/src/gateway/agent-builtin-tools.js +1 -1
  254. package/dist/src/gateway/agent-builtin-tools.js.map +1 -1
  255. package/dist/src/gateway/agents-admin.d.ts +1 -0
  256. package/dist/src/gateway/agents-admin.js +13 -15
  257. package/dist/src/gateway/agents-admin.js.map +1 -1
  258. package/dist/src/gateway/capability-presets-admin.d.ts +1 -0
  259. package/dist/src/gateway/capability-presets-admin.js +19 -10
  260. package/dist/src/gateway/capability-presets-admin.js.map +1 -1
  261. package/dist/src/gateway/dreaming-automation-reconciler.d.ts +11 -0
  262. package/dist/src/gateway/dreaming-automation-reconciler.js +105 -0
  263. package/dist/src/gateway/dreaming-automation-reconciler.js.map +1 -0
  264. package/dist/src/gateway/heartbeat/service.d.ts +0 -2
  265. package/dist/src/gateway/heartbeat/service.js +0 -7
  266. package/dist/src/gateway/heartbeat/service.js.map +1 -1
  267. package/dist/src/gateway/hono/lib/config-payload.d.ts +5 -6
  268. package/dist/src/gateway/hono/lib/config-payload.js +2 -2
  269. package/dist/src/gateway/hono/lib/config-payload.js.map +1 -1
  270. package/dist/src/gateway/hono/routes/agents.js.map +1 -1
  271. package/dist/src/gateway/hono/routes/config-patch/misc.d.ts +1 -1
  272. package/dist/src/gateway/hono/routes/config-patch/misc.js +12 -6
  273. package/dist/src/gateway/hono/routes/config-patch/misc.js.map +1 -1
  274. package/dist/src/gateway/hono/routes/dreaming.js +27 -37
  275. package/dist/src/gateway/hono/routes/dreaming.js.map +1 -1
  276. package/dist/src/gateway/hono/routes/home.d.ts +2 -2
  277. package/dist/src/gateway/hono/routes/home.js +34 -25
  278. package/dist/src/gateway/hono/routes/home.js.map +1 -1
  279. package/dist/src/gateway/hono/routes/lazy-bundles.js +10 -6
  280. package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
  281. package/dist/src/gateway/hono/routes/migrations.d.ts +3 -0
  282. package/dist/src/gateway/hono/routes/migrations.js +35 -0
  283. package/dist/src/gateway/hono/routes/migrations.js.map +1 -0
  284. package/dist/src/gateway/hono/routes/public-gateway.js +2 -1
  285. package/dist/src/gateway/hono/routes/public-gateway.js.map +1 -1
  286. package/dist/src/gateway/hono/routes/sessions.js +14 -0
  287. package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
  288. package/dist/src/gateway/run-loop.js +2 -0
  289. package/dist/src/gateway/run-loop.js.map +1 -1
  290. package/dist/src/gateway/security/operator-scopes.js +5 -1
  291. package/dist/src/gateway/security/operator-scopes.js.map +1 -1
  292. package/dist/src/gateway/service/config-coordinator.d.ts +4 -4
  293. package/dist/src/gateway/service/config-coordinator.js +14 -8
  294. package/dist/src/gateway/service/config-coordinator.js.map +1 -1
  295. package/dist/src/gateway/service/sessions-api.d.ts +2 -1
  296. package/dist/src/gateway/service/sessions-api.js +6 -1
  297. package/dist/src/gateway/service/sessions-api.js.map +1 -1
  298. package/dist/src/gateway/service.d.ts +7 -3
  299. package/dist/src/gateway/service.js +61 -27
  300. package/dist/src/gateway/service.js.map +1 -1
  301. package/dist/src/goals/goal-service.js +45 -4
  302. package/dist/src/goals/goal-service.js.map +1 -1
  303. package/dist/src/infra/update-restart.js +1 -1
  304. package/dist/src/migrations/config/default-capability-preset.d.ts +10 -0
  305. package/dist/src/migrations/config/default-capability-preset.js +135 -0
  306. package/dist/src/migrations/config/default-capability-preset.js.map +1 -0
  307. package/dist/src/migrations/index.d.ts +4 -0
  308. package/dist/src/migrations/index.js +4 -0
  309. package/dist/src/migrations/registry.d.ts +8 -0
  310. package/dist/src/migrations/registry.js +18 -0
  311. package/dist/src/migrations/registry.js.map +1 -0
  312. package/dist/src/migrations/runner.d.ts +17 -0
  313. package/dist/src/migrations/runner.js +191 -0
  314. package/dist/src/migrations/runner.js.map +1 -0
  315. package/dist/src/migrations/types.d.ts +34 -0
  316. package/dist/src/notes/service.js +24 -1
  317. package/dist/src/notes/service.js.map +1 -1
  318. package/dist/src/providers/model-registry.d.ts +0 -1
  319. package/dist/src/providers/model-registry.js +0 -3
  320. package/dist/src/providers/model-registry.js.map +1 -1
  321. package/dist/src/routing/resolve-tui-session-key.d.ts +3 -0
  322. package/dist/src/routing/resolve-tui-session-key.js +14 -3
  323. package/dist/src/routing/resolve-tui-session-key.js.map +1 -1
  324. package/dist/src/session/transcript-outline.d.ts +47 -0
  325. package/dist/src/session/transcript-outline.js +481 -0
  326. package/dist/src/session/transcript-outline.js.map +1 -0
  327. package/dist/src/storage/sqlite/index.d.ts +0 -2
  328. package/dist/src/storage/sqlite/index.js +1 -3
  329. package/dist/src/storage/sqlite/migrations/016_automations.sql +47 -0
  330. package/dist/src/storage/sqlite/migrations/017_automation_run_events.sql +14 -0
  331. package/dist/src/storage/sqlite/migrations/018_automation_safety.sql +1 -0
  332. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  333. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  334. package/dist/src/storage/sqlite/migrations/runner.js.map +1 -1
  335. package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
  336. package/dist/src/storage/sqlite/schema.js +1 -1
  337. package/dist/src/storage/sqlite/schema.sql +56 -46
  338. package/dist/src/tui/backends/embedded-backend.d.ts +6 -0
  339. package/dist/src/tui/backends/embedded-backend.js +18 -7
  340. package/dist/src/tui/backends/embedded-backend.js.map +1 -1
  341. package/dist/src/tui/backends/gateway-sse-backend.d.ts +3 -0
  342. package/dist/src/tui/backends/gateway-sse-backend.js +14 -0
  343. package/dist/src/tui/backends/gateway-sse-backend.js.map +1 -1
  344. package/dist/src/tui/tui-backend.d.ts +4 -0
  345. package/dist/src/tui/tui-commands.d.ts +5 -0
  346. package/dist/src/tui/tui-commands.js +43 -0
  347. package/dist/src/tui/tui-commands.js.map +1 -1
  348. package/dist/src/tui/tui-transcript-tree.d.ts +1 -1
  349. package/dist/src/tui/tui-transcript-tree.js +17 -257
  350. package/dist/src/tui/tui-transcript-tree.js.map +1 -1
  351. package/dist/src/tui/tui-types.d.ts +2 -0
  352. package/dist/src/tui/tui-types.js.map +1 -1
  353. package/dist/src/tui/tui.js +7 -2
  354. package/dist/src/tui/tui.js.map +1 -1
  355. package/dist/src/workflows/domain/index.js +1 -1
  356. package/dist/src/workflows/domain/run.d.ts +7 -7
  357. package/dist/src/workflows/domain/run.js.map +1 -1
  358. package/dist/src/workflows/index.js +2 -2
  359. package/dist/src/workflows/service/workflow-run-service.d.ts +2 -0
  360. package/dist/src/workflows/service/workflow-run-service.js +31 -9
  361. package/dist/src/workflows/service/workflow-run-service.js.map +1 -1
  362. package/dist/src/workflows/service/workflow-run-service.types.d.ts +1 -1
  363. package/package.json +4 -2
  364. package/dist/gateway/static/root/assets/agents-BCxZbkOw.js +0 -2
  365. package/dist/gateway/static/root/assets/app-management-settings-panel-bxYJVJpx.js +0 -1
  366. package/dist/gateway/static/root/assets/appearance-settings-BCIykXlI.js +0 -1
  367. package/dist/gateway/static/root/assets/browser-settings-page-DRhKdn81.js +0 -8
  368. package/dist/gateway/static/root/assets/capability-presets-api-CorhiHlg.js +0 -1
  369. package/dist/gateway/static/root/assets/capability-presets-settings-panel-qFx9Jtce.js +0 -1
  370. package/dist/gateway/static/root/assets/channels-settings-BAwAkqIA.js +0 -1
  371. package/dist/gateway/static/root/assets/cn-JdwAhgNB.js +0 -1
  372. package/dist/gateway/static/root/assets/connectors-page-BQLcfitM.js +0 -2
  373. package/dist/gateway/static/root/assets/createLucideIcon-DPHK1VkS.js +0 -1
  374. package/dist/gateway/static/root/assets/cron-api-qGwmL-24.js +0 -1
  375. package/dist/gateway/static/root/assets/cron-dreaming-jobs-nCMWCf0p.js +0 -1
  376. package/dist/gateway/static/root/assets/cron-page-BBWMAj8-.js +0 -3
  377. package/dist/gateway/static/root/assets/dreaming-settings-Dw89Obml.js +0 -1
  378. package/dist/gateway/static/root/assets/format-cron-label-BsotZDO5.js +0 -2
  379. package/dist/gateway/static/root/assets/format-interval-label-BzxafKxR.js +0 -1
  380. package/dist/gateway/static/root/assets/gateway-settings-Cmwy58rS.js +0 -1
  381. package/dist/gateway/static/root/assets/goal-detail-page-l7mu5GWX.js +0 -1
  382. package/dist/gateway/static/root/assets/goals-settings-CYVY4NGp.js +0 -1
  383. package/dist/gateway/static/root/assets/heartbeat-config-api-DriO_CN9.js +0 -1
  384. package/dist/gateway/static/root/assets/heartbeat-settings-CUQTKxg7.js +0 -1
  385. package/dist/gateway/static/root/assets/index-C17Tsd_b.css +0 -1
  386. package/dist/gateway/static/root/assets/index-Cc41r16l.js +0 -191
  387. package/dist/gateway/static/root/assets/interval-presets-DFPCKW_W.js +0 -1
  388. package/dist/gateway/static/root/assets/keyboard-shortcuts-settings-CcVcqstx.js +0 -1
  389. package/dist/gateway/static/root/assets/messages-B1iSKjiw.js +0 -3
  390. package/dist/gateway/static/root/assets/models-hub-panel-BfLfcta8.js +0 -2
  391. package/dist/gateway/static/root/assets/note-detail-page-BjwOQBfT.js +0 -2
  392. package/dist/gateway/static/root/assets/notes-page-DktdBiwB.js +0 -1
  393. package/dist/gateway/static/root/assets/remote-access-hub-rfVx96fq.js +0 -1
  394. package/dist/gateway/static/root/assets/schedule-field-CUCKODde.js +0 -1
  395. package/dist/gateway/static/root/assets/sessions-page-DbtMFuuH.js +0 -1
  396. package/dist/gateway/static/root/assets/settings-advanced-gate-5re5gAnP.js +0 -1
  397. package/dist/gateway/static/root/assets/settings-page-D-WMyLlj.js +0 -1
  398. package/dist/gateway/static/root/assets/setup-status-panel-Cl-DEJAU.js +0 -1
  399. package/dist/gateway/static/root/assets/shares-settings-CyPVvbLt.js +0 -1
  400. package/dist/gateway/static/root/assets/skill-reload-api-CleTH1oz.js +0 -1
  401. package/dist/gateway/static/root/assets/skills-page-Ck8hdXqR.js +0 -2
  402. package/dist/gateway/static/root/assets/system-settings-panel-DI-LN_8G.js +0 -1
  403. package/dist/gateway/static/root/assets/typed-models-lib-kX9duch4.js +0 -1
  404. package/dist/gateway/static/root/assets/user-profile-settings-panel-B-UFPMXy.js +0 -1
  405. package/dist/gateway/static/root/assets/utils-Dm0hKalR.js +0 -1
  406. package/dist/gateway/static/root/assets/workflows-page-BtFGp2y_.js +0 -18
  407. package/dist/src/agent/fallback/error.d.ts +0 -22
  408. package/dist/src/agent/fallback/error.js +0 -32
  409. package/dist/src/agent/fallback/error.js.map +0 -1
  410. package/dist/src/agent/fallback/index.d.ts +0 -5
  411. package/dist/src/agent/fallback/index.js +0 -9
  412. package/dist/src/agent/fallback/index.js.map +0 -1
  413. package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.d.ts +0 -29
  414. package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.js +0 -76
  415. package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.js.map +0 -1
  416. package/dist/src/agent/service/reconcile-dreaming-cron.d.ts +0 -6
  417. package/dist/src/agent/service/reconcile-dreaming-cron.js +0 -84
  418. package/dist/src/agent/service/reconcile-dreaming-cron.js.map +0 -1
  419. package/dist/src/agent/tools/cronjob-tool.d.ts +0 -29
  420. package/dist/src/agent/tools/cronjob-tool.js +0 -274
  421. package/dist/src/agent/tools/cronjob-tool.js.map +0 -1
  422. package/dist/src/cli/commands/cron-cli.d.ts +0 -2
  423. package/dist/src/cli/commands/cron-cli.js +0 -15
  424. package/dist/src/cli/commands/cron-cli.js.map +0 -1
  425. package/dist/src/cli/commands/cron.d.ts +0 -4
  426. package/dist/src/cli/commands/cron.js +0 -188
  427. package/dist/src/cli/commands/cron.js.map +0 -1
  428. package/dist/src/cli/commands/doctor/checks/cron-health.js +0 -35
  429. package/dist/src/cli/commands/doctor/checks/cron-health.js.map +0 -1
  430. package/dist/src/cron/execution-types.d.ts +0 -42
  431. package/dist/src/cron/executor.d.ts +0 -67
  432. package/dist/src/cron/executor.js +0 -669
  433. package/dist/src/cron/executor.js.map +0 -1
  434. package/dist/src/cron/index.d.ts +0 -7
  435. package/dist/src/cron/index.js +0 -7
  436. package/dist/src/cron/job-content.d.ts +0 -5
  437. package/dist/src/cron/job-content.js +0 -15
  438. package/dist/src/cron/job-content.js.map +0 -1
  439. package/dist/src/cron/run-log-store.d.ts +0 -12
  440. package/dist/src/cron/run-log-store.js +0 -58
  441. package/dist/src/cron/run-log-store.js.map +0 -1
  442. package/dist/src/cron/schedule.d.ts +0 -10
  443. package/dist/src/cron/schedule.js +0 -85
  444. package/dist/src/cron/schedule.js.map +0 -1
  445. package/dist/src/cron/service.d.ts +0 -58
  446. package/dist/src/cron/service.js +0 -419
  447. package/dist/src/cron/service.js.map +0 -1
  448. package/dist/src/cron/types.d.ts +0 -183
  449. package/dist/src/cron/validation.d.ts +0 -500
  450. package/dist/src/cron/validation.js +0 -192
  451. package/dist/src/cron/validation.js.map +0 -1
  452. package/dist/src/cron/workflow-run-completion.d.ts +0 -23
  453. package/dist/src/cron/workflow-run-completion.js +0 -72
  454. package/dist/src/cron/workflow-run-completion.js.map +0 -1
  455. package/dist/src/extensions/types/phase4.js +0 -1
  456. package/dist/src/gateway/hono/routes/cron.d.ts +0 -3
  457. package/dist/src/gateway/hono/routes/cron.js +0 -109
  458. package/dist/src/gateway/hono/routes/cron.js.map +0 -1
  459. package/dist/src/storage/sqlite/cron-job-repository.d.ts +0 -6
  460. package/dist/src/storage/sqlite/cron-job-repository.js +0 -70
  461. package/dist/src/storage/sqlite/cron-job-repository.js.map +0 -1
  462. package/dist/src/storage/sqlite/cron-run-repository.d.ts +0 -5
  463. package/dist/src/storage/sqlite/cron-run-repository.js +0 -96
  464. package/dist/src/storage/sqlite/cron-run-repository.js.map +0 -1
  465. /package/dist/src/{cron → automations/domain}/types.js +0 -0
  466. /package/dist/src/{config/defaults.d.ts → automations/draft/automation-draft.types.js} +0 -0
  467. /package/dist/src/{config/defaults.js → extensions/types/registration.js} +0 -0
  468. /package/dist/src/{cron/execution-types.js → migrations/types.js} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"tui-commands.js","names":["listAllAuthProfiles"],"sources":["../../../src/tui/tui-commands.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\n\nimport type { KeybindingsManager, TUI } from '@earendil-works/pi-tui';\n\nimport type {\n TuiCompactionResult,\n TuiModelChoice,\n TuiShareRequest,\n TuiSessionStats,\n TuiSessionItem,\n TuiStartupResources,\n TuiTranscriptTreeEntry,\n TuiAgentInfo,\n} from './tui-backend.js';\nimport type { ChatLog } from './components/chat-log.js';\nimport {\n formatKeyIds,\n formatXopcTuiHotkeys,\n type TuiHotkeyExtensionShortcut,\n} from './format-tui-hotkeys.js';\nimport { getTuiKeybindingsPath } from './tui-keybindings-file.js';\nimport type { TuiState } from './tui-types.js';\nimport { createWorkflowCatalog } from '../agent/workflow/catalog.js';\nimport {\n isValidAgentId,\n normalizeAgentId,\n parseAgentSessionKey,\n} from '../routing/agent-session-key.js';\nimport {\n normalizeReasoningLevel,\n normalizeThinkLevel,\n normalizeVerboseLevel,\n type ReasoningLevel,\n type ThinkLevel,\n type VerboseLevel,\n} from '../agent/transcript/thinking-types.js';\nimport {\n getAuthStorePath,\n listAllProfiles as listAllAuthProfiles,\n listProfilesForProvider,\n removeAuthProfile,\n type AuthProfileEntry,\n} from '../auth/profiles/index.js';\nimport { loadConfig, resolveConfigPath } from '../config/index.js';\nimport type { TuiSlashCommandContext, TuiSlashCommandHandler } from '../extensions/types/tui.js';\nimport { provenanceTracker } from '../extensions/security.js';\nimport type { ProjectTrustStoreEntry } from '../project-trust/trust-store.js';\nimport { providerSupportsOAuth } from '../providers/index.js';\n\nimport { rewriteUnknownSlashAsWorkflow } from './tui-workflow-slash.js';\nimport { formatTuiStartupText } from './tui-startup-text.js';\n\nexport interface SlashCommandDef {\n name: string;\n originalName?: string;\n description: string;\n}\n\nexport type TuiExtensionSlashCommandEntry = SlashCommandDef & {\n handler: TuiSlashCommandHandler;\n getContext?: () => TuiSlashCommandContext;\n};\n\nfunction keyLabel(\n keybindings: KeybindingsManager | undefined,\n id: Parameters<KeybindingsManager['getKeys']>[0],\n fallback: string,\n): string {\n return keybindings ? formatKeyIds(keybindings, id, { capitalize: true }) : fallback;\n}\n\nexport function getSlashCommands(\n _isLocal: boolean,\n keybindings?: KeybindingsManager,\n): SlashCommandDef[] {\n const abortKey = keyLabel(keybindings, 'app.interrupt', 'Escape');\n const toolsKey = keyLabel(keybindings, 'app.tools.expand', 'Ctrl+O');\n const thinkingKey = keyLabel(keybindings, 'app.thinking.toggle', 'Ctrl+T');\n const sessionKey = keyLabel(keybindings, 'app.session.resume', 'Ctrl+Shift+P');\n const modelCycleKey = keyLabel(keybindings, 'app.model.cycleForward', 'Ctrl+P');\n return [\n { name: 'help', description: 'Show available commands' },\n { name: 'abort', description: `Abort active run (or press ${abortKey})` },\n { name: 'recover', description: 'Reload history and reattach to a stalled run' },\n { name: 'retry', description: 'Abort current run if needed and resend the last user message' },\n { name: 'tools', description: `Toggle tool output expanded/collapsed (or ${toolsKey})` },\n { name: 'thinking', description: `Toggle thinking display (or ${thinkingKey})` },\n { name: 'copy', description: 'Copy last assistant message to clipboard' },\n { name: 'exit', description: 'Exit the TUI' },\n { name: 'quit', description: 'Quit the TUI' },\n { name: 'model', description: 'Open model picker (optional search text)' },\n { name: 'models', description: 'List available models' },\n { name: 'switch', description: 'Switch model — copy `provider/model` from /models' },\n { name: 'login', description: 'Login to an OAuth provider' },\n { name: 'logout', description: 'Remove stored provider auth profiles' },\n { name: 'usage', description: 'Show token usage statistics' },\n { name: 'session', description: 'Show current session info' },\n { name: 'agent', description: 'Show or switch agent for this TUI session' },\n { name: 'agents', description: 'List available agents' },\n { name: 'new', description: 'Start a new isolated TUI session (tui-{uuid})' },\n { name: 'fork', description: 'Fork current session transcript into a new session' },\n { name: 'clone', description: 'Duplicate current session transcript into a new session' },\n { name: 'trust', description: 'Manage project trust and show extension security policy' },\n { name: 'name', description: 'Show or set current session display name' },\n { name: 'reset', description: 'Reset current session transcript and reload history' },\n { name: 'clear', description: 'Clear the TUI view without resetting the session' },\n { name: 'list', description: 'List sessions' },\n { name: 'resume', description: `Open session picker (or ${sessionKey})` },\n { name: 'tree', description: 'Show grouped session tree' },\n { name: 'scoped-models', description: `Choose models for ${modelCycleKey} cycling` },\n { name: 'compact', description: 'Compact session history (local API)' },\n { name: 'think', description: 'Set thinking level (e.g. /think high)' },\n { name: 'reasoning', description: 'Set reasoning visibility (e.g. /reasoning stream)' },\n { name: 'verbose', description: 'Toggle verbose mode' },\n { name: 'status', description: 'Show agent status' },\n { name: 'config', description: 'Show current configuration' },\n { name: 'context', description: 'Show context budget' },\n { name: 'btw', description: 'Side question without saving to session' },\n { name: 'aside', description: 'Alias for /btw' },\n { name: 'export', description: 'Export session (markdown/html/json)' },\n { name: 'import', description: 'Import an xopc JSON session export' },\n { name: 'share', description: 'Create a share link for a workspace file/folder/site' },\n { name: 'settings', description: 'Open TUI settings overlay' },\n { name: 'reload', description: 'Reload keybindings, TUI settings, theme, and extension UI' },\n { name: 'reload-keybindings', description: `Reload ${getTuiKeybindingsPath()}` },\n { name: 'start', description: 'Show welcome message' },\n { name: 'hotkeys', description: 'Show resolved keyboard shortcuts (pi-style)' },\n { name: 'changelog', description: 'Show version history' },\n { name: 'workflow', description: 'Workflow subcommands: list, view <name>' },\n ];\n}\n\nfunction formatExtraSlashCommands(commands: SlashCommandDef[], seen: Set<string>): string[] {\n const lines: string[] = [];\n for (const command of commands) {\n const name = command.name.replace(/^\\//, '').trim().toLowerCase();\n const originalName = command.originalName?.replace(/^\\//, '').trim().toLowerCase();\n if (!name || seen.has(name) || (originalName && seen.has(originalName))) continue;\n seen.add(name);\n lines.push(` /${name} — ${command.description}`);\n }\n return lines;\n}\n\nexport function formatTuiHelpText(\n isLocal: boolean,\n keybindings?: KeybindingsManager,\n extraSlashCommands: SlashCommandDef[] = [],\n skillSlashCommands: SlashCommandDef[] = [],\n workflowSlashCommands: SlashCommandDef[] = [],\n): string {\n const commands = getSlashCommands(isLocal, keybindings);\n const interrupt = keyLabel(keybindings, 'app.interrupt', 'Escape');\n const thinkCycle = keyLabel(keybindings, 'app.thinking.cycle', 'Shift+Tab');\n const modelNext = keyLabel(keybindings, 'app.model.cycleForward', 'Ctrl+P');\n const modelPrev = keyLabel(keybindings, 'app.model.cycleBackward', 'Shift+Ctrl+P');\n const modelPicker = keyLabel(keybindings, 'app.model.select', 'Ctrl+L');\n const sessionPicker = keyLabel(keybindings, 'app.session.resume', 'Ctrl+Shift+P');\n const sessionTree = keyLabel(keybindings, 'app.session.tree', '(not bound)');\n const sessionFork = keyLabel(keybindings, 'app.session.fork', '(not bound)');\n const toolExpand = keyLabel(keybindings, 'app.tools.expand', 'Ctrl+O');\n const thinkingToggle = keyLabel(keybindings, 'app.thinking.toggle', 'Ctrl+T');\n const editorExternal = keyLabel(keybindings, 'app.editor.external', 'Ctrl+G');\n const suspend = keyLabel(keybindings, 'app.suspend', 'Ctrl+Z');\n const followUp = keyLabel(keybindings, 'app.message.followUp', 'Alt+Enter');\n const dequeue = keyLabel(keybindings, 'app.message.dequeue', 'Alt+Up');\n const pasteImage = keyLabel(keybindings, 'app.clipboard.pasteImage', 'Ctrl+V / Alt+V');\n const clearInput = keyLabel(keybindings, 'app.clear', 'Ctrl+C');\n const exit = keyLabel(keybindings, 'app.exit', 'Ctrl+D');\n const lines = ['Available commands:'];\n for (const c of commands) {\n lines.push(` /${c.name} — ${c.description}`);\n }\n const seenCommands = new Set(commands.map((command) => command.name));\n const skillCommandLines = formatExtraSlashCommands(skillSlashCommands, seenCommands);\n if (skillCommandLines.length > 0) {\n lines.push('', 'Skill commands:');\n lines.push(...skillCommandLines);\n }\n const workflowCommandLines = formatExtraSlashCommands(workflowSlashCommands, seenCommands);\n if (workflowCommandLines.length > 0) {\n lines.push('', 'Workflow commands:');\n lines.push(...workflowCommandLines);\n }\n const extraCommandLines = formatExtraSlashCommands(extraSlashCommands, seenCommands);\n if (extraCommandLines.length > 0) {\n lines.push('', 'Extension commands:');\n lines.push(...extraCommandLines);\n }\n lines.push('', 'Keyboard shortcuts (defaults align with pi coding-agent where noted):');\n lines.push(` ${interrupt} — Abort active run`);\n lines.push(` ${thinkCycle} — Cycle /think level`);\n lines.push(` ${modelNext} / ${modelPrev} — Next / previous model (/switch)`);\n lines.push(` ${modelPicker} — Model picker`);\n lines.push(` ${sessionPicker} — Session picker (rename/delete)`);\n lines.push(` ${sessionTree} — Session tree`);\n lines.push(` ${sessionFork} — Fork current session`);\n lines.push(` /scoped-models — Limit ${modelNext} model cycle set`);\n lines.push(` ${toolExpand} — Toggle tool output`);\n lines.push(` ${thinkingToggle} — Toggle thinking block display`);\n lines.push(` ${editorExternal} — Edit draft in $EDITOR`);\n lines.push(` ${suspend} — Suspend to shell (Unix)`);\n lines.push(` ${followUp} — Queue follow-up while busy (sends when this reply finishes)`);\n lines.push(` ${dequeue} — Restore queued messages to editor`);\n lines.push(' Enter (while busy) — Steer: inject at next tool boundary');\n lines.push(` ${pasteImage} — Paste image from clipboard`);\n lines.push(' /settings — Theme, thinking display, terminal progress, …');\n lines.push(` ${getTuiKeybindingsPath()} — Custom shortcuts (use /reload)`);\n lines.push(` ${clearInput} — Clear input; repeat within ~0.5s to exit when empty`);\n lines.push(` ${exit} — Exit when input empty`);\n lines.push(' !cmd — Local shell (gated; runs on this machine)');\n lines.push('', 'Use /hotkeys for the resolved binding list from the active keymap.');\n return lines.join('\\n');\n}\n\nexport function formatTuiStartText(\n state: TuiState,\n isLocal: boolean,\n keybindings?: KeybindingsManager,\n resources?: TuiStartupResources,\n): string {\n return formatTuiStartupText({\n state,\n isLocal,\n keybindings,\n resources,\n expanded: true,\n });\n}\n\nimport {\n formatTuiConfigInfo,\n formatTuiContextInfo,\n formatTuiLoginInfo,\n formatTuiModelsInfo,\n formatTuiSessionInfo,\n formatTuiSessionListInfo,\n formatTuiSessionTreeInfo,\n formatTuiStoredAuthProfilesInfo,\n formatTuiTranscriptTreeInfo,\n formatTuiTrustInfo,\n formatTuiUsageInfo,\n formatTuiWorkflowDetail,\n formatTuiWorkflowsInfo,\n loadTuiChangelogInfo,\n nextVerboseLevel,\n parseTuiExportRequest,\n parseTuiImportRequest,\n parseTuiShareRequest,\n writeTuiDebugInfo,\n type TuiExportRequest,\n type TuiImportRequest,\n} from './tui-command-formatters.js';\n\nexport type CommandHandlerDeps = {\n state: TuiState;\n chatLog: ChatLog;\n tui: TUI;\n isLocalMode: boolean;\n abortActive: () => Promise<void>;\n sendMessage: (text: string) => void;\n requestExit: () => void;\n updateFooter: () => void;\n keybindings: KeybindingsManager;\n uiOverlays?: {\n openModelPicker: (initialSearch?: string) => void;\n openAgentPicker?: () => void;\n openSessionPicker: () => void;\n openSessionTree: () => void;\n openTranscriptTree: () => void;\n openUserMessageFork: () => void;\n openScopedModels: () => void;\n openThinkingSelector: () => void;\n openSettings: () => void;\n openProjectTrust: () => void;\n reloadKeybindings: () => void | Promise<void>;\n };\n setThinkingLevel?: (level: ThinkLevel) => void | Promise<void>;\n setReasoningLevel?: (level: ReasoningLevel) => void | Promise<void>;\n setVerboseLevel?: (level: VerboseLevel) => void | Promise<void>;\n copyLastAssistant?: () => void | Promise<void>;\n renameCurrentSession?: (name: string) => void | Promise<void>;\n runCompaction?: (instructions?: string) => void | Promise<void | TuiCompactionResult>;\n listModels?: () => TuiModelChoice[] | Promise<TuiModelChoice[]>;\n switchModel?: (modelRef: string) => void | Promise<void>;\n listSessions?: () => TuiSessionItem[] | Promise<TuiSessionItem[]>;\n listAgents?: () => TuiAgentInfo[] | Promise<TuiAgentInfo[]>;\n switchAgentSession?: (sessionKey: string, agentId: string) => void | Promise<void>;\n getSessionStats?: () => TuiSessionStats | Promise<TuiSessionStats>;\n getStartupResources?: () => TuiStartupResources | undefined;\n loadTranscriptTree?: () => TuiTranscriptTreeEntry[] | Promise<TuiTranscriptTreeEntry[]>;\n exportSession?: (request: TuiExportRequest) => void | Promise<void>;\n importSession?: (request: TuiImportRequest) => void | Promise<void>;\n createShare?: (request: TuiShareRequest) => void | Promise<void>;\n startWorkflowRun?: (request: { definitionId: string; goal?: string }) => {\n runId: string;\n sessionKey: string;\n definitionId: string;\n } | Promise<{\n runId: string;\n sessionKey: string;\n definitionId: string;\n }>;\n authProfiles?: {\n listAll: () => AuthProfileEntry[] | Promise<AuthProfileEntry[]>;\n listProvider: (provider: string) => AuthProfileEntry[] | Promise<AuthProfileEntry[]>;\n remove: (profileId: string) => boolean | Promise<boolean>;\n getStorePath: () => string;\n };\n projectTrust?: {\n cwd: string;\n hasProjectResources: () => boolean;\n getStorePath: () => string;\n getEntry: () => ProjectTrustStoreEntry | null;\n getSessionDecision: () => boolean | null;\n };\n runLogin?: (provider?: string) => void | Promise<void>;\n runBtwQuery?: (question: string) => void | Promise<void>;\n forkSession?: (rawKey?: string) => void | Promise<void>;\n skillSlashCommands?: SlashCommandDef[];\n workflowSlashCommands?: SlashCommandDef[];\n extensionSlashCommands?: TuiExtensionSlashCommandEntry[];\n extensionShortcuts?: TuiHotkeyExtensionShortcut[];\n currentAgentId?: string;\n setSession?: (rawKey: string) => Promise<void>;\n resetSession?: () => Promise<void>;\n recoverStream?: () => void | Promise<void>;\n retryLastMessage?: () => void | Promise<void>;\n};\n\nfunction defaultAuthProfiles(): NonNullable<CommandHandlerDeps['authProfiles']> {\n return {\n listAll: () => listAllAuthProfiles(),\n listProvider: (provider) => listProfilesForProvider(provider),\n remove: (profileId) => removeAuthProfile(profileId),\n getStorePath: () => getAuthStorePath(),\n };\n}\n\nfunction formatAgentsList(agents: TuiAgentInfo[], currentAgentId?: string): string {\n if (agents.length === 0) {\n return 'No agents available.';\n }\n const current = currentAgentId?.trim().toLowerCase();\n const sorted = [...agents].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 return [\n 'Available agents:',\n ...sorted.map((agent) => {\n const marker = agent.id === current ? '*' : ' ';\n const label = agent.displayName ? ` — ${agent.displayName}` : '';\n return `${marker} ${agent.id}${label}`;\n }),\n '',\n 'Switch with: /agent <id>',\n ].join('\\n');\n}\n\nfunction formatCurrentAgent(state: TuiState): string {\n const parsed = parseAgentSessionKey(state.currentSessionKey);\n if (!parsed) {\n return `Current session is not an agent session.\\nSession: ${state.currentSessionKey}`;\n }\n const lines = [\n `Current agent: ${parsed.agentId}`,\n `Session: ${state.currentSessionKey}`,\n ];\n const workspace = state.sessionInfo.effectiveWorkspacePath?.trim();\n if (workspace) lines.push(`Workspace: ${workspace}`);\n const provider = state.sessionInfo.modelProvider?.trim();\n const model = state.sessionInfo.model?.trim();\n if (model) lines.push(`Model: ${provider ? `${provider}/${model}` : model}`);\n return lines.join('\\n');\n}\n\nexport function createTuiCommandHandler(deps: CommandHandlerDeps): (input: string) => void {\n const {\n state,\n chatLog,\n tui,\n isLocalMode,\n abortActive,\n sendMessage,\n requestExit,\n updateFooter,\n keybindings,\n uiOverlays,\n skillSlashCommands = [],\n workflowSlashCommands = [],\n extensionSlashCommands = [],\n extensionShortcuts = [],\n setSession,\n resetSession,\n } = deps;\n\n const runReset = async () => {\n await abortActive();\n if (resetSession) {\n await resetSession();\n chatLog.addSystem(`session ${state.currentSessionKey} reset`);\n } else {\n chatLog.clearAll();\n state.messageFollowUpQueue.length = 0;\n state.steeringQueue.length = 0;\n chatLog.addSystem('Session cleared (reset not available in this mode).');\n }\n tui.requestRender();\n };\n\n return (input: string) => {\n const trimmed = input.replace(/^\\//, '').trim();\n const [commandName, ...restParts] = trimmed.split(/\\s+/);\n const normalizedCommand = (commandName ?? '').toLowerCase();\n const commandArgs = restParts.join(' ');\n\n switch (normalizedCommand) {\n case 'help':\n chatLog.addSystem(formatTuiHelpText(\n isLocalMode,\n keybindings,\n extensionSlashCommands,\n skillSlashCommands,\n workflowSlashCommands,\n ));\n tui.requestRender();\n return;\n case 'start':\n chatLog.addSystem(formatTuiStartText(state, isLocalMode, keybindings, deps.getStartupResources?.()));\n tui.requestRender();\n return;\n case 'hotkeys':\n case 'keys':\n chatLog.addSystem(formatXopcTuiHotkeys(keybindings, extensionShortcuts));\n tui.requestRender();\n return;\n case 'changelog':\n chatLog.addSystem(loadTuiChangelogInfo());\n tui.requestRender();\n return;\n case 'debug':\n try {\n const debugPath = writeTuiDebugInfo({ state, tui });\n chatLog.addSystem(`Debug log written\\n${debugPath}`);\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Debug log failed: ${errorMessage}`);\n }\n tui.requestRender();\n return;\n case 'session':\n case 'status':\n void Promise.resolve(deps.getSessionStats?.())\n .catch(() => undefined)\n .then((stats) => {\n chatLog.addSystem(formatTuiSessionInfo(state, stats));\n tui.requestRender();\n });\n return;\n case 'agents':\n if (uiOverlays?.openAgentPicker) {\n uiOverlays.openAgentPicker();\n return;\n }\n void Promise.resolve(deps.listAgents?.() ?? [])\n .then((agents) => {\n const current = parseAgentSessionKey(state.currentSessionKey)?.agentId;\n chatLog.addSystem(formatAgentsList(agents, current));\n tui.requestRender();\n })\n .catch((err: unknown) => {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Agents list failed: ${errorMessage}`);\n tui.requestRender();\n });\n return;\n case 'agent': {\n const targetRaw = commandArgs.trim();\n if (!targetRaw) {\n chatLog.addSystem(formatCurrentAgent(state));\n tui.requestRender();\n return;\n }\n void (async () => {\n const parsedCurrent = parseAgentSessionKey(state.currentSessionKey);\n if (!parsedCurrent) {\n chatLog.addSystem('Cannot switch agent: current session is not an agent session.');\n tui.requestRender();\n return;\n }\n if (state.activeRunId) {\n chatLog.addSystem('Cannot switch agent while a run is active. Abort first.');\n tui.requestRender();\n return;\n }\n if (!isValidAgentId(targetRaw)) {\n chatLog.addSystem(`Invalid agent id: ${targetRaw}`);\n tui.requestRender();\n return;\n }\n const targetAgentId = normalizeAgentId(targetRaw);\n const agents = await Promise.resolve(deps.listAgents?.() ?? []);\n if (!agents.some((agent) => agent.enabled !== false && agent.id === targetAgentId)) {\n chatLog.addSystem(`Unknown agent: ${targetAgentId}`);\n tui.requestRender();\n return;\n }\n const targetSessionKey = `agent:${targetAgentId}:${parsedCurrent.rest}`;\n if (targetSessionKey === state.currentSessionKey) {\n chatLog.addSystem(`Already using agent: ${targetAgentId}`);\n tui.requestRender();\n return;\n }\n if (!deps.switchAgentSession) {\n chatLog.addSystem('Agent switching is not available in this mode.');\n tui.requestRender();\n return;\n }\n await deps.switchAgentSession(targetSessionKey, targetAgentId);\n chatLog.addSystem(`Switched to agent: ${targetAgentId}\\nSession: ${targetSessionKey}`);\n tui.requestRender();\n })().catch((err: unknown) => {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Agent switch failed: ${errorMessage}`);\n tui.requestRender();\n });\n return;\n }\n case 'usage':\n void Promise.resolve(deps.getSessionStats?.())\n .catch(() => undefined)\n .then((stats) => {\n chatLog.addSystem(formatTuiUsageInfo(state, stats));\n tui.requestRender();\n });\n return;\n case 'context':\n chatLog.addSystem(formatTuiContextInfo(state));\n tui.requestRender();\n return;\n case 'config':\n chatLog.addSystem(formatTuiConfigInfo(state));\n tui.requestRender();\n return;\n case 'trust':\n if (uiOverlays?.openProjectTrust) {\n uiOverlays.openProjectTrust();\n return;\n }\n chatLog.addSystem(\n formatTuiTrustInfo(loadConfig(), {\n configPath: resolveConfigPath(),\n provenance: provenanceTracker.getAll(),\n cwd: deps.projectTrust?.cwd,\n hasProjectResources: deps.projectTrust?.hasProjectResources(),\n projectTrustStorePath: deps.projectTrust?.getStorePath(),\n projectTrustEntry: deps.projectTrust?.getEntry(),\n projectTrustSessionDecision: deps.projectTrust?.getSessionDecision(),\n }),\n );\n tui.requestRender();\n return;\n case 'export':\n if (!deps.exportSession) {\n chatLog.addSystem('Export is not available in this mode.');\n tui.requestRender();\n return;\n }\n void Promise.resolve(deps.exportSession(parseTuiExportRequest(commandArgs))).then(() => {\n tui.requestRender();\n });\n return;\n case 'import':\n if (!deps.importSession) {\n chatLog.addSystem('Import is not available in this mode.');\n tui.requestRender();\n return;\n }\n void Promise.resolve(deps.importSession(parseTuiImportRequest(commandArgs))).then(() => {\n tui.requestRender();\n });\n return;\n case 'share': {\n if (!deps.createShare) {\n chatLog.addSystem('Share is not available in this mode.');\n tui.requestRender();\n return;\n }\n const request = parseTuiShareRequest(commandArgs);\n if (!request) {\n chatLog.addSystem(\n [\n 'Usage: /share <workspace-path> [friend|colleague|public] [--site|--zip|--file]',\n 'Optional: --title \"Title\" --description \"Description\"',\n ].join('\\n'),\n );\n tui.requestRender();\n return;\n }\n void Promise.resolve(deps.createShare(request)).then(() => {\n tui.requestRender();\n });\n return;\n }\n case 'btw':\n case 'aside': {\n const question = commandArgs.trim();\n if (!question) {\n chatLog.addSystem(\n 'Usage: /btw <question>\\nAnswers use the current session as read-only background and are not saved.',\n );\n tui.requestRender();\n return;\n }\n if (!deps.runBtwQuery) {\n chatLog.addSystem('/btw is not available in this mode.');\n tui.requestRender();\n return;\n }\n void Promise.resolve(deps.runBtwQuery(question)).then(() => {\n tui.requestRender();\n });\n return;\n }\n case 'workflow': {\n const [subcommandRaw, ...workflowRest] = commandArgs.trim().split(/\\s+/);\n const subcommand = (subcommandRaw || 'list').toLowerCase();\n if (subcommand === 'list' || subcommand === 'ls') {\n try {\n chatLog.addSystem(formatTuiWorkflowsInfo(createWorkflowCatalog().list()));\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Workflow list failed: ${errorMessage}`);\n }\n tui.requestRender();\n return;\n }\n if (subcommand === 'view' || subcommand === 'show') {\n const name = workflowRest[0]?.trim();\n if (!name) {\n chatLog.addSystem('Usage: /workflow view <name>');\n tui.requestRender();\n return;\n }\n try {\n chatLog.addSystem(formatTuiWorkflowDetail(name));\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Workflow view failed: ${errorMessage}`);\n }\n tui.requestRender();\n return;\n }\n if (subcommand === 'save') {\n chatLog.addSystem('/workflow save is not a TUI command. Save generated workflows through the workflow tool.');\n tui.requestRender();\n return;\n }\n chatLog.addSystem('Usage: /workflow list | /workflow view <name>');\n tui.requestRender();\n return;\n }\n case 'models':\n void Promise.resolve(deps.listModels?.() ?? []).then((models) => {\n chatLog.addSystem(formatTuiModelsInfo(models));\n tui.requestRender();\n });\n return;\n case 'model':\n if (uiOverlays) {\n uiOverlays.openModelPicker(commandArgs.trim() || undefined);\n return;\n }\n chatLog.addSystem('Model picker is not available in this mode. Use /models and /switch <provider/model>.');\n tui.requestRender();\n return;\n case 'list':\n void Promise.resolve(deps.listSessions?.() ?? []).then((sessions) => {\n chatLog.addSystem(\n formatTuiSessionListInfo(sessions, { currentSessionKey: state.currentSessionKey }),\n );\n tui.requestRender();\n });\n return;\n case 'tree':\n if (uiOverlays) {\n uiOverlays.openTranscriptTree();\n return;\n }\n if (deps.loadTranscriptTree) {\n void Promise.resolve(deps.loadTranscriptTree()).then((entries) => {\n chatLog.addSystem(formatTuiTranscriptTreeInfo(entries));\n tui.requestRender();\n });\n return;\n }\n uiOverlays?.openSessionTree();\n if (uiOverlays) return;\n void Promise.resolve(deps.listSessions?.() ?? []).then((sessions) => {\n chatLog.addSystem(\n formatTuiSessionTreeInfo(sessions, { currentSessionKey: state.currentSessionKey }),\n );\n tui.requestRender();\n });\n return;\n case 'switch': {\n const modelRef = commandArgs.trim();\n if (!modelRef) {\n chatLog.addSystem('Usage: /switch <provider/model>');\n tui.requestRender();\n return;\n }\n if (!deps.switchModel) {\n chatLog.addSystem('Model switching is not available in this mode.');\n tui.requestRender();\n return;\n }\n void Promise.resolve(deps.switchModel?.(modelRef)).then(() => {\n tui.requestRender();\n });\n return;\n }\n case 'login':\n if (deps.runLogin && (!commandArgs.trim() || providerSupportsOAuth(commandArgs.trim()))) {\n void Promise.resolve(deps.runLogin(commandArgs.trim() || undefined))\n .catch((err) => {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Login failed: ${errorMessage}`);\n })\n .finally(() => tui.requestRender());\n return;\n }\n chatLog.addSystem(formatTuiLoginInfo(commandArgs));\n tui.requestRender();\n return;\n case 'logout': {\n const provider = commandArgs.trim();\n const authProfiles = deps.authProfiles ?? defaultAuthProfiles();\n void (async () => {\n try {\n if (!provider) {\n const profiles = await authProfiles.listAll();\n chatLog.addSystem(\n formatTuiStoredAuthProfilesInfo(profiles, { authStorePath: authProfiles.getStorePath() }),\n );\n tui.requestRender();\n return;\n }\n\n const profiles = await authProfiles.listProvider(provider);\n if (profiles.length === 0) {\n chatLog.addSystem(\n [\n `No stored auth profiles found for provider: ${provider}`,\n 'Environment variables and config credentials are unchanged.',\n ].join('\\n'),\n );\n tui.requestRender();\n return;\n }\n\n let removed = 0;\n for (const profile of profiles) {\n if (await authProfiles.remove(profile.profileId)) {\n removed += 1;\n }\n }\n chatLog.addSystem(\n [\n `Logged out from ${provider}: removed ${removed} stored auth profile${removed === 1 ? '' : 's'}.`,\n 'Environment variables and config credentials are unchanged.',\n ].join('\\n'),\n );\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Logout failed: ${errorMessage}`);\n }\n tui.requestRender();\n })();\n return;\n }\n case 'exit':\n case 'quit':\n requestExit();\n return;\n case 'abort':\n case 'stop':\n case 'cancel':\n void abortActive().then(() => {\n chatLog.addSystem('Aborted.');\n tui.requestRender();\n });\n return;\n case 'recover':\n if (!deps.recoverStream) {\n chatLog.addSystem('Stream recovery is not available in this mode.');\n tui.requestRender();\n return;\n }\n void Promise.resolve(deps.recoverStream?.())\n .catch((err: unknown) => {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Recover failed: ${errorMessage}`);\n })\n .finally(() => tui.requestRender());\n return;\n case 'retry':\n if (!deps.retryLastMessage) {\n chatLog.addSystem('Retry is not available in this mode.');\n tui.requestRender();\n return;\n }\n void Promise.resolve(deps.retryLastMessage?.())\n .catch((err: unknown) => {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Retry failed: ${errorMessage}`);\n })\n .finally(() => tui.requestRender());\n return;\n case 'tools':\n state.toolsExpanded = !state.toolsExpanded;\n chatLog.setToolsExpanded(state.toolsExpanded);\n chatLog.addSystem(`Tools: ${state.toolsExpanded ? 'expanded' : 'collapsed'}`);\n tui.requestRender();\n return;\n case 'thinking':\n state.showThinking = !state.showThinking;\n chatLog.setShowThinking(state.showThinking);\n chatLog.addSystem(`Thinking display: ${state.showThinking ? 'on' : 'off'}`);\n updateFooter();\n tui.requestRender();\n return;\n case 'copy':\n if (!deps.copyLastAssistant) {\n chatLog.addSystem('Copy is not available in this mode.');\n tui.requestRender();\n return;\n }\n void Promise.resolve(deps.copyLastAssistant?.()).then(() => {\n tui.requestRender();\n });\n return;\n case 'name': {\n const name = commandArgs.trim();\n if (!name) {\n const currentName = state.sessionInfo.displayName?.trim();\n chatLog.addSystem(currentName ? `Session name: ${currentName}` : 'Usage: /name <name>');\n tui.requestRender();\n return;\n }\n if (!deps.renameCurrentSession) {\n chatLog.addSystem('Session rename is not available in this mode.');\n tui.requestRender();\n return;\n }\n void Promise.resolve(deps.renameCurrentSession?.(name)).then(() => {\n tui.requestRender();\n });\n return;\n }\n case 'resume':\n case 'sessions':\n if (!uiOverlays) {\n chatLog.addSystem('Session picker is not available in this mode. Use /list to show sessions.');\n tui.requestRender();\n return;\n }\n uiOverlays?.openSessionPicker();\n return;\n case 'scoped-models':\n case 'scopedmodels':\n if (!uiOverlays) {\n chatLog.addSystem('Scoped model picker is not available in this mode.');\n tui.requestRender();\n return;\n }\n uiOverlays?.openScopedModels();\n return;\n case 'think': {\n const level = normalizeThinkLevel(commandArgs);\n if (!commandArgs.trim()) {\n if (!uiOverlays) {\n const current = state.sessionInfo.thinkingLevel?.trim();\n chatLog.addSystem(\n current ? `Thinking level: ${current}` : 'Usage: /think <off|low|medium|high>',\n );\n tui.requestRender();\n return;\n }\n uiOverlays?.openThinkingSelector();\n return;\n }\n if (!level) {\n chatLog.addSystem(`Invalid thinking level: ${commandArgs}`);\n tui.requestRender();\n return;\n }\n if (!deps.setThinkingLevel) {\n chatLog.addSystem('Thinking level changes are not available in this mode.');\n tui.requestRender();\n return;\n }\n void Promise.resolve(deps.setThinkingLevel?.(level)).then(() => {\n tui.requestRender();\n });\n return;\n }\n case 'reasoning': {\n const level = normalizeReasoningLevel(commandArgs);\n if (!commandArgs.trim()) {\n const current = state.sessionInfo.reasoningLevel?.trim();\n chatLog.addSystem(\n current\n ? `Reasoning visibility: ${current}`\n : 'Usage: /reasoning <off|on|stream>',\n );\n tui.requestRender();\n return;\n }\n if (!level) {\n chatLog.addSystem(`Invalid reasoning visibility: ${commandArgs}`);\n tui.requestRender();\n return;\n }\n if (!deps.setReasoningLevel) {\n chatLog.addSystem('Reasoning visibility changes are not available in this mode.');\n tui.requestRender();\n return;\n }\n void Promise.resolve(deps.setReasoningLevel?.(level)).then(() => {\n tui.requestRender();\n });\n return;\n }\n case 'verbose': {\n const raw = commandArgs.trim();\n const level = raw ? normalizeVerboseLevel(raw) : nextVerboseLevel(state.sessionInfo.verboseLevel);\n if (raw && !level) {\n chatLog.addSystem(`Invalid verbose level: ${commandArgs}`);\n tui.requestRender();\n return;\n }\n if (!deps.setVerboseLevel) {\n chatLog.addSystem('Verbose mode changes are not available in this mode.');\n tui.requestRender();\n return;\n }\n void Promise.resolve(deps.setVerboseLevel?.(level)).then(() => {\n tui.requestRender();\n });\n return;\n }\n case 'settings':\n if (!uiOverlays) {\n chatLog.addSystem('Settings are not available in this mode.');\n tui.requestRender();\n return;\n }\n uiOverlays?.openSettings();\n return;\n case 'reload':\n case 'reload-keybindings':\n case 'reload-keybind':\n if (!uiOverlays) {\n chatLog.addSystem('Reload is not available in this mode.');\n tui.requestRender();\n return;\n }\n void Promise.resolve(uiOverlays?.reloadKeybindings())\n .then(() => {\n chatLog.addSystem('Reloaded keybindings, TUI settings, theme, and extension UI.');\n tui.requestRender();\n })\n .catch((err: unknown) => {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Reload failed: ${errorMessage}`);\n tui.requestRender();\n });\n return;\n case 'compact':\n if (!deps.runCompaction) {\n chatLog.addSystem('Compaction is not available in this mode.');\n tui.requestRender();\n return;\n }\n void deps.runCompaction?.(commandArgs.trim() || undefined);\n return;\n default:\n break;\n }\n\n switch (normalizedCommand) {\n case 'new': {\n void (async () => {\n try {\n await abortActive();\n const uniqueKey = `tui-${randomUUID()}`;\n if (setSession) {\n await setSession(uniqueKey);\n chatLog.addSystem(`new session: ${state.currentSessionKey}`);\n } else {\n chatLog.clearAll();\n state.messageFollowUpQueue.length = 0;\n state.steeringQueue.length = 0;\n chatLog.addSystem('New session requires gateway or local session support.');\n }\n tui.requestRender();\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`new session failed: ${errorMessage}`);\n tui.requestRender();\n }\n })();\n return;\n }\n case 'fork': {\n if (!commandArgs.trim() && uiOverlays) {\n uiOverlays.openUserMessageFork();\n return;\n }\n void Promise.resolve(deps.forkSession?.(commandArgs.trim() || undefined)).then(() => {\n tui.requestRender();\n });\n return;\n }\n case 'clone':\n void Promise.resolve(deps.forkSession?.(commandArgs.trim() || undefined)).then(() => {\n tui.requestRender();\n });\n return;\n case 'reset':\n case 'restart':\n void runReset();\n return;\n case 'clear':\n chatLog.clearAll();\n state.messageFollowUpQueue.length = 0;\n state.steeringQueue.length = 0;\n chatLog.addSystem('TUI view cleared. Session transcript was not reset.');\n tui.requestRender();\n return;\n default:\n break;\n }\n\n const extensionCmd = extensionSlashCommands.find((c) => c.name === normalizedCommand);\n if (extensionCmd) {\n void Promise.resolve(\n extensionCmd.handler(commandArgs, extensionCmd.getContext?.()),\n ).then(() => {\n tui.requestRender();\n });\n return;\n }\n\n if (normalizedCommand.startsWith('skill:')) {\n sendMessage(input);\n return;\n }\n\n if (normalizedCommand.startsWith('workflow:')) {\n const workflowName = normalizedCommand.slice('workflow:'.length).trim();\n if (!workflowName) {\n chatLog.addSystem('Usage: /workflow:<name> [goal]');\n tui.requestRender();\n return;\n }\n if (!deps.startWorkflowRun) {\n chatLog.addSystem('Workflow runs are not available in this mode.');\n tui.requestRender();\n return;\n }\n chatLog.addSystem(`▶ Starting workflow: ${workflowName}`);\n tui.requestRender();\n void Promise.resolve(deps.startWorkflowRun({\n definitionId: workflowName,\n goal: commandArgs.trim() || undefined,\n })).then((result) => {\n chatLog.addSystem(\n `Workflow started: ${result.definitionId}\\nrunId: ${result.runId}\\nsessionKey: ${result.sessionKey}`,\n );\n tui.requestRender();\n }).catch((err: unknown) => {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Workflow start failed: ${errorMessage}`);\n tui.requestRender();\n });\n return;\n }\n\n // Unknown slash that names a known workflow → rewrite into a natural prompt\n // so the assistant deterministically calls workflow({name}) instead of\n // depending on the model to puzzle out \"/audit_repo\".\n if (input.trimStart().startsWith('/')) {\n const rewritten = rewriteUnknownSlashAsWorkflow(normalizedCommand, commandArgs);\n if (rewritten) {\n chatLog.addSystem(`▶ Running workflow: ${normalizedCommand}`);\n tui.requestRender();\n sendMessage(rewritten);\n return;\n }\n }\n\n sendMessage(input);\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"tui-commands.js","names":["listAllAuthProfiles"],"sources":["../../../src/tui/tui-commands.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\n\nimport type { KeybindingsManager, TUI } from '@earendil-works/pi-tui';\n\nimport type {\n TuiCompactionResult,\n TuiModelChoice,\n TuiShareRequest,\n TuiSessionStats,\n TuiSessionItem,\n TuiStartupResources,\n TuiTranscriptTreeEntry,\n TuiAgentInfo,\n} from './tui-backend.js';\nimport type { ChatLog } from './components/chat-log.js';\nimport {\n formatKeyIds,\n formatXopcTuiHotkeys,\n type TuiHotkeyExtensionShortcut,\n} from './format-tui-hotkeys.js';\nimport { getTuiKeybindingsPath } from './tui-keybindings-file.js';\nimport type { TuiState } from './tui-types.js';\nimport { createWorkflowCatalog } from '../agent/workflow/catalog.js';\nimport {\n isValidAgentId,\n normalizeAgentId,\n parseAgentSessionKey,\n} from '../routing/agent-session-key.js';\nimport {\n normalizeReasoningLevel,\n normalizeThinkLevel,\n normalizeVerboseLevel,\n type ReasoningLevel,\n type ThinkLevel,\n type VerboseLevel,\n} from '../agent/transcript/thinking-types.js';\nimport {\n getAuthStorePath,\n listAllProfiles as listAllAuthProfiles,\n listProfilesForProvider,\n removeAuthProfile,\n type AuthProfileEntry,\n} from '../auth/profiles/index.js';\nimport { loadConfig, resolveConfigPath } from '../config/index.js';\nimport type { TuiSlashCommandContext, TuiSlashCommandHandler } from '../extensions/types/tui.js';\nimport { provenanceTracker } from '../extensions/security.js';\nimport type { ProjectTrustStoreEntry } from '../project-trust/trust-store.js';\nimport { providerSupportsOAuth } from '../providers/index.js';\n\nimport { rewriteUnknownSlashAsWorkflow } from './tui-workflow-slash.js';\nimport { formatTuiStartupText } from './tui-startup-text.js';\n\nexport interface SlashCommandDef {\n name: string;\n originalName?: string;\n description: string;\n}\n\nexport type TuiExtensionSlashCommandEntry = SlashCommandDef & {\n handler: TuiSlashCommandHandler;\n getContext?: () => TuiSlashCommandContext;\n};\n\nfunction keyLabel(\n keybindings: KeybindingsManager | undefined,\n id: Parameters<KeybindingsManager['getKeys']>[0],\n fallback: string,\n): string {\n return keybindings ? formatKeyIds(keybindings, id, { capitalize: true }) : fallback;\n}\n\nexport function getSlashCommands(\n _isLocal: boolean,\n keybindings?: KeybindingsManager,\n): SlashCommandDef[] {\n const abortKey = keyLabel(keybindings, 'app.interrupt', 'Escape');\n const toolsKey = keyLabel(keybindings, 'app.tools.expand', 'Ctrl+O');\n const thinkingKey = keyLabel(keybindings, 'app.thinking.toggle', 'Ctrl+T');\n const sessionKey = keyLabel(keybindings, 'app.session.resume', 'Ctrl+Shift+P');\n const modelCycleKey = keyLabel(keybindings, 'app.model.cycleForward', 'Ctrl+P');\n return [\n { name: 'help', description: 'Show available commands' },\n { name: 'abort', description: `Abort active run (or press ${abortKey})` },\n { name: 'recover', description: 'Reload history and reattach to a stalled run' },\n { name: 'retry', description: 'Abort current run if needed and resend the last user message' },\n { name: 'tools', description: `Toggle tool output expanded/collapsed (or ${toolsKey})` },\n { name: 'thinking', description: `Toggle thinking display (or ${thinkingKey})` },\n { name: 'copy', description: 'Copy last assistant message to clipboard' },\n { name: 'exit', description: 'Exit the TUI' },\n { name: 'quit', description: 'Quit the TUI' },\n { name: 'model', description: 'Open model picker (optional search text)' },\n { name: 'models', description: 'List available models' },\n { name: 'switch', description: 'Switch model — copy `provider/model` from /models' },\n { name: 'login', description: 'Login to an OAuth provider' },\n { name: 'logout', description: 'Remove stored provider auth profiles' },\n { name: 'usage', description: 'Show token usage statistics' },\n { name: 'session', description: 'Show current session info' },\n { name: 'agent', description: 'Show or switch agent for this TUI session' },\n { name: 'agents', description: 'List available agents' },\n { name: 'tui-default-agent', description: 'Set default agent for new TUI sessions' },\n { name: 'new', description: 'Start a new isolated TUI session (tui-{uuid})' },\n { name: 'fork', description: 'Fork current session transcript into a new session' },\n { name: 'clone', description: 'Duplicate current session transcript into a new session' },\n { name: 'trust', description: 'Manage project trust and show extension security policy' },\n { name: 'name', description: 'Show or set current session display name' },\n { name: 'reset', description: 'Reset current session transcript and reload history' },\n { name: 'clear', description: 'Clear the TUI view without resetting the session' },\n { name: 'list', description: 'List sessions' },\n { name: 'resume', description: `Open session picker (or ${sessionKey})` },\n { name: 'tree', description: 'Show grouped session tree' },\n { name: 'scoped-models', description: `Choose models for ${modelCycleKey} cycling` },\n { name: 'compact', description: 'Compact session history (local API)' },\n { name: 'think', description: 'Set thinking level (e.g. /think high)' },\n { name: 'reasoning', description: 'Set reasoning visibility (e.g. /reasoning stream)' },\n { name: 'verbose', description: 'Toggle verbose mode' },\n { name: 'status', description: 'Show agent status' },\n { name: 'config', description: 'Show current configuration' },\n { name: 'context', description: 'Show context budget' },\n { name: 'btw', description: 'Side question without saving to session' },\n { name: 'aside', description: 'Alias for /btw' },\n { name: 'export', description: 'Export session (markdown/html/json)' },\n { name: 'import', description: 'Import an xopc JSON session export' },\n { name: 'share', description: 'Create a share link for a workspace file/folder/site' },\n { name: 'settings', description: 'Open TUI settings overlay' },\n { name: 'reload', description: 'Reload keybindings, TUI settings, theme, and extension UI' },\n { name: 'reload-keybindings', description: `Reload ${getTuiKeybindingsPath()}` },\n { name: 'start', description: 'Show welcome message' },\n { name: 'hotkeys', description: 'Show resolved keyboard shortcuts (pi-style)' },\n { name: 'changelog', description: 'Show version history' },\n { name: 'workflow', description: 'Workflow subcommands: list, view <name>' },\n ];\n}\n\nfunction formatExtraSlashCommands(commands: SlashCommandDef[], seen: Set<string>): string[] {\n const lines: string[] = [];\n for (const command of commands) {\n const name = command.name.replace(/^\\//, '').trim().toLowerCase();\n const originalName = command.originalName?.replace(/^\\//, '').trim().toLowerCase();\n if (!name || seen.has(name) || (originalName && seen.has(originalName))) continue;\n seen.add(name);\n lines.push(` /${name} — ${command.description}`);\n }\n return lines;\n}\n\nexport function formatTuiHelpText(\n isLocal: boolean,\n keybindings?: KeybindingsManager,\n extraSlashCommands: SlashCommandDef[] = [],\n skillSlashCommands: SlashCommandDef[] = [],\n workflowSlashCommands: SlashCommandDef[] = [],\n): string {\n const commands = getSlashCommands(isLocal, keybindings);\n const interrupt = keyLabel(keybindings, 'app.interrupt', 'Escape');\n const thinkCycle = keyLabel(keybindings, 'app.thinking.cycle', 'Shift+Tab');\n const modelNext = keyLabel(keybindings, 'app.model.cycleForward', 'Ctrl+P');\n const modelPrev = keyLabel(keybindings, 'app.model.cycleBackward', 'Shift+Ctrl+P');\n const modelPicker = keyLabel(keybindings, 'app.model.select', 'Ctrl+L');\n const sessionPicker = keyLabel(keybindings, 'app.session.resume', 'Ctrl+Shift+P');\n const sessionTree = keyLabel(keybindings, 'app.session.tree', '(not bound)');\n const sessionFork = keyLabel(keybindings, 'app.session.fork', '(not bound)');\n const toolExpand = keyLabel(keybindings, 'app.tools.expand', 'Ctrl+O');\n const thinkingToggle = keyLabel(keybindings, 'app.thinking.toggle', 'Ctrl+T');\n const editorExternal = keyLabel(keybindings, 'app.editor.external', 'Ctrl+G');\n const suspend = keyLabel(keybindings, 'app.suspend', 'Ctrl+Z');\n const followUp = keyLabel(keybindings, 'app.message.followUp', 'Alt+Enter');\n const dequeue = keyLabel(keybindings, 'app.message.dequeue', 'Alt+Up');\n const pasteImage = keyLabel(keybindings, 'app.clipboard.pasteImage', 'Ctrl+V / Alt+V');\n const clearInput = keyLabel(keybindings, 'app.clear', 'Ctrl+C');\n const exit = keyLabel(keybindings, 'app.exit', 'Ctrl+D');\n const lines = ['Available commands:'];\n for (const c of commands) {\n lines.push(` /${c.name} — ${c.description}`);\n }\n const seenCommands = new Set(commands.map((command) => command.name));\n const skillCommandLines = formatExtraSlashCommands(skillSlashCommands, seenCommands);\n if (skillCommandLines.length > 0) {\n lines.push('', 'Skill commands:');\n lines.push(...skillCommandLines);\n }\n const workflowCommandLines = formatExtraSlashCommands(workflowSlashCommands, seenCommands);\n if (workflowCommandLines.length > 0) {\n lines.push('', 'Workflow commands:');\n lines.push(...workflowCommandLines);\n }\n const extraCommandLines = formatExtraSlashCommands(extraSlashCommands, seenCommands);\n if (extraCommandLines.length > 0) {\n lines.push('', 'Extension commands:');\n lines.push(...extraCommandLines);\n }\n lines.push('', 'Keyboard shortcuts (defaults align with pi coding-agent where noted):');\n lines.push(` ${interrupt} — Abort active run`);\n lines.push(` ${thinkCycle} — Cycle /think level`);\n lines.push(` ${modelNext} / ${modelPrev} — Next / previous model (/switch)`);\n lines.push(` ${modelPicker} — Model picker`);\n lines.push(` ${sessionPicker} — Session picker (rename/delete)`);\n lines.push(` ${sessionTree} — Session tree`);\n lines.push(` ${sessionFork} — Fork current session`);\n lines.push(` /scoped-models — Limit ${modelNext} model cycle set`);\n lines.push(` ${toolExpand} — Toggle tool output`);\n lines.push(` ${thinkingToggle} — Toggle thinking block display`);\n lines.push(` ${editorExternal} — Edit draft in $EDITOR`);\n lines.push(` ${suspend} — Suspend to shell (Unix)`);\n lines.push(` ${followUp} — Queue follow-up while busy (sends when this reply finishes)`);\n lines.push(` ${dequeue} — Restore queued messages to editor`);\n lines.push(' Enter (while busy) — Steer: inject at next tool boundary');\n lines.push(` ${pasteImage} — Paste image from clipboard`);\n lines.push(' /settings — Theme, thinking display, terminal progress, …');\n lines.push(` ${getTuiKeybindingsPath()} — Custom shortcuts (use /reload)`);\n lines.push(` ${clearInput} — Clear input; repeat within ~0.5s to exit when empty`);\n lines.push(` ${exit} — Exit when input empty`);\n lines.push(' !cmd — Local shell (gated; runs on this machine)');\n lines.push('', 'Use /hotkeys for the resolved binding list from the active keymap.');\n return lines.join('\\n');\n}\n\nexport function formatTuiStartText(\n state: TuiState,\n isLocal: boolean,\n keybindings?: KeybindingsManager,\n resources?: TuiStartupResources,\n): string {\n return formatTuiStartupText({\n state,\n isLocal,\n keybindings,\n resources,\n expanded: true,\n });\n}\n\nimport {\n formatTuiConfigInfo,\n formatTuiContextInfo,\n formatTuiLoginInfo,\n formatTuiModelsInfo,\n formatTuiSessionInfo,\n formatTuiSessionListInfo,\n formatTuiSessionTreeInfo,\n formatTuiStoredAuthProfilesInfo,\n formatTuiTranscriptTreeInfo,\n formatTuiTrustInfo,\n formatTuiUsageInfo,\n formatTuiWorkflowDetail,\n formatTuiWorkflowsInfo,\n loadTuiChangelogInfo,\n nextVerboseLevel,\n parseTuiExportRequest,\n parseTuiImportRequest,\n parseTuiShareRequest,\n writeTuiDebugInfo,\n type TuiExportRequest,\n type TuiImportRequest,\n} from './tui-command-formatters.js';\n\nexport type CommandHandlerDeps = {\n state: TuiState;\n chatLog: ChatLog;\n tui: TUI;\n isLocalMode: boolean;\n abortActive: () => Promise<void>;\n sendMessage: (text: string) => void;\n requestExit: () => void;\n updateFooter: () => void;\n keybindings: KeybindingsManager;\n uiOverlays?: {\n openModelPicker: (initialSearch?: string) => void;\n openAgentPicker?: () => void;\n openSessionPicker: () => void;\n openSessionTree: () => void;\n openTranscriptTree: () => void;\n openUserMessageFork: () => void;\n openScopedModels: () => void;\n openThinkingSelector: () => void;\n openSettings: () => void;\n openProjectTrust: () => void;\n reloadKeybindings: () => void | Promise<void>;\n };\n setThinkingLevel?: (level: ThinkLevel) => void | Promise<void>;\n setReasoningLevel?: (level: ReasoningLevel) => void | Promise<void>;\n setVerboseLevel?: (level: VerboseLevel) => void | Promise<void>;\n copyLastAssistant?: () => void | Promise<void>;\n renameCurrentSession?: (name: string) => void | Promise<void>;\n runCompaction?: (instructions?: string) => void | Promise<void | TuiCompactionResult>;\n listModels?: () => TuiModelChoice[] | Promise<TuiModelChoice[]>;\n switchModel?: (modelRef: string) => void | Promise<void>;\n listSessions?: () => TuiSessionItem[] | Promise<TuiSessionItem[]>;\n listAgents?: () => TuiAgentInfo[] | Promise<TuiAgentInfo[]>;\n setTuiDefaultAgent?: (agentId: string) => { agentId: string } | Promise<{ agentId: string }>;\n switchAgentSession?: (sessionKey: string, agentId: string) => void | Promise<void>;\n getSessionStats?: () => TuiSessionStats | Promise<TuiSessionStats>;\n getStartupResources?: () => TuiStartupResources | undefined;\n loadTranscriptTree?: () => TuiTranscriptTreeEntry[] | Promise<TuiTranscriptTreeEntry[]>;\n exportSession?: (request: TuiExportRequest) => void | Promise<void>;\n importSession?: (request: TuiImportRequest) => void | Promise<void>;\n createShare?: (request: TuiShareRequest) => void | Promise<void>;\n startWorkflowRun?: (request: { definitionId: string; goal?: string }) => {\n runId: string;\n sessionKey: string;\n definitionId: string;\n } | Promise<{\n runId: string;\n sessionKey: string;\n definitionId: string;\n }>;\n authProfiles?: {\n listAll: () => AuthProfileEntry[] | Promise<AuthProfileEntry[]>;\n listProvider: (provider: string) => AuthProfileEntry[] | Promise<AuthProfileEntry[]>;\n remove: (profileId: string) => boolean | Promise<boolean>;\n getStorePath: () => string;\n };\n projectTrust?: {\n cwd: string;\n hasProjectResources: () => boolean;\n getStorePath: () => string;\n getEntry: () => ProjectTrustStoreEntry | null;\n getSessionDecision: () => boolean | null;\n };\n runLogin?: (provider?: string) => void | Promise<void>;\n runBtwQuery?: (question: string) => void | Promise<void>;\n forkSession?: (rawKey?: string) => void | Promise<void>;\n skillSlashCommands?: SlashCommandDef[];\n workflowSlashCommands?: SlashCommandDef[];\n extensionSlashCommands?: TuiExtensionSlashCommandEntry[];\n extensionShortcuts?: TuiHotkeyExtensionShortcut[];\n currentAgentId?: string;\n setSession?: (rawKey: string) => Promise<void>;\n resetSession?: () => Promise<void>;\n recoverStream?: () => void | Promise<void>;\n retryLastMessage?: () => void | Promise<void>;\n};\n\nfunction defaultAuthProfiles(): NonNullable<CommandHandlerDeps['authProfiles']> {\n return {\n listAll: () => listAllAuthProfiles(),\n listProvider: (provider) => listProfilesForProvider(provider),\n remove: (profileId) => removeAuthProfile(profileId),\n getStorePath: () => getAuthStorePath(),\n };\n}\n\nfunction formatAgentsList(agents: TuiAgentInfo[], currentAgentId?: string): string {\n if (agents.length === 0) {\n return 'No agents available.';\n }\n const current = currentAgentId?.trim().toLowerCase();\n const sorted = [...agents].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 return [\n 'Available agents:',\n ...sorted.map((agent) => {\n const marker = agent.id === current ? '*' : ' ';\n const label = agent.displayName ? ` — ${agent.displayName}` : '';\n return `${marker} ${agent.id}${label}`;\n }),\n '',\n 'Switch with: /agent <id>',\n ].join('\\n');\n}\n\nfunction formatCurrentAgent(state: TuiState): string {\n const parsed = parseAgentSessionKey(state.currentSessionKey);\n if (!parsed) {\n return `Current session is not an agent session.\\nSession: ${state.currentSessionKey}`;\n }\n const lines = [\n `Current agent: ${parsed.agentId}`,\n `Session: ${state.currentSessionKey}`,\n ];\n const workspace = state.sessionInfo.effectiveWorkspacePath?.trim();\n if (workspace) lines.push(`Workspace: ${workspace}`);\n const provider = state.sessionInfo.modelProvider?.trim();\n const model = state.sessionInfo.model?.trim();\n if (model) lines.push(`Model: ${provider ? `${provider}/${model}` : model}`);\n return lines.join('\\n');\n}\n\nexport function createTuiCommandHandler(deps: CommandHandlerDeps): (input: string) => void {\n const {\n state,\n chatLog,\n tui,\n isLocalMode,\n abortActive,\n sendMessage,\n requestExit,\n updateFooter,\n keybindings,\n uiOverlays,\n skillSlashCommands = [],\n workflowSlashCommands = [],\n extensionSlashCommands = [],\n extensionShortcuts = [],\n setSession,\n resetSession,\n } = deps;\n\n const runReset = async () => {\n await abortActive();\n if (resetSession) {\n await resetSession();\n chatLog.addSystem(`session ${state.currentSessionKey} reset`);\n } else {\n chatLog.clearAll();\n state.messageFollowUpQueue.length = 0;\n state.steeringQueue.length = 0;\n chatLog.addSystem('Session cleared (reset not available in this mode).');\n }\n tui.requestRender();\n };\n\n return (input: string) => {\n const trimmed = input.replace(/^\\//, '').trim();\n const [commandName, ...restParts] = trimmed.split(/\\s+/);\n const normalizedCommand = (commandName ?? '').toLowerCase();\n const commandArgs = restParts.join(' ');\n\n switch (normalizedCommand) {\n case 'help':\n chatLog.addSystem(formatTuiHelpText(\n isLocalMode,\n keybindings,\n extensionSlashCommands,\n skillSlashCommands,\n workflowSlashCommands,\n ));\n tui.requestRender();\n return;\n case 'start':\n chatLog.addSystem(formatTuiStartText(state, isLocalMode, keybindings, deps.getStartupResources?.()));\n tui.requestRender();\n return;\n case 'hotkeys':\n case 'keys':\n chatLog.addSystem(formatXopcTuiHotkeys(keybindings, extensionShortcuts));\n tui.requestRender();\n return;\n case 'changelog':\n chatLog.addSystem(loadTuiChangelogInfo());\n tui.requestRender();\n return;\n case 'debug':\n try {\n const debugPath = writeTuiDebugInfo({ state, tui });\n chatLog.addSystem(`Debug log written\\n${debugPath}`);\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Debug log failed: ${errorMessage}`);\n }\n tui.requestRender();\n return;\n case 'session':\n case 'status':\n void Promise.resolve(deps.getSessionStats?.())\n .catch(() => undefined)\n .then((stats) => {\n chatLog.addSystem(formatTuiSessionInfo(state, stats));\n tui.requestRender();\n });\n return;\n case 'agents':\n if (uiOverlays?.openAgentPicker) {\n uiOverlays.openAgentPicker();\n return;\n }\n void Promise.resolve(deps.listAgents?.() ?? [])\n .then((agents) => {\n const current = parseAgentSessionKey(state.currentSessionKey)?.agentId;\n chatLog.addSystem(formatAgentsList(agents, current));\n tui.requestRender();\n })\n .catch((err: unknown) => {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Agents list failed: ${errorMessage}`);\n tui.requestRender();\n });\n return;\n case 'agent': {\n const targetRaw = commandArgs.trim();\n if (!targetRaw) {\n chatLog.addSystem(formatCurrentAgent(state));\n tui.requestRender();\n return;\n }\n void (async () => {\n const parsedCurrent = parseAgentSessionKey(state.currentSessionKey);\n if (!parsedCurrent) {\n chatLog.addSystem('Cannot switch agent: current session is not an agent session.');\n tui.requestRender();\n return;\n }\n if (state.activeRunId) {\n chatLog.addSystem('Cannot switch agent while a run is active. Abort first.');\n tui.requestRender();\n return;\n }\n if (!isValidAgentId(targetRaw)) {\n chatLog.addSystem(`Invalid agent id: ${targetRaw}`);\n tui.requestRender();\n return;\n }\n const targetAgentId = normalizeAgentId(targetRaw);\n const agents = await Promise.resolve(deps.listAgents?.() ?? []);\n if (!agents.some((agent) => agent.enabled !== false && agent.id === targetAgentId)) {\n chatLog.addSystem(`Unknown agent: ${targetAgentId}`);\n tui.requestRender();\n return;\n }\n const targetSessionKey = `agent:${targetAgentId}:${parsedCurrent.rest}`;\n if (targetSessionKey === state.currentSessionKey) {\n chatLog.addSystem(`Already using agent: ${targetAgentId}`);\n tui.requestRender();\n return;\n }\n if (!deps.switchAgentSession) {\n chatLog.addSystem('Agent switching is not available in this mode.');\n tui.requestRender();\n return;\n }\n await deps.switchAgentSession(targetSessionKey, targetAgentId);\n chatLog.addSystem(`Switched to agent: ${targetAgentId}\\nSession: ${targetSessionKey}`);\n tui.requestRender();\n })().catch((err: unknown) => {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Agent switch failed: ${errorMessage}`);\n tui.requestRender();\n });\n return;\n }\n case 'tui-default-agent': {\n const targetRaw = commandArgs.trim();\n if (!targetRaw) {\n void Promise.resolve(deps.listAgents?.() ?? [])\n .then((agents) => {\n chatLog.addSystem([\n 'Usage: /tui-default-agent <agent-id>',\n 'This changes new TUI sessions only; the current session is unchanged.',\n '',\n formatAgentsList(agents, parseAgentSessionKey(state.currentSessionKey)?.agentId),\n ].join('\\n'));\n tui.requestRender();\n })\n .catch((err: unknown) => {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`TUI default agent help failed: ${errorMessage}`);\n tui.requestRender();\n });\n return;\n }\n void (async () => {\n if (!isValidAgentId(targetRaw)) {\n chatLog.addSystem(`Invalid agent id: ${targetRaw}`);\n tui.requestRender();\n return;\n }\n if (!deps.setTuiDefaultAgent) {\n chatLog.addSystem('TUI default agent updates are not available in this mode.');\n tui.requestRender();\n return;\n }\n const result = await deps.setTuiDefaultAgent(normalizeAgentId(targetRaw));\n chatLog.addSystem(\n `TUI default agent set to ${result.agentId}. New TUI sessions will use it.`,\n );\n tui.requestRender();\n })().catch((err: unknown) => {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`TUI default agent update failed: ${errorMessage}`);\n tui.requestRender();\n });\n return;\n }\n case 'usage':\n void Promise.resolve(deps.getSessionStats?.())\n .catch(() => undefined)\n .then((stats) => {\n chatLog.addSystem(formatTuiUsageInfo(state, stats));\n tui.requestRender();\n });\n return;\n case 'context':\n chatLog.addSystem(formatTuiContextInfo(state));\n tui.requestRender();\n return;\n case 'config':\n chatLog.addSystem(formatTuiConfigInfo(state));\n tui.requestRender();\n return;\n case 'trust':\n if (uiOverlays?.openProjectTrust) {\n uiOverlays.openProjectTrust();\n return;\n }\n chatLog.addSystem(\n formatTuiTrustInfo(loadConfig(), {\n configPath: resolveConfigPath(),\n provenance: provenanceTracker.getAll(),\n cwd: deps.projectTrust?.cwd,\n hasProjectResources: deps.projectTrust?.hasProjectResources(),\n projectTrustStorePath: deps.projectTrust?.getStorePath(),\n projectTrustEntry: deps.projectTrust?.getEntry(),\n projectTrustSessionDecision: deps.projectTrust?.getSessionDecision(),\n }),\n );\n tui.requestRender();\n return;\n case 'export':\n if (!deps.exportSession) {\n chatLog.addSystem('Export is not available in this mode.');\n tui.requestRender();\n return;\n }\n void Promise.resolve(deps.exportSession(parseTuiExportRequest(commandArgs))).then(() => {\n tui.requestRender();\n });\n return;\n case 'import':\n if (!deps.importSession) {\n chatLog.addSystem('Import is not available in this mode.');\n tui.requestRender();\n return;\n }\n void Promise.resolve(deps.importSession(parseTuiImportRequest(commandArgs))).then(() => {\n tui.requestRender();\n });\n return;\n case 'share': {\n if (!deps.createShare) {\n chatLog.addSystem('Share is not available in this mode.');\n tui.requestRender();\n return;\n }\n const request = parseTuiShareRequest(commandArgs);\n if (!request) {\n chatLog.addSystem(\n [\n 'Usage: /share <workspace-path> [friend|colleague|public] [--site|--zip|--file]',\n 'Optional: --title \"Title\" --description \"Description\"',\n ].join('\\n'),\n );\n tui.requestRender();\n return;\n }\n void Promise.resolve(deps.createShare(request)).then(() => {\n tui.requestRender();\n });\n return;\n }\n case 'btw':\n case 'aside': {\n const question = commandArgs.trim();\n if (!question) {\n chatLog.addSystem(\n 'Usage: /btw <question>\\nAnswers use the current session as read-only background and are not saved.',\n );\n tui.requestRender();\n return;\n }\n if (!deps.runBtwQuery) {\n chatLog.addSystem('/btw is not available in this mode.');\n tui.requestRender();\n return;\n }\n void Promise.resolve(deps.runBtwQuery(question)).then(() => {\n tui.requestRender();\n });\n return;\n }\n case 'workflow': {\n const [subcommandRaw, ...workflowRest] = commandArgs.trim().split(/\\s+/);\n const subcommand = (subcommandRaw || 'list').toLowerCase();\n if (subcommand === 'list' || subcommand === 'ls') {\n try {\n chatLog.addSystem(formatTuiWorkflowsInfo(createWorkflowCatalog().list()));\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Workflow list failed: ${errorMessage}`);\n }\n tui.requestRender();\n return;\n }\n if (subcommand === 'view' || subcommand === 'show') {\n const name = workflowRest[0]?.trim();\n if (!name) {\n chatLog.addSystem('Usage: /workflow view <name>');\n tui.requestRender();\n return;\n }\n try {\n chatLog.addSystem(formatTuiWorkflowDetail(name));\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Workflow view failed: ${errorMessage}`);\n }\n tui.requestRender();\n return;\n }\n if (subcommand === 'save') {\n chatLog.addSystem('/workflow save is not a TUI command. Save generated workflows through the workflow tool.');\n tui.requestRender();\n return;\n }\n chatLog.addSystem('Usage: /workflow list | /workflow view <name>');\n tui.requestRender();\n return;\n }\n case 'models':\n void Promise.resolve(deps.listModels?.() ?? []).then((models) => {\n chatLog.addSystem(formatTuiModelsInfo(models));\n tui.requestRender();\n });\n return;\n case 'model':\n if (uiOverlays) {\n uiOverlays.openModelPicker(commandArgs.trim() || undefined);\n return;\n }\n chatLog.addSystem('Model picker is not available in this mode. Use /models and /switch <provider/model>.');\n tui.requestRender();\n return;\n case 'list':\n void Promise.resolve(deps.listSessions?.() ?? []).then((sessions) => {\n chatLog.addSystem(\n formatTuiSessionListInfo(sessions, { currentSessionKey: state.currentSessionKey }),\n );\n tui.requestRender();\n });\n return;\n case 'tree':\n if (uiOverlays) {\n uiOverlays.openTranscriptTree();\n return;\n }\n if (deps.loadTranscriptTree) {\n void Promise.resolve(deps.loadTranscriptTree()).then((entries) => {\n chatLog.addSystem(formatTuiTranscriptTreeInfo(entries));\n tui.requestRender();\n });\n return;\n }\n uiOverlays?.openSessionTree();\n if (uiOverlays) return;\n void Promise.resolve(deps.listSessions?.() ?? []).then((sessions) => {\n chatLog.addSystem(\n formatTuiSessionTreeInfo(sessions, { currentSessionKey: state.currentSessionKey }),\n );\n tui.requestRender();\n });\n return;\n case 'switch': {\n const modelRef = commandArgs.trim();\n if (!modelRef) {\n chatLog.addSystem('Usage: /switch <provider/model>');\n tui.requestRender();\n return;\n }\n if (!deps.switchModel) {\n chatLog.addSystem('Model switching is not available in this mode.');\n tui.requestRender();\n return;\n }\n void Promise.resolve(deps.switchModel?.(modelRef)).then(() => {\n tui.requestRender();\n });\n return;\n }\n case 'login':\n if (deps.runLogin && (!commandArgs.trim() || providerSupportsOAuth(commandArgs.trim()))) {\n void Promise.resolve(deps.runLogin(commandArgs.trim() || undefined))\n .catch((err) => {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Login failed: ${errorMessage}`);\n })\n .finally(() => tui.requestRender());\n return;\n }\n chatLog.addSystem(formatTuiLoginInfo(commandArgs));\n tui.requestRender();\n return;\n case 'logout': {\n const provider = commandArgs.trim();\n const authProfiles = deps.authProfiles ?? defaultAuthProfiles();\n void (async () => {\n try {\n if (!provider) {\n const profiles = await authProfiles.listAll();\n chatLog.addSystem(\n formatTuiStoredAuthProfilesInfo(profiles, { authStorePath: authProfiles.getStorePath() }),\n );\n tui.requestRender();\n return;\n }\n\n const profiles = await authProfiles.listProvider(provider);\n if (profiles.length === 0) {\n chatLog.addSystem(\n [\n `No stored auth profiles found for provider: ${provider}`,\n 'Environment variables and config credentials are unchanged.',\n ].join('\\n'),\n );\n tui.requestRender();\n return;\n }\n\n let removed = 0;\n for (const profile of profiles) {\n if (await authProfiles.remove(profile.profileId)) {\n removed += 1;\n }\n }\n chatLog.addSystem(\n [\n `Logged out from ${provider}: removed ${removed} stored auth profile${removed === 1 ? '' : 's'}.`,\n 'Environment variables and config credentials are unchanged.',\n ].join('\\n'),\n );\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Logout failed: ${errorMessage}`);\n }\n tui.requestRender();\n })();\n return;\n }\n case 'exit':\n case 'quit':\n requestExit();\n return;\n case 'abort':\n case 'stop':\n case 'cancel':\n void abortActive().then(() => {\n chatLog.addSystem('Aborted.');\n tui.requestRender();\n });\n return;\n case 'recover':\n if (!deps.recoverStream) {\n chatLog.addSystem('Stream recovery is not available in this mode.');\n tui.requestRender();\n return;\n }\n void Promise.resolve(deps.recoverStream?.())\n .catch((err: unknown) => {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Recover failed: ${errorMessage}`);\n })\n .finally(() => tui.requestRender());\n return;\n case 'retry':\n if (!deps.retryLastMessage) {\n chatLog.addSystem('Retry is not available in this mode.');\n tui.requestRender();\n return;\n }\n void Promise.resolve(deps.retryLastMessage?.())\n .catch((err: unknown) => {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Retry failed: ${errorMessage}`);\n })\n .finally(() => tui.requestRender());\n return;\n case 'tools':\n state.toolsExpanded = !state.toolsExpanded;\n chatLog.setToolsExpanded(state.toolsExpanded);\n chatLog.addSystem(`Tools: ${state.toolsExpanded ? 'expanded' : 'collapsed'}`);\n tui.requestRender();\n return;\n case 'thinking':\n state.showThinking = !state.showThinking;\n chatLog.setShowThinking(state.showThinking);\n chatLog.addSystem(`Thinking display: ${state.showThinking ? 'on' : 'off'}`);\n updateFooter();\n tui.requestRender();\n return;\n case 'copy':\n if (!deps.copyLastAssistant) {\n chatLog.addSystem('Copy is not available in this mode.');\n tui.requestRender();\n return;\n }\n void Promise.resolve(deps.copyLastAssistant?.()).then(() => {\n tui.requestRender();\n });\n return;\n case 'name': {\n const name = commandArgs.trim();\n if (!name) {\n const currentName = state.sessionInfo.displayName?.trim();\n chatLog.addSystem(currentName ? `Session name: ${currentName}` : 'Usage: /name <name>');\n tui.requestRender();\n return;\n }\n if (!deps.renameCurrentSession) {\n chatLog.addSystem('Session rename is not available in this mode.');\n tui.requestRender();\n return;\n }\n void Promise.resolve(deps.renameCurrentSession?.(name)).then(() => {\n tui.requestRender();\n });\n return;\n }\n case 'resume':\n case 'sessions':\n if (!uiOverlays) {\n chatLog.addSystem('Session picker is not available in this mode. Use /list to show sessions.');\n tui.requestRender();\n return;\n }\n uiOverlays?.openSessionPicker();\n return;\n case 'scoped-models':\n case 'scopedmodels':\n if (!uiOverlays) {\n chatLog.addSystem('Scoped model picker is not available in this mode.');\n tui.requestRender();\n return;\n }\n uiOverlays?.openScopedModels();\n return;\n case 'think': {\n const level = normalizeThinkLevel(commandArgs);\n if (!commandArgs.trim()) {\n if (!uiOverlays) {\n const current = state.sessionInfo.thinkingLevel?.trim();\n chatLog.addSystem(\n current ? `Thinking level: ${current}` : 'Usage: /think <off|low|medium|high>',\n );\n tui.requestRender();\n return;\n }\n uiOverlays?.openThinkingSelector();\n return;\n }\n if (!level) {\n chatLog.addSystem(`Invalid thinking level: ${commandArgs}`);\n tui.requestRender();\n return;\n }\n if (!deps.setThinkingLevel) {\n chatLog.addSystem('Thinking level changes are not available in this mode.');\n tui.requestRender();\n return;\n }\n void Promise.resolve(deps.setThinkingLevel?.(level)).then(() => {\n tui.requestRender();\n });\n return;\n }\n case 'reasoning': {\n const level = normalizeReasoningLevel(commandArgs);\n if (!commandArgs.trim()) {\n const current = state.sessionInfo.reasoningLevel?.trim();\n chatLog.addSystem(\n current\n ? `Reasoning visibility: ${current}`\n : 'Usage: /reasoning <off|on|stream>',\n );\n tui.requestRender();\n return;\n }\n if (!level) {\n chatLog.addSystem(`Invalid reasoning visibility: ${commandArgs}`);\n tui.requestRender();\n return;\n }\n if (!deps.setReasoningLevel) {\n chatLog.addSystem('Reasoning visibility changes are not available in this mode.');\n tui.requestRender();\n return;\n }\n void Promise.resolve(deps.setReasoningLevel?.(level)).then(() => {\n tui.requestRender();\n });\n return;\n }\n case 'verbose': {\n const raw = commandArgs.trim();\n const level = raw ? normalizeVerboseLevel(raw) : nextVerboseLevel(state.sessionInfo.verboseLevel);\n if (raw && !level) {\n chatLog.addSystem(`Invalid verbose level: ${commandArgs}`);\n tui.requestRender();\n return;\n }\n if (!deps.setVerboseLevel) {\n chatLog.addSystem('Verbose mode changes are not available in this mode.');\n tui.requestRender();\n return;\n }\n void Promise.resolve(deps.setVerboseLevel?.(level)).then(() => {\n tui.requestRender();\n });\n return;\n }\n case 'settings':\n if (!uiOverlays) {\n chatLog.addSystem('Settings are not available in this mode.');\n tui.requestRender();\n return;\n }\n uiOverlays?.openSettings();\n return;\n case 'reload':\n case 'reload-keybindings':\n case 'reload-keybind':\n if (!uiOverlays) {\n chatLog.addSystem('Reload is not available in this mode.');\n tui.requestRender();\n return;\n }\n void Promise.resolve(uiOverlays?.reloadKeybindings())\n .then(() => {\n chatLog.addSystem('Reloaded keybindings, TUI settings, theme, and extension UI.');\n tui.requestRender();\n })\n .catch((err: unknown) => {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Reload failed: ${errorMessage}`);\n tui.requestRender();\n });\n return;\n case 'compact':\n if (!deps.runCompaction) {\n chatLog.addSystem('Compaction is not available in this mode.');\n tui.requestRender();\n return;\n }\n void deps.runCompaction?.(commandArgs.trim() || undefined);\n return;\n default:\n break;\n }\n\n switch (normalizedCommand) {\n case 'new': {\n void (async () => {\n try {\n await abortActive();\n const uniqueKey = `tui-${randomUUID()}`;\n if (setSession) {\n await setSession(uniqueKey);\n chatLog.addSystem(`new session: ${state.currentSessionKey}`);\n } else {\n chatLog.clearAll();\n state.messageFollowUpQueue.length = 0;\n state.steeringQueue.length = 0;\n chatLog.addSystem('New session requires gateway or local session support.');\n }\n tui.requestRender();\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`new session failed: ${errorMessage}`);\n tui.requestRender();\n }\n })();\n return;\n }\n case 'fork': {\n if (!commandArgs.trim() && uiOverlays) {\n uiOverlays.openUserMessageFork();\n return;\n }\n void Promise.resolve(deps.forkSession?.(commandArgs.trim() || undefined)).then(() => {\n tui.requestRender();\n });\n return;\n }\n case 'clone':\n void Promise.resolve(deps.forkSession?.(commandArgs.trim() || undefined)).then(() => {\n tui.requestRender();\n });\n return;\n case 'reset':\n case 'restart':\n void runReset();\n return;\n case 'clear':\n chatLog.clearAll();\n state.messageFollowUpQueue.length = 0;\n state.steeringQueue.length = 0;\n chatLog.addSystem('TUI view cleared. Session transcript was not reset.');\n tui.requestRender();\n return;\n default:\n break;\n }\n\n const extensionCmd = extensionSlashCommands.find((c) => c.name === normalizedCommand);\n if (extensionCmd) {\n void Promise.resolve(\n extensionCmd.handler(commandArgs, extensionCmd.getContext?.()),\n ).then(() => {\n tui.requestRender();\n });\n return;\n }\n\n if (normalizedCommand.startsWith('skill:')) {\n sendMessage(input);\n return;\n }\n\n if (normalizedCommand.startsWith('workflow:')) {\n const workflowName = normalizedCommand.slice('workflow:'.length).trim();\n if (!workflowName) {\n chatLog.addSystem('Usage: /workflow:<name> [goal]');\n tui.requestRender();\n return;\n }\n if (!deps.startWorkflowRun) {\n chatLog.addSystem('Workflow runs are not available in this mode.');\n tui.requestRender();\n return;\n }\n chatLog.addSystem(`▶ Starting workflow: ${workflowName}`);\n tui.requestRender();\n void Promise.resolve(deps.startWorkflowRun({\n definitionId: workflowName,\n goal: commandArgs.trim() || undefined,\n })).then((result) => {\n chatLog.addSystem(\n `Workflow started: ${result.definitionId}\\nrunId: ${result.runId}\\nsessionKey: ${result.sessionKey}`,\n );\n tui.requestRender();\n }).catch((err: unknown) => {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Workflow start failed: ${errorMessage}`);\n tui.requestRender();\n });\n return;\n }\n\n // Unknown slash that names a known workflow → rewrite into a natural prompt\n // so the assistant deterministically calls workflow({name}) instead of\n // depending on the model to puzzle out \"/audit_repo\".\n if (input.trimStart().startsWith('/')) {\n const rewritten = rewriteUnknownSlashAsWorkflow(normalizedCommand, commandArgs);\n if (rewritten) {\n chatLog.addSystem(`▶ Running workflow: ${normalizedCommand}`);\n tui.requestRender();\n sendMessage(rewritten);\n return;\n }\n }\n\n sendMessage(input);\n };\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { type TranscriptStoredRow } from '../session/session-context-for-llm.js';
1
+ import type { TranscriptStoredRow } from '../session/session-context-for-llm.js';
2
2
  import type { TuiTranscriptTreeEntry } from './tui-backend.js';
3
3
  import type { TreeFilterMode } from './tui-settings.js';
4
4
  export declare function transcriptTreeEntryIdToRowNumber(entryId: string): number | null;
@@ -1,4 +1,4 @@
1
- import { isTranscriptBashExecutionEntry, isTranscriptContextEntry, isTranscriptCustomMessageEntry, isTranscriptLabelEntry, isTranscriptMetadataEntry, isTranscriptSummaryMessageEntry } from "../session/session-context-for-llm.js";
1
+ import { buildTranscriptOutline } from "../session/transcript-outline.js";
2
2
  //#region src/tui/tui-transcript-tree.ts
3
3
  const TRANSCRIPT_ROW_ID_RE = /^row-(\d+)$/;
4
4
  function transcriptTreeEntryIdToRowNumber(entryId) {
@@ -7,263 +7,23 @@ function transcriptTreeEntryIdToRowNumber(entryId) {
7
7
  const row = Number.parseInt(match[1], 10);
8
8
  return Number.isFinite(row) && row > 0 ? row : null;
9
9
  }
10
- function asRecord(value) {
11
- return value && typeof value === "object" ? value : null;
12
- }
13
- function stringValue(value) {
14
- return typeof value === "string" && value.trim() ? value.trim() : void 0;
15
- }
16
- function truncateText(text, max = 96) {
17
- const normalized = text.replace(/\s+/g, " ").trim();
18
- if (normalized.length <= max) return normalized;
19
- return `${normalized.slice(0, Math.max(0, max - 3)).trimEnd()}...`;
20
- }
21
- function contentPreview(content) {
22
- return truncateText(contentText(content));
23
- }
24
- function contentText(content) {
25
- if (typeof content === "string") return content;
26
- if (!Array.isArray(content)) return "";
27
- const parts = [];
28
- for (const block of content) {
29
- if (typeof block === "string") {
30
- parts.push(block);
31
- continue;
32
- }
33
- const obj = asRecord(block);
34
- if (!obj) continue;
35
- const type = stringValue(obj.type);
36
- if (type === "text") parts.push(stringValue(obj.text) ?? "");
37
- else if (type === "toolCall") parts.push(formatToolCallPreview(stringValue(obj.name) ?? stringValue(obj.toolName) ?? "tool", asRecord(obj.arguments) ?? asRecord(obj.args) ?? {}));
38
- else if (type === "image" || type === "image_url") parts.push("[image]");
39
- else if (type) parts.push(`[${type}]`);
40
- }
41
- return parts.filter(Boolean).join(" ");
42
- }
43
- function formatToolCallPreview(name, args) {
44
- const path = stringValue(args.path) ?? stringValue(args.file_path) ?? "";
45
- if (name === "read" || name === "read_file") {
46
- const offset = typeof args.offset === "number" ? args.offset : void 0;
47
- const limit = typeof args.limit === "number" ? args.limit : void 0;
48
- let display = path;
49
- if (offset !== void 0 || limit !== void 0) {
50
- const start = offset ?? 1;
51
- const end = limit !== void 0 ? start + limit - 1 : void 0;
52
- display += `:${start}${end !== void 0 ? `-${end}` : ""}`;
53
- }
54
- return `[read: ${display || "file"}]`;
55
- }
56
- if (name === "write" || name === "write_file") return `[write: ${path || "file"}]`;
57
- if (name === "edit") return `[edit: ${path || "file"}]`;
58
- if (name === "bash" || name === "shell") return `[bash: ${truncateText((stringValue(args.command) ?? "").replace(/[\n\t]/g, " ").trim(), 53)}]`;
59
- if (name === "grep") return `[grep: /${stringValue(args.pattern) ?? ""}/ in ${path || "."}]`;
60
- if (name === "find") return `[find: ${stringValue(args.pattern) ?? ""} in ${path || "."}]`;
61
- if (name === "ls") return `[ls: ${path || "."}]`;
62
- const argsText = JSON.stringify(args);
63
- return `[${name}: ${argsText.length > 40 ? `${argsText.slice(0, 40)}...` : argsText}]`;
64
- }
65
- function collectToolCallDisplays(content) {
66
- if (!Array.isArray(content)) return [];
67
- const calls = [];
68
- for (const block of content) {
69
- const obj = asRecord(block);
70
- if (!obj || stringValue(obj.type) !== "toolCall") continue;
71
- const id = stringValue(obj.id) ?? stringValue(obj.toolCallId) ?? stringValue(obj.tool_call_id) ?? stringValue(obj.tool_call_id$);
72
- if (!id) continue;
73
- const name = stringValue(obj.name) ?? stringValue(obj.toolName) ?? "tool";
74
- calls.push({
75
- id,
76
- name,
77
- preview: formatToolCallPreview(name, asRecord(obj.arguments) ?? asRecord(obj.args) ?? {})
78
- });
79
- }
80
- return calls;
81
- }
82
- function rowToolCallId(row) {
83
- const record = asRecord(row);
84
- return stringValue(record?.toolCallId) ?? stringValue(record?.tool_call_id) ?? stringValue(record?.tool_call_id$);
85
- }
86
- function rowCreatedAt(row) {
87
- const record = asRecord(row);
88
- return stringValue(record?.createdAt) ?? stringValue(record?.timestamp);
89
- }
90
- function messageLabel(row) {
91
- const role = stringValue(row.role) ?? "message";
92
- if (role === "tool" || role === "toolResult") return `tool:${stringValue(row.toolName) ?? "result"}`;
93
- return role;
94
- }
95
- function rowPreview(row) {
96
- if (isTranscriptContextEntry(row)) return truncateText(row.text ?? JSON.stringify(row.data ?? {}));
97
- if (isTranscriptLabelEntry(row)) return truncateText(row.label ? `label: ${row.label}` : "label cleared");
98
- if (isTranscriptMetadataEntry(row)) {
99
- if (row.type === "model_change") return truncateText([row.provider, row.modelId].filter(Boolean).join("/") || "model changed");
100
- if (row.type === "thinking_level_change") return truncateText(row.thinkingLevel ? `thinking: ${row.thinkingLevel}` : "thinking changed");
101
- return truncateText(row.name ? `title: ${row.name}` : "title cleared");
102
- }
103
- if (isTranscriptBashExecutionEntry(row)) return truncateText(row.command ?? "bash");
104
- if (isTranscriptCustomMessageEntry(row)) {
105
- const record = asRecord(row);
106
- const customType = stringValue(record?.customType) ?? "custom";
107
- const preview = contentPreview(record?.content);
108
- return truncateText(preview ? `${customType}: ${preview}` : customType);
109
- }
110
- if (isTranscriptSummaryMessageEntry(row)) {
111
- if (row.role === "branchSummary") return truncateText(row.summary ?? "branch summary");
112
- return truncateText(row.summary ?? "compaction checkpoint");
113
- }
114
- const record = asRecord(row);
115
- if (record?.type === "compaction") return truncateText(stringValue(record.summary) ?? "compaction checkpoint");
116
- const preview = contentPreview(record?.content);
117
- if (record?.role === "assistant" && !preview) {
118
- if (record.stopReason === "aborted") return "(aborted)";
119
- const errorMessage = stringValue(record.errorMessage);
120
- if (errorMessage) return truncateText(errorMessage, 80);
121
- }
122
- return preview;
123
- }
124
- function rowContentText(row) {
125
- if (isTranscriptContextEntry(row)) return row.text;
126
- if (isTranscriptLabelEntry(row)) return row.label;
127
- if (isTranscriptMetadataEntry(row)) {
128
- if (row.type === "model_change") return [row.provider, row.modelId].filter(Boolean).join("/") || void 0;
129
- if (row.type === "thinking_level_change") return row.thinkingLevel;
130
- return row.name;
131
- }
132
- if (isTranscriptBashExecutionEntry(row)) return row.command;
133
- if (isTranscriptCustomMessageEntry(row)) {
134
- const record = asRecord(row);
135
- return contentText(record?.content).trim() || stringValue(record?.customType);
136
- }
137
- if (isTranscriptSummaryMessageEntry(row)) return row.summary;
138
- const record = asRecord(row);
139
- if (record?.type === "compaction") return stringValue(record.summary);
140
- const text = contentText(record?.content).trim();
141
- return text ? text : void 0;
142
- }
143
10
  function buildTuiTranscriptTree(rows) {
144
- const entries = [];
145
- const byOriginalId = /* @__PURE__ */ new Map();
146
- const toolCallsById = /* @__PURE__ */ new Map();
147
- const labelChanges = [];
148
- let currentTurnId;
149
- let turn = 0;
150
- rows.forEach((row, index) => {
151
- const id = `row-${index + 1}`;
152
- const record = asRecord(row);
153
- let parentId;
154
- let depth = 0;
155
- let label = "entry";
156
- let role;
157
- let toolCallPreview;
158
- if (isTranscriptContextEntry(row)) {
159
- label = "context";
160
- parentId = currentTurnId;
161
- depth = currentTurnId ? 1 : 0;
162
- } else if (asRecord(row)?.type === "compaction") {
163
- label = "compaction";
164
- parentId = currentTurnId;
165
- depth = currentTurnId ? 1 : 0;
166
- } else if (isTranscriptLabelEntry(row)) {
167
- label = row.label ? `label:${row.label}` : "label:cleared";
168
- parentId = currentTurnId;
169
- depth = currentTurnId ? 1 : 0;
170
- if (row.targetId) labelChanges.push({
171
- targetId: row.targetId,
172
- label: row.label,
173
- timestamp: typeof row.timestamp === "string" ? row.timestamp : void 0
174
- });
175
- } else if (isTranscriptMetadataEntry(row)) {
176
- label = row.type;
177
- parentId = currentTurnId;
178
- depth = currentTurnId ? 1 : 0;
179
- } else if (isTranscriptBashExecutionEntry(row)) {
180
- label = "bashExecution";
181
- parentId = currentTurnId;
182
- depth = currentTurnId ? 1 : 0;
183
- } else if (isTranscriptCustomMessageEntry(row)) {
184
- label = `custom:${stringValue(record?.customType) ?? "message"}`;
185
- parentId = currentTurnId;
186
- depth = currentTurnId ? 1 : 0;
187
- } else if (isTranscriptSummaryMessageEntry(row)) {
188
- label = row.role === "branchSummary" ? "branch_summary" : "compaction";
189
- parentId = currentTurnId;
190
- depth = currentTurnId ? 1 : 0;
191
- } else {
192
- const message = row;
193
- role = stringValue(message.role);
194
- label = messageLabel(message);
195
- if (role === "tool" || role === "toolResult") {
196
- const toolCallId = rowToolCallId(row);
197
- const toolCall = toolCallId ? toolCallsById.get(toolCallId) : void 0;
198
- if (toolCall) {
199
- label = `tool:${toolCall.name}`;
200
- toolCallPreview = toolCall.preview;
201
- }
202
- }
203
- if (role === "user" || !currentTurnId) {
204
- turn += 1;
205
- currentTurnId = id;
206
- depth = 0;
207
- } else {
208
- parentId = currentTurnId;
209
- depth = 1;
210
- }
211
- }
212
- const entry = {
213
- id,
214
- depth,
215
- label,
216
- turn,
217
- preview: rowPreview(row),
218
- contentText: rowContentText(row),
219
- createdAt: rowCreatedAt(row)
220
- };
221
- if (parentId) entry.parentId = parentId;
222
- if (role) entry.role = role;
223
- if (toolCallPreview) entry.toolCallPreview = toolCallPreview;
224
- entries.push(entry);
225
- byOriginalId.set(id, entry);
226
- const originalId = stringValue(record?.id);
227
- if (originalId) byOriginalId.set(originalId, entry);
228
- for (const toolCall of collectToolCallDisplays(record?.content)) toolCallsById.set(toolCall.id, {
229
- name: toolCall.name,
230
- preview: toolCall.preview
231
- });
232
- });
233
- for (const change of labelChanges) {
234
- const target = byOriginalId.get(change.targetId);
235
- if (!target) continue;
236
- if (change.label?.trim()) {
237
- target.userLabel = change.label.trim();
238
- target.labelTimestamp = change.timestamp;
239
- } else {
240
- delete target.userLabel;
241
- delete target.labelTimestamp;
242
- }
243
- }
244
- markCurrentTranscriptPath(entries);
245
- return entries;
246
- }
247
- function markCurrentTranscriptPath(entries) {
248
- const currentLeaf = [...entries].reverse().find(isCurrentLeafCandidate) ?? entries.at(-1);
249
- if (!currentLeaf) return;
250
- const byId = new Map(entries.map((entry) => [entry.id, entry]));
251
- currentLeaf.isCurrentLeaf = true;
252
- let currentId = currentLeaf.id;
253
- while (currentId) {
254
- const entry = byId.get(currentId);
255
- if (!entry) break;
256
- entry.isOnActivePath = true;
257
- currentId = entry.parentId;
258
- }
259
- }
260
- function isCurrentLeafCandidate(entry) {
261
- if (entry.label === "context") return false;
262
- if (entry.label === "model_change") return false;
263
- if (entry.label === "thinking_level_change") return false;
264
- if (entry.label === "session_info") return false;
265
- if (entry.label.startsWith("label:")) return false;
266
- return true;
11
+ return buildTranscriptOutline(rows).map((entry) => ({
12
+ id: entry.id,
13
+ ...entry.parentId ? { parentId: entry.parentId } : {},
14
+ depth: entry.depth,
15
+ label: entry.label,
16
+ ...entry.role ? { role: entry.role } : {},
17
+ ...entry.userLabel ? { userLabel: entry.userLabel } : {},
18
+ ...entry.labelTimestamp ? { labelTimestamp: entry.labelTimestamp } : {},
19
+ turn: entry.turn,
20
+ ...entry.preview ? { preview: entry.preview } : {},
21
+ ...entry.contentText ? { contentText: entry.contentText } : {},
22
+ ...entry.toolCallPreview ? { toolCallPreview: entry.toolCallPreview } : {},
23
+ ...entry.createdAt ? { createdAt: entry.createdAt } : {},
24
+ ...entry.isOnActivePath ? { isOnActivePath: entry.isOnActivePath } : {},
25
+ ...entry.isCurrentLeaf ? { isCurrentLeaf: entry.isCurrentLeaf } : {}
26
+ }));
267
27
  }
268
28
  function filterTuiTranscriptTreeEntries(entries, mode) {
269
29
  if (mode === "all") return entries;