@xopcai/xopc 0.0.113 → 0.0.115

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 (567) hide show
  1. package/dist/browser-ext/manifest.json +1 -1
  2. package/dist/extensions/feishu/src/outbound/media-load.js +1 -1
  3. package/dist/extensions/feishu/src/workflow-progress.js +1 -1
  4. package/dist/extensions/telegram/src/adapters/streaming-adapter.js +1 -1
  5. package/dist/extensions/telegram/src/inbound-processor.js +1 -1
  6. package/dist/extensions/telegram/src/plugin.js +1 -1
  7. package/dist/extensions/telegram/src/routing-integration.js +2 -2
  8. package/dist/extensions/telegram/src/update-offset-store.js +1 -1
  9. package/dist/extensions/telegram/src/workflow-progress.js +1 -1
  10. package/dist/extensions/telegram/xopc.extension.json +1 -1
  11. package/dist/extensions/weixin/src/api/api.js +2 -2
  12. package/dist/extensions/weixin/src/auth/accounts.js +1 -1
  13. package/dist/extensions/weixin/src/cdn/upload.js +1 -1
  14. package/dist/extensions/weixin/src/media/data-url.js +1 -1
  15. package/dist/extensions/weixin/src/messaging/debug-mode.js +1 -1
  16. package/dist/extensions/weixin/src/messaging/inbound.js +1 -1
  17. package/dist/extensions/weixin/src/messaging/process-message.js +1 -1
  18. package/dist/extensions/weixin/src/plugin.js +1 -1
  19. package/dist/extensions/weixin/src/storage/sync-buf.js +1 -1
  20. package/dist/extensions/weixin/src/workflow-progress.js +1 -1
  21. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-CBlklyNr.js → agent-avatar-dicebear-DVnBfANm.js} +1 -1
  22. package/dist/gateway/static/root/assets/agent-browser-settings-page-DPXc4hz8.js +6 -0
  23. package/dist/gateway/static/root/assets/agent-defaults-tabbed-page-CTJ0YnRQ.js +1 -0
  24. package/dist/gateway/static/root/assets/agents-zJXQfJ_W.js +71 -0
  25. package/dist/gateway/static/root/assets/{app-management-settings-panel-28E_WfMe.js → app-management-settings-panel-DzGbdr04.js} +1 -1
  26. package/dist/gateway/static/root/assets/{appearance-settings-Do1z0XgJ.js → appearance-settings-BQpPSTHD.js} +1 -1
  27. package/dist/gateway/static/root/assets/apps-page-CPjfyzSD.js +1 -0
  28. package/dist/gateway/static/root/assets/{archive-plugin-BAFlsov_.js → archive-plugin-CXu-Csep.js} +1 -1
  29. package/dist/gateway/static/root/assets/{attachment-load-V3qGPC3x.js → attachment-load-BAjgOoGY.js} +1 -1
  30. package/dist/gateway/static/root/assets/{binary-plugins-DT8NvA6W.js → binary-plugins-BSBgB2hO.js} +1 -1
  31. package/dist/gateway/static/root/assets/{block-editor-CdLMEcHd.js → block-editor-BpXw9TTR.js} +3 -3
  32. package/dist/gateway/static/root/assets/channels-settings-BbPUpzWB.js +1 -0
  33. package/dist/gateway/static/root/assets/{config-api-Bf5mjpu7.js → config-api-NOoPiIYz.js} +1 -1
  34. package/dist/gateway/static/root/assets/connectors-settings-CAXYMOdp.js +2 -0
  35. package/dist/gateway/static/root/assets/{cron-api--pAB_rps.js → cron-api-C9BOqAXd.js} +1 -1
  36. package/dist/gateway/static/root/assets/cron-page-DuUbBeKI.js +3 -0
  37. package/dist/gateway/static/root/assets/{dreaming-settings-6UZE1FSK.js → dreaming-settings-DQ4DtiK1.js} +1 -1
  38. package/dist/gateway/static/root/assets/{extension-debug-page-BGhE7msg.js → extension-debug-page-D9kgUHCc.js} +1 -1
  39. package/dist/gateway/static/root/assets/{extension-page-CvpI45WG.js → extension-page-CGyhXqzR.js} +1 -1
  40. package/dist/gateway/static/root/assets/{extension-settings-page-DAmR5FUe.js → extension-settings-page-DL8Xquqd.js} +1 -1
  41. package/dist/gateway/static/root/assets/{fetch-NZmjSXLl.js → fetch-D0VXA932.js} +1 -1
  42. package/dist/gateway/static/root/assets/{format-interval-label-qhth3BMV.js → format-interval-label-Be8SmgUw.js} +1 -1
  43. package/dist/gateway/static/root/assets/{gateway-config-api-CaXBt-9R.js → gateway-config-api-C-xjn__h.js} +1 -1
  44. package/dist/gateway/static/root/assets/{gateway-settings-DphpbLBc.js → gateway-settings-BMPwIjKI.js} +1 -1
  45. package/dist/gateway/static/root/assets/{gateway-startup-retry-Be1omjh3.js → gateway-startup-retry-DERUH61L.js} +1 -1
  46. package/dist/gateway/static/root/assets/goal-detail-page-BJsyjJnF.js +1 -0
  47. package/dist/gateway/static/root/assets/goals-config-api-BPmqWk90.js +1 -0
  48. package/dist/gateway/static/root/assets/goals-page-BerDgIhw.js +2 -0
  49. package/dist/gateway/static/root/assets/goals-settings-ByTjeAto.js +1 -0
  50. package/dist/gateway/static/root/assets/{heartbeat-config-api-BzO6G4fD.js → heartbeat-config-api-Bfdzr8oV.js} +1 -1
  51. package/dist/gateway/static/root/assets/{heartbeat-settings-DCST9-du.js → heartbeat-settings-TbHgcjTn.js} +1 -1
  52. package/dist/gateway/static/root/assets/index-AkTrf6Pb.js +122 -0
  53. package/dist/gateway/static/root/assets/index-fh5sXTj9.css +1 -0
  54. package/dist/gateway/static/root/assets/{interval-presets-DJmshV8n.js → interval-presets-utKbuCRY.js} +1 -1
  55. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-9AUUlQ5Q.js → keyboard-shortcuts-settings-CjqS6c6V.js} +1 -1
  56. package/dist/gateway/static/root/assets/logs-page-DGXuPf5B.js +2 -0
  57. package/dist/gateway/static/root/assets/{markdown-split-CYYELqAr.js → markdown-split-DW8C47iB.js} +1 -1
  58. package/dist/gateway/static/root/assets/{media-plugins-BEcMR2M8.js → media-plugins-D6HwDhDT.js} +1 -1
  59. package/dist/gateway/static/root/assets/messages-upgxw6Ub.js +3 -0
  60. package/dist/gateway/static/root/assets/models-hub-panel-Bot16nn7.js +2 -0
  61. package/dist/gateway/static/root/assets/note-detail-page-Brlyou8M.js +2 -0
  62. package/dist/gateway/static/root/assets/{note-image-lightbox-DNAoPcmm.js → note-image-lightbox-pJM35Pz5.js} +1 -1
  63. package/dist/gateway/static/root/assets/notes-page-DvZ4pwc-.js +1 -0
  64. package/dist/gateway/static/root/assets/{preview-open-alternatives-BPLz0AIv.js → preview-open-alternatives-CVwHuyN6.js} +1 -1
  65. package/dist/gateway/static/root/assets/remote-access-hub-BZEDmxbZ.js +1 -0
  66. package/dist/gateway/static/root/assets/{save-bar-controls-CrWwWRVK.js → save-bar-controls-Ba-UEk7x.js} +1 -1
  67. package/dist/gateway/static/root/assets/{schedule-field-CF2sadvN.js → schedule-field-CNN9595U.js} +1 -1
  68. package/dist/gateway/static/root/assets/{schema-form-Di5cKjYE.js → schema-form-DnNMmtD5.js} +1 -1
  69. package/dist/gateway/static/root/assets/sessions-page-DdGGlsfn.js +1 -0
  70. package/dist/gateway/static/root/assets/settings-advanced-gate-DlkEkPf9.js +1 -0
  71. package/dist/gateway/static/root/assets/{settings-collapsible-section-Chh282jW.js → settings-collapsible-section-CmOz80i5.js} +1 -1
  72. package/dist/gateway/static/root/assets/{settings-form-section-Dq-83cQd.js → settings-form-section-BmK7JJOV.js} +1 -1
  73. package/dist/gateway/static/root/assets/settings-page-DFPTrsPF.js +1 -0
  74. package/dist/gateway/static/root/assets/setup-status-panel-CYCCfgh4.js +1 -0
  75. package/dist/gateway/static/root/assets/{share-preview-page-0FXYnSUA.js → share-preview-page-Dp2qGrHC.js} +1 -1
  76. package/dist/gateway/static/root/assets/shares-settings-Bff1pGd0.js +1 -0
  77. package/dist/gateway/static/root/assets/skill-reload-api-CJGKpBur.js +1 -0
  78. package/dist/gateway/static/root/assets/skills-page-C6ocduTD.js +2 -0
  79. package/dist/gateway/static/root/assets/{system-settings-panel-W1pTcojB.js → system-settings-panel-5jrIEr5b.js} +1 -1
  80. package/dist/gateway/static/root/assets/{use-agent-defaults-form-BVRvkK7m.js → use-agent-defaults-form-BuiXLIs5.js} +1 -1
  81. package/dist/gateway/static/root/assets/{use-channel-catalog-CgJibfMM.js → use-channel-catalog-CHlO8J9G.js} +1 -1
  82. package/dist/gateway/static/root/assets/{use-settings-tab-guard-Bw_qkRQE.js → use-settings-tab-guard-CW5JORnl.js} +1 -1
  83. package/dist/gateway/static/root/assets/voice-api-key-field-DDoQyghO.js +1 -0
  84. package/dist/gateway/static/root/assets/{voice-player-store-C7lziaAx.js → voice-player-store-DDDWYHvg.js} +1 -1
  85. package/dist/gateway/static/root/assets/workflow-page.utils-CKjeEGqx.js +1 -0
  86. package/dist/gateway/static/root/assets/workflows-page-B604ehHG.js +18 -0
  87. package/dist/gateway/static/root/index.html +5 -5
  88. package/dist/gateway/static/root/logo.svg +4 -3
  89. package/dist/package.js +1 -1
  90. package/dist/src/agent/agent-manager.d.ts +8 -0
  91. package/dist/src/agent/agent-manager.js +63 -28
  92. package/dist/src/agent/agent-manager.js.map +1 -1
  93. package/dist/src/agent/agent-scope.js +1 -1
  94. package/dist/src/agent/bootstrap/load-bootstrap-files.js +1 -1
  95. package/dist/src/agent/bootstrap/project-agents-context.d.ts +2 -0
  96. package/dist/src/agent/bootstrap/project-agents-context.js +32 -0
  97. package/dist/src/agent/bootstrap/project-agents-context.js.map +1 -0
  98. package/dist/src/agent/context/workspace-seed.js +2 -2
  99. package/dist/src/agent/context/workspace-state.js +1 -1
  100. package/dist/src/agent/context/workspace.js +1 -1
  101. package/dist/src/agent/embedded/session-tool-result-guard.js +8 -1
  102. package/dist/src/agent/embedded/session-tool-result-guard.js.map +1 -1
  103. package/dist/src/agent/goals/checklist-judge.d.ts +1 -0
  104. package/dist/src/agent/goals/checklist-judge.js +3 -2
  105. package/dist/src/agent/goals/checklist-judge.js.map +1 -1
  106. package/dist/src/agent/goals/evaluate-turn.d.ts +1 -1
  107. package/dist/src/agent/goals/evaluate-turn.js +1 -0
  108. package/dist/src/agent/goals/evaluate-turn.js.map +1 -1
  109. package/dist/src/agent/goals/goal-locale.js +2 -2
  110. package/dist/src/agent/goals/persistent-goal-service.js +2 -4
  111. package/dist/src/agent/goals/persistent-goal-service.js.map +1 -1
  112. package/dist/src/agent/goals/post-turn.d.ts +6 -1
  113. package/dist/src/agent/goals/post-turn.js +15 -6
  114. package/dist/src/agent/goals/post-turn.js.map +1 -1
  115. package/dist/src/agent/image/load-image-media.js +2 -2
  116. package/dist/src/agent/inbound/inbound-loop.js +5 -1
  117. package/dist/src/agent/inbound/inbound-loop.js.map +1 -1
  118. package/dist/src/agent/inbound/turn-dispatcher.d.ts +2 -2
  119. package/dist/src/agent/inbound/turn-dispatcher.js +2 -2
  120. package/dist/src/agent/inbound/turn-dispatcher.js.map +1 -1
  121. package/dist/src/agent/ipc/inbox.js +3 -3
  122. package/dist/src/agent/ipc/socket.js +1 -1
  123. package/dist/src/agent/mcp/bundle-mcp-materialize.d.ts +27 -0
  124. package/dist/src/agent/mcp/bundle-mcp-materialize.js +50 -2
  125. package/dist/src/agent/mcp/bundle-mcp-materialize.js.map +1 -1
  126. package/dist/src/agent/mcp/bundle-mcp-runtime.js +79 -4
  127. package/dist/src/agent/mcp/bundle-mcp-runtime.js.map +1 -1
  128. package/dist/src/agent/mcp/bundle-mcp-types.d.ts +19 -0
  129. package/dist/src/agent/mcp/mcp-transport-config.js +1 -1
  130. package/dist/src/agent/mcp/mcp-transport.js +1 -1
  131. package/dist/src/agent/memory/builtin-memory-store.js +1 -1
  132. package/dist/src/agent/memory/dreaming/deep-promotion.js +1 -1
  133. package/dist/src/agent/memory/dreaming/events.js +1 -1
  134. package/dist/src/agent/memory/dreaming/last-run.js +1 -1
  135. package/dist/src/agent/memory/dreaming/light-sweep.js +1 -1
  136. package/dist/src/agent/memory/dreaming/preview.js +1 -1
  137. package/dist/src/agent/memory/dreaming/rem-patterns.js +1 -1
  138. package/dist/src/agent/memory/dreaming/short-term-store.js +1 -1
  139. package/dist/src/agent/memory/dreaming/utils.js +1 -1
  140. package/dist/src/agent/memory/memory-flush.js +1 -1
  141. package/dist/src/agent/memory/plugin-discovery.js +1 -1
  142. package/dist/src/agent/models/manager.js +1 -1
  143. package/dist/src/agent/prompt/memory/index.js +1 -1
  144. package/dist/src/agent/prompt/service-prompt-builder.js +2 -2
  145. package/dist/src/agent/reply/post-compaction-context.js +1 -1
  146. package/dist/src/agent/reply/workspace-boundary-read.js +1 -1
  147. package/dist/src/agent/sandbox/path-policy.js +2 -2
  148. package/dist/src/agent/service/btw-query.js +11 -3
  149. package/dist/src/agent/service/btw-query.js.map +1 -1
  150. package/dist/src/agent/service/parse-outbound-session-key.js +13 -8
  151. package/dist/src/agent/service/parse-outbound-session-key.js.map +1 -1
  152. package/dist/src/agent/service/process-direct-one-shot.d.ts +2 -2
  153. package/dist/src/agent/service/process-direct-one-shot.js +1 -1
  154. package/dist/src/agent/service/process-direct-one-shot.js.map +1 -1
  155. package/dist/src/agent/service/process-direct-streaming.d.ts +2 -2
  156. package/dist/src/agent/service/process-direct-streaming.js +1 -1
  157. package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
  158. package/dist/src/agent/service.d.ts +1 -1
  159. package/dist/src/agent/service.js +13 -9
  160. package/dist/src/agent/service.js.map +1 -1
  161. package/dist/src/agent/service.types.d.ts +5 -0
  162. package/dist/src/agent/session/session-inspector.js +1 -1
  163. package/dist/src/agent/skills/config.js +2 -2
  164. package/dist/src/agent/skills/filesystem-watcher.js +5 -4
  165. package/dist/src/agent/skills/filesystem-watcher.js.map +1 -1
  166. package/dist/src/agent/skills/hub-hash.js +2 -2
  167. package/dist/src/agent/skills/hub-lock.js +1 -1
  168. package/dist/src/agent/skills/hub-pull.js +2 -2
  169. package/dist/src/agent/skills/index.js +4 -3
  170. package/dist/src/agent/skills/index.js.map +1 -1
  171. package/dist/src/agent/skills/installer.js +2 -2
  172. package/dist/src/agent/skills/managed-store.js +1 -1
  173. package/dist/src/agent/skills/skill-manage-ops.js +3 -2
  174. package/dist/src/agent/skills/skill-manage-ops.js.map +1 -1
  175. package/dist/src/agent/skills/skill-manager.js +1 -1
  176. package/dist/src/agent/skills/skill-view-path.js +1 -1
  177. package/dist/src/agent/skills/test-framework.js +1 -1
  178. package/dist/src/agent/skills/types.d.ts +1 -1
  179. package/dist/src/agent/skills/watcher.js +2 -5
  180. package/dist/src/agent/skills/watcher.js.map +1 -1
  181. package/dist/src/agent/skills/workspace-skills-dir.d.ts +1 -0
  182. package/dist/src/agent/skills/workspace-skills-dir.js +11 -0
  183. package/dist/src/agent/skills/workspace-skills-dir.js.map +1 -0
  184. package/dist/src/agent/starter-agents.js +1 -1
  185. package/dist/src/agent/tool-manuals/browser.d.ts +1 -1
  186. package/dist/src/agent/tool-manuals/browser.js +62 -3
  187. package/dist/src/agent/tool-manuals/browser.js.map +1 -1
  188. package/dist/src/agent/tools/browser/tool/browser-use-tool.d.ts +4 -1
  189. package/dist/src/agent/tools/browser/tool/browser-use-tool.js +13 -4
  190. package/dist/src/agent/tools/browser/tool/browser-use-tool.js.map +1 -1
  191. package/dist/src/agent/tools/browser/tool/schemas.d.ts +0 -2
  192. package/dist/src/agent/tools/browser/tool/schemas.js +1 -2
  193. package/dist/src/agent/tools/browser/tool/schemas.js.map +1 -1
  194. package/dist/src/agent/tools/dreaming-tool.js +1 -1
  195. package/dist/src/agent/tools/factory.js +1 -10
  196. package/dist/src/agent/tools/factory.js.map +1 -1
  197. package/dist/src/agent/tools/find.js +1 -1
  198. package/dist/src/agent/tools/grep.js +1 -1
  199. package/dist/src/agent/tools/image-generate-tool.js +1 -1
  200. package/dist/src/agent/tools/skill-manage-tool.js +2 -2
  201. package/dist/src/agent/tools/skill-manage-tool.js.map +1 -1
  202. package/dist/src/agent/tools/workflow-tool.js +1 -1
  203. package/dist/src/agent/workflow/catalog.js +1 -1
  204. package/dist/src/agent/workflow/snapshot.d.ts +10 -0
  205. package/dist/src/agent/workflow/snapshot.js +136 -1
  206. package/dist/src/agent/workflow/snapshot.js.map +1 -1
  207. package/dist/src/agent/workflow/subagent-runner.js +18 -1
  208. package/dist/src/agent/workflow/subagent-runner.js.map +1 -1
  209. package/dist/src/ai-assist/text-assist.js +1 -1
  210. package/dist/src/auth/credentials.js +2 -2
  211. package/dist/src/auth/profiles/store.js +2 -2
  212. package/dist/src/auth/sync-provider-auth.js +1 -1
  213. package/dist/src/browser/actions/extension-registry-bridge.js +91 -7
  214. package/dist/src/browser/actions/extension-registry-bridge.js.map +1 -1
  215. package/dist/src/browser/actions/registry.js +383 -7
  216. package/dist/src/browser/actions/registry.js.map +1 -1
  217. package/dist/src/browser/actions/types.d.ts +11 -3
  218. package/dist/src/browser/cache-dir-policy.js +1 -1
  219. package/dist/src/browser/cdp-local-launcher.js +2 -2
  220. package/dist/src/browser/index.js +2 -2
  221. package/dist/src/browser/pipeline/output.d.ts +18 -16
  222. package/dist/src/browser/pipeline/output.js +28 -20
  223. package/dist/src/browser/pipeline/output.js.map +1 -1
  224. package/dist/src/browser/pipeline/runner.d.ts +7 -14
  225. package/dist/src/browser/pipeline/runner.js +349 -102
  226. package/dist/src/browser/pipeline/runner.js.map +1 -1
  227. package/dist/src/browser/pipeline/schema.d.ts +1 -0
  228. package/dist/src/browser/pipeline/schema.js +35 -58
  229. package/dist/src/browser/pipeline/schema.js.map +1 -1
  230. package/dist/src/browser/pipeline/source.d.ts +2 -0
  231. package/dist/src/browser/pipeline/source.js +10 -1
  232. package/dist/src/browser/pipeline/source.js.map +1 -1
  233. package/dist/src/browser/pipeline/template.d.ts +10 -2
  234. package/dist/src/browser/pipeline/template.js +50 -8
  235. package/dist/src/browser/pipeline/template.js.map +1 -1
  236. package/dist/src/browser/providers/browser-ext-install.js +4 -4
  237. package/dist/src/browser/providers/cloakbrowser.js +5 -5
  238. package/dist/src/browser/providers/playwright-doctor.js +1 -1
  239. package/dist/src/browser/stealth.js +1 -1
  240. package/dist/src/channels/catalog/channel-catalog-service.d.ts +2 -1
  241. package/dist/src/channels/catalog/channel-catalog-service.js +133 -16
  242. package/dist/src/channels/catalog/channel-catalog-service.js.map +1 -1
  243. package/dist/src/channels/catalog/channel-catalog-types.d.ts +13 -0
  244. package/dist/src/channels/outbound/persist-store.js +1 -1
  245. package/dist/src/channels/pairing/allow-from-file.js +1 -1
  246. package/dist/src/channels/pairing/pairing-store.js +2 -2
  247. package/dist/src/chat-commands/agent-edit.js +2 -2
  248. package/dist/src/chat-commands/builtins/config.js +5 -7
  249. package/dist/src/chat-commands/builtins/config.js.map +1 -1
  250. package/dist/src/chat-commands/context.d.ts +5 -0
  251. package/dist/src/chat-commands/context.js +18 -9
  252. package/dist/src/chat-commands/context.js.map +1 -1
  253. package/dist/src/chat-commands/index.d.ts +1 -1
  254. package/dist/src/chat-commands/index.js +2 -2
  255. package/dist/src/chat-commands/index.js.map +1 -1
  256. package/dist/src/chat-commands/processor.js +22 -21
  257. package/dist/src/chat-commands/processor.js.map +1 -1
  258. package/dist/src/chat-commands/session-key.d.ts +3 -15
  259. package/dist/src/chat-commands/session-key.js +3 -49
  260. package/dist/src/chat-commands/session-key.js.map +1 -1
  261. package/dist/src/chat-commands/types.d.ts +4 -0
  262. package/dist/src/cli/commands/browser-cli-helpers.js +11 -5
  263. package/dist/src/cli/commands/browser-cli-helpers.js.map +1 -1
  264. package/dist/src/cli/commands/config.js +1 -1
  265. package/dist/src/cli/commands/doctor/checks/channel-config.js +14 -1
  266. package/dist/src/cli/commands/doctor/checks/channel-config.js.map +1 -1
  267. package/dist/src/cli/commands/doctor/checks/config-health.js +1 -1
  268. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  269. package/dist/src/cli/commands/doctor/checks/provider-auth.js +1 -1
  270. package/dist/src/cli/commands/doctor/checks/session-integrity.js +8 -8
  271. package/dist/src/cli/commands/doctor/checks/session-integrity.js.map +1 -1
  272. package/dist/src/cli/commands/doctor/checks/state-integrity.js +1 -1
  273. package/dist/src/cli/commands/doctor/checks/workspace-status.js +1 -1
  274. package/dist/src/cli/commands/extension-create.js +1 -1
  275. package/dist/src/cli/commands/extension-dev.js +2 -2
  276. package/dist/src/cli/commands/extension-marketplace.js +2 -2
  277. package/dist/src/cli/commands/extension-pack.js +2 -2
  278. package/dist/src/cli/commands/extension.js +3 -3
  279. package/dist/src/cli/commands/gateway/logs.js +1 -1
  280. package/dist/src/cli/commands/image.js +1 -1
  281. package/dist/src/cli/commands/init.js +2 -2
  282. package/dist/src/cli/commands/models.js +1 -1
  283. package/dist/src/cli/commands/skills-test.js +1 -1
  284. package/dist/src/cli/templates.js +1 -1
  285. package/dist/src/cli/utils/gateway-client.js +1 -1
  286. package/dist/src/cli/utils/init-workspace-core.js +2 -2
  287. package/dist/src/config/agent-profile.js +1 -1
  288. package/dist/src/config/agent-typed-models.js +1 -1
  289. package/dist/src/config/gateway-bind.js +1 -1
  290. package/dist/src/config/index.js +7 -7
  291. package/dist/src/config/loader.js +4 -4
  292. package/dist/src/config/models-json.js +2 -2
  293. package/dist/src/config/paths-state.js +1 -1
  294. package/dist/src/config/paths.js +1 -1
  295. package/dist/src/config/profile.js +1 -1
  296. package/dist/src/config/reload.js +1 -1
  297. package/dist/src/config/rules.js +5 -0
  298. package/dist/src/config/rules.js.map +1 -1
  299. package/dist/src/config/schema.d.ts +8 -0
  300. package/dist/src/config/schema.js +7 -0
  301. package/dist/src/config/schema.js.map +1 -1
  302. package/dist/src/config/web-patch.d.ts +1 -0
  303. package/dist/src/config/web-patch.js +1 -0
  304. package/dist/src/config/web-patch.js.map +1 -1
  305. package/dist/src/config/workspace-path.js +1 -1
  306. package/dist/src/connectors/builtin-catalog.js +180 -1
  307. package/dist/src/connectors/builtin-catalog.js.map +1 -1
  308. package/dist/src/connectors/health.js +18 -9
  309. package/dist/src/connectors/health.js.map +1 -1
  310. package/dist/src/connectors/types.d.ts +19 -0
  311. package/dist/src/connectors/usage.js +12 -4
  312. package/dist/src/connectors/usage.js.map +1 -1
  313. package/dist/src/cron/executor.js +1 -1
  314. package/dist/src/cron/service.js +1 -1
  315. package/dist/src/daemon/constants.js +1 -1
  316. package/dist/src/daemon/install-plan.js +2 -2
  317. package/dist/src/daemon/launchd.js +2 -2
  318. package/dist/src/daemon/schtasks.js +2 -2
  319. package/dist/src/daemon/systemd.js +2 -2
  320. package/dist/src/extensions/bundle-mcp.js +1 -1
  321. package/dist/src/extensions/discover-extensions.js +2 -2
  322. package/dist/src/extensions/health.js +1 -1
  323. package/dist/src/extensions/install.js +2 -2
  324. package/dist/src/extensions/loader.js +2 -2
  325. package/dist/src/extensions/lockfile.js +3 -3
  326. package/dist/src/extensions/security.js +1 -1
  327. package/dist/src/extensions/types/tui.d.ts +2 -0
  328. package/dist/src/extensions/update.js +2 -2
  329. package/dist/src/gateway/agents-admin.js +2 -2
  330. package/dist/src/gateway/file-path-classifier.js +2 -2
  331. package/dist/src/gateway/heartbeat/service.js +13 -1
  332. package/dist/src/gateway/heartbeat/service.js.map +1 -1
  333. package/dist/src/gateway/hono/app.js +18 -5
  334. package/dist/src/gateway/hono/app.js.map +1 -1
  335. package/dist/src/gateway/hono/lib/config-payload.d.ts +3 -1
  336. package/dist/src/gateway/hono/lib/config-payload.js +7 -4
  337. package/dist/src/gateway/hono/lib/config-payload.js.map +1 -1
  338. package/dist/src/gateway/hono/lib/extension-store.js +2 -2
  339. package/dist/src/gateway/hono/lib/static-ui.js +2 -2
  340. package/dist/src/gateway/hono/middleware/strict-rate-limit.d.ts +4 -0
  341. package/dist/src/gateway/hono/middleware/strict-rate-limit.js +19 -5
  342. package/dist/src/gateway/hono/middleware/strict-rate-limit.js.map +1 -1
  343. package/dist/src/gateway/hono/oauth-async.js +1 -1
  344. package/dist/src/gateway/hono/routes/agent-stream.js +6 -6
  345. package/dist/src/gateway/hono/routes/agent-stream.js.map +1 -1
  346. package/dist/src/gateway/hono/routes/agents.js +1 -1
  347. package/dist/src/gateway/hono/routes/auth-registry-extensions.js +1 -1
  348. package/dist/src/gateway/hono/routes/channels.js +18 -14
  349. package/dist/src/gateway/hono/routes/channels.js.map +1 -1
  350. package/dist/src/gateway/hono/routes/config-patch/gateway.d.ts +1 -1
  351. package/dist/src/gateway/hono/routes/config-patch/gateway.js +6 -0
  352. package/dist/src/gateway/hono/routes/config-patch/gateway.js.map +1 -1
  353. package/dist/src/gateway/hono/routes/config-patch/misc.js +1 -1
  354. package/dist/src/gateway/hono/routes/deps.d.ts +1 -0
  355. package/dist/src/gateway/hono/routes/dreaming.js +1 -1
  356. package/dist/src/gateway/hono/routes/goals.js +16 -3
  357. package/dist/src/gateway/hono/routes/goals.js.map +1 -1
  358. package/dist/src/gateway/hono/routes/host-fs.js +2 -2
  359. package/dist/src/gateway/hono/routes/logs.js +1 -0
  360. package/dist/src/gateway/hono/routes/logs.js.map +1 -1
  361. package/dist/src/gateway/hono/routes/mcp.js +27 -8
  362. package/dist/src/gateway/hono/routes/mcp.js.map +1 -1
  363. package/dist/src/gateway/hono/routes/models.js +1 -1
  364. package/dist/src/gateway/hono/routes/notes.js +14 -2
  365. package/dist/src/gateway/hono/routes/notes.js.map +1 -1
  366. package/dist/src/gateway/hono/routes/sessions.js +62 -4
  367. package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
  368. package/dist/src/gateway/hono/routes/shares.js +1 -1
  369. package/dist/src/gateway/hono/routes/workflows.js +1 -1
  370. package/dist/src/gateway/hono/routes/workspace.js +5 -68
  371. package/dist/src/gateway/hono/routes/workspace.js.map +1 -1
  372. package/dist/src/gateway/hono/sse.d.ts +2 -2
  373. package/dist/src/gateway/hono/sse.js +7 -15
  374. package/dist/src/gateway/hono/sse.js.map +1 -1
  375. package/dist/src/gateway/lock.js +3 -3
  376. package/dist/src/gateway/ports.js +1 -1
  377. package/dist/src/gateway/rate-limit/buckets.d.ts +3 -0
  378. package/dist/src/gateway/rate-limit/buckets.js +12 -0
  379. package/dist/src/gateway/rate-limit/buckets.js.map +1 -1
  380. package/dist/src/gateway/resolve-webchat-session-key.d.ts +2 -6
  381. package/dist/src/gateway/resolve-webchat-session-key.js +5 -31
  382. package/dist/src/gateway/resolve-webchat-session-key.js.map +1 -1
  383. package/dist/src/gateway/service/agent-runner.d.ts +2 -3
  384. package/dist/src/gateway/service/agent-runner.js +9 -22
  385. package/dist/src/gateway/service/agent-runner.js.map +1 -1
  386. package/dist/src/gateway/service/config-coordinator.js +1 -1
  387. package/dist/src/gateway/service/marketplace-service.js +2 -2
  388. package/dist/src/gateway/service/run-gateway-agent.js +9 -7
  389. package/dist/src/gateway/service/run-gateway-agent.js.map +1 -1
  390. package/dist/src/gateway/service/sessions-api.d.ts +9 -0
  391. package/dist/src/gateway/service/sessions-api.js +11 -0
  392. package/dist/src/gateway/service/sessions-api.js.map +1 -1
  393. package/dist/src/gateway/service.d.ts +1 -1
  394. package/dist/src/gateway/service.js +23 -9
  395. package/dist/src/gateway/service.js.map +1 -1
  396. package/dist/src/gateway/workspace-file-search.d.ts +9 -0
  397. package/dist/src/gateway/workspace-file-search.js +76 -0
  398. package/dist/src/gateway/workspace-file-search.js.map +1 -0
  399. package/dist/src/gateway/workspace-fs-file-list.js +1 -1
  400. package/dist/src/goals/goal-notifications.d.ts +2 -0
  401. package/dist/src/goals/goal-notifications.js +16 -11
  402. package/dist/src/goals/goal-notifications.js.map +1 -1
  403. package/dist/src/goals/goal-service.js +1 -6
  404. package/dist/src/goals/goal-service.js.map +1 -1
  405. package/dist/src/goals/goal-workflow-judge.js +2 -2
  406. package/dist/src/i18n/goals-bundle.js +1 -1
  407. package/dist/src/i18n/index.js +1 -1
  408. package/dist/src/i18n/share-tool-bundle.js +2 -2
  409. package/dist/src/infra/brew.js +1 -1
  410. package/dist/src/infra/package-json.js +1 -1
  411. package/dist/src/infra/package-update-steps.js +1 -1
  412. package/dist/src/infra/path-env.js +2 -2
  413. package/dist/src/infra/restart.js +1 -1
  414. package/dist/src/infra/stable-node-path.js +1 -1
  415. package/dist/src/infra/update-check.js +1 -1
  416. package/dist/src/infra/update-global.js +1 -1
  417. package/dist/src/infra/update-lock.js +2 -2
  418. package/dist/src/infra/update-restart.js +1 -1
  419. package/dist/src/infra/update-runner.js +1 -1
  420. package/dist/src/infra/update-startup.js +1 -1
  421. package/dist/src/infra/write-file-atomic.js +2 -2
  422. package/dist/src/media/store.js +1 -1
  423. package/dist/src/notes/agent-context.js +1 -1
  424. package/dist/src/notes/service.js +1 -1
  425. package/dist/src/notes/store.js +2 -2
  426. package/dist/src/project-trust/trust-store.js +4 -2
  427. package/dist/src/project-trust/trust-store.js.map +1 -1
  428. package/dist/src/providers/auth-runtime/auth-profile-store.js +1 -1
  429. package/dist/src/providers/index.js +1 -1
  430. package/dist/src/providers/model-registry.js +4 -4
  431. package/dist/src/session/index.d.ts +1 -1
  432. package/dist/src/session/index.js +2 -2
  433. package/dist/src/session/init-session-turn.js +7 -10
  434. package/dist/src/session/init-session-turn.js.map +1 -1
  435. package/dist/src/session/manager.d.ts +5 -1
  436. package/dist/src/session/manager.js +5 -2
  437. package/dist/src/session/manager.js.map +1 -1
  438. package/dist/src/session/reset-type.d.ts +0 -2
  439. package/dist/src/session/reset-type.js +3 -9
  440. package/dist/src/session/reset-type.js.map +1 -1
  441. package/dist/src/session/resolve-session.js +10 -21
  442. package/dist/src/session/resolve-session.js.map +1 -1
  443. package/dist/src/session/session-title.js +2 -2
  444. package/dist/src/session/store.d.ts +11 -3
  445. package/dist/src/session/store.js +30 -14
  446. package/dist/src/session/store.js.map +1 -1
  447. package/dist/src/session/types.d.ts +2 -4
  448. package/dist/src/session/types.js.map +1 -1
  449. package/dist/src/share/share-auto.js +2 -2
  450. package/dist/src/share/share-store.js +3 -3
  451. package/dist/src/share/share-thumbnail.js +2 -2
  452. package/dist/src/share/share-zip.js +1 -1
  453. package/dist/src/share/site-share-store.js +3 -3
  454. package/dist/src/share/site-static-serve.js +1 -1
  455. package/dist/src/storage/sqlite/connection.js +1 -1
  456. package/dist/src/storage/sqlite/index.d.ts +2 -2
  457. package/dist/src/storage/sqlite/index.js +3 -3
  458. package/dist/src/storage/sqlite/memory-index-repository.js +2 -2
  459. package/dist/src/storage/sqlite/migrations/010_session_id_identity.sql +30 -0
  460. package/dist/src/storage/sqlite/migrations/discover.js +1 -1
  461. package/dist/src/storage/sqlite/migrations/runner.d.ts +2 -2
  462. package/dist/src/storage/sqlite/migrations/runner.js +5 -5
  463. package/dist/src/storage/sqlite/migrations/runner.js.map +1 -1
  464. package/dist/src/storage/sqlite/migrations/runner.ts +2 -2
  465. package/dist/src/storage/sqlite/row-mappers.d.ts +4 -4
  466. package/dist/src/storage/sqlite/row-mappers.js +11 -14
  467. package/dist/src/storage/sqlite/row-mappers.js.map +1 -1
  468. package/dist/src/storage/sqlite/schema.js +4 -4
  469. package/dist/src/storage/sqlite/schema.js.map +1 -1
  470. package/dist/src/storage/sqlite/schema.sql +37 -10
  471. package/dist/src/storage/sqlite/session-metadata.d.ts +2 -7
  472. package/dist/src/storage/sqlite/session-metadata.js +18 -72
  473. package/dist/src/storage/sqlite/session-metadata.js.map +1 -1
  474. package/dist/src/storage/sqlite/session-repository.d.ts +6 -5
  475. package/dist/src/storage/sqlite/session-repository.js +34 -40
  476. package/dist/src/storage/sqlite/session-repository.js.map +1 -1
  477. package/dist/src/storage/sqlite/transcript-repository.d.ts +2 -2
  478. package/dist/src/storage/sqlite/transcript-repository.js +52 -52
  479. package/dist/src/storage/sqlite/transcript-repository.js.map +1 -1
  480. package/dist/src/tui/backends/embedded-backend.d.ts +18 -4
  481. package/dist/src/tui/backends/embedded-backend.js +100 -1
  482. package/dist/src/tui/backends/embedded-backend.js.map +1 -1
  483. package/dist/src/tui/backends/gateway-sse-backend.d.ts +5 -1
  484. package/dist/src/tui/backends/gateway-sse-backend.js +45 -2
  485. package/dist/src/tui/backends/gateway-sse-backend.js.map +1 -1
  486. package/dist/src/tui/clipboard-image.js +3 -3
  487. package/dist/src/tui/components/chat-log.d.ts +2 -0
  488. package/dist/src/tui/components/chat-log.js +19 -0
  489. package/dist/src/tui/components/chat-log.js.map +1 -1
  490. package/dist/src/tui/extension-host/autocomplete.d.ts +3 -2
  491. package/dist/src/tui/extension-host/autocomplete.js +29 -12
  492. package/dist/src/tui/extension-host/autocomplete.js.map +1 -1
  493. package/dist/src/tui/extension-host/load-extensions.js +1 -1
  494. package/dist/src/tui/extension-host/runtime.d.ts +12 -0
  495. package/dist/src/tui/extension-host/runtime.js +6 -4
  496. package/dist/src/tui/extension-host/runtime.js.map +1 -1
  497. package/dist/src/tui/theme-manager.js +1 -1
  498. package/dist/src/tui/tui-backend.d.ts +23 -0
  499. package/dist/src/tui/tui-command-formatters.js +4 -4
  500. package/dist/src/tui/tui-commands.d.ts +16 -3
  501. package/dist/src/tui/tui-commands.js +134 -27
  502. package/dist/src/tui/tui-commands.js.map +1 -1
  503. package/dist/src/tui/tui-file-autocomplete.d.ts +5 -0
  504. package/dist/src/tui/tui-file-autocomplete.js +26 -0
  505. package/dist/src/tui/tui-file-autocomplete.js.map +1 -0
  506. package/dist/src/tui/tui-keybindings-file.js +1 -1
  507. package/dist/src/tui/tui-picker-overlay.js +1 -1
  508. package/dist/src/tui/tui-scoped-models.js +2 -2
  509. package/dist/src/tui/tui-settings.js +1 -1
  510. package/dist/src/tui/tui-startup-resources.js +1 -1
  511. package/dist/src/tui/tui-startup-text.js +1 -1
  512. package/dist/src/tui/tui-startup-text.js.map +1 -1
  513. package/dist/src/tui/tui.js +106 -17
  514. package/dist/src/tui/tui.js.map +1 -1
  515. package/dist/src/tunnel/frpc-binary.js +4 -4
  516. package/dist/src/tunnel/frpc-config.js +1 -1
  517. package/dist/src/tunnel/frpc-extract.js +1 -1
  518. package/dist/src/tunnel/tunnel-state.js +1 -1
  519. package/dist/src/utils/logger/audit.js +1 -1
  520. package/dist/src/utils/logger/context.d.ts +2 -2
  521. package/dist/src/utils/logger/context.js +2 -1
  522. package/dist/src/utils/logger/context.js.map +1 -1
  523. package/dist/src/utils/logger/log-store.js +2 -1
  524. package/dist/src/utils/logger/log-store.js.map +1 -1
  525. package/dist/src/utils/logger/pino-record.js +3 -0
  526. package/dist/src/utils/logger/pino-record.js.map +1 -1
  527. package/dist/src/utils/logger/rotation.js +1 -1
  528. package/dist/src/utils/logger/streams.js +1 -1
  529. package/dist/src/utils/logger/types.d.ts +5 -0
  530. package/dist/src/utils/logger/types.js.map +1 -1
  531. package/dist/src/voice/tts/audio.js +1 -1
  532. package/dist/src/voice/tts/providers/edge-speech.js +2 -2
  533. package/dist/src/workflows/draft/workflow-draft-service.js +1 -1
  534. package/dist/src/workflows/service/workflow-run-service.js +1 -1
  535. package/dist/src/workflows/service/workflow-session-bridge.js +13 -1
  536. package/dist/src/workflows/service/workflow-session-bridge.js.map +1 -1
  537. package/dist/src/workflows/store/event-store.js +1 -1
  538. package/dist/src/workflows/store/run-store.js +1 -1
  539. package/package.json +1 -1
  540. package/dist/gateway/static/root/assets/agent-browser-settings-page-rGbKc2Hh.js +0 -6
  541. package/dist/gateway/static/root/assets/agent-defaults-tabbed-page-CtwVbjOA.js +0 -1
  542. package/dist/gateway/static/root/assets/agents-CCBmGcwc.js +0 -71
  543. package/dist/gateway/static/root/assets/apps-page-xwCsJS15.js +0 -1
  544. package/dist/gateway/static/root/assets/channels-settings-C044DcYk.js +0 -1
  545. package/dist/gateway/static/root/assets/connectors-settings-8VEWUOTj.js +0 -2
  546. package/dist/gateway/static/root/assets/cron-page-DqmNGNOy.js +0 -3
  547. package/dist/gateway/static/root/assets/goal-detail-page-bv0VRDaf.js +0 -1
  548. package/dist/gateway/static/root/assets/goals-page-1Ywnt4Cb.js +0 -2
  549. package/dist/gateway/static/root/assets/goals-settings-ceEBjnfc.js +0 -1
  550. package/dist/gateway/static/root/assets/index-Cxm6xsps.js +0 -122
  551. package/dist/gateway/static/root/assets/index-b_R4tKqt.css +0 -1
  552. package/dist/gateway/static/root/assets/logs-page-B_wrxhee.js +0 -2
  553. package/dist/gateway/static/root/assets/messages-CkT-lcgP.js +0 -3
  554. package/dist/gateway/static/root/assets/models-hub-panel-D0JDSbNu.js +0 -2
  555. package/dist/gateway/static/root/assets/note-detail-page-DpFV-EO6.js +0 -2
  556. package/dist/gateway/static/root/assets/notes-page-CdkjTch8.js +0 -1
  557. package/dist/gateway/static/root/assets/remote-access-hub-DSYVAi96.js +0 -1
  558. package/dist/gateway/static/root/assets/sessions-page-CenkcVjF.js +0 -1
  559. package/dist/gateway/static/root/assets/settings-advanced-gate-D9sva86V.js +0 -1
  560. package/dist/gateway/static/root/assets/settings-page-DL35U0x0.js +0 -1
  561. package/dist/gateway/static/root/assets/setup-status-panel-Ctwbp9Er.js +0 -1
  562. package/dist/gateway/static/root/assets/shares-settings-DIM3JNsr.js +0 -1
  563. package/dist/gateway/static/root/assets/skill-reload-api-DAlNaNzL.js +0 -1
  564. package/dist/gateway/static/root/assets/skills-page-CLrHVzAt.js +0 -2
  565. package/dist/gateway/static/root/assets/voice-api-key-field-vYAO71Gn.js +0 -1
  566. package/dist/gateway/static/root/assets/workflow-page.utils-sgHjOXOm.js +0 -1
  567. package/dist/gateway/static/root/assets/workflows-page-DYyOTmFx.js +0 -18
@@ -1 +1 @@
1
- {"version":3,"file":"tui.js","names":["packageJson.version"],"sources":["../../../src/tui/tui.ts"],"sourcesContent":["import {\n Container,\n Loader,\n type LoaderIndicatorOptions,\n ProcessTerminal,\n setKeybindings,\n TUI,\n type Component,\n type EditorComponent,\n type OverlayHandle,\n type OverlayOptions,\n} from '@earendil-works/pi-tui';\nimport type { AgentMessage } from '@earendil-works/pi-agent-core';\nimport { Buffer } from 'node:buffer';\nimport { randomUUID } from 'node:crypto';\nimport { mkdirSync, mkdtempSync, readFileSync, unlinkSync, writeFileSync } from 'node:fs';\nimport { tmpdir } from 'node:os';\nimport { dirname, isAbsolute, join, resolve } from 'node:path';\nimport { spawnSync } from 'node:child_process';\n\nimport type {\n ReasoningLevel,\n ThinkLevel,\n VerboseLevel,\n} from '../agent/transcript/thinking-types.js';\nimport { resolveEffectiveAgentProfileForSession } from '../config/agent-profile.js';\nimport { loadConfig } from '../config/index.js';\nimport { resolveStateDir, resolveXopcDatabasePath } from '../config/paths.js';\nimport {\n MAX_CHAT_ATTACHMENTS,\n MAX_WEBCHAT_ATTACHMENT_FILE_BYTES,\n} from '../gateway/chat-limits.js';\nimport { resolveTuiSessionKey, resolveTuiStartupSessionKey } from '../routing/resolve-tui-session-key.js';\nimport { parseAgentSessionKey } from '../routing/agent-session-key.js';\nimport type {\n TuiBackend,\n TuiCompactionResult,\n TuiEvent,\n TuiExportFormat,\n TuiInboundAttachment,\n TuiModelChoice,\n TuiShareRequest,\n TuiStartupResources,\n} from './tui-backend.js';\nimport { EmbeddedBackend } from './backends/embedded-backend.js';\nimport { GatewaySseBackend } from './backends/gateway-sse-backend.js';\nimport {\n clearSeenStreamEvents,\n clearSeenStreamEventsForRun,\n DEFAULT_STREAMING_WATCHDOG_MS,\n dispatchAgentEvent,\n} from './tui-agent-events.js';\nimport { ChatLog } from './components/chat-log.js';\nimport { CustomEditor } from './components/custom-editor.js';\nimport { TuiBottomBar } from './components/tui-bottom-bar.js';\nimport { TuiHeader } from './components/tui-header.js';\nimport {\n createTuiCommandHandler,\n getSlashCommands,\n} from './tui-commands.js';\nimport {\n formatTuiCompactionResult,\n formatTuiShareResult,\n type TuiExportRequest,\n type TuiImportRequest,\n} from './tui-command-formatters.js';\nimport { createLocalShellRunner } from './tui-local-shell.js';\nimport { drainFollowUpQueue, restoreQueuedMessages } from './tui-follow-up-queue.js';\nimport {\n createBackspaceDeduper,\n drainAndStopTuiSafely,\n resolveCtrlCAction,\n} from './tui-lifecycle.js';\nimport {\n openAgentPickerOverlay,\n openProjectTrustOverlay,\n openScopedModelsOverlay,\n openSessionPickerOverlay,\n openSessionTreeOverlay,\n openSettingsOverlay,\n openTranscriptTreeOverlay,\n openThinkingSelectorOverlay,\n openUserMessageForkOverlay,\n} from './tui-picker-overlay.js';\nimport { openModelPickerOverlay } from './tui-model-picker.js';\nimport { runTuiOAuthLogin } from './tui-oauth-login.js';\nimport {\n createEditorSubmitHandler,\n createSubmitBurstCoalescer,\n shouldEnableWindowsGitBashPasteFallback,\n} from './tui-submit.js';\nimport { installTuiStdioFilter } from './tui-stdio-filter.js';\nimport { withTuiSuspended } from './tui-suspend.js';\nimport { extensionForImageMimeType, readClipboardImage } from './clipboard-image.js';\nimport { copyTextToClipboard } from './clipboard-text.js';\nimport {\n applyThemeById,\n getCustomThemesDir,\n getThemeExports,\n getBashExcludeBorderColor,\n getBashModeBorderColor,\n getThinkingBorderColor,\n initTuiTheme,\n listAvailableThemeIds,\n resolveThemePalette,\n} from './theme-manager.js';\nimport { editorTheme, theme } from './theme.js';\nimport { loadTuiSettings, saveTuiSettings, type TuiSettings } from './tui-settings.js';\nimport { resolveFdPath } from './tui-fd-path.js';\nimport packageJson from '../../package.json' with { type: 'json' };\nimport { createSessionActions } from './tui-session-actions.js';\nimport { createInitialState, type TuiOptions, type TuiResult, type TuiState } from './tui-types.js';\nimport { createXopcTuiKeybindingsManager } from './tui-keybindings-file.js';\nimport { formatKeyIds } from './format-tui-hotkeys.js';\nimport { formatTuiStartupText } from './tui-startup-text.js';\nimport {\n filterModelsForCycle,\n loadScopedModelRefs,\n saveScopedModelRefs,\n} from './tui-scoped-models.js';\nimport {\n formatBusyResponseHint,\n formatSteerUnavailableHint,\n formatSuspendUnsupportedHint,\n} from './tui-runtime-hints.js';\nimport { loadExtensionsForTuiLocalMode } from './extension-host/load-extensions.js';\nimport { createTuiExtensionRuntime } from './extension-host/runtime.js';\nimport { TuiSessionSnapshot } from './tui-session-snapshot.js';\nimport {\n extensionCustomMessageContentToText,\n extensionCustomMessageToTurnText,\n extensionUserMessageContentToText,\n} from './tui-extension-user-message.js';\nimport type { ExtensionRegistryImpl } from '../extensions/loader.js';\nimport type {\n ExtensionCustomMessage,\n ExtensionSendMessageOptions,\n ExtensionSendUserMessageOptions,\n ExtensionUserMessageContent,\n} from '../extensions/types/core.js';\nimport type {\n TuiEditorFactory,\n TuiForkOptions,\n TuiModelRegistryModel,\n TuiNavigateTreeOptions,\n TuiNewSessionOptions,\n TuiReasoningLevel,\n TuiReplacedSessionContext,\n TuiReplacementResult,\n TuiSwitchSessionOptions,\n TuiThinkingLevel,\n TuiVerboseLevel,\n} from '../extensions/types/tui.js';\nimport { getAllModels, getAllProviders, getApiKey, isProviderConfiguredSync } from '../providers/index.js';\nimport {\n hasTrustRequiringProjectResources,\n ProjectTrustStore,\n} from '../project-trust/trust-store.js';\nimport { transcriptTreeEntryIdToRowNumber } from './tui-transcript-tree.js';\nimport {\n isActiveRunStreamStale,\n markActiveRunStalled,\n markRunSending,\n markRunRecovering,\n markRunRecoveryComplete,\n} from './tui-run-state.js';\n\nexport type { TuiOptions, TuiResult };\n\nexport {\n createBackspaceDeduper,\n drainAndStopTuiSafely,\n type DrainableTui,\n isIgnorableTuiStopError,\n resolveCtrlCAction,\n stopTuiSafely,\n} from './tui-lifecycle.js';\n\nexport { withTuiSuspended } from './tui-suspend.js';\n\nconst THINK_LEVEL_CYCLE: ThinkLevel[] = [\n 'off',\n 'minimal',\n 'low',\n 'medium',\n 'high',\n 'xhigh',\n 'adaptive',\n];\n\nfunction nextThinkLevel(current: string | undefined): ThinkLevel {\n const c = (current ?? 'medium').toLowerCase();\n const idx = THINK_LEVEL_CYCLE.indexOf(c as ThinkLevel);\n const mediumIdx = THINK_LEVEL_CYCLE.indexOf('medium');\n const base = idx >= 0 ? idx : mediumIdx >= 0 ? mediumIdx : 0;\n return THINK_LEVEL_CYCLE[(base + 1) % THINK_LEVEL_CYCLE.length]!;\n}\n\nconst DOUBLE_ESCAPE_WINDOW_MS = 500;\n\nfunction escapeHtml(text: string): string {\n return text\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;');\n}\n\nfunction exportExtension(format: TuiExportFormat): string {\n if (format === 'json') return 'json';\n if (format === 'markdown') return 'md';\n return 'html';\n}\n\nfunction wrapMarkdownExportAsHtml(markdown: string): string {\n return [\n '<!doctype html>',\n '<html>',\n '<head>',\n '<meta charset=\"utf-8\">',\n '<title>xopc session export</title>',\n '<style>body{font:14px/1.5 system-ui,sans-serif;margin:32px;max-width:960px}pre{white-space:pre-wrap}</style>',\n '</head>',\n '<body>',\n '<pre>',\n escapeHtml(markdown),\n '</pre>',\n '</body>',\n '</html>',\n '',\n ].join('\\n');\n}\n\nfunction defaultExportPath(sessionKey: string, format: TuiExportFormat): string {\n const safeKey = sessionKey.replace(/[^a-z0-9_.-]+/gi, '_').replace(/^_+|_+$/g, '') || 'session';\n const stamp = new Date().toISOString().replace(/[:.]/g, '-');\n return resolve(process.cwd(), `xopc-session-${safeKey}-${stamp}.${exportExtension(format)}`);\n}\n\nfunction userDisplayContentForAttachments(\n text: string,\n attachments: readonly TuiInboundAttachment[] | undefined,\n): string | unknown[] {\n if (!attachments?.length) return text;\n const blocks: unknown[] = [];\n if (text.trim()) {\n blocks.push({ type: 'text', text });\n }\n for (const att of attachments) {\n if (att.mimeType?.startsWith('image/') || att.type === 'image' || att.type === 'photo') {\n blocks.push({ type: 'image', name: att.name });\n continue;\n }\n blocks.push({ type: 'file', name: att.name });\n }\n return blocks;\n}\n\nfunction shellQuote(value: string): string {\n if (/^[A-Za-z0-9_/:@%+=,.-]+$/.test(value)) {\n return value;\n }\n return `'${value.replace(/'/g, `'\\\\''`)}'`;\n}\n\nfunction formatTuiResumeCommand(opts: TuiOptions, sessionKey: string): string {\n const parts = ['xopc', 'tui'];\n if (opts.local === true) {\n parts.push('--local');\n }\n if (opts.url) {\n parts.push('--url', shellQuote(opts.url));\n }\n parts.push('--session', shellQuote(sessionKey));\n return parts.join(' ');\n}\n\nfunction isLoopbackGatewayUrl(rawUrl: string): boolean {\n try {\n const hostname = new URL(rawUrl).hostname.toLowerCase();\n return hostname === 'localhost' || hostname === '127.0.0.1' || hostname === '::1' || hostname === '[::1]';\n } catch {\n return false;\n }\n}\n\nfunction resolveStartupWorkingDirectory(opts: TuiOptions, isLocalMode: boolean): string | undefined {\n const explicit = opts.workdir?.trim();\n if (explicit) {\n return resolve(explicit);\n }\n if (opts.useStartupCwd === false || opts.session?.trim()) {\n return undefined;\n }\n const gatewayUrl = opts.url ?? 'http://localhost:3120';\n if (isLocalMode || isLoopbackGatewayUrl(gatewayUrl)) {\n return process.cwd();\n }\n return undefined;\n}\n\nfunction assistantMessagePlainText(message: AgentMessage): string {\n const content = (message as { content?: unknown }).content;\n if (typeof content === 'string') return content;\n if (!Array.isArray(content)) return '';\n return content\n .map((block) => {\n if (!block || typeof block !== 'object') return '';\n const rec = block as { type?: unknown; text?: unknown };\n return rec.type === 'text' && typeof rec.text === 'string' ? rec.text : '';\n })\n .join('');\n}\n\nexport async function runTui(opts: TuiOptions): Promise<TuiResult> {\n const stdioFilter = installTuiStdioFilter();\n const restoreStdio = () => stdioFilter.restore();\n\n const isLocalMode = opts.local === true;\n const config = loadConfig();\n const startup = resolveTuiStartupSessionKey({\n cfg: config,\n sessionOption: opts.session,\n cwd: process.cwd(),\n });\n let currentAgentId = startup.agentId;\n const sessionScope = startup.sessionScope;\n const sessionMainKey = startup.sessionMainKey;\n const resolveSessionKey = (raw?: string) =>\n resolveTuiSessionKey({\n raw,\n sessionScope,\n currentAgentId,\n sessionMainKey,\n });\n let tuiSettings = loadTuiSettings();\n initTuiTheme({ themeId: opts.theme ?? tuiSettings.theme });\n const state = createInitialState(startup.sessionKey);\n const projectTrustStore = new ProjectTrustStore();\n let projectTrustSessionDecision: boolean | null = null;\n const isCurrentProjectTrusted = () => {\n if (projectTrustSessionDecision !== null) return projectTrustSessionDecision;\n if (!hasTrustRequiringProjectResources(process.cwd())) return true;\n return projectTrustStore.get(process.cwd()) === true;\n };\n let projectTrustPromptShown = false;\n const sessionStateDir = resolveStateDir();\n const sessionDatabasePath = resolveXopcDatabasePath();\n const sessionSnapshot = new TuiSessionSnapshot(\n () => state.currentSessionKey,\n () => process.cwd(),\n () => state.sessionInfo.displayName,\n () => `${sessionDatabasePath}#session=${encodeURIComponent(state.currentSessionKey)}`,\n () => sessionStateDir,\n );\n state.scopedModelRefs = loadScopedModelRefs();\n state.showThinking = tuiSettings.showThinking;\n state.toolsExpanded = tuiSettings.toolsExpanded;\n let pendingImageAttachments: TuiInboundAttachment[] = [];\n const pendingNextTurnCustomMessages: string[] = [];\n let lastRetryMessageText: string | null = null;\n let setExtensionLabel = (_entryId: string, _label: string | undefined): void => {};\n let sendExtensionUserMessage = (\n _content: ExtensionUserMessageContent,\n _options?: ExtensionSendUserMessageOptions,\n ): void => {};\n let appendExtensionEntry = <T = unknown>(_customType: string, _data?: T): void => {};\n let sendExtensionMessage = <T = unknown>(\n _message: ExtensionCustomMessage<T>,\n _options?: ExtensionSendMessageOptions,\n ): void => {};\n\n let extensionRegistry: ExtensionRegistryImpl | undefined;\n if (isLocalMode) {\n extensionRegistry = await loadExtensionsForTuiLocalMode({\n setLabel: (entryId, label) => setExtensionLabel(entryId, label),\n sendUserMessage: (content, options) => sendExtensionUserMessage(content, options),\n appendEntry: (customType, data) => appendExtensionEntry(customType, data),\n sendMessage: (message, options) => sendExtensionMessage(message, options),\n });\n }\n\n const client: TuiBackend = isLocalMode\n ? new EmbeddedBackend({ extensionRegistry })\n : new GatewaySseBackend({ url: opts.url ?? 'http://localhost:3120', token: opts.token });\n const startupWorkingDirectory = resolveStartupWorkingDirectory(opts, isLocalMode);\n if (startupWorkingDirectory) {\n state.sessionInfo.effectiveWorkspacePath = startupWorkingDirectory;\n }\n let startupWorkingDirectoryApplied = false;\n\n const keybindings = createXopcTuiKeybindingsManager();\n setKeybindings(keybindings);\n\n let modelChoices: TuiModelChoice[] = [];\n const cycleModelChoices = (): TuiModelChoice[] =>\n filterModelsForCycle(modelChoices, state.scopedModelRefs);\n\n const refreshCycleModels = () => {\n bottomBar.invalidate();\n tui.requestRender();\n };\n\n const tui = new TUI(new ProcessTerminal());\n tui.setShowHardwareCursor(tuiSettings.showHardwareCursor);\n tui.setClearOnShrink(tuiSettings.clearOnShrink);\n const dedupeBackspace = createBackspaceDeduper();\n tui.addInputListener((data) => {\n const next = dedupeBackspace(data);\n if (next.length === 0) {\n return { consume: true };\n }\n return { data: next };\n });\n\n const header = new TuiHeader(() => ({\n version: packageJson.version ?? 'dev',\n connectionLabel: client.connectionLabel,\n sessionKey: state.currentSessionKey,\n showHints: tuiSettings.showStartupHints,\n }), keybindings);\n const statusContainer = new Container();\n const bottomBar = new TuiBottomBar(\n () => state,\n () => opts.thinking,\n () => formatKeyIds(keybindings, 'app.message.dequeue', { capitalize: true }),\n );\n const chatLog = new ChatLog(keybindings);\n let startupResources: TuiStartupResources | undefined;\n let startupCardShown = false;\n chatLog.setShowThinking(state.showThinking);\n chatLog.setToolsExpanded(state.toolsExpanded);\n chatLog.setToolImageOptions({\n showImages: tuiSettings.showImages,\n imageWidthCells: tuiSettings.imageWidthCells,\n cwd: process.cwd(),\n });\n setExtensionLabel = (entryId, label) => {\n sessionSnapshot.setLabel(entryId, label);\n void client\n .setTranscriptLabel(state.currentSessionKey, entryId, label)\n .catch((err: unknown) => {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Label update failed: ${errorMessage}`);\n })\n .finally(() => {\n updateFooter();\n tui.requestRender();\n });\n };\n appendExtensionEntry = (customType, data) => {\n const normalized = customType.trim();\n if (!normalized) {\n throw new Error('appendEntry requires customType.');\n }\n sessionSnapshot.appendCustomEntry(normalized, data);\n void client\n .appendCustomEntry(state.currentSessionKey, normalized, data)\n .catch((err: unknown) => {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Custom entry append failed: ${errorMessage}`);\n })\n .finally(() => {\n updateFooter();\n tui.requestRender();\n });\n };\n sendExtensionMessage = (message, options) => {\n const customType = message.customType.trim();\n if (!customType) {\n throw new Error('sendMessage requires customType.');\n }\n const display = message.display ?? true;\n const nextMessage = {\n customType,\n content: message.content,\n display,\n details: message.details,\n };\n sessionSnapshot.appendCustomMessage(nextMessage);\n if (display) {\n chatLog.addCustomMessage({\n customType,\n content: extensionCustomMessageContentToText(message.content),\n rawContent: message.content,\n details: message.details,\n display,\n });\n tui.requestRender();\n }\n const persist = client\n .appendCustomMessage(state.currentSessionKey, nextMessage)\n .catch((err: unknown) => {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Custom message append failed: ${errorMessage}`);\n throw err;\n })\n .finally(() => {\n updateFooter();\n tui.requestRender();\n });\n\n const turnText = extensionCustomMessageToTurnText(nextMessage).trim();\n if (!turnText) {\n return;\n }\n void persist.then(() => {\n const controlText = `Continue with the extension message \"${customType}\" above.`;\n if (options?.deliverAs === 'nextTurn') {\n pendingNextTurnCustomMessages.push(controlText);\n chatLog.addSystem(\n theme.dim(`Queued extension message for next turn (${pendingNextTurnCustomMessages.length}).`),\n );\n bottomBar.invalidate();\n tui.requestRender();\n return;\n }\n if (state.activeRunId) {\n if (options?.deliverAs === 'followUp') {\n state.messageFollowUpQueue.push(controlText);\n chatLog.addSystem(\n theme.dim(\n `Queued extension follow-up (${state.messageFollowUpQueue.length} in queue). ${tuiSettings.followUpMode === 'all' ? 'All queued messages send together when this reply finishes.' : 'Next sends when this reply finishes.'}`,\n ),\n );\n bottomBar.invalidate();\n tui.requestRender();\n return;\n }\n steerMessage(turnText);\n return;\n }\n if (options?.triggerTurn) {\n sendMessage(controlText);\n }\n }).catch(() => {});\n };\n const defaultEditor = new CustomEditor(tui, editorTheme, keybindings, {\n paddingX: tuiSettings.editorPaddingX,\n autocompleteMaxVisible: tuiSettings.autocompleteMaxVisible,\n });\n let editor: EditorComponent = defaultEditor;\n let editorComponentFactory: TuiEditorFactory | undefined;\n const editorContainer = new Container();\n editorContainer.addChild(editor as Component);\n const root = new Container();\n root.addChild(header);\n root.addChild(chatLog);\n root.addChild(statusContainer);\n root.addChild(editorContainer);\n root.addChild(bottomBar);\n tui.addChild(root);\n tui.setFocus(editor as Component);\n\n let isBashMode = false;\n let isBashExcludeContext = false;\n\n const updateEditorBorderColor = () => {\n if (isBashMode) {\n editor.borderColor = isBashExcludeContext\n ? getBashExcludeBorderColor()\n : getBashModeBorderColor();\n } else {\n const level = state.sessionInfo.thinkingLevel ?? opts.thinking ?? 'off';\n editor.borderColor = getThinkingBorderColor(level);\n }\n tui.requestRender();\n };\n\n editor.onChange = (text: string) => {\n const trimmed = text.trimStart();\n const nextExclude = trimmed.startsWith('!!');\n const nextBash = trimmed.startsWith('!');\n if (nextBash !== isBashMode || nextExclude !== isBashExcludeContext) {\n isBashMode = nextBash;\n isBashExcludeContext = nextExclude;\n updateEditorBorderColor();\n }\n };\n\n const copyDefaultEditorAppHandlers = (target: EditorComponent) => {\n const customEditor = target as unknown as {\n actionHandlers?: unknown;\n onEscape?: () => void;\n onCtrlD?: () => void;\n onPasteImage?: () => void;\n onExtensionShortcut?: (data: string) => boolean;\n };\n if (!(customEditor.actionHandlers instanceof Map)) return;\n customEditor.onEscape ??= () => defaultEditor.onEscape?.();\n customEditor.onCtrlD ??= () => defaultEditor.onCtrlD?.();\n customEditor.onPasteImage ??= () => defaultEditor.onPasteImage?.();\n customEditor.onExtensionShortcut ??= (data: string) =>\n defaultEditor.onExtensionShortcut?.(data) ?? false;\n for (const [action, handler] of defaultEditor.actionHandlers) {\n customEditor.actionHandlers.set(action, handler);\n }\n };\n\n const setEditorExtensionShortcut = () => {\n const customEditor = editor as unknown as {\n onExtensionShortcut?: (data: string) => boolean;\n };\n customEditor.onExtensionShortcut = (data: string) => extensionRuntime.handleShortcut(data);\n };\n\n const setEditorComponent = (factory: TuiEditorFactory | undefined) => {\n editorComponentFactory = factory;\n const currentText = editor.getText();\n editorContainer.clear();\n if (factory) {\n const nextEditor = factory(tui, editorTheme, keybindings) as EditorComponent;\n nextEditor.onSubmit = defaultEditor.onSubmit;\n nextEditor.onChange = defaultEditor.onChange;\n nextEditor.setText(currentText);\n if (nextEditor.borderColor !== undefined) {\n nextEditor.borderColor = defaultEditor.borderColor;\n }\n nextEditor.setPaddingX?.(tuiSettings.editorPaddingX);\n nextEditor.setAutocompleteMaxVisible?.(tuiSettings.autocompleteMaxVisible);\n nextEditor.setAutocompleteProvider?.(extensionRuntime.autocompleteProvider);\n copyDefaultEditorAppHandlers(nextEditor);\n editor = nextEditor;\n } else {\n defaultEditor.setText(currentText);\n editor = defaultEditor;\n }\n editorContainer.addChild(editor as Component);\n setEditorExtensionShortcut();\n tui.setFocus(editor as Component);\n updateEditorBorderColor();\n tui.requestRender();\n };\n\n let activeEditorSelectorClose: (() => void) | null = null;\n\n const closeEditorSelector = () => {\n const close = activeEditorSelectorClose;\n close?.();\n };\n\n const openEditorSelector = (component: Component, focus: Component = component) => {\n closeEditorSelector();\n editorContainer.clear();\n editorContainer.addChild(component);\n tui.setFocus(focus);\n tui.requestRender();\n const close = () => {\n if (activeEditorSelectorClose !== close) return;\n activeEditorSelectorClose = null;\n editorContainer.clear();\n editorContainer.addChild(editor as Component);\n tui.setFocus(editor as Component);\n tui.requestRender();\n };\n activeEditorSelectorClose = close;\n return close;\n };\n\n const openCommandOverlay = (\n component: Component,\n _options?: OverlayOptions,\n ): OverlayHandle => {\n let hidden = false;\n let closeCurrent = openEditorSelector(component, component);\n return {\n hide: () => closeCurrent(),\n setHidden: (nextHidden: boolean) => {\n hidden = nextHidden;\n if (nextHidden) {\n closeCurrent();\n } else {\n closeCurrent = openEditorSelector(component, component);\n }\n },\n isHidden: () => hidden,\n focus: () => tui.setFocus(component),\n unfocus: () => tui.setFocus(editor as Component),\n isFocused: () => false,\n };\n };\n\n const closeCommandOverlay = () => {\n closeEditorSelector();\n };\n\n const slashCommands = getSlashCommands(isLocalMode, keybindings);\n let extensionWorkingMessage: string | undefined;\n let extensionWorkingVisible = true;\n let extensionWorkingIndicator: LoaderIndicatorOptions | undefined;\n\n const getAllExtensionThemes = () => {\n const customDir = getCustomThemesDir();\n return listAvailableThemeIds().map((name) => ({\n name,\n path: name === 'auto' || name === 'dark' || name === 'light'\n ? undefined\n : join(customDir, `${name}.json`),\n }));\n };\n\n const getExtensionTheme = (name: string) => {\n const normalized = name.trim().toLowerCase() || 'auto';\n if (!listAvailableThemeIds().includes(normalized)) return undefined;\n const currentTheme = tuiSettings.theme;\n applyThemeById(normalized);\n const resolved = getThemeExports().theme;\n applyThemeById(currentTheme);\n return resolved;\n };\n\n const setExtensionTheme = (nextTheme: string) => {\n const normalized = nextTheme.trim().toLowerCase() || 'auto';\n if (!listAvailableThemeIds().includes(normalized)) {\n return { success: false, error: `Unknown theme: ${nextTheme}` };\n }\n try {\n resolveThemePalette(normalized);\n tuiSettings = { ...tuiSettings, theme: normalized };\n saveTuiSettings(tuiSettings);\n applyThemeById(normalized);\n updateEditorBorderColor();\n chatLog.invalidate();\n header.invalidate();\n bottomBar.invalidate();\n tui.requestRender();\n return { success: true };\n } catch (err) {\n return {\n success: false,\n error: err instanceof Error ? err.message : String(err),\n };\n }\n };\n\n const getAvailableProviderCount = () =>\n getAllProviders().filter((provider) => isProviderConfiguredSync(provider)).length;\n\n const getExtensionSystemPrompt = () =>\n resolveEffectiveAgentProfileForSession(config, state.currentSessionKey).systemPromptOverride ?? '';\n\n const waitForTuiIdle = async () => {\n while (\n state.activeRunId != null ||\n state.isCompacting ||\n state.activityStatus === 'sending' ||\n state.activityStatus === 'waiting' ||\n state.activityStatus === 'streaming' ||\n state.activityStatus === 'running' ||\n state.activityStatus === 'compacting'\n ) {\n await new Promise((resolveDelay) => setTimeout(resolveDelay, 50));\n }\n };\n\n const createReplacementContext = (): TuiReplacedSessionContext => {\n const model = state.sessionInfo.model\n ? {\n ...(state.sessionInfo.modelProvider ? { provider: state.sessionInfo.modelProvider } : {}),\n id: state.sessionInfo.model,\n ref: state.sessionInfo.modelProvider\n ? `${state.sessionInfo.modelProvider}/${state.sessionInfo.model}`\n : state.sessionInfo.model,\n contextWindow: state.sessionInfo.contextWindow ?? null,\n }\n : undefined;\n return {\n mode: 'tui',\n hasUI: true,\n signal: client.getActiveSignal?.(),\n ui: {\n select: async () => undefined,\n confirm: async () => false,\n input: async () => undefined,\n notify: (message, level) => {\n const prefix = level === 'error' ? 'Error: ' : level === 'warn' || level === 'warning' ? 'Warning: ' : '';\n chatLog.addSystem(`${prefix}${message}`);\n tui.requestRender();\n },\n onTerminalInput: (handler) => tui.addInputListener(handler),\n setStatus: () => {},\n setWorkingMessage: (message) => {\n extensionWorkingMessage = message?.trim() || undefined;\n renderStatus();\n },\n setWorkingVisible: (visible) => {\n extensionWorkingVisible = visible;\n renderStatus();\n },\n setWorkingIndicator: (indicator) => {\n extensionWorkingIndicator = indicator ?? undefined;\n statusLoader?.setIndicator(indicator ?? undefined);\n renderStatus();\n },\n setHiddenThinkingLabel: (label) => {\n chatLog.setHiddenThinkingLabel(label ?? undefined);\n tui.requestRender();\n },\n setWidget: () => {},\n setFooter: () => {},\n setHeader: () => {},\n custom: async () => undefined as never,\n setTitle: (title) => tui.terminal.setTitle(title),\n pasteToEditor: (text) => editor.handleInput(`\\x1b[200~${text}\\x1b[201~`),\n setEditorText: (text) => editor.setText(text),\n getEditorText: () => editor.getExpandedText?.() ?? editor.getText(),\n editor: async () => undefined,\n addAutocompleteProvider: () => () => {},\n setEditorComponent,\n getEditorComponent: () => editorComponentFactory,\n theme,\n getAllThemes: getAllExtensionThemes,\n getTheme: getExtensionTheme,\n setTheme: setExtensionTheme,\n getToolsExpanded: () => state.toolsExpanded,\n setToolsExpanded: (expanded) => {\n state.toolsExpanded = expanded;\n tuiSettings = { ...tuiSettings, toolsExpanded: expanded };\n saveTuiSettings(tuiSettings);\n chatLog.setToolsExpanded(expanded);\n updateFooter();\n tui.requestRender();\n },\n },\n sessionManager: sessionSnapshot.manager(),\n modelRegistry: {\n find(provider, modelId) {\n return getAllModels().find(\n (candidate) => candidate.provider === provider && candidate.id === modelId,\n ) as unknown as TuiModelRegistryModel | undefined;\n },\n async getApiKeyAndHeaders(nextModel) {\n const provider = typeof nextModel.provider === 'string' ? nextModel.provider : undefined;\n if (!provider) return { ok: false, error: 'Model provider is missing.' };\n try {\n return { ok: true, apiKey: await getApiKey(provider), headers: {} };\n } catch (error) {\n return { ok: false, error: error instanceof Error ? error.message : String(error) };\n }\n },\n },\n model,\n cwd: process.cwd(),\n sessionKey: state.currentSessionKey,\n isProjectTrusted: isCurrentProjectTrusted,\n isIdle: () => !state.activeRunId && !state.isCompacting,\n hasPendingMessages: () =>\n state.messageFollowUpQueue.length > 0 ||\n state.steeringQueue.length > 0 ||\n state.compactionQueue.length > 0,\n abort: () => abortActive(),\n shutdown: () => requestExit(),\n compact: (options) => runCompaction(options?.customInstructions, {\n onComplete: options?.onComplete,\n onError: options?.onError,\n }),\n getSystemPrompt: getExtensionSystemPrompt,\n getSystemPromptOptions: () => ({\n cwd: process.cwd(),\n sessionKey: state.currentSessionKey,\n ...(model ? { model } : {}),\n }),\n waitForIdle: waitForTuiIdle,\n newSession: (options) => runExtensionNewSession(options),\n fork: (entryId, options) => runExtensionFork(entryId, options),\n navigateTree: (targetId, options) => runExtensionNavigateTree(targetId, options),\n switchSession: (sessionPath, options) => runExtensionSwitchSession(sessionPath, options),\n reload: async () => {\n await loadSessionHistory({ merge: true });\n await refreshSessionInfoWithBorder();\n },\n getModel: () => model,\n setModel: (modelRef) => switchCurrentModel(modelRef),\n getThinkingLevel: () => state.sessionInfo.thinkingLevel as TuiThinkingLevel | undefined,\n setThinkingLevel,\n getReasoningLevel: () => state.sessionInfo.reasoningLevel as TuiReasoningLevel | undefined,\n setReasoningLevel,\n getVerboseLevel: () => state.sessionInfo.verboseLevel as TuiVerboseLevel | undefined,\n setVerboseLevel,\n getCommands: () => slashCommands.map((command) => ({\n name: command.name,\n description: command.description,\n source: 'builtin' as const,\n })),\n getContextUsage: () => {\n const tokens = state.sessionInfo.totalTokens ?? state.sessionInfo.contextTokens ?? null;\n const contextWindow = state.sessionInfo.contextWindow ?? null;\n const percent = state.sessionInfo.contextUsagePercent ?? null;\n if (tokens == null && contextWindow == null) return undefined;\n return {\n estimatedTokens: tokens,\n tokens,\n contextWindow,\n usagePercent: percent,\n percent,\n };\n },\n notify: (message, level) => {\n const prefix = level === 'error' ? 'Error: ' : level === 'warn' || level === 'warning' ? 'Warning: ' : '';\n chatLog.addSystem(`${prefix}${message}`);\n tui.requestRender();\n },\n sendMessage: async (message, options) => sendExtensionMessage(message, options),\n sendUserMessage: async (content, options) =>\n sendExtensionUserMessage(content as ExtensionUserMessageContent, options),\n };\n };\n\n const runWithReplacementContext = async (\n callback: ((ctx: TuiReplacedSessionContext) => Promise<void>) | undefined,\n ) => {\n if (callback) {\n await callback(createReplacementContext());\n }\n };\n\n const runExtensionNewSession = async (\n options?: TuiNewSessionOptions,\n ): Promise<TuiReplacementResult> => {\n await abortActive({ clearUi: false });\n const targetKey = resolveSessionKey(`session-${randomUUID()}`);\n await setSession(targetKey);\n await options?.setup?.(sessionSnapshot.manager());\n await runWithReplacementContext(options?.withSession);\n return { cancelled: false };\n };\n\n const runExtensionFork = async (\n entryId: string,\n options?: TuiForkOptions,\n ): Promise<TuiReplacementResult> => {\n const rowNumber = transcriptTreeEntryIdToRowNumber(entryId);\n if (rowNumber == null) {\n throw new Error(`Invalid entry ID for forking: ${entryId}`);\n }\n const throughRow = options?.position === 'before' ? rowNumber - 1 : rowNumber;\n if (throughRow <= 0) {\n throw new Error(`Invalid entry ID for forking: ${entryId}`);\n }\n const sourceSessionKey = state.currentSessionKey;\n const targetKey = resolveSessionKey(`fork-${randomUUID()}`);\n await abortActive({ clearUi: false });\n const result = await client.forkSessionAt(sourceSessionKey, targetKey, `row-${throughRow}`);\n await setSession(result.sessionKey);\n chatLog.addBranchSummary({\n sourceSessionKey,\n targetSessionKey: result.sessionKey,\n rowCount: result.rowCount,\n entryId,\n });\n await runWithReplacementContext(options?.withSession);\n return { cancelled: false };\n };\n\n const runExtensionNavigateTree = async (\n targetId: string,\n options?: TuiNavigateTreeOptions,\n ): Promise<TuiReplacementResult> => {\n if (options?.label) {\n setExtensionLabel(targetId, options.label);\n }\n return runExtensionFork(targetId, { position: 'at' });\n };\n\n const runExtensionSwitchSession = async (\n sessionPath: string,\n options?: TuiSwitchSessionOptions,\n ): Promise<TuiReplacementResult> => {\n await abortActive({ clearUi: false });\n await setSession(sessionPath);\n await runWithReplacementContext(options?.withSession);\n return { cancelled: false };\n };\n\n const extensionRuntime = createTuiExtensionRuntime({\n registry: extensionRegistry,\n tui,\n chatLog,\n header,\n bottomBar,\n getState: () => state,\n baseSlashCommands: slashCommands,\n keybindings,\n addInputListener: (handler) => tui.addInputListener(handler),\n setTitle: (title) => tui.terminal.setTitle(title),\n pasteToEditor: (text) => editor.handleInput(`\\x1b[200~${text}\\x1b[201~`),\n setEditorText: (text) => editor.setText(text),\n getEditorText: () => editor.getExpandedText?.() ?? editor.getText(),\n setEditorComponent,\n getEditorComponent: () => editorComponentFactory,\n getThemeObject: () => theme,\n getAllThemes: getAllExtensionThemes,\n getTheme: getExtensionTheme,\n setTheme: setExtensionTheme,\n getToolsExpanded: () => state.toolsExpanded,\n setToolsExpanded: (expanded) => {\n state.toolsExpanded = expanded;\n tuiSettings = { ...tuiSettings, toolsExpanded: expanded };\n saveTuiSettings(tuiSettings);\n chatLog.setToolsExpanded(expanded);\n updateFooter();\n tui.requestRender();\n },\n getAvailableProviderCount,\n getActiveSignal: () => client.getActiveSignal?.(),\n isProjectTrusted: isCurrentProjectTrusted,\n getSessionManager: () => sessionSnapshot.manager(),\n getSystemPrompt: getExtensionSystemPrompt,\n getSystemPromptOptions: () => ({\n cwd: process.cwd(),\n sessionKey: state.currentSessionKey,\n ...(state.sessionInfo.model\n ? {\n model: {\n ...(state.sessionInfo.modelProvider ? { provider: state.sessionInfo.modelProvider } : {}),\n id: state.sessionInfo.model,\n ref: state.sessionInfo.modelProvider\n ? `${state.sessionInfo.modelProvider}/${state.sessionInfo.model}`\n : state.sessionInfo.model,\n contextWindow: state.sessionInfo.contextWindow ?? null,\n },\n }\n : {}),\n }),\n waitForIdle: waitForTuiIdle,\n newSession: runExtensionNewSession,\n forkSession: runExtensionFork,\n navigateTree: runExtensionNavigateTree,\n switchSession: runExtensionSwitchSession,\n reload: async () => {\n await loadSessionHistory();\n await refreshSessionInfoWithBorder();\n },\n sendUserMessage: async (content, options) =>\n sendExtensionUserMessage(content as ExtensionUserMessageContent, options),\n sendMessage: async (message, options) => sendExtensionMessage(message, options),\n cwd: process.cwd(),\n fdPath: resolveFdPath(),\n openOverlay: openCommandOverlay,\n closeOverlay: closeCommandOverlay,\n onInvalidate: () => {\n updateHeader();\n updateFooter();\n tui.requestRender();\n },\n abortActive: () => abortActive(),\n requestExit: () => requestExit(),\n compactSession: (options) => runCompaction(options?.customInstructions, {\n onComplete: options?.onComplete,\n onError: options?.onError,\n }),\n setModel: (modelRef) => switchCurrentModel(modelRef),\n setThinkingLevel: (level) => setThinkingLevel(level),\n setReasoningLevel: (level) => setReasoningLevel(level),\n setVerboseLevel: (level) => setVerboseLevel(level),\n setWorkingMessage: (message?: string) => {\n extensionWorkingMessage = message?.trim() || undefined;\n renderStatus();\n },\n setWorkingVisible: (visible: boolean) => {\n extensionWorkingVisible = visible;\n renderStatus();\n },\n setWorkingIndicator: (indicator?: LoaderIndicatorOptions) => {\n extensionWorkingIndicator = indicator;\n statusLoader?.setIndicator(indicator);\n renderStatus();\n },\n });\n\n editor.setAutocompleteProvider?.(extensionRuntime.autocompleteProvider);\n setEditorExtensionShortcut();\n\n let statusLoader: Loader | null = null;\n let statusStartedAt: number | null = null;\n let lastActivityStatus = '';\n let elapsedTimerId: ReturnType<typeof setInterval> | null = null;\n const busyStates = new Set(['sending', 'waiting', 'streaming', 'running', 'compacting', 'recovering']);\n\n const syncTerminalProgress = () => {\n if (!tuiSettings.showTerminalProgress) {\n tui.terminal.setProgress(false);\n return;\n }\n tui.terminal.setProgress(busyStates.has(state.activityStatus));\n };\n\n let lastStreamActivityAt = Date.now();\n let streamWatchdogId: ReturnType<typeof setInterval> | null = null;\n\n const touchStreamingActivity = () => {\n lastStreamActivityAt = Date.now();\n if (state.activeRunId && state.runStatus.lastActivityAt == null) {\n state.runStatus = {\n ...state.runStatus,\n runId: state.activeRunId,\n lastActivityAt: lastStreamActivityAt,\n };\n }\n };\n\n const formatElapsed = (startMs: number) => {\n const totalSeconds = Math.max(0, Math.floor((Date.now() - startMs) / 1000));\n if (totalSeconds < 60) return `${totalSeconds}s`;\n const minutes = Math.floor(totalSeconds / 60);\n const seconds = totalSeconds % 60;\n return `${minutes}m ${seconds}s`;\n };\n\n const renderStatus = () => {\n const isBusy = busyStates.has(state.activityStatus);\n if (isBusy && extensionWorkingVisible) {\n if (!statusStartedAt || lastActivityStatus !== state.activityStatus) {\n statusStartedAt = Date.now();\n }\n if (!statusLoader) {\n statusContainer.clear();\n statusLoader = new Loader(\n tui,\n (spinner) => theme.accent(spinner),\n (text) => theme.bold(theme.accentSoft(text)),\n '',\n extensionWorkingIndicator,\n );\n statusContainer.addChild(statusLoader);\n }\n const elapsed = formatElapsed(statusStartedAt);\n const loaderMessage = state.progressMessage ?? extensionWorkingMessage ?? state.activityStatus;\n statusLoader.setMessage(\n `${loaderMessage} • ${elapsed} | ${state.connectionStatus}`,\n );\n if (!elapsedTimerId) {\n elapsedTimerId = setInterval(() => {\n if (statusStartedAt && statusLoader) {\n const el = formatElapsed(statusStartedAt);\n const message = state.progressMessage ?? extensionWorkingMessage ?? state.activityStatus;\n statusLoader.setMessage(\n `${message} • ${el} | ${state.connectionStatus}`,\n );\n }\n }, 1000);\n }\n } else {\n if (!isBusy) {\n state.progressMessage = null;\n statusStartedAt = null;\n }\n if (elapsedTimerId) {\n clearInterval(elapsedTimerId);\n elapsedTimerId = null;\n }\n statusLoader?.stop();\n statusLoader = null;\n statusContainer.clear();\n }\n lastActivityStatus = state.activityStatus;\n bottomBar.invalidate();\n syncTerminalProgress();\n tui.requestRender();\n };\n\n const setActivityStatus = (status: string) => {\n state.activityStatus = status as TuiState['activityStatus'];\n renderStatus();\n };\n\n const setConnectionStatus = (text: string) => {\n state.connectionStatus = text;\n renderStatus();\n };\n\n const updateHeader = () => {\n header.invalidate();\n syncTerminalTitle();\n };\n\n const syncTerminalTitle = () => {\n const shortKey =\n state.currentSessionKey.length > 48\n ? `${state.currentSessionKey.slice(0, 45)}…`\n : state.currentSessionKey;\n tui.terminal.setTitle(`xopc · ${shortKey}`);\n };\n\n const updateFooter = () => {\n bottomBar.invalidate();\n };\n\n const refreshModelChoices = async () => {\n try {\n modelChoices = await client.listModels();\n } catch {\n modelChoices = [];\n }\n bottomBar.invalidate();\n tui.requestRender();\n };\n\n let finishTui: (() => void) | null = null;\n let exitResult: TuiResult = { exitReason: 'exit' };\n\n const requestExit = () => {\n if (state.exitRequested) return;\n state.exitRequested = true;\n if (elapsedTimerId) {\n clearInterval(elapsedTimerId);\n elapsedTimerId = null;\n }\n if (streamWatchdogId) {\n clearInterval(streamWatchdogId);\n streamWatchdogId = null;\n }\n client.stop();\n tui.terminal.setProgress(false);\n void drainAndStopTuiSafely(tui).then(() => {\n restoreStdio();\n process.stdout.write(\n `\\nTo resume this session: ${formatTuiResumeCommand(opts, state.currentSessionKey)}\\n`,\n );\n finishTui?.();\n process.exit(0);\n });\n };\n\n const sessionActions = createSessionActions({\n client,\n chatLog,\n tui,\n state,\n resolveSessionKey,\n updateHeader,\n updateFooter,\n setActivityStatus,\n sessionSnapshot,\n onAgentIdChange: (agentId) => {\n currentAgentId = agentId;\n },\n });\n\n const {\n refreshSessionInfo,\n loadHistory: loadSessionHistory,\n setSession,\n abortActive,\n resetCurrentSession,\n clearChatForSessionSwitch,\n } = sessionActions;\n\n const refreshSessionInfoWithBorder = async () => {\n await refreshSessionInfo();\n updateEditorBorderColor();\n };\n\n const refreshStartupResources = async () => {\n if (!client.getStartupResources) return;\n try {\n startupResources = await client.getStartupResources(state.currentSessionKey);\n } catch {\n startupResources = undefined;\n }\n };\n\n const showStartupCardOnce = () => {\n if (startupCardShown) return;\n startupCardShown = true;\n chatLog.addSystem(formatTuiStartupText({\n state,\n isLocal: isLocalMode,\n keybindings,\n resources: startupResources,\n expanded: false,\n }));\n };\n\n const applyStartupWorkingDirectory = async () => {\n if (startupWorkingDirectoryApplied || !startupWorkingDirectory) return;\n startupWorkingDirectoryApplied = true;\n await client.patchSession(state.currentSessionKey, {\n workingDirectory: startupWorkingDirectory,\n });\n state.sessionInfo.effectiveWorkspacePath = startupWorkingDirectory;\n state.sessionInfo.workingDirectoryLocked = true;\n };\n\n let streamRecoveryPromise: Promise<void> | null = null;\n const recoverActiveRunFromHistory = (reason: string) => {\n if (!state.activeRunId) return Promise.resolve();\n if (streamRecoveryPromise) return streamRecoveryPromise;\n const runId = state.activeRunId;\n markRunRecovering(state, Date.now());\n state.progressMessage = 'recovering stream history';\n setActivityStatus('recovering');\n streamRecoveryPromise = (async () => {\n try {\n await loadSessionHistory();\n await refreshSessionInfoWithBorder();\n if (state.activeRunId === runId) {\n clearSeenStreamEventsForRun(runId);\n if (client.resumeChat) {\n const resumed = await client.resumeChat({ sessionKey: state.currentSessionKey, runId });\n if (resumed.ok) {\n state.progressMessage = 'resuming stream';\n setActivityStatus('recovering');\n chatLog.addSystem(theme.dim(`Reattached to active run after ${reason}.`));\n } else {\n markRunRecoveryComplete(state, Date.now());\n state.progressMessage = 'stream stalled; resume unavailable';\n setActivityStatus('stalled');\n chatLog.addSystem(\n theme.dim(\n `Recovered persisted history after ${reason}, but could not resume stream: ${resumed.reason ?? 'run relay unavailable'}. Press Escape or /abort to stop it.`,\n ),\n );\n }\n } else {\n markRunRecoveryComplete(state, Date.now());\n state.progressMessage = 'stream stalled; waiting for new events or abort';\n setActivityStatus('stalled');\n chatLog.addSystem(\n theme.dim(\n `Recovered persisted history after ${reason}. Active run is still marked stalled; press Escape or /abort to stop it.`,\n ),\n );\n }\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n chatLog.addSystem(theme.dim(`Stream recovery failed after ${reason}: ${errorMessage}`));\n if (state.activeRunId === runId) {\n markRunRecoveryComplete(state, Date.now());\n setActivityStatus('stalled');\n }\n } finally {\n streamRecoveryPromise = null;\n updateFooter();\n tui.requestRender();\n }\n })();\n return streamRecoveryPromise;\n };\n\n const setThinkingLevel = async (level: ThinkLevel) => {\n try {\n await client.patchSession(state.currentSessionKey, { thinkingLevel: level });\n state.sessionInfo.thinkingLevel = level;\n await refreshSessionInfoWithBorder();\n updateFooter();\n chatLog.addStatus(theme.dim(`Thinking level: ${level}`));\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Thinking level change failed: ${errorMessage}`);\n } finally {\n tui.requestRender();\n }\n };\n\n const setReasoningLevel = async (level: ReasoningLevel) => {\n try {\n await client.patchSession(state.currentSessionKey, { reasoningLevel: level });\n state.sessionInfo.reasoningLevel = level;\n await refreshSessionInfoWithBorder();\n updateFooter();\n chatLog.addStatus(theme.dim(`Reasoning visibility: ${level}`));\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Reasoning visibility change failed: ${errorMessage}`);\n } finally {\n tui.requestRender();\n }\n };\n\n const setVerboseLevel = async (level: VerboseLevel) => {\n try {\n await client.patchSession(state.currentSessionKey, { verboseLevel: level });\n state.sessionInfo.verboseLevel = level;\n await refreshSessionInfoWithBorder();\n updateFooter();\n chatLog.addStatus(theme.dim(`Verbose mode: ${level}`));\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Verbose mode change failed: ${errorMessage}`);\n } finally {\n tui.requestRender();\n }\n };\n\n const copyLastAssistant = async () => {\n const text = chatLog.getLastAssistantText().trim();\n if (!text) {\n chatLog.addSystem('No assistant messages to copy yet.');\n tui.requestRender();\n return;\n }\n try {\n await copyTextToClipboard(text);\n chatLog.addStatus(theme.dim('Copied last assistant message to clipboard'));\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Copy failed: ${errorMessage}`);\n } finally {\n tui.requestRender();\n }\n };\n\n const renameCurrentSession = async (name: string) => {\n const nextName = name.trim();\n if (!nextName) {\n chatLog.addSystem('Usage: /name <name>');\n tui.requestRender();\n return;\n }\n try {\n const result = await client.renameSession(state.currentSessionKey, nextName);\n if (!result.ok) {\n chatLog.addSystem('Session rename failed.');\n tui.requestRender();\n return;\n }\n state.sessionInfo.displayName = nextName;\n updateFooter();\n updateHeader();\n chatLog.addStatus(theme.dim(`Session name set: ${nextName}`));\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Session rename failed: ${errorMessage}`);\n } finally {\n tui.requestRender();\n }\n };\n\n const resolveModelChoiceIndex = (): number => {\n const choices = cycleModelChoices();\n if (choices.length === 0) return -1;\n const p = state.sessionInfo.modelProvider;\n const m = state.sessionInfo.model;\n if (p && m) {\n const byParts = choices.findIndex((x) => x.provider === p && x.id === m);\n if (byParts >= 0) return byParts;\n }\n if (m?.includes('/')) {\n const [a, b] = m.split('/', 2);\n const bySlash = choices.findIndex((x) => x.provider === a && x.id === b);\n if (bySlash >= 0) return bySlash;\n }\n return 0;\n };\n\n const cycleModel = (dir: 'forward' | 'backward') => {\n const choices = cycleModelChoices();\n if (choices.length === 0) {\n void refreshModelChoices().then(() => {\n if (cycleModelChoices().length === 0) {\n chatLog.addSystem('No models available to cycle.');\n tui.requestRender();\n return;\n }\n cycleModel(dir);\n });\n return;\n }\n const idx = resolveModelChoiceIndex();\n const base = idx >= 0 ? idx : 0;\n const delta = dir === 'forward' ? 1 : -1;\n const next = choices[(base + delta + choices.length) % choices.length]!;\n void switchCurrentModel(`${next.provider}/${next.id}`);\n };\n\n const listCurrentModels = async (): Promise<TuiModelChoice[]> => {\n if (modelChoices.length === 0) {\n await refreshModelChoices();\n }\n return modelChoices;\n };\n\n const switchCurrentModel = async (modelRef: string) => {\n const trimmed = modelRef.trim();\n if (!trimmed.includes('/')) {\n chatLog.addSystem('Usage: /switch <provider/model>');\n tui.requestRender();\n return;\n }\n if (modelChoices.length === 0) {\n await refreshModelChoices();\n }\n const [provider, id] = trimmed.split('/', 2);\n const selected = modelChoices.find((choice) => choice.provider === provider && choice.id === id);\n if (!selected) {\n chatLog.addSystem(`Model not found: ${trimmed}`);\n tui.requestRender();\n return;\n }\n try {\n await client.patchSession(state.currentSessionKey, { model: trimmed });\n state.sessionInfo.modelProvider = selected.provider;\n state.sessionInfo.model = selected.id;\n if (selected.contextWindow != null) {\n state.sessionInfo.contextWindow = selected.contextWindow;\n }\n await refreshSessionInfoWithBorder();\n updateFooter();\n updateHeader();\n chatLog.addStatus(theme.dim(`Model: ${trimmed}`));\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Model switch failed: ${errorMessage}`);\n } finally {\n tui.requestRender();\n }\n };\n\n const exportCurrentSession = async (request: TuiExportRequest) => {\n const outputPath = request.outputPath\n ? isAbsolute(request.outputPath)\n ? request.outputPath\n : resolve(process.cwd(), request.outputPath)\n : defaultExportPath(state.currentSessionKey, request.format);\n try {\n const backendFormat = request.format === 'json' ? 'json' : 'markdown';\n const raw = await client.exportSession(state.currentSessionKey, backendFormat);\n const content = request.format === 'html' ? wrapMarkdownExportAsHtml(raw) : raw;\n mkdirSync(dirname(outputPath), { recursive: true });\n writeFileSync(outputPath, content, 'utf8');\n chatLog.addStatus(theme.dim(`Exported ${request.format} session to: ${outputPath}`));\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Export failed: ${errorMessage}`);\n } finally {\n tui.requestRender();\n }\n };\n\n const importSessionExport = async (request: TuiImportRequest) => {\n const rawPath = request.inputPath?.trim();\n if (!rawPath) {\n chatLog.addSystem('Usage: /import <path.json> [target-session]');\n tui.requestRender();\n return;\n }\n const inputPath = isAbsolute(rawPath) ? rawPath : resolve(process.cwd(), rawPath);\n const targetRaw = request.targetKey?.trim() || `import-${randomUUID()}`;\n const targetKey = resolveSessionKey(targetRaw);\n try {\n const content = readFileSync(inputPath, 'utf8');\n const result = await client.importSession(targetKey, content);\n await setSession(result.sessionKey);\n chatLog.addStatus(theme.dim(`Imported ${result.rowCount} transcript rows from: ${inputPath}`));\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Import failed: ${errorMessage}`);\n } finally {\n tui.requestRender();\n }\n };\n\n const createShareLink = async (request: TuiShareRequest) => {\n try {\n chatLog.addStatus(theme.dim(`Creating share for: ${request.path}`));\n tui.requestRender();\n const result = await client.createShare(state.currentSessionKey, request, { agentId: currentAgentId });\n chatLog.addSystem(formatTuiShareResult(result));\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Share failed: ${errorMessage}`);\n } finally {\n tui.requestRender();\n }\n };\n\n const runBtwQuery = async (question: string) => {\n const previousStatus = state.activityStatus;\n try {\n setActivityStatus('waiting');\n state.progressMessage = 'btw';\n const result = await client.btwQuery(state.currentSessionKey, question);\n if (result.error) {\n chatLog.addSystem(`BTW failed: ${result.error}`);\n return;\n }\n chatLog.addSystem(`BTW\\n\\n${result.text}`);\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`BTW failed: ${errorMessage}`);\n } finally {\n state.activityStatus = previousStatus;\n renderStatus();\n tui.requestRender();\n }\n };\n\n const forkCurrentSession = async (rawKey?: string) => {\n const targetRaw = rawKey?.trim() || `fork-${randomUUID()}`;\n const targetKey = resolveSessionKey(targetRaw);\n if (targetKey === state.currentSessionKey) {\n chatLog.addSystem('Fork target must be different from the current session.');\n tui.requestRender();\n return;\n }\n const sourceSessionKey = state.currentSessionKey;\n try {\n await abortActive({ clearUi: false });\n const result = await client.forkSession(sourceSessionKey, targetKey);\n await setSession(result.sessionKey);\n chatLog.addBranchSummary({\n sourceSessionKey,\n targetSessionKey: result.sessionKey,\n rowCount: result.rowCount,\n });\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Fork failed: ${errorMessage}`);\n } finally {\n tui.requestRender();\n }\n };\n\n const handleCtrlZ = () => {\n if (process.platform === 'win32') {\n chatLog.addSystem(formatSuspendUnsupportedHint(keybindings));\n tui.requestRender();\n return;\n }\n const suspendKeepAlive = setInterval(() => {}, 2 ** 30);\n const ignoreSigint = () => {};\n process.on('SIGINT', ignoreSigint);\n process.once('SIGCONT', () => {\n clearInterval(suspendKeepAlive);\n process.removeListener('SIGINT', ignoreSigint);\n tui.start();\n tui.setFocus(editor);\n tui.requestRender(true);\n });\n try {\n tui.stop();\n process.kill(0, 'SIGTSTP');\n } catch {\n clearInterval(suspendKeepAlive);\n process.removeListener('SIGINT', ignoreSigint);\n }\n };\n\n const openExternalEditor = () => {\n const dir = mkdtempSync(join(tmpdir(), 'xopc-tui-edit-'));\n const filePath = join(dir, 'message.md');\n writeFileSync(filePath, editor.getText(), 'utf8');\n const editorBin = process.env.EDITOR || process.env.VISUAL || 'vi';\n void (async () => {\n await withTuiSuspended(tui, async () => {\n spawnSync(editorBin, [filePath], { stdio: 'inherit' });\n });\n try {\n const next = readFileSync(filePath, 'utf8');\n editor.setText(next.replace(/\\r\\n/g, '\\n'));\n } catch {\n // ignore\n }\n try {\n unlinkSync(filePath);\n } catch {\n // ignore\n }\n tui.setFocus(editor);\n tui.requestRender(true);\n })();\n };\n\n const isAgentBusy = () =>\n state.activeRunId != null || state.isCompacting || busyStates.has(state.activityStatus);\n\n let steeringInFlightForRunId: string | null = null;\n\n const sendSteeringToActiveRun = (text: string) => {\n chatLog.addUser(text);\n touchStreamingActivity();\n tui.requestRender();\n void client\n .steerChat({ sessionKey: state.currentSessionKey, message: text })\n .then(({ ok }) => {\n if (!ok) {\n chatLog.addSystem(\n theme.dim(\n formatSteerUnavailableHint(keybindings),\n ),\n );\n } else {\n chatLog.addSystem(\n theme.dim('Steered — message injects at the next tool boundary (pi-style).'),\n );\n }\n tui.requestRender();\n })\n .catch((error: unknown) => {\n const errorMessage = error instanceof Error ? error.message : String(error);\n chatLog.addSystem(theme.dim(`Steer failed: ${errorMessage}`));\n tui.requestRender();\n });\n };\n\n const flushSteeringQueue = () => {\n if (state.exitRequested) return;\n if (state.activeRunId) return;\n const next = drainFollowUpQueue(state.steeringQueue, tuiSettings.steeringMode);\n if (next === undefined) return;\n sendMessage(next);\n };\n\n const steerMessage = (text: string) => {\n if (!state.activeRunId) {\n sendMessage(text);\n return;\n }\n if (steeringInFlightForRunId === state.activeRunId) {\n state.steeringQueue.push(text);\n chatLog.addSystem(\n theme.dim(\n `Queued steering (${state.steeringQueue.length} in queue). ${tuiSettings.steeringMode === 'all' ? 'All queued steering sends together after this reply.' : 'Next sends after this reply.'}`,\n ),\n );\n bottomBar.invalidate();\n tui.requestRender();\n return;\n }\n steeringInFlightForRunId = state.activeRunId;\n sendSteeringToActiveRun(text);\n };\n\n const sendMessage = (text: string) => {\n if (state.activeRunId && pendingImageAttachments.length > 0) {\n chatLog.addSystem(\n theme.dim('Image attachments cannot be steered into an active run. Wait for this reply to finish, then send.'),\n );\n tui.requestRender();\n return;\n }\n const pendingCustomText = pendingNextTurnCustomMessages.splice(0).join('\\n\\n').trim();\n const messageText = [text, pendingCustomText].filter(Boolean).join('\\n\\n');\n const attachments = pendingImageAttachments;\n pendingImageAttachments = [];\n if (state.isCompacting) {\n state.compactionQueue.push(messageText);\n if (attachments.length > 0) {\n pendingImageAttachments.unshift(...attachments);\n }\n chatLog.addSystem(\n theme.dim(`Queued during compaction (${state.compactionQueue.length}). Sends when compact finishes.`),\n );\n bottomBar.invalidate();\n tui.requestRender();\n return;\n }\n\n if (state.activeRunId) {\n chatLog.addSystem(\n formatBusyResponseHint(keybindings),\n );\n if (pendingCustomText) {\n pendingNextTurnCustomMessages.unshift(pendingCustomText);\n }\n if (attachments.length > 0) {\n pendingImageAttachments.unshift(...attachments);\n }\n tui.requestRender();\n return;\n }\n\n chatLog.addUser(userDisplayContentForAttachments(text, attachments));\n sessionSnapshot.appendMessage('user', messageText);\n lastRetryMessageText = messageText;\n markRunSending(state);\n setActivityStatus('sending');\n touchStreamingActivity();\n tui.requestRender();\n\n void client\n .sendChat({\n sessionKey: state.currentSessionKey,\n message: messageText,\n attachments: attachments.length > 0 ? attachments : undefined,\n thinking: opts.thinking,\n })\n .catch((error: unknown) => {\n const errorMessage = error instanceof Error ? error.message : String(error);\n if (attachments.length > 0) {\n pendingImageAttachments.unshift(...attachments);\n }\n chatLog.addSystem(`❌ Failed to send: ${errorMessage}`);\n setActivityStatus('idle');\n tui.requestRender();\n });\n };\n\n sendExtensionUserMessage = (content, options) => {\n const text = extensionUserMessageContentToText(content).trim();\n if (!text) {\n throw new Error('sendUserMessage requires text content.');\n }\n if (!state.activeRunId) {\n sendMessage(text);\n return;\n }\n if (options?.deliverAs === 'steer') {\n steerMessage(text);\n return;\n }\n if (options?.deliverAs === 'followUp') {\n state.messageFollowUpQueue.push(text);\n chatLog.addSystem(\n theme.dim(\n `Queued follow-up (${state.messageFollowUpQueue.length} in queue). ${tuiSettings.followUpMode === 'all' ? 'All queued messages send together when this reply finishes.' : 'Next sends when this reply finishes.'}`,\n ),\n );\n bottomBar.invalidate();\n tui.requestRender();\n return;\n }\n throw new Error('Agent is busy. Use deliverAs: \"steer\" or \"followUp\".');\n };\n\n const runCompaction = async (\n instructions?: string,\n callbacks?: {\n onComplete?: (result: TuiCompactionResult) => void;\n onError?: (error: Error) => void;\n },\n ): Promise<TuiCompactionResult | undefined> => {\n if (state.isCompacting) return undefined;\n state.isCompacting = true;\n setActivityStatus('compacting');\n chatLog.addSystem(\n theme.dim(\n instructions ? `Compacting session with instructions: ${instructions}` : 'Compacting session…',\n ),\n );\n tui.requestRender();\n try {\n const result = await client.compactSession(state.currentSessionKey, { force: true, instructions });\n if (result.compacted) {\n clearSeenStreamEvents();\n state.historyLoaded = false;\n await loadSessionHistory();\n chatLog.addCompactionSummary(result);\n } else {\n chatLog.addSystem(formatTuiCompactionResult(result));\n }\n callbacks?.onComplete?.(result);\n return result;\n } catch (error: unknown) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n chatLog.addSystem(`❌ Compaction failed: ${errorMessage}`);\n callbacks?.onError?.(error instanceof Error ? error : new Error(errorMessage));\n return undefined;\n } finally {\n state.isCompacting = false;\n setActivityStatus('idle');\n await refreshSessionInfoWithBorder();\n const queued = state.compactionQueue.shift();\n if (queued && !state.activeRunId) {\n sendMessage(queued);\n }\n updateFooter();\n tui.requestRender();\n }\n };\n\n const applyTuiSettings = (settings: TuiSettings) => {\n tuiSettings = { ...settings };\n saveTuiSettings(tuiSettings);\n state.showThinking = tuiSettings.showThinking;\n state.toolsExpanded = tuiSettings.toolsExpanded;\n chatLog.setShowThinking(tuiSettings.showThinking);\n chatLog.setToolsExpanded(tuiSettings.toolsExpanded);\n chatLog.setToolImageOptions({\n showImages: tuiSettings.showImages,\n imageWidthCells: tuiSettings.imageWidthCells,\n cwd: process.cwd(),\n });\n tui.setShowHardwareCursor(tuiSettings.showHardwareCursor);\n tui.setClearOnShrink(tuiSettings.clearOnShrink);\n defaultEditor.setPaddingX(tuiSettings.editorPaddingX);\n defaultEditor.setAutocompleteMaxVisible(tuiSettings.autocompleteMaxVisible);\n if (editor !== defaultEditor) {\n editor.setPaddingX?.(tuiSettings.editorPaddingX);\n editor.setAutocompleteMaxVisible?.(tuiSettings.autocompleteMaxVisible);\n }\n applyThemeById(tuiSettings.theme);\n header.invalidate();\n updateEditorBorderColor();\n syncTerminalProgress();\n bottomBar.invalidate();\n tui.requestRender();\n };\n\n const previewTheme = (themeId: string) => {\n applyThemeById(themeId);\n updateEditorBorderColor();\n tui.requestRender();\n };\n\n const reloadTuiRuntime = async () => {\n if (state.activeRunId) {\n throw new Error('Wait for the current response to finish before reloading.');\n }\n if (state.isCompacting) {\n throw new Error('Wait for compaction to finish before reloading.');\n }\n keybindings.reload();\n setKeybindings(keybindings);\n applyTuiSettings(loadTuiSettings());\n extensionRuntime.dispose();\n await extensionRuntime.activate();\n editor.setAutocompleteProvider?.(extensionRuntime.autocompleteProvider);\n setEditorExtensionShortcut();\n updateHeader();\n updateFooter();\n tui.requestRender();\n };\n\n const uiOverlays = {\n openModelPicker: (_initialSearch?: string) => {},\n openAgentPicker: () => {},\n openSessionPicker: () => {},\n openSessionTree: () => {},\n openTranscriptTree: () => {},\n openUserMessageFork: () => {},\n openScopedModels: () => {},\n openThinkingSelector: () => {},\n openSettings: () => {},\n openProjectTrust: () => {},\n reloadKeybindings: () => reloadTuiRuntime(),\n };\n\n const recoverCurrentStream = async () => {\n if (state.activeRunId) {\n await recoverActiveRunFromHistory('manual recover');\n return;\n }\n await loadSessionHistory({ merge: true });\n await refreshSessionInfoWithBorder();\n chatLog.addSystem(theme.dim('Reloaded persisted history; no active run to recover.'));\n tui.requestRender();\n };\n\n const retryLastMessage = async () => {\n const message = lastRetryMessageText?.trim();\n if (!message) {\n chatLog.addSystem('No previous user message to retry.');\n return;\n }\n if (state.activeRunId) {\n await abortActive({ clearUi: false });\n }\n sendMessage(message);\n };\n\n const switchAgentSession = async (sessionKey: string, agentId: string) => {\n const previousWorkspace = state.sessionInfo.effectiveWorkspacePath?.trim();\n await setSession(sessionKey);\n await refreshStartupResources();\n if (previousWorkspace && state.sessionInfo.workingDirectoryLocked !== true) {\n try {\n await client.patchSession(state.currentSessionKey, { workingDirectory: previousWorkspace });\n state.sessionInfo.effectiveWorkspacePath = previousWorkspace;\n state.sessionInfo.workingDirectoryLocked = true;\n await refreshSessionInfoWithBorder();\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Switched agent, but workspace was not copied: ${errorMessage}`);\n }\n }\n currentAgentId = agentId;\n updateHeader();\n updateFooter();\n };\n\n const handleCommand = createTuiCommandHandler({\n state,\n chatLog,\n tui,\n isLocalMode,\n abortActive,\n sendMessage,\n requestExit,\n updateFooter,\n keybindings,\n recoverStream: recoverCurrentStream,\n retryLastMessage,\n uiOverlays,\n setThinkingLevel,\n setReasoningLevel,\n setVerboseLevel,\n copyLastAssistant,\n renameCurrentSession,\n runCompaction,\n listModels: listCurrentModels,\n switchModel: switchCurrentModel,\n listSessions: () => client.listSessions(),\n listAgents: () => client.listAgents(),\n switchAgentSession,\n getSessionStats: () => client.getSessionStats(state.currentSessionKey),\n getStartupResources: () => startupResources,\n loadTranscriptTree: () => client.loadTranscriptTree(state.currentSessionKey),\n exportSession: exportCurrentSession,\n importSession: importSessionExport,\n createShare: createShareLink,\n runBtwQuery,\n forkSession: forkCurrentSession,\n extensionSlashCommands: extensionRuntime.slashCommands,\n extensionShortcuts: extensionRuntime.shortcuts,\n currentAgentId,\n setSession: async (rawKey) => {\n await setSession(rawKey);\n await refreshStartupResources();\n },\n resetSession: resetCurrentSession,\n projectTrust: {\n cwd: process.cwd(),\n hasProjectResources: () => hasTrustRequiringProjectResources(process.cwd()),\n getStorePath: () => projectTrustStore.getPath(),\n getEntry: () => projectTrustStore.getEntry(process.cwd()),\n getSessionDecision: () => projectTrustSessionDecision,\n },\n runLogin: (provider) =>\n runTuiOAuthLogin(provider, {\n chatLog,\n tui,\n editor,\n openOverlay: openCommandOverlay,\n closeOverlay: closeCommandOverlay,\n keybindings,\n }),\n });\n\n const { runLocalShellLine } = createLocalShellRunner({\n chatLog,\n tui,\n editor,\n openOverlay: openCommandOverlay,\n closeOverlay: closeCommandOverlay,\n pauseStdioFilter: () => stdioFilter.pause(),\n resumeStdioFilter: () => stdioFilter.resume(),\n runWithInheritedStdio: async (work) => {\n await withTuiSuspended(tui, work);\n },\n keybindings,\n getCwd: () => {\n const workspace = state.sessionInfo.effectiveWorkspacePath?.trim();\n if (!workspace) {\n throw new Error('Workspace is not loaded yet.');\n }\n return workspace;\n },\n onComplete: async (entry) => {\n await client\n .appendBashExecution(state.currentSessionKey, entry)\n .catch((err: unknown) => {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Bash transcript append failed: ${errorMessage}`);\n })\n .finally(() => {\n updateFooter();\n tui.requestRender();\n });\n },\n });\n\n const submitCore = createEditorSubmitHandler({\n editor: {\n setText: (value) => editor.setText(value),\n addToHistory: (value) => editor.addToHistory?.(value),\n },\n handleCommand,\n sendMessage,\n handleBangLine: runLocalShellLine,\n isAgentBusy,\n steerWhileBusy: steerMessage,\n hasPendingAttachments: () => pendingImageAttachments.length > 0,\n defaultAttachmentMessage: 'Please analyze the attached image.',\n });\n\n const submitBurst = createSubmitBurstCoalescer({\n submit: submitCore,\n enabled: shouldEnableWindowsGitBashPasteFallback(),\n });\n defaultEditor.onSubmit = submitBurst;\n\n const flushFollowUpQueue = () => {\n if (state.exitRequested) return;\n if (state.activeRunId) return;\n const next = drainFollowUpQueue(state.messageFollowUpQueue, tuiSettings.followUpMode);\n if (next === undefined) return;\n sendMessage(next);\n };\n\n const handleFollowUp = () => {\n const text = editor.getText().trim();\n if (!text && pendingImageAttachments.length === 0) return;\n if (isAgentBusy()) {\n if (pendingImageAttachments.length > 0) {\n chatLog.addSystem(\n theme.dim('Image attachments cannot be queued while the agent is busy. Wait for this reply to finish, then send.'),\n );\n tui.requestRender();\n return;\n }\n editor.addToHistory(text);\n state.messageFollowUpQueue.push(text);\n editor.setText('');\n chatLog.addSystem(\n theme.dim(\n `Queued follow-up (${state.messageFollowUpQueue.length} in queue). ${tuiSettings.followUpMode === 'all' ? 'All queued messages send together when this reply finishes.' : 'Next sends when this reply finishes.'}`,\n ),\n );\n bottomBar.invalidate();\n tui.requestRender();\n return;\n }\n submitBurst(text);\n };\n\n const handleDequeue = () => {\n const restored = restoreQueuedMessages(\n {\n steeringQueue: state.steeringQueue,\n followUpQueue: state.messageFollowUpQueue,\n },\n editor.getText(),\n );\n if (restored.restoredCount === 0) {\n chatLog.addStatus(theme.dim('No queued messages to restore.'));\n tui.requestRender();\n return;\n }\n editor.setText(restored.text);\n chatLog.addStatus(\n theme.dim(\n `Restored ${restored.restoredCount} queued message${restored.restoredCount > 1 ? 's' : ''} to editor.`,\n ),\n );\n bottomBar.invalidate();\n tui.requestRender();\n };\n\n const setSessionKey = (key: string) => {\n state.currentSessionKey = resolveSessionKey(key);\n updateAgentFromPicker(key);\n };\n\n const updateAgentFromPicker = (key: string) => {\n const parsed = parseAgentSessionKey(resolveSessionKey(key));\n if (parsed?.agentId) {\n currentAgentId = parsed.agentId;\n }\n };\n\n let ctrlCHandling = false;\n const handleCtrlC = () => {\n if (ctrlCHandling) return;\n ctrlCHandling = true;\n try {\n const now = Date.now();\n const decision = resolveCtrlCAction({\n hasInput: editor.getText().trim().length > 0,\n now,\n lastCtrlCAt: state.lastCtrlCAt,\n });\n state.lastCtrlCAt = decision.nextLastCtrlCAt;\n if (decision.action === 'clear') {\n editor.setText('');\n setActivityStatus('cleared input; press ctrl+c again to exit');\n tui.requestRender();\n return;\n }\n if (decision.action === 'exit') {\n requestExit();\n return;\n }\n setActivityStatus('press ctrl+c again to exit');\n tui.requestRender();\n } finally {\n ctrlCHandling = false;\n }\n };\n\n const setModelChoices = (models: TuiModelChoice[]) => {\n modelChoices = models;\n };\n\n const pickerSvc = {\n tui,\n editor,\n openOverlay: openCommandOverlay,\n closeOverlay: closeCommandOverlay,\n chatLog,\n client,\n sendMessage,\n switchModel: switchCurrentModel,\n openEditorSelector,\n refreshSessionInfo,\n updateHeader,\n state,\n setSessionKey,\n switchAgentSession,\n clearChatForSessionSwitch,\n loadSessionHistory,\n setEditorText: (text: string) => editor.setText(text),\n setModelChoices,\n getScopedModelRefs: () => state.scopedModelRefs,\n setScopedModelRefs: (refs: string[] | null) => {\n state.scopedModelRefs = refs;\n saveScopedModelRefs(refs);\n },\n refreshCycleModels,\n getTuiSettings: () => ({ ...tuiSettings }),\n applyTuiSettings,\n previewTheme,\n reloadKeybindings: reloadTuiRuntime,\n setThinkingLevel,\n getProjectTrustStore: () => projectTrustStore,\n getProjectTrustSessionDecision: () => projectTrustSessionDecision,\n setProjectTrustSessionDecision: (decision: boolean | null) => {\n projectTrustSessionDecision = decision;\n },\n keybindings,\n };\n\n uiOverlays.openModelPicker = (initialSearch?: string) =>\n void openModelPickerOverlay(pickerSvc, initialSearch);\n uiOverlays.openAgentPicker = () => void openAgentPickerOverlay(pickerSvc);\n uiOverlays.openSessionPicker = () => void openSessionPickerOverlay(pickerSvc);\n uiOverlays.openSessionTree = () => void openSessionTreeOverlay(pickerSvc);\n uiOverlays.openTranscriptTree = () => void openTranscriptTreeOverlay(pickerSvc);\n uiOverlays.openUserMessageFork = () => void openUserMessageForkOverlay(pickerSvc);\n uiOverlays.openScopedModels = () => void openScopedModelsOverlay(pickerSvc);\n uiOverlays.openThinkingSelector = () => openThinkingSelectorOverlay(pickerSvc);\n uiOverlays.openSettings = () => openSettingsOverlay(pickerSvc);\n uiOverlays.openProjectTrust = () => openProjectTrustOverlay(pickerSvc);\n\n const showSessionTree = () => {\n uiOverlays.openTranscriptTree();\n };\n\n const handleDoubleEscape = () => {\n switch (tuiSettings.doubleEscapeAction) {\n case 'tree':\n showSessionTree();\n break;\n case 'fork':\n uiOverlays.openUserMessageFork();\n break;\n default:\n break;\n }\n };\n\n defaultEditor.onEscape = () => {\n if (state.activeRunId) {\n void abortActive();\n return;\n }\n if (editor.getText().trim().length > 0) return;\n const now = Date.now();\n if (now - state.lastEscapeAt <= DOUBLE_ESCAPE_WINDOW_MS) {\n state.lastEscapeAt = 0;\n handleDoubleEscape();\n return;\n }\n state.lastEscapeAt = now;\n };\n defaultEditor.onCtrlD = () => requestExit();\n\n defaultEditor.onAction('app.clear', handleCtrlC);\n defaultEditor.onAction('app.exit', () => requestExit());\n defaultEditor.onAction('app.suspend', handleCtrlZ);\n defaultEditor.onAction('app.thinking.cycle', () => {\n const cur = state.sessionInfo.thinkingLevel ?? opts.thinking ?? 'medium';\n void setThinkingLevel(nextThinkLevel(cur));\n });\n defaultEditor.onAction('app.model.cycleForward', () => cycleModel('forward'));\n defaultEditor.onAction('app.model.cycleBackward', () => cycleModel('backward'));\n defaultEditor.onAction('app.model.select', () => uiOverlays.openModelPicker());\n defaultEditor.onAction('app.session.resume', () => void openSessionPickerOverlay(pickerSvc));\n defaultEditor.onAction('app.session.tree', showSessionTree);\n defaultEditor.onAction('app.session.fork', () => uiOverlays.openUserMessageFork());\n defaultEditor.onAction('app.tools.expand', () => {\n state.toolsExpanded = !state.toolsExpanded;\n tuiSettings = { ...tuiSettings, toolsExpanded: state.toolsExpanded };\n saveTuiSettings(tuiSettings);\n chatLog.setToolsExpanded(state.toolsExpanded);\n setActivityStatus(state.toolsExpanded ? 'tools expanded' : 'tools collapsed');\n tui.requestRender();\n });\n defaultEditor.onAction('app.thinking.toggle', () => {\n state.showThinking = !state.showThinking;\n tuiSettings = { ...tuiSettings, showThinking: state.showThinking };\n saveTuiSettings(tuiSettings);\n chatLog.setShowThinking(state.showThinking);\n updateFooter();\n tui.requestRender();\n });\n defaultEditor.onAction('app.editor.external', openExternalEditor);\n defaultEditor.onPasteImage = () => {\n void (async () => {\n const image = await readClipboardImage();\n if (!image) {\n chatLog.addStatus(theme.dim('No image found on clipboard.'));\n tui.requestRender();\n return;\n }\n if (pendingImageAttachments.length >= MAX_CHAT_ATTACHMENTS) {\n chatLog.addSystem(`Attachment limit reached (${MAX_CHAT_ATTACHMENTS}). Send or clear the current draft first.`);\n tui.requestRender();\n return;\n }\n if (image.bytes.byteLength > MAX_WEBCHAT_ATTACHMENT_FILE_BYTES) {\n chatLog.addSystem(\n `Clipboard image is too large (${image.bytes.byteLength} bytes; max ${MAX_WEBCHAT_ATTACHMENT_FILE_BYTES}).`,\n );\n tui.requestRender();\n return;\n }\n const ext = extensionForImageMimeType(image.mimeType) ?? 'png';\n const name = `clipboard-${pendingImageAttachments.length + 1}.${ext}`;\n pendingImageAttachments.push({\n type: 'image',\n mimeType: image.mimeType,\n data: Buffer.from(image.bytes).toString('base64'),\n name,\n size: image.bytes.byteLength,\n });\n chatLog.addStatus(\n theme.dim(\n `Attached image: ${name} (${pendingImageAttachments.length} pending). Send a message to include it.`,\n ),\n );\n tui.requestRender();\n })();\n };\n defaultEditor.onAction('app.message.followUp', handleFollowUp);\n defaultEditor.onAction('app.message.dequeue', handleDequeue);\n\n streamWatchdogId = setInterval(() => {\n const now = Date.now();\n if (!isActiveRunStreamStale(state, now, DEFAULT_STREAMING_WATCHDOG_MS)) return;\n if (!markActiveRunStalled(state, now)) return;\n chatLog.addSystem(\n theme.dim(\n 'No stream activity for 30s; preserving active run and reloading persisted history.',\n ),\n );\n setActivityStatus('stalled');\n void recoverActiveRunFromHistory('stream watchdog');\n tui.requestRender();\n }, 5000);\n\n const onAgentRunEnded = () => {\n state.progressMessage = null;\n steeringInFlightForRunId = null;\n void refreshSessionInfoWithBorder().finally(() => {\n updateFooter();\n tui.requestRender();\n });\n flushSteeringQueue();\n flushFollowUpQueue();\n };\n\n client.onEvent = (evt: TuiEvent) => {\n const data = (evt.data ?? {}) as Record<string, unknown>;\n dispatchAgentEvent(\n evt.event,\n data,\n state,\n chatLog,\n tui,\n setActivityStatus,\n touchStreamingActivity,\n onAgentRunEnded,\n (message) => sessionSnapshot.appendMessage('assistant', assistantMessagePlainText(message)),\n evt.source,\n );\n };\n\n client.onConnected = () => {\n state.isConnected = true;\n setConnectionStatus(isLocalMode ? 'local ready' : 'gateway connected');\n touchStreamingActivity();\n void (async () => {\n try {\n await applyStartupWorkingDirectory();\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Working directory not changed: ${errorMessage}`);\n }\n await refreshSessionInfoWithBorder();\n await refreshModelChoices();\n await refreshStartupResources();\n await loadSessionHistory({ merge: true });\n showStartupCardOnce();\n if (state.activeRunId) {\n void recoverActiveRunFromHistory('broadcast reconnect');\n }\n if (\n !projectTrustPromptShown &&\n isLocalMode &&\n projectTrustSessionDecision === null &&\n hasTrustRequiringProjectResources(process.cwd()) &&\n projectTrustStore.get(process.cwd()) === null\n ) {\n projectTrustPromptShown = true;\n chatLog.addSystem(\n 'Project-local xopc resources detected. Use /trust to trust this folder, trust a parent folder, or keep it untrusted.',\n );\n }\n updateHeader();\n updateFooter();\n tui.requestRender();\n if (!state.autoMessageSent && opts.message) {\n state.autoMessageSent = true;\n sendMessage(opts.message);\n }\n })();\n };\n\n client.onDisconnected = (reason: string) => {\n const wasConnected = state.isConnected;\n state.isConnected = false;\n touchStreamingActivity();\n if (isLocalMode) {\n setConnectionStatus(`local stopped: ${reason}`);\n } else {\n const hint =\n wasConnected || state.historyLoaded\n ? ` (${reason}). Reconnecting broadcast stream…`\n : `. Ensure gateway is running (xopc gateway) or use --local.`;\n setConnectionStatus(`disconnected${hint}`);\n if (!wasConnected && !state.historyLoaded) {\n const gatewayUrl = opts.url ?? 'http://localhost:3120';\n chatLog.addSystem(\n `Cannot reach gateway at ${gatewayUrl}.\\n` +\n 'Start the gateway (`xopc gateway`) or run `xopc tui --local` for embedded mode.',\n );\n }\n }\n tui.requestRender();\n };\n\n client.onGap = (info) => {\n chatLog.addSystem(\n `⚠️ Event gap: expected ${info.expected}, received ${info.received}. Some updates may be missing.`,\n );\n setConnectionStatus(`event gap: expected ${info.expected}, got ${info.received}`);\n if (state.activeRunId) {\n void recoverActiveRunFromHistory('broadcast event gap');\n } else {\n void loadSessionHistory({ merge: true });\n }\n tui.requestRender();\n };\n\n const sigintHandler = () => handleCtrlC();\n const sigtermHandler = () => requestExit();\n process.on('SIGINT', sigintHandler);\n process.on('SIGTERM', sigtermHandler);\n\n updateHeader();\n updateEditorBorderColor();\n setConnectionStatus(isLocalMode ? 'starting local runtime' : 'connecting');\n updateFooter();\n await extensionRuntime.activate();\n tui.start();\n client.start();\n\n await new Promise<void>((resolve) => {\n finishTui = () => {\n process.removeListener('SIGINT', sigintHandler);\n process.removeListener('SIGTERM', sigtermHandler);\n if (streamWatchdogId) {\n clearInterval(streamWatchdogId);\n streamWatchdogId = null;\n }\n finishTui = null;\n resolve();\n };\n });\n\n return exitResult;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"tui.js","names":["packageJson.version"],"sources":["../../../src/tui/tui.ts"],"sourcesContent":["import {\n Container,\n Loader,\n type LoaderIndicatorOptions,\n ProcessTerminal,\n setKeybindings,\n TUI,\n type Component,\n type EditorComponent,\n type OverlayHandle,\n type OverlayOptions,\n} from '@earendil-works/pi-tui';\nimport type { AgentMessage } from '@earendil-works/pi-agent-core';\nimport { Buffer } from 'node:buffer';\nimport { randomUUID } from 'node:crypto';\nimport { mkdirSync, mkdtempSync, readFileSync, unlinkSync, writeFileSync } from 'node:fs';\nimport { tmpdir } from 'node:os';\nimport { dirname, isAbsolute, join, relative, resolve } from 'node:path';\nimport { spawnSync } from 'node:child_process';\n\nimport type {\n ReasoningLevel,\n ThinkLevel,\n VerboseLevel,\n} from '../agent/transcript/thinking-types.js';\nimport { resolveEffectiveAgentProfileForSession } from '../config/agent-profile.js';\nimport { loadConfig } from '../config/index.js';\nimport { resolveStateDir, resolveXopcDatabasePath } from '../config/paths.js';\nimport {\n MAX_CHAT_ATTACHMENTS,\n MAX_WEBCHAT_ATTACHMENT_FILE_BYTES,\n} from '../gateway/chat-limits.js';\nimport { resolveTuiSessionKey, resolveTuiStartupSessionKey } from '../routing/resolve-tui-session-key.js';\nimport { parseAgentSessionKey } from '../routing/agent-session-key.js';\nimport type {\n TuiBackend,\n TuiCompactionResult,\n TuiEvent,\n TuiExportFormat,\n TuiInboundAttachment,\n TuiModelChoice,\n TuiShareRequest,\n TuiStartupResources,\n} from './tui-backend.js';\nimport { EmbeddedBackend } from './backends/embedded-backend.js';\nimport { GatewaySseBackend } from './backends/gateway-sse-backend.js';\nimport {\n clearSeenStreamEvents,\n clearSeenStreamEventsForRun,\n DEFAULT_STREAMING_WATCHDOG_MS,\n dispatchAgentEvent,\n} from './tui-agent-events.js';\nimport { ChatLog } from './components/chat-log.js';\nimport { CustomEditor } from './components/custom-editor.js';\nimport { TuiBottomBar } from './components/tui-bottom-bar.js';\nimport { TuiHeader } from './components/tui-header.js';\nimport {\n createTuiCommandHandler,\n getSlashCommands,\n type SlashCommandDef,\n} from './tui-commands.js';\nimport {\n formatTuiCompactionResult,\n formatTuiShareResult,\n type TuiExportRequest,\n type TuiImportRequest,\n} from './tui-command-formatters.js';\nimport { createLocalShellRunner } from './tui-local-shell.js';\nimport { drainFollowUpQueue, restoreQueuedMessages } from './tui-follow-up-queue.js';\nimport {\n createBackspaceDeduper,\n drainAndStopTuiSafely,\n resolveCtrlCAction,\n} from './tui-lifecycle.js';\nimport {\n openAgentPickerOverlay,\n openProjectTrustOverlay,\n openScopedModelsOverlay,\n openSessionPickerOverlay,\n openSessionTreeOverlay,\n openSettingsOverlay,\n openTranscriptTreeOverlay,\n openThinkingSelectorOverlay,\n openUserMessageForkOverlay,\n} from './tui-picker-overlay.js';\nimport { openModelPickerOverlay } from './tui-model-picker.js';\nimport { runTuiOAuthLogin } from './tui-oauth-login.js';\nimport {\n createEditorSubmitHandler,\n createSubmitBurstCoalescer,\n shouldEnableWindowsGitBashPasteFallback,\n} from './tui-submit.js';\nimport { installTuiStdioFilter } from './tui-stdio-filter.js';\nimport { withTuiSuspended } from './tui-suspend.js';\nimport { extensionForImageMimeType, readClipboardImage } from './clipboard-image.js';\nimport { copyTextToClipboard } from './clipboard-text.js';\nimport {\n renderWorkflowFinalSummary,\n renderWorkflowPanel,\n} from '../agent/workflow/snapshot.js';\nimport { isTerminalWorkflowRunStatus, type WorkflowRunView } from '../workflows/domain/index.js';\nimport { runViewToSnapshot } from '../workflows/service/run-view-to-snapshot.js';\nimport {\n applyThemeById,\n getCustomThemesDir,\n getThemeExports,\n getBashExcludeBorderColor,\n getBashModeBorderColor,\n getThinkingBorderColor,\n initTuiTheme,\n listAvailableThemeIds,\n resolveThemePalette,\n} from './theme-manager.js';\nimport { editorTheme, theme } from './theme.js';\nimport { loadTuiSettings, saveTuiSettings, type TuiSettings } from './tui-settings.js';\nimport { resolveFdPath } from './tui-fd-path.js';\nimport packageJson from '../../package.json' with { type: 'json' };\nimport { createSessionActions } from './tui-session-actions.js';\nimport { createInitialState, type TuiOptions, type TuiResult, type TuiState } from './tui-types.js';\nimport { createXopcTuiKeybindingsManager } from './tui-keybindings-file.js';\nimport { formatKeyIds } from './format-tui-hotkeys.js';\nimport { formatTuiStartupText } from './tui-startup-text.js';\nimport {\n filterModelsForCycle,\n loadScopedModelRefs,\n saveScopedModelRefs,\n} from './tui-scoped-models.js';\nimport {\n formatBusyResponseHint,\n formatSteerUnavailableHint,\n formatSuspendUnsupportedHint,\n} from './tui-runtime-hints.js';\nimport { loadExtensionsForTuiLocalMode } from './extension-host/load-extensions.js';\nimport { createTuiExtensionRuntime } from './extension-host/runtime.js';\nimport { TuiSessionSnapshot } from './tui-session-snapshot.js';\nimport {\n extensionCustomMessageContentToText,\n extensionCustomMessageToTurnText,\n extensionUserMessageContentToText,\n} from './tui-extension-user-message.js';\nimport type { ExtensionRegistryImpl } from '../extensions/loader.js';\nimport type {\n ExtensionCustomMessage,\n ExtensionSendMessageOptions,\n ExtensionSendUserMessageOptions,\n ExtensionUserMessageContent,\n} from '../extensions/types/core.js';\nimport type {\n TuiEditorFactory,\n TuiForkOptions,\n TuiModelRegistryModel,\n TuiNavigateTreeOptions,\n TuiNewSessionOptions,\n TuiReasoningLevel,\n TuiReplacedSessionContext,\n TuiReplacementResult,\n TuiSwitchSessionOptions,\n TuiThinkingLevel,\n TuiVerboseLevel,\n} from '../extensions/types/tui.js';\nimport { getAllModels, getAllProviders, getApiKey, isProviderConfiguredSync } from '../providers/index.js';\nimport {\n hasTrustRequiringProjectResources,\n ProjectTrustStore,\n} from '../project-trust/trust-store.js';\nimport { transcriptTreeEntryIdToRowNumber } from './tui-transcript-tree.js';\nimport {\n isActiveRunStreamStale,\n markActiveRunStalled,\n markRunSending,\n markRunRecovering,\n markRunRecoveryComplete,\n} from './tui-run-state.js';\n\nexport type { TuiOptions, TuiResult };\n\nexport {\n createBackspaceDeduper,\n drainAndStopTuiSafely,\n type DrainableTui,\n isIgnorableTuiStopError,\n resolveCtrlCAction,\n stopTuiSafely,\n} from './tui-lifecycle.js';\n\nexport { withTuiSuspended } from './tui-suspend.js';\n\nconst THINK_LEVEL_CYCLE: ThinkLevel[] = [\n 'off',\n 'minimal',\n 'low',\n 'medium',\n 'high',\n 'xhigh',\n 'adaptive',\n];\n\nfunction nextThinkLevel(current: string | undefined): ThinkLevel {\n const c = (current ?? 'medium').toLowerCase();\n const idx = THINK_LEVEL_CYCLE.indexOf(c as ThinkLevel);\n const mediumIdx = THINK_LEVEL_CYCLE.indexOf('medium');\n const base = idx >= 0 ? idx : mediumIdx >= 0 ? mediumIdx : 0;\n return THINK_LEVEL_CYCLE[(base + 1) % THINK_LEVEL_CYCLE.length]!;\n}\n\nconst DOUBLE_ESCAPE_WINDOW_MS = 500;\n\nfunction escapeHtml(text: string): string {\n return text\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;');\n}\n\nfunction exportExtension(format: TuiExportFormat): string {\n if (format === 'json') return 'json';\n if (format === 'markdown') return 'md';\n return 'html';\n}\n\nfunction wrapMarkdownExportAsHtml(markdown: string): string {\n return [\n '<!doctype html>',\n '<html>',\n '<head>',\n '<meta charset=\"utf-8\">',\n '<title>xopc session export</title>',\n '<style>body{font:14px/1.5 system-ui,sans-serif;margin:32px;max-width:960px}pre{white-space:pre-wrap}</style>',\n '</head>',\n '<body>',\n '<pre>',\n escapeHtml(markdown),\n '</pre>',\n '</body>',\n '</html>',\n '',\n ].join('\\n');\n}\n\nfunction defaultExportPath(sessionKey: string, format: TuiExportFormat): string {\n const safeKey = sessionKey.replace(/[^a-z0-9_.-]+/gi, '_').replace(/^_+|_+$/g, '') || 'session';\n const stamp = new Date().toISOString().replace(/[:.]/g, '-');\n return resolve(process.cwd(), `xopc-session-${safeKey}-${stamp}.${exportExtension(format)}`);\n}\n\nfunction userDisplayContentForAttachments(\n text: string,\n attachments: readonly TuiInboundAttachment[] | undefined,\n): string | unknown[] {\n if (!attachments?.length) return text;\n const blocks: unknown[] = [];\n if (text.trim()) {\n blocks.push({ type: 'text', text });\n }\n for (const att of attachments) {\n if (att.mimeType?.startsWith('image/') || att.type === 'image' || att.type === 'photo') {\n blocks.push({ type: 'image', name: att.name });\n continue;\n }\n blocks.push({ type: 'file', name: att.name });\n }\n return blocks;\n}\n\nfunction shellQuote(value: string): string {\n if (/^[A-Za-z0-9_/:@%+=,.-]+$/.test(value)) {\n return value;\n }\n return `'${value.replace(/'/g, `'\\\\''`)}'`;\n}\n\nfunction formatTuiResumeCommand(opts: TuiOptions, sessionKey: string): string {\n const parts = ['xopc', 'tui'];\n if (opts.local === true) {\n parts.push('--local');\n }\n if (opts.url) {\n parts.push('--url', shellQuote(opts.url));\n }\n parts.push('--session', shellQuote(sessionKey));\n return parts.join(' ');\n}\n\nfunction isLoopbackGatewayUrl(rawUrl: string): boolean {\n try {\n const hostname = new URL(rawUrl).hostname.toLowerCase();\n return hostname === 'localhost' || hostname === '127.0.0.1' || hostname === '::1' || hostname === '[::1]';\n } catch {\n return false;\n }\n}\n\nfunction resolveStartupWorkingDirectory(opts: TuiOptions, isLocalMode: boolean): string | undefined {\n const explicit = opts.workdir?.trim();\n if (explicit) {\n return resolve(explicit);\n }\n if (opts.useStartupCwd === false || opts.session?.trim()) {\n return undefined;\n }\n const gatewayUrl = opts.url ?? 'http://localhost:3120';\n if (isLocalMode || isLoopbackGatewayUrl(gatewayUrl)) {\n return process.cwd();\n }\n return undefined;\n}\n\nfunction isPathSameOrInside(parentDir: string, childDir: string): boolean {\n const rel = relative(resolve(parentDir), resolve(childDir));\n return rel === '' || (!!rel && !rel.startsWith('..') && !isAbsolute(rel));\n}\n\nfunction assistantMessagePlainText(message: AgentMessage): string {\n const content = (message as { content?: unknown }).content;\n if (typeof content === 'string') return content;\n if (!Array.isArray(content)) return '';\n return content\n .map((block) => {\n if (!block || typeof block !== 'object') return '';\n const rec = block as { type?: unknown; text?: unknown };\n return rec.type === 'text' && typeof rec.text === 'string' ? rec.text : '';\n })\n .join('');\n}\n\nexport async function runTui(opts: TuiOptions): Promise<TuiResult> {\n const stdioFilter = installTuiStdioFilter();\n const restoreStdio = () => stdioFilter.restore();\n\n const isLocalMode = opts.local === true;\n const config = loadConfig();\n const startup = resolveTuiStartupSessionKey({\n cfg: config,\n sessionOption: opts.session,\n cwd: process.cwd(),\n });\n let currentAgentId = startup.agentId;\n const sessionScope = startup.sessionScope;\n const sessionMainKey = startup.sessionMainKey;\n const resolveSessionKey = (raw?: string) =>\n resolveTuiSessionKey({\n raw,\n sessionScope,\n currentAgentId,\n sessionMainKey,\n });\n let tuiSettings = loadTuiSettings();\n initTuiTheme({ themeId: opts.theme ?? tuiSettings.theme });\n const state = createInitialState(startup.sessionKey);\n const startupWorkingDirectory = resolveStartupWorkingDirectory(opts, isLocalMode);\n const implicitTrustedWorkspace = startupWorkingDirectory ?? (isLocalMode ? process.cwd() : undefined);\n const projectTrustStore = new ProjectTrustStore();\n let projectTrustSessionDecision: boolean | null = null;\n const isCurrentProjectTrusted = () => {\n if (projectTrustSessionDecision !== null) return projectTrustSessionDecision;\n const persisted = projectTrustStore.get(process.cwd());\n if (persisted !== null) return persisted;\n if (!hasTrustRequiringProjectResources(process.cwd())) return true;\n return !!implicitTrustedWorkspace && isPathSameOrInside(implicitTrustedWorkspace, process.cwd());\n };\n const sessionStateDir = resolveStateDir();\n const sessionDatabasePath = resolveXopcDatabasePath();\n const sessionSnapshot = new TuiSessionSnapshot(\n () => state.currentSessionKey,\n () => process.cwd(),\n () => state.sessionInfo.displayName,\n () => `${sessionDatabasePath}#session=${encodeURIComponent(state.currentSessionKey)}`,\n () => sessionStateDir,\n );\n state.scopedModelRefs = loadScopedModelRefs();\n state.showThinking = tuiSettings.showThinking;\n state.toolsExpanded = tuiSettings.toolsExpanded;\n let pendingImageAttachments: TuiInboundAttachment[] = [];\n const pendingNextTurnCustomMessages: string[] = [];\n let lastRetryMessageText: string | null = null;\n let setExtensionLabel = (_entryId: string, _label: string | undefined): void => {};\n let sendExtensionUserMessage = (\n _content: ExtensionUserMessageContent,\n _options?: ExtensionSendUserMessageOptions,\n ): void => {};\n let appendExtensionEntry = <T = unknown>(_customType: string, _data?: T): void => {};\n let sendExtensionMessage = <T = unknown>(\n _message: ExtensionCustomMessage<T>,\n _options?: ExtensionSendMessageOptions,\n ): void => {};\n\n let extensionRegistry: ExtensionRegistryImpl | undefined;\n if (isLocalMode) {\n extensionRegistry = await loadExtensionsForTuiLocalMode({\n setLabel: (entryId, label) => setExtensionLabel(entryId, label),\n sendUserMessage: (content, options) => sendExtensionUserMessage(content, options),\n appendEntry: (customType, data) => appendExtensionEntry(customType, data),\n sendMessage: (message, options) => sendExtensionMessage(message, options),\n });\n }\n\n const client: TuiBackend = isLocalMode\n ? new EmbeddedBackend({\n extensionRegistry,\n implicitTrustedWorkspace,\n isWorkspaceTrusted: () => projectTrustSessionDecision,\n })\n : new GatewaySseBackend({ url: opts.url ?? 'http://localhost:3120', token: opts.token });\n if (startupWorkingDirectory) {\n state.sessionInfo.effectiveWorkspacePath = startupWorkingDirectory;\n }\n let startupWorkingDirectoryApplied = false;\n\n const keybindings = createXopcTuiKeybindingsManager();\n setKeybindings(keybindings);\n\n let modelChoices: TuiModelChoice[] = [];\n const cycleModelChoices = (): TuiModelChoice[] =>\n filterModelsForCycle(modelChoices, state.scopedModelRefs);\n\n const refreshCycleModels = () => {\n bottomBar.invalidate();\n tui.requestRender();\n };\n\n const tui = new TUI(new ProcessTerminal());\n tui.setShowHardwareCursor(tuiSettings.showHardwareCursor);\n tui.setClearOnShrink(tuiSettings.clearOnShrink);\n const dedupeBackspace = createBackspaceDeduper();\n tui.addInputListener((data) => {\n const next = dedupeBackspace(data);\n if (next.length === 0) {\n return { consume: true };\n }\n return { data: next };\n });\n\n const header = new TuiHeader(() => ({\n version: packageJson.version ?? 'dev',\n connectionLabel: client.connectionLabel,\n sessionKey: state.currentSessionKey,\n showHints: tuiSettings.showStartupHints,\n }), keybindings);\n const statusContainer = new Container();\n const bottomBar = new TuiBottomBar(\n () => state,\n () => opts.thinking,\n () => formatKeyIds(keybindings, 'app.message.dequeue', { capitalize: true }),\n );\n const chatLog = new ChatLog(keybindings);\n let startupResources: TuiStartupResources | undefined;\n let startupCardShown = false;\n chatLog.setShowThinking(state.showThinking);\n chatLog.setToolsExpanded(state.toolsExpanded);\n chatLog.setToolImageOptions({\n showImages: tuiSettings.showImages,\n imageWidthCells: tuiSettings.imageWidthCells,\n cwd: process.cwd(),\n });\n setExtensionLabel = (entryId, label) => {\n sessionSnapshot.setLabel(entryId, label);\n void client\n .setTranscriptLabel(state.currentSessionKey, entryId, label)\n .catch((err: unknown) => {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Label update failed: ${errorMessage}`);\n })\n .finally(() => {\n updateFooter();\n tui.requestRender();\n });\n };\n appendExtensionEntry = (customType, data) => {\n const normalized = customType.trim();\n if (!normalized) {\n throw new Error('appendEntry requires customType.');\n }\n sessionSnapshot.appendCustomEntry(normalized, data);\n void client\n .appendCustomEntry(state.currentSessionKey, normalized, data)\n .catch((err: unknown) => {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Custom entry append failed: ${errorMessage}`);\n })\n .finally(() => {\n updateFooter();\n tui.requestRender();\n });\n };\n sendExtensionMessage = (message, options) => {\n const customType = message.customType.trim();\n if (!customType) {\n throw new Error('sendMessage requires customType.');\n }\n const display = message.display ?? true;\n const nextMessage = {\n customType,\n content: message.content,\n display,\n details: message.details,\n };\n sessionSnapshot.appendCustomMessage(nextMessage);\n if (display) {\n chatLog.addCustomMessage({\n customType,\n content: extensionCustomMessageContentToText(message.content),\n rawContent: message.content,\n details: message.details,\n display,\n });\n tui.requestRender();\n }\n const persist = client\n .appendCustomMessage(state.currentSessionKey, nextMessage)\n .catch((err: unknown) => {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Custom message append failed: ${errorMessage}`);\n throw err;\n })\n .finally(() => {\n updateFooter();\n tui.requestRender();\n });\n\n const turnText = extensionCustomMessageToTurnText(nextMessage).trim();\n if (!turnText) {\n return;\n }\n void persist.then(() => {\n const controlText = `Continue with the extension message \"${customType}\" above.`;\n if (options?.deliverAs === 'nextTurn') {\n pendingNextTurnCustomMessages.push(controlText);\n chatLog.addSystem(\n theme.dim(`Queued extension message for next turn (${pendingNextTurnCustomMessages.length}).`),\n );\n bottomBar.invalidate();\n tui.requestRender();\n return;\n }\n if (state.activeRunId) {\n if (options?.deliverAs === 'followUp') {\n state.messageFollowUpQueue.push(controlText);\n chatLog.addSystem(\n theme.dim(\n `Queued extension follow-up (${state.messageFollowUpQueue.length} in queue). ${tuiSettings.followUpMode === 'all' ? 'All queued messages send together when this reply finishes.' : 'Next sends when this reply finishes.'}`,\n ),\n );\n bottomBar.invalidate();\n tui.requestRender();\n return;\n }\n steerMessage(turnText);\n return;\n }\n if (options?.triggerTurn) {\n sendMessage(controlText);\n }\n }).catch(() => {});\n };\n const defaultEditor = new CustomEditor(tui, editorTheme, keybindings, {\n paddingX: tuiSettings.editorPaddingX,\n autocompleteMaxVisible: tuiSettings.autocompleteMaxVisible,\n });\n let editor: EditorComponent = defaultEditor;\n let editorComponentFactory: TuiEditorFactory | undefined;\n const editorContainer = new Container();\n editorContainer.addChild(editor as Component);\n const root = new Container();\n root.addChild(header);\n root.addChild(chatLog);\n root.addChild(statusContainer);\n root.addChild(editorContainer);\n root.addChild(bottomBar);\n tui.addChild(root);\n tui.setFocus(editor as Component);\n\n let isBashMode = false;\n let isBashExcludeContext = false;\n\n const updateEditorBorderColor = () => {\n if (isBashMode) {\n editor.borderColor = isBashExcludeContext\n ? getBashExcludeBorderColor()\n : getBashModeBorderColor();\n } else {\n const level = state.sessionInfo.thinkingLevel ?? opts.thinking ?? 'off';\n editor.borderColor = getThinkingBorderColor(level);\n }\n tui.requestRender();\n };\n\n editor.onChange = (text: string) => {\n const trimmed = text.trimStart();\n const nextExclude = trimmed.startsWith('!!');\n const nextBash = trimmed.startsWith('!');\n if (nextBash !== isBashMode || nextExclude !== isBashExcludeContext) {\n isBashMode = nextBash;\n isBashExcludeContext = nextExclude;\n updateEditorBorderColor();\n }\n };\n\n const copyDefaultEditorAppHandlers = (target: EditorComponent) => {\n const customEditor = target as unknown as {\n actionHandlers?: unknown;\n onEscape?: () => void;\n onCtrlD?: () => void;\n onPasteImage?: () => void;\n onExtensionShortcut?: (data: string) => boolean;\n };\n if (!(customEditor.actionHandlers instanceof Map)) return;\n customEditor.onEscape ??= () => defaultEditor.onEscape?.();\n customEditor.onCtrlD ??= () => defaultEditor.onCtrlD?.();\n customEditor.onPasteImage ??= () => defaultEditor.onPasteImage?.();\n customEditor.onExtensionShortcut ??= (data: string) =>\n defaultEditor.onExtensionShortcut?.(data) ?? false;\n for (const [action, handler] of defaultEditor.actionHandlers) {\n customEditor.actionHandlers.set(action, handler);\n }\n };\n\n const setEditorExtensionShortcut = () => {\n const customEditor = editor as unknown as {\n onExtensionShortcut?: (data: string) => boolean;\n };\n customEditor.onExtensionShortcut = (data: string) => extensionRuntime.handleShortcut(data);\n };\n\n const setEditorComponent = (factory: TuiEditorFactory | undefined) => {\n editorComponentFactory = factory;\n const currentText = editor.getText();\n editorContainer.clear();\n if (factory) {\n const nextEditor = factory(tui, editorTheme, keybindings) as EditorComponent;\n nextEditor.onSubmit = defaultEditor.onSubmit;\n nextEditor.onChange = defaultEditor.onChange;\n nextEditor.setText(currentText);\n if (nextEditor.borderColor !== undefined) {\n nextEditor.borderColor = defaultEditor.borderColor;\n }\n nextEditor.setPaddingX?.(tuiSettings.editorPaddingX);\n nextEditor.setAutocompleteMaxVisible?.(tuiSettings.autocompleteMaxVisible);\n nextEditor.setAutocompleteProvider?.(extensionRuntime.autocompleteProvider);\n copyDefaultEditorAppHandlers(nextEditor);\n editor = nextEditor;\n } else {\n defaultEditor.setText(currentText);\n editor = defaultEditor;\n }\n editorContainer.addChild(editor as Component);\n setEditorExtensionShortcut();\n tui.setFocus(editor as Component);\n updateEditorBorderColor();\n tui.requestRender();\n };\n\n let activeEditorSelectorClose: (() => void) | null = null;\n\n const closeEditorSelector = () => {\n const close = activeEditorSelectorClose;\n close?.();\n };\n\n const openEditorSelector = (component: Component, focus: Component = component) => {\n closeEditorSelector();\n editorContainer.clear();\n editorContainer.addChild(component);\n tui.setFocus(focus);\n tui.requestRender();\n const close = () => {\n if (activeEditorSelectorClose !== close) return;\n activeEditorSelectorClose = null;\n editorContainer.clear();\n editorContainer.addChild(editor as Component);\n tui.setFocus(editor as Component);\n tui.requestRender();\n };\n activeEditorSelectorClose = close;\n return close;\n };\n\n const openCommandOverlay = (\n component: Component,\n _options?: OverlayOptions,\n ): OverlayHandle => {\n let hidden = false;\n let closeCurrent = openEditorSelector(component, component);\n return {\n hide: () => closeCurrent(),\n setHidden: (nextHidden: boolean) => {\n hidden = nextHidden;\n if (nextHidden) {\n closeCurrent();\n } else {\n closeCurrent = openEditorSelector(component, component);\n }\n },\n isHidden: () => hidden,\n focus: () => tui.setFocus(component),\n unfocus: () => tui.setFocus(editor as Component),\n isFocused: () => false,\n };\n };\n\n const closeCommandOverlay = () => {\n closeEditorSelector();\n };\n\n const slashCommands = getSlashCommands(isLocalMode, keybindings);\n const resourceSlashCommands: SlashCommandDef[] = [];\n const skillSlashCommands: SlashCommandDef[] = [];\n const workflowSlashCommands: SlashCommandDef[] = [];\n const visibleWorkflowRunIds = new Set<string>();\n const syncResourceSlashCommands = (resources: TuiStartupResources | undefined) => {\n resourceSlashCommands.length = 0;\n skillSlashCommands.length = 0;\n for (const name of resources?.skills ?? []) {\n const skillName = name.trim();\n if (!skillName) continue;\n const command = {\n name: `skill:${skillName}`,\n description: 'Apply skill to the next turn',\n };\n skillSlashCommands.push(command);\n resourceSlashCommands.push(command);\n }\n workflowSlashCommands.length = 0;\n for (const name of resources?.workflows ?? []) {\n const workflowName = name.trim();\n if (!workflowName) continue;\n const command = {\n name: `workflow:${workflowName}`,\n description: 'Run workflow',\n };\n workflowSlashCommands.push(command);\n resourceSlashCommands.push(command);\n }\n };\n let extensionWorkingMessage: string | undefined;\n let extensionWorkingVisible = true;\n let extensionWorkingIndicator: LoaderIndicatorOptions | undefined;\n\n const getAllExtensionThemes = () => {\n const customDir = getCustomThemesDir();\n return listAvailableThemeIds().map((name) => ({\n name,\n path: name === 'auto' || name === 'dark' || name === 'light'\n ? undefined\n : join(customDir, `${name}.json`),\n }));\n };\n\n const getExtensionTheme = (name: string) => {\n const normalized = name.trim().toLowerCase() || 'auto';\n if (!listAvailableThemeIds().includes(normalized)) return undefined;\n const currentTheme = tuiSettings.theme;\n applyThemeById(normalized);\n const resolved = getThemeExports().theme;\n applyThemeById(currentTheme);\n return resolved;\n };\n\n const setExtensionTheme = (nextTheme: string) => {\n const normalized = nextTheme.trim().toLowerCase() || 'auto';\n if (!listAvailableThemeIds().includes(normalized)) {\n return { success: false, error: `Unknown theme: ${nextTheme}` };\n }\n try {\n resolveThemePalette(normalized);\n tuiSettings = { ...tuiSettings, theme: normalized };\n saveTuiSettings(tuiSettings);\n applyThemeById(normalized);\n updateEditorBorderColor();\n chatLog.invalidate();\n header.invalidate();\n bottomBar.invalidate();\n tui.requestRender();\n return { success: true };\n } catch (err) {\n return {\n success: false,\n error: err instanceof Error ? err.message : String(err),\n };\n }\n };\n\n const getAvailableProviderCount = () =>\n getAllProviders().filter((provider) => isProviderConfiguredSync(provider)).length;\n\n const getExtensionSystemPrompt = () =>\n resolveEffectiveAgentProfileForSession(config, state.currentSessionKey).systemPromptOverride ?? '';\n\n const waitForTuiIdle = async () => {\n while (\n state.activeRunId != null ||\n state.isCompacting ||\n state.activityStatus === 'sending' ||\n state.activityStatus === 'waiting' ||\n state.activityStatus === 'streaming' ||\n state.activityStatus === 'running' ||\n state.activityStatus === 'compacting'\n ) {\n await new Promise((resolveDelay) => setTimeout(resolveDelay, 50));\n }\n };\n\n const createReplacementContext = (): TuiReplacedSessionContext => {\n const model = state.sessionInfo.model\n ? {\n ...(state.sessionInfo.modelProvider ? { provider: state.sessionInfo.modelProvider } : {}),\n id: state.sessionInfo.model,\n ref: state.sessionInfo.modelProvider\n ? `${state.sessionInfo.modelProvider}/${state.sessionInfo.model}`\n : state.sessionInfo.model,\n contextWindow: state.sessionInfo.contextWindow ?? null,\n }\n : undefined;\n return {\n mode: 'tui',\n hasUI: true,\n signal: client.getActiveSignal?.(),\n ui: {\n select: async () => undefined,\n confirm: async () => false,\n input: async () => undefined,\n notify: (message, level) => {\n const prefix = level === 'error' ? 'Error: ' : level === 'warn' || level === 'warning' ? 'Warning: ' : '';\n chatLog.addSystem(`${prefix}${message}`);\n tui.requestRender();\n },\n onTerminalInput: (handler) => tui.addInputListener(handler),\n setStatus: () => {},\n setWorkingMessage: (message) => {\n extensionWorkingMessage = message?.trim() || undefined;\n renderStatus();\n },\n setWorkingVisible: (visible) => {\n extensionWorkingVisible = visible;\n renderStatus();\n },\n setWorkingIndicator: (indicator) => {\n extensionWorkingIndicator = indicator ?? undefined;\n statusLoader?.setIndicator(indicator ?? undefined);\n renderStatus();\n },\n setHiddenThinkingLabel: (label) => {\n chatLog.setHiddenThinkingLabel(label ?? undefined);\n tui.requestRender();\n },\n setWidget: () => {},\n setFooter: () => {},\n setHeader: () => {},\n custom: async () => undefined as never,\n setTitle: (title) => tui.terminal.setTitle(title),\n pasteToEditor: (text) => editor.handleInput(`\\x1b[200~${text}\\x1b[201~`),\n setEditorText: (text) => editor.setText(text),\n getEditorText: () => editor.getExpandedText?.() ?? editor.getText(),\n editor: async () => undefined,\n addAutocompleteProvider: () => () => {},\n setEditorComponent,\n getEditorComponent: () => editorComponentFactory,\n theme,\n getAllThemes: getAllExtensionThemes,\n getTheme: getExtensionTheme,\n setTheme: setExtensionTheme,\n getToolsExpanded: () => state.toolsExpanded,\n setToolsExpanded: (expanded) => {\n state.toolsExpanded = expanded;\n tuiSettings = { ...tuiSettings, toolsExpanded: expanded };\n saveTuiSettings(tuiSettings);\n chatLog.setToolsExpanded(expanded);\n updateFooter();\n tui.requestRender();\n },\n },\n sessionManager: sessionSnapshot.manager(),\n modelRegistry: {\n find(provider, modelId) {\n return getAllModels().find(\n (candidate) => candidate.provider === provider && candidate.id === modelId,\n ) as unknown as TuiModelRegistryModel | undefined;\n },\n async getApiKeyAndHeaders(nextModel) {\n const provider = typeof nextModel.provider === 'string' ? nextModel.provider : undefined;\n if (!provider) return { ok: false, error: 'Model provider is missing.' };\n try {\n return { ok: true, apiKey: await getApiKey(provider), headers: {} };\n } catch (error) {\n return { ok: false, error: error instanceof Error ? error.message : String(error) };\n }\n },\n },\n model,\n cwd: process.cwd(),\n sessionKey: state.currentSessionKey,\n isProjectTrusted: isCurrentProjectTrusted,\n isIdle: () => !state.activeRunId && !state.isCompacting,\n hasPendingMessages: () =>\n state.messageFollowUpQueue.length > 0 ||\n state.steeringQueue.length > 0 ||\n state.compactionQueue.length > 0,\n abort: () => abortActive(),\n shutdown: () => requestExit(),\n compact: (options) => runCompaction(options?.customInstructions, {\n onComplete: options?.onComplete,\n onError: options?.onError,\n }),\n getSystemPrompt: getExtensionSystemPrompt,\n getSystemPromptOptions: () => ({\n cwd: process.cwd(),\n sessionKey: state.currentSessionKey,\n ...(model ? { model } : {}),\n }),\n waitForIdle: waitForTuiIdle,\n newSession: (options) => runExtensionNewSession(options),\n fork: (entryId, options) => runExtensionFork(entryId, options),\n navigateTree: (targetId, options) => runExtensionNavigateTree(targetId, options),\n switchSession: (sessionPath, options) => runExtensionSwitchSession(sessionPath, options),\n reload: async () => {\n await loadSessionHistory({ merge: true });\n await refreshSessionInfoWithBorder();\n },\n getModel: () => model,\n setModel: (modelRef) => switchCurrentModel(modelRef),\n getThinkingLevel: () => state.sessionInfo.thinkingLevel as TuiThinkingLevel | undefined,\n setThinkingLevel,\n getReasoningLevel: () => state.sessionInfo.reasoningLevel as TuiReasoningLevel | undefined,\n setReasoningLevel,\n getVerboseLevel: () => state.sessionInfo.verboseLevel as TuiVerboseLevel | undefined,\n setVerboseLevel,\n getCommands: () => slashCommands.map((command) => ({\n name: command.name,\n description: command.description,\n source: 'builtin' as const,\n })),\n getContextUsage: () => {\n const tokens = state.sessionInfo.totalTokens ?? state.sessionInfo.contextTokens ?? null;\n const contextWindow = state.sessionInfo.contextWindow ?? null;\n const percent = state.sessionInfo.contextUsagePercent ?? null;\n if (tokens == null && contextWindow == null) return undefined;\n return {\n estimatedTokens: tokens,\n tokens,\n contextWindow,\n usagePercent: percent,\n percent,\n };\n },\n notify: (message, level) => {\n const prefix = level === 'error' ? 'Error: ' : level === 'warn' || level === 'warning' ? 'Warning: ' : '';\n chatLog.addSystem(`${prefix}${message}`);\n tui.requestRender();\n },\n sendMessage: async (message, options) => sendExtensionMessage(message, options),\n sendUserMessage: async (content, options) =>\n sendExtensionUserMessage(content as ExtensionUserMessageContent, options),\n };\n };\n\n const runWithReplacementContext = async (\n callback: ((ctx: TuiReplacedSessionContext) => Promise<void>) | undefined,\n ) => {\n if (callback) {\n await callback(createReplacementContext());\n }\n };\n\n const runExtensionNewSession = async (\n options?: TuiNewSessionOptions,\n ): Promise<TuiReplacementResult> => {\n await abortActive({ clearUi: false });\n const targetKey = resolveSessionKey(`session-${randomUUID()}`);\n await setSession(targetKey);\n await options?.setup?.(sessionSnapshot.manager());\n await runWithReplacementContext(options?.withSession);\n return { cancelled: false };\n };\n\n const runExtensionFork = async (\n entryId: string,\n options?: TuiForkOptions,\n ): Promise<TuiReplacementResult> => {\n const rowNumber = transcriptTreeEntryIdToRowNumber(entryId);\n if (rowNumber == null) {\n throw new Error(`Invalid entry ID for forking: ${entryId}`);\n }\n const throughRow = options?.position === 'before' ? rowNumber - 1 : rowNumber;\n if (throughRow <= 0) {\n throw new Error(`Invalid entry ID for forking: ${entryId}`);\n }\n const sourceSessionKey = state.currentSessionKey;\n const targetKey = resolveSessionKey(`fork-${randomUUID()}`);\n await abortActive({ clearUi: false });\n const result = await client.forkSessionAt(sourceSessionKey, targetKey, `row-${throughRow}`);\n await setSession(result.sessionKey);\n chatLog.addBranchSummary({\n sourceSessionKey,\n targetSessionKey: result.sessionKey,\n rowCount: result.rowCount,\n entryId,\n });\n await runWithReplacementContext(options?.withSession);\n return { cancelled: false };\n };\n\n const runExtensionNavigateTree = async (\n targetId: string,\n options?: TuiNavigateTreeOptions,\n ): Promise<TuiReplacementResult> => {\n if (options?.label) {\n setExtensionLabel(targetId, options.label);\n }\n return runExtensionFork(targetId, { position: 'at' });\n };\n\n const runExtensionSwitchSession = async (\n sessionPath: string,\n options?: TuiSwitchSessionOptions,\n ): Promise<TuiReplacementResult> => {\n await abortActive({ clearUi: false });\n await setSession(sessionPath);\n await runWithReplacementContext(options?.withSession);\n return { cancelled: false };\n };\n\n const extensionRuntime = createTuiExtensionRuntime({\n registry: extensionRegistry,\n tui,\n chatLog,\n header,\n bottomBar,\n getState: () => state,\n baseSlashCommands: slashCommands,\n additionalSlashCommands: resourceSlashCommands,\n keybindings,\n addInputListener: (handler) => tui.addInputListener(handler),\n setTitle: (title) => tui.terminal.setTitle(title),\n pasteToEditor: (text) => editor.handleInput(`\\x1b[200~${text}\\x1b[201~`),\n setEditorText: (text) => editor.setText(text),\n getEditorText: () => editor.getExpandedText?.() ?? editor.getText(),\n setEditorComponent,\n getEditorComponent: () => editorComponentFactory,\n searchWorkspaceFiles: (sessionKey, query, options) =>\n client.searchWorkspaceFiles?.(sessionKey, query, options) ?? Promise.resolve([]),\n getThemeObject: () => theme,\n getAllThemes: getAllExtensionThemes,\n getTheme: getExtensionTheme,\n setTheme: setExtensionTheme,\n getToolsExpanded: () => state.toolsExpanded,\n setToolsExpanded: (expanded) => {\n state.toolsExpanded = expanded;\n tuiSettings = { ...tuiSettings, toolsExpanded: expanded };\n saveTuiSettings(tuiSettings);\n chatLog.setToolsExpanded(expanded);\n updateFooter();\n tui.requestRender();\n },\n getAvailableProviderCount,\n getActiveSignal: () => client.getActiveSignal?.(),\n isProjectTrusted: isCurrentProjectTrusted,\n getSessionManager: () => sessionSnapshot.manager(),\n getSystemPrompt: getExtensionSystemPrompt,\n getSystemPromptOptions: () => ({\n cwd: process.cwd(),\n sessionKey: state.currentSessionKey,\n ...(state.sessionInfo.model\n ? {\n model: {\n ...(state.sessionInfo.modelProvider ? { provider: state.sessionInfo.modelProvider } : {}),\n id: state.sessionInfo.model,\n ref: state.sessionInfo.modelProvider\n ? `${state.sessionInfo.modelProvider}/${state.sessionInfo.model}`\n : state.sessionInfo.model,\n contextWindow: state.sessionInfo.contextWindow ?? null,\n },\n }\n : {}),\n }),\n waitForIdle: waitForTuiIdle,\n newSession: runExtensionNewSession,\n forkSession: runExtensionFork,\n navigateTree: runExtensionNavigateTree,\n switchSession: runExtensionSwitchSession,\n reload: async () => {\n await loadSessionHistory();\n await refreshSessionInfoWithBorder();\n },\n sendUserMessage: async (content, options) =>\n sendExtensionUserMessage(content as ExtensionUserMessageContent, options),\n sendMessage: async (message, options) => sendExtensionMessage(message, options),\n cwd: process.cwd(),\n fdPath: resolveFdPath(),\n openOverlay: openCommandOverlay,\n closeOverlay: closeCommandOverlay,\n onInvalidate: () => {\n updateHeader();\n updateFooter();\n tui.requestRender();\n },\n abortActive: () => abortActive(),\n requestExit: () => requestExit(),\n compactSession: (options) => runCompaction(options?.customInstructions, {\n onComplete: options?.onComplete,\n onError: options?.onError,\n }),\n setModel: (modelRef) => switchCurrentModel(modelRef),\n setThinkingLevel: (level) => setThinkingLevel(level),\n setReasoningLevel: (level) => setReasoningLevel(level),\n setVerboseLevel: (level) => setVerboseLevel(level),\n setWorkingMessage: (message?: string) => {\n extensionWorkingMessage = message?.trim() || undefined;\n renderStatus();\n },\n setWorkingVisible: (visible: boolean) => {\n extensionWorkingVisible = visible;\n renderStatus();\n },\n setWorkingIndicator: (indicator?: LoaderIndicatorOptions) => {\n extensionWorkingIndicator = indicator;\n statusLoader?.setIndicator(indicator);\n renderStatus();\n },\n });\n\n editor.setAutocompleteProvider?.(extensionRuntime.autocompleteProvider);\n setEditorExtensionShortcut();\n\n let statusLoader: Loader | null = null;\n let statusStartedAt: number | null = null;\n let lastActivityStatus = '';\n let elapsedTimerId: ReturnType<typeof setInterval> | null = null;\n const busyStates = new Set(['sending', 'waiting', 'streaming', 'running', 'compacting', 'recovering']);\n\n const syncTerminalProgress = () => {\n if (!tuiSettings.showTerminalProgress) {\n tui.terminal.setProgress(false);\n return;\n }\n tui.terminal.setProgress(busyStates.has(state.activityStatus));\n };\n\n let lastStreamActivityAt = Date.now();\n let streamWatchdogId: ReturnType<typeof setInterval> | null = null;\n\n const touchStreamingActivity = () => {\n lastStreamActivityAt = Date.now();\n if (state.activeRunId && state.runStatus.lastActivityAt == null) {\n state.runStatus = {\n ...state.runStatus,\n runId: state.activeRunId,\n lastActivityAt: lastStreamActivityAt,\n };\n }\n };\n\n const formatElapsed = (startMs: number) => {\n const totalSeconds = Math.max(0, Math.floor((Date.now() - startMs) / 1000));\n if (totalSeconds < 60) return `${totalSeconds}s`;\n const minutes = Math.floor(totalSeconds / 60);\n const seconds = totalSeconds % 60;\n return `${minutes}m ${seconds}s`;\n };\n\n const renderStatus = () => {\n const isBusy = busyStates.has(state.activityStatus);\n if (isBusy && extensionWorkingVisible) {\n if (!statusStartedAt || lastActivityStatus !== state.activityStatus) {\n statusStartedAt = Date.now();\n }\n if (!statusLoader) {\n statusContainer.clear();\n statusLoader = new Loader(\n tui,\n (spinner) => theme.accent(spinner),\n (text) => theme.bold(theme.accentSoft(text)),\n '',\n extensionWorkingIndicator,\n );\n statusContainer.addChild(statusLoader);\n }\n const elapsed = formatElapsed(statusStartedAt);\n const loaderMessage = state.progressMessage ?? extensionWorkingMessage ?? state.activityStatus;\n statusLoader.setMessage(\n `${loaderMessage} • ${elapsed} | ${state.connectionStatus}`,\n );\n if (!elapsedTimerId) {\n elapsedTimerId = setInterval(() => {\n if (statusStartedAt && statusLoader) {\n const el = formatElapsed(statusStartedAt);\n const message = state.progressMessage ?? extensionWorkingMessage ?? state.activityStatus;\n statusLoader.setMessage(\n `${message} • ${el} | ${state.connectionStatus}`,\n );\n }\n }, 1000);\n }\n } else {\n if (!isBusy) {\n state.progressMessage = null;\n statusStartedAt = null;\n }\n if (elapsedTimerId) {\n clearInterval(elapsedTimerId);\n elapsedTimerId = null;\n }\n statusLoader?.stop();\n statusLoader = null;\n statusContainer.clear();\n }\n lastActivityStatus = state.activityStatus;\n bottomBar.invalidate();\n syncTerminalProgress();\n tui.requestRender();\n };\n\n const setActivityStatus = (status: string) => {\n state.activityStatus = status as TuiState['activityStatus'];\n renderStatus();\n };\n\n const setConnectionStatus = (text: string) => {\n state.connectionStatus = text;\n renderStatus();\n };\n\n const updateHeader = () => {\n header.invalidate();\n syncTerminalTitle();\n };\n\n const syncTerminalTitle = () => {\n const shortKey =\n state.currentSessionKey.length > 48\n ? `${state.currentSessionKey.slice(0, 45)}…`\n : state.currentSessionKey;\n tui.terminal.setTitle(`xopc · ${shortKey}`);\n };\n\n const updateFooter = () => {\n bottomBar.invalidate();\n };\n\n const refreshModelChoices = async () => {\n try {\n modelChoices = await client.listModels();\n } catch {\n modelChoices = [];\n }\n bottomBar.invalidate();\n tui.requestRender();\n };\n\n let finishTui: (() => void) | null = null;\n let exitResult: TuiResult = { exitReason: 'exit' };\n\n const requestExit = () => {\n if (state.exitRequested) return;\n state.exitRequested = true;\n if (elapsedTimerId) {\n clearInterval(elapsedTimerId);\n elapsedTimerId = null;\n }\n if (streamWatchdogId) {\n clearInterval(streamWatchdogId);\n streamWatchdogId = null;\n }\n client.stop();\n tui.terminal.setProgress(false);\n void drainAndStopTuiSafely(tui).then(() => {\n restoreStdio();\n process.stdout.write(\n `\\nTo resume this session: ${formatTuiResumeCommand(opts, state.currentSessionKey)}\\n`,\n );\n finishTui?.();\n process.exit(0);\n });\n };\n\n const sessionActions = createSessionActions({\n client,\n chatLog,\n tui,\n state,\n resolveSessionKey,\n updateHeader,\n updateFooter,\n setActivityStatus,\n sessionSnapshot,\n onAgentIdChange: (agentId) => {\n currentAgentId = agentId;\n },\n });\n\n const {\n refreshSessionInfo,\n loadHistory: loadSessionHistory,\n setSession,\n abortActive,\n resetCurrentSession,\n clearChatForSessionSwitch,\n } = sessionActions;\n\n const refreshSessionInfoWithBorder = async () => {\n await refreshSessionInfo();\n updateEditorBorderColor();\n };\n\n const refreshStartupResources = async () => {\n if (!client.getStartupResources) {\n startupResources = undefined;\n syncResourceSlashCommands(undefined);\n return;\n }\n try {\n startupResources = await client.getStartupResources(state.currentSessionKey);\n } catch {\n startupResources = undefined;\n }\n syncResourceSlashCommands(startupResources);\n };\n\n const showStartupCardOnce = () => {\n if (startupCardShown) return;\n startupCardShown = true;\n chatLog.addSystem(formatTuiStartupText({\n state,\n isLocal: isLocalMode,\n keybindings,\n resources: startupResources,\n expanded: false,\n }));\n };\n\n const applyStartupWorkingDirectory = async () => {\n if (startupWorkingDirectoryApplied || !startupWorkingDirectory) return;\n startupWorkingDirectoryApplied = true;\n await client.patchSession(state.currentSessionKey, {\n workingDirectory: startupWorkingDirectory,\n });\n state.sessionInfo.effectiveWorkspacePath = startupWorkingDirectory;\n state.sessionInfo.workingDirectoryLocked = true;\n };\n\n let streamRecoveryPromise: Promise<void> | null = null;\n const recoverActiveRunFromHistory = (reason: string) => {\n if (!state.activeRunId) return Promise.resolve();\n if (streamRecoveryPromise) return streamRecoveryPromise;\n const runId = state.activeRunId;\n markRunRecovering(state, Date.now());\n state.progressMessage = 'recovering stream history';\n setActivityStatus('recovering');\n streamRecoveryPromise = (async () => {\n try {\n await loadSessionHistory();\n await refreshSessionInfoWithBorder();\n if (state.activeRunId === runId) {\n clearSeenStreamEventsForRun(runId);\n if (client.resumeChat) {\n const resumed = await client.resumeChat({ sessionKey: state.currentSessionKey, runId });\n if (resumed.ok) {\n state.progressMessage = 'resuming stream';\n setActivityStatus('recovering');\n chatLog.addSystem(theme.dim(`Reattached to active run after ${reason}.`));\n } else {\n markRunRecoveryComplete(state, Date.now());\n state.progressMessage = 'stream stalled; resume unavailable';\n setActivityStatus('stalled');\n chatLog.addSystem(\n theme.dim(\n `Recovered persisted history after ${reason}, but could not resume stream: ${resumed.reason ?? 'run relay unavailable'}. Press Escape or /abort to stop it.`,\n ),\n );\n }\n } else {\n markRunRecoveryComplete(state, Date.now());\n state.progressMessage = 'stream stalled; waiting for new events or abort';\n setActivityStatus('stalled');\n chatLog.addSystem(\n theme.dim(\n `Recovered persisted history after ${reason}. Active run is still marked stalled; press Escape or /abort to stop it.`,\n ),\n );\n }\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n chatLog.addSystem(theme.dim(`Stream recovery failed after ${reason}: ${errorMessage}`));\n if (state.activeRunId === runId) {\n markRunRecoveryComplete(state, Date.now());\n setActivityStatus('stalled');\n }\n } finally {\n streamRecoveryPromise = null;\n updateFooter();\n tui.requestRender();\n }\n })();\n return streamRecoveryPromise;\n };\n\n const setThinkingLevel = async (level: ThinkLevel) => {\n try {\n await client.patchSession(state.currentSessionKey, { thinkingLevel: level });\n state.sessionInfo.thinkingLevel = level;\n await refreshSessionInfoWithBorder();\n updateFooter();\n chatLog.addStatus(theme.dim(`Thinking level: ${level}`));\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Thinking level change failed: ${errorMessage}`);\n } finally {\n tui.requestRender();\n }\n };\n\n const setReasoningLevel = async (level: ReasoningLevel) => {\n try {\n await client.patchSession(state.currentSessionKey, { reasoningLevel: level });\n state.sessionInfo.reasoningLevel = level;\n await refreshSessionInfoWithBorder();\n updateFooter();\n chatLog.addStatus(theme.dim(`Reasoning visibility: ${level}`));\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Reasoning visibility change failed: ${errorMessage}`);\n } finally {\n tui.requestRender();\n }\n };\n\n const setVerboseLevel = async (level: VerboseLevel) => {\n try {\n await client.patchSession(state.currentSessionKey, { verboseLevel: level });\n state.sessionInfo.verboseLevel = level;\n await refreshSessionInfoWithBorder();\n updateFooter();\n chatLog.addStatus(theme.dim(`Verbose mode: ${level}`));\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Verbose mode change failed: ${errorMessage}`);\n } finally {\n tui.requestRender();\n }\n };\n\n const copyLastAssistant = async () => {\n const text = chatLog.getLastAssistantText().trim();\n if (!text) {\n chatLog.addSystem('No assistant messages to copy yet.');\n tui.requestRender();\n return;\n }\n try {\n await copyTextToClipboard(text);\n chatLog.addStatus(theme.dim('Copied last assistant message to clipboard'));\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Copy failed: ${errorMessage}`);\n } finally {\n tui.requestRender();\n }\n };\n\n const renameCurrentSession = async (name: string) => {\n const nextName = name.trim();\n if (!nextName) {\n chatLog.addSystem('Usage: /name <name>');\n tui.requestRender();\n return;\n }\n try {\n const result = await client.renameSession(state.currentSessionKey, nextName);\n if (!result.ok) {\n chatLog.addSystem('Session rename failed.');\n tui.requestRender();\n return;\n }\n state.sessionInfo.displayName = nextName;\n updateFooter();\n updateHeader();\n chatLog.addStatus(theme.dim(`Session name set: ${nextName}`));\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Session rename failed: ${errorMessage}`);\n } finally {\n tui.requestRender();\n }\n };\n\n const resolveModelChoiceIndex = (): number => {\n const choices = cycleModelChoices();\n if (choices.length === 0) return -1;\n const p = state.sessionInfo.modelProvider;\n const m = state.sessionInfo.model;\n if (p && m) {\n const byParts = choices.findIndex((x) => x.provider === p && x.id === m);\n if (byParts >= 0) return byParts;\n }\n if (m?.includes('/')) {\n const [a, b] = m.split('/', 2);\n const bySlash = choices.findIndex((x) => x.provider === a && x.id === b);\n if (bySlash >= 0) return bySlash;\n }\n return 0;\n };\n\n const cycleModel = (dir: 'forward' | 'backward') => {\n const choices = cycleModelChoices();\n if (choices.length === 0) {\n void refreshModelChoices().then(() => {\n if (cycleModelChoices().length === 0) {\n chatLog.addSystem('No models available to cycle.');\n tui.requestRender();\n return;\n }\n cycleModel(dir);\n });\n return;\n }\n const idx = resolveModelChoiceIndex();\n const base = idx >= 0 ? idx : 0;\n const delta = dir === 'forward' ? 1 : -1;\n const next = choices[(base + delta + choices.length) % choices.length]!;\n void switchCurrentModel(`${next.provider}/${next.id}`);\n };\n\n const listCurrentModels = async (): Promise<TuiModelChoice[]> => {\n if (modelChoices.length === 0) {\n await refreshModelChoices();\n }\n return modelChoices;\n };\n\n const switchCurrentModel = async (modelRef: string) => {\n const trimmed = modelRef.trim();\n if (!trimmed.includes('/')) {\n chatLog.addSystem('Usage: /switch <provider/model>');\n tui.requestRender();\n return;\n }\n if (modelChoices.length === 0) {\n await refreshModelChoices();\n }\n const [provider, id] = trimmed.split('/', 2);\n const selected = modelChoices.find((choice) => choice.provider === provider && choice.id === id);\n if (!selected) {\n chatLog.addSystem(`Model not found: ${trimmed}`);\n tui.requestRender();\n return;\n }\n try {\n await client.patchSession(state.currentSessionKey, { model: trimmed });\n state.sessionInfo.modelProvider = selected.provider;\n state.sessionInfo.model = selected.id;\n if (selected.contextWindow != null) {\n state.sessionInfo.contextWindow = selected.contextWindow;\n }\n await refreshSessionInfoWithBorder();\n updateFooter();\n updateHeader();\n chatLog.addStatus(theme.dim(`Model: ${trimmed}`));\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Model switch failed: ${errorMessage}`);\n } finally {\n tui.requestRender();\n }\n };\n\n const exportCurrentSession = async (request: TuiExportRequest) => {\n const outputPath = request.outputPath\n ? isAbsolute(request.outputPath)\n ? request.outputPath\n : resolve(process.cwd(), request.outputPath)\n : defaultExportPath(state.currentSessionKey, request.format);\n try {\n const backendFormat = request.format === 'json' ? 'json' : 'markdown';\n const raw = await client.exportSession(state.currentSessionKey, backendFormat);\n const content = request.format === 'html' ? wrapMarkdownExportAsHtml(raw) : raw;\n mkdirSync(dirname(outputPath), { recursive: true });\n writeFileSync(outputPath, content, 'utf8');\n chatLog.addStatus(theme.dim(`Exported ${request.format} session to: ${outputPath}`));\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Export failed: ${errorMessage}`);\n } finally {\n tui.requestRender();\n }\n };\n\n const importSessionExport = async (request: TuiImportRequest) => {\n const rawPath = request.inputPath?.trim();\n if (!rawPath) {\n chatLog.addSystem('Usage: /import <path.json> [target-session]');\n tui.requestRender();\n return;\n }\n const inputPath = isAbsolute(rawPath) ? rawPath : resolve(process.cwd(), rawPath);\n const targetRaw = request.targetKey?.trim() || `import-${randomUUID()}`;\n const targetKey = resolveSessionKey(targetRaw);\n try {\n const content = readFileSync(inputPath, 'utf8');\n const result = await client.importSession(targetKey, content);\n await setSession(result.sessionKey);\n chatLog.addStatus(theme.dim(`Imported ${result.rowCount} transcript rows from: ${inputPath}`));\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Import failed: ${errorMessage}`);\n } finally {\n tui.requestRender();\n }\n };\n\n const createShareLink = async (request: TuiShareRequest) => {\n try {\n chatLog.addStatus(theme.dim(`Creating share for: ${request.path}`));\n tui.requestRender();\n const result = await client.createShare(state.currentSessionKey, request, { agentId: currentAgentId });\n chatLog.addSystem(formatTuiShareResult(result));\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Share failed: ${errorMessage}`);\n } finally {\n tui.requestRender();\n }\n };\n\n const startWorkflowRun = async (request: { definitionId: string; goal?: string }) => {\n if (!client.startWorkflowRun) {\n throw new Error('Workflow runs are not available in this mode.');\n }\n const result = await client.startWorkflowRun({\n sessionKey: state.currentSessionKey,\n definitionId: request.definitionId,\n agentId: currentAgentId,\n goal: request.goal,\n });\n visibleWorkflowRunIds.add(result.runId);\n return result;\n };\n\n const runBtwQuery = async (question: string) => {\n const previousStatus = state.activityStatus;\n const runId = `btw-${randomUUID()}`;\n try {\n setActivityStatus('waiting');\n state.progressMessage = 'btw';\n chatLog.addUser(`/btw ${question}`);\n chatLog.addStatus(theme.dim('BTW running...'));\n tui.requestRender();\n const result = await client.btwQuery(state.currentSessionKey, question);\n if (result.error) {\n chatLog.addSystem(`BTW failed: ${result.error}`);\n return;\n }\n chatLog.finalizeAssistant({\n role: 'assistant',\n content: [{ type: 'text', text: `BTW\\n\\n${result.text}` }],\n timestamp: Date.now(),\n } as AgentMessage, runId);\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`BTW failed: ${errorMessage}`);\n } finally {\n state.activityStatus = previousStatus;\n renderStatus();\n tui.requestRender();\n }\n };\n\n const forkCurrentSession = async (rawKey?: string) => {\n const targetRaw = rawKey?.trim() || `fork-${randomUUID()}`;\n const targetKey = resolveSessionKey(targetRaw);\n if (targetKey === state.currentSessionKey) {\n chatLog.addSystem('Fork target must be different from the current session.');\n tui.requestRender();\n return;\n }\n const sourceSessionKey = state.currentSessionKey;\n try {\n await abortActive({ clearUi: false });\n const result = await client.forkSession(sourceSessionKey, targetKey);\n await setSession(result.sessionKey);\n chatLog.addBranchSummary({\n sourceSessionKey,\n targetSessionKey: result.sessionKey,\n rowCount: result.rowCount,\n });\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Fork failed: ${errorMessage}`);\n } finally {\n tui.requestRender();\n }\n };\n\n const handleCtrlZ = () => {\n if (process.platform === 'win32') {\n chatLog.addSystem(formatSuspendUnsupportedHint(keybindings));\n tui.requestRender();\n return;\n }\n const suspendKeepAlive = setInterval(() => {}, 2 ** 30);\n const ignoreSigint = () => {};\n process.on('SIGINT', ignoreSigint);\n process.once('SIGCONT', () => {\n clearInterval(suspendKeepAlive);\n process.removeListener('SIGINT', ignoreSigint);\n tui.start();\n tui.setFocus(editor);\n tui.requestRender(true);\n });\n try {\n tui.stop();\n process.kill(0, 'SIGTSTP');\n } catch {\n clearInterval(suspendKeepAlive);\n process.removeListener('SIGINT', ignoreSigint);\n }\n };\n\n const openExternalEditor = () => {\n const dir = mkdtempSync(join(tmpdir(), 'xopc-tui-edit-'));\n const filePath = join(dir, 'message.md');\n writeFileSync(filePath, editor.getText(), 'utf8');\n const editorBin = process.env.EDITOR || process.env.VISUAL || 'vi';\n void (async () => {\n await withTuiSuspended(tui, async () => {\n spawnSync(editorBin, [filePath], { stdio: 'inherit' });\n });\n try {\n const next = readFileSync(filePath, 'utf8');\n editor.setText(next.replace(/\\r\\n/g, '\\n'));\n } catch {\n // ignore\n }\n try {\n unlinkSync(filePath);\n } catch {\n // ignore\n }\n tui.setFocus(editor);\n tui.requestRender(true);\n })();\n };\n\n const isAgentBusy = () =>\n state.activeRunId != null || state.isCompacting || busyStates.has(state.activityStatus);\n\n let steeringInFlightForRunId: string | null = null;\n\n const sendSteeringToActiveRun = (text: string) => {\n chatLog.addUser(text);\n touchStreamingActivity();\n tui.requestRender();\n void client\n .steerChat({ sessionKey: state.currentSessionKey, message: text })\n .then(({ ok }) => {\n if (!ok) {\n chatLog.addSystem(\n theme.dim(\n formatSteerUnavailableHint(keybindings),\n ),\n );\n } else {\n chatLog.addSystem(\n theme.dim('Steered — message injects at the next tool boundary (pi-style).'),\n );\n }\n tui.requestRender();\n })\n .catch((error: unknown) => {\n const errorMessage = error instanceof Error ? error.message : String(error);\n chatLog.addSystem(theme.dim(`Steer failed: ${errorMessage}`));\n tui.requestRender();\n });\n };\n\n const flushSteeringQueue = () => {\n if (state.exitRequested) return;\n if (state.activeRunId) return;\n const next = drainFollowUpQueue(state.steeringQueue, tuiSettings.steeringMode);\n if (next === undefined) return;\n sendMessage(next);\n };\n\n const steerMessage = (text: string) => {\n if (!state.activeRunId) {\n sendMessage(text);\n return;\n }\n if (steeringInFlightForRunId === state.activeRunId) {\n state.steeringQueue.push(text);\n chatLog.addSystem(\n theme.dim(\n `Queued steering (${state.steeringQueue.length} in queue). ${tuiSettings.steeringMode === 'all' ? 'All queued steering sends together after this reply.' : 'Next sends after this reply.'}`,\n ),\n );\n bottomBar.invalidate();\n tui.requestRender();\n return;\n }\n steeringInFlightForRunId = state.activeRunId;\n sendSteeringToActiveRun(text);\n };\n\n const sendMessage = (text: string) => {\n if (state.activeRunId && pendingImageAttachments.length > 0) {\n chatLog.addSystem(\n theme.dim('Image attachments cannot be steered into an active run. Wait for this reply to finish, then send.'),\n );\n tui.requestRender();\n return;\n }\n const pendingCustomText = pendingNextTurnCustomMessages.splice(0).join('\\n\\n').trim();\n const messageText = [text, pendingCustomText].filter(Boolean).join('\\n\\n');\n const attachments = pendingImageAttachments;\n pendingImageAttachments = [];\n if (state.isCompacting) {\n state.compactionQueue.push(messageText);\n if (attachments.length > 0) {\n pendingImageAttachments.unshift(...attachments);\n }\n chatLog.addSystem(\n theme.dim(`Queued during compaction (${state.compactionQueue.length}). Sends when compact finishes.`),\n );\n bottomBar.invalidate();\n tui.requestRender();\n return;\n }\n\n if (state.activeRunId) {\n chatLog.addSystem(\n formatBusyResponseHint(keybindings),\n );\n if (pendingCustomText) {\n pendingNextTurnCustomMessages.unshift(pendingCustomText);\n }\n if (attachments.length > 0) {\n pendingImageAttachments.unshift(...attachments);\n }\n tui.requestRender();\n return;\n }\n\n chatLog.addUser(userDisplayContentForAttachments(text, attachments));\n sessionSnapshot.appendMessage('user', messageText);\n lastRetryMessageText = messageText;\n markRunSending(state);\n setActivityStatus('sending');\n touchStreamingActivity();\n tui.requestRender();\n\n void client\n .sendChat({\n sessionKey: state.currentSessionKey,\n message: messageText,\n attachments: attachments.length > 0 ? attachments : undefined,\n thinking: opts.thinking,\n })\n .catch((error: unknown) => {\n const errorMessage = error instanceof Error ? error.message : String(error);\n if (attachments.length > 0) {\n pendingImageAttachments.unshift(...attachments);\n }\n chatLog.addSystem(`❌ Failed to send: ${errorMessage}`);\n setActivityStatus('idle');\n tui.requestRender();\n });\n };\n\n sendExtensionUserMessage = (content, options) => {\n const text = extensionUserMessageContentToText(content).trim();\n if (!text) {\n throw new Error('sendUserMessage requires text content.');\n }\n if (!state.activeRunId) {\n sendMessage(text);\n return;\n }\n if (options?.deliverAs === 'steer') {\n steerMessage(text);\n return;\n }\n if (options?.deliverAs === 'followUp') {\n state.messageFollowUpQueue.push(text);\n chatLog.addSystem(\n theme.dim(\n `Queued follow-up (${state.messageFollowUpQueue.length} in queue). ${tuiSettings.followUpMode === 'all' ? 'All queued messages send together when this reply finishes.' : 'Next sends when this reply finishes.'}`,\n ),\n );\n bottomBar.invalidate();\n tui.requestRender();\n return;\n }\n throw new Error('Agent is busy. Use deliverAs: \"steer\" or \"followUp\".');\n };\n\n const runCompaction = async (\n instructions?: string,\n callbacks?: {\n onComplete?: (result: TuiCompactionResult) => void;\n onError?: (error: Error) => void;\n },\n ): Promise<TuiCompactionResult | undefined> => {\n if (state.isCompacting) return undefined;\n state.isCompacting = true;\n setActivityStatus('compacting');\n chatLog.addSystem(\n theme.dim(\n instructions ? `Compacting session with instructions: ${instructions}` : 'Compacting session…',\n ),\n );\n tui.requestRender();\n try {\n const result = await client.compactSession(state.currentSessionKey, { force: true, instructions });\n if (result.compacted) {\n clearSeenStreamEvents();\n state.historyLoaded = false;\n await loadSessionHistory();\n chatLog.addCompactionSummary(result);\n } else {\n chatLog.addSystem(formatTuiCompactionResult(result));\n }\n callbacks?.onComplete?.(result);\n return result;\n } catch (error: unknown) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n chatLog.addSystem(`❌ Compaction failed: ${errorMessage}`);\n callbacks?.onError?.(error instanceof Error ? error : new Error(errorMessage));\n return undefined;\n } finally {\n state.isCompacting = false;\n setActivityStatus('idle');\n await refreshSessionInfoWithBorder();\n const queued = state.compactionQueue.shift();\n if (queued && !state.activeRunId) {\n sendMessage(queued);\n }\n updateFooter();\n tui.requestRender();\n }\n };\n\n const applyTuiSettings = (settings: TuiSettings) => {\n tuiSettings = { ...settings };\n saveTuiSettings(tuiSettings);\n state.showThinking = tuiSettings.showThinking;\n state.toolsExpanded = tuiSettings.toolsExpanded;\n chatLog.setShowThinking(tuiSettings.showThinking);\n chatLog.setToolsExpanded(tuiSettings.toolsExpanded);\n chatLog.setToolImageOptions({\n showImages: tuiSettings.showImages,\n imageWidthCells: tuiSettings.imageWidthCells,\n cwd: process.cwd(),\n });\n tui.setShowHardwareCursor(tuiSettings.showHardwareCursor);\n tui.setClearOnShrink(tuiSettings.clearOnShrink);\n defaultEditor.setPaddingX(tuiSettings.editorPaddingX);\n defaultEditor.setAutocompleteMaxVisible(tuiSettings.autocompleteMaxVisible);\n if (editor !== defaultEditor) {\n editor.setPaddingX?.(tuiSettings.editorPaddingX);\n editor.setAutocompleteMaxVisible?.(tuiSettings.autocompleteMaxVisible);\n }\n applyThemeById(tuiSettings.theme);\n header.invalidate();\n updateEditorBorderColor();\n syncTerminalProgress();\n bottomBar.invalidate();\n tui.requestRender();\n };\n\n const previewTheme = (themeId: string) => {\n applyThemeById(themeId);\n updateEditorBorderColor();\n tui.requestRender();\n };\n\n const reloadTuiRuntime = async () => {\n if (state.activeRunId) {\n throw new Error('Wait for the current response to finish before reloading.');\n }\n if (state.isCompacting) {\n throw new Error('Wait for compaction to finish before reloading.');\n }\n keybindings.reload();\n setKeybindings(keybindings);\n applyTuiSettings(loadTuiSettings());\n extensionRuntime.dispose();\n await extensionRuntime.activate();\n editor.setAutocompleteProvider?.(extensionRuntime.autocompleteProvider);\n setEditorExtensionShortcut();\n updateHeader();\n updateFooter();\n tui.requestRender();\n };\n\n const uiOverlays = {\n openModelPicker: (_initialSearch?: string) => {},\n openAgentPicker: () => {},\n openSessionPicker: () => {},\n openSessionTree: () => {},\n openTranscriptTree: () => {},\n openUserMessageFork: () => {},\n openScopedModels: () => {},\n openThinkingSelector: () => {},\n openSettings: () => {},\n openProjectTrust: () => {},\n reloadKeybindings: () => reloadTuiRuntime(),\n };\n\n const recoverCurrentStream = async () => {\n if (state.activeRunId) {\n await recoverActiveRunFromHistory('manual recover');\n return;\n }\n await loadSessionHistory({ merge: true });\n await refreshSessionInfoWithBorder();\n chatLog.addSystem(theme.dim('Reloaded persisted history; no active run to recover.'));\n tui.requestRender();\n };\n\n const retryLastMessage = async () => {\n const message = lastRetryMessageText?.trim();\n if (!message) {\n chatLog.addSystem('No previous user message to retry.');\n return;\n }\n if (state.activeRunId) {\n await abortActive({ clearUi: false });\n }\n sendMessage(message);\n };\n\n const switchAgentSession = async (sessionKey: string, agentId: string) => {\n const previousWorkspace = state.sessionInfo.effectiveWorkspacePath?.trim();\n await setSession(sessionKey);\n await refreshStartupResources();\n if (previousWorkspace && state.sessionInfo.workingDirectoryLocked !== true) {\n try {\n await client.patchSession(state.currentSessionKey, { workingDirectory: previousWorkspace });\n state.sessionInfo.effectiveWorkspacePath = previousWorkspace;\n state.sessionInfo.workingDirectoryLocked = true;\n await refreshSessionInfoWithBorder();\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Switched agent, but workspace was not copied: ${errorMessage}`);\n }\n }\n currentAgentId = agentId;\n updateHeader();\n updateFooter();\n };\n\n const handleCommand = createTuiCommandHandler({\n state,\n chatLog,\n tui,\n isLocalMode,\n abortActive,\n sendMessage,\n requestExit,\n updateFooter,\n keybindings,\n recoverStream: recoverCurrentStream,\n retryLastMessage,\n uiOverlays,\n setThinkingLevel,\n setReasoningLevel,\n setVerboseLevel,\n copyLastAssistant,\n renameCurrentSession,\n runCompaction,\n listModels: listCurrentModels,\n switchModel: switchCurrentModel,\n listSessions: () => client.listSessions(),\n listAgents: () => client.listAgents(),\n switchAgentSession,\n getSessionStats: () => client.getSessionStats(state.currentSessionKey),\n getStartupResources: () => startupResources,\n loadTranscriptTree: () => client.loadTranscriptTree(state.currentSessionKey),\n exportSession: exportCurrentSession,\n importSession: importSessionExport,\n createShare: createShareLink,\n startWorkflowRun,\n runBtwQuery,\n forkSession: forkCurrentSession,\n extensionSlashCommands: extensionRuntime.slashCommands,\n skillSlashCommands,\n workflowSlashCommands,\n extensionShortcuts: extensionRuntime.shortcuts,\n currentAgentId,\n setSession: async (rawKey) => {\n await setSession(rawKey);\n await refreshStartupResources();\n },\n resetSession: resetCurrentSession,\n projectTrust: {\n cwd: process.cwd(),\n hasProjectResources: () => hasTrustRequiringProjectResources(process.cwd()),\n getStorePath: () => projectTrustStore.getPath(),\n getEntry: () => projectTrustStore.getEntry(process.cwd()),\n getSessionDecision: () => projectTrustSessionDecision,\n },\n runLogin: (provider) =>\n runTuiOAuthLogin(provider, {\n chatLog,\n tui,\n editor,\n openOverlay: openCommandOverlay,\n closeOverlay: closeCommandOverlay,\n keybindings,\n }),\n });\n\n const { runLocalShellLine } = createLocalShellRunner({\n chatLog,\n tui,\n editor,\n openOverlay: openCommandOverlay,\n closeOverlay: closeCommandOverlay,\n pauseStdioFilter: () => stdioFilter.pause(),\n resumeStdioFilter: () => stdioFilter.resume(),\n runWithInheritedStdio: async (work) => {\n await withTuiSuspended(tui, work);\n },\n keybindings,\n getCwd: () => {\n const workspace = state.sessionInfo.effectiveWorkspacePath?.trim();\n if (!workspace) {\n throw new Error('Workspace is not loaded yet.');\n }\n return workspace;\n },\n onComplete: async (entry) => {\n await client\n .appendBashExecution(state.currentSessionKey, entry)\n .catch((err: unknown) => {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Bash transcript append failed: ${errorMessage}`);\n })\n .finally(() => {\n updateFooter();\n tui.requestRender();\n });\n },\n });\n\n const submitCore = createEditorSubmitHandler({\n editor: {\n setText: (value) => editor.setText(value),\n addToHistory: (value) => editor.addToHistory?.(value),\n },\n handleCommand,\n sendMessage,\n handleBangLine: runLocalShellLine,\n isAgentBusy,\n steerWhileBusy: steerMessage,\n hasPendingAttachments: () => pendingImageAttachments.length > 0,\n defaultAttachmentMessage: 'Please analyze the attached image.',\n });\n\n const submitBurst = createSubmitBurstCoalescer({\n submit: submitCore,\n enabled: shouldEnableWindowsGitBashPasteFallback(),\n });\n defaultEditor.onSubmit = submitBurst;\n\n const flushFollowUpQueue = () => {\n if (state.exitRequested) return;\n if (state.activeRunId) return;\n const next = drainFollowUpQueue(state.messageFollowUpQueue, tuiSettings.followUpMode);\n if (next === undefined) return;\n sendMessage(next);\n };\n\n const handleFollowUp = () => {\n const text = editor.getText().trim();\n if (!text && pendingImageAttachments.length === 0) return;\n if (isAgentBusy()) {\n if (pendingImageAttachments.length > 0) {\n chatLog.addSystem(\n theme.dim('Image attachments cannot be queued while the agent is busy. Wait for this reply to finish, then send.'),\n );\n tui.requestRender();\n return;\n }\n editor.addToHistory(text);\n state.messageFollowUpQueue.push(text);\n editor.setText('');\n chatLog.addSystem(\n theme.dim(\n `Queued follow-up (${state.messageFollowUpQueue.length} in queue). ${tuiSettings.followUpMode === 'all' ? 'All queued messages send together when this reply finishes.' : 'Next sends when this reply finishes.'}`,\n ),\n );\n bottomBar.invalidate();\n tui.requestRender();\n return;\n }\n submitBurst(text);\n };\n\n const handleDequeue = () => {\n const restored = restoreQueuedMessages(\n {\n steeringQueue: state.steeringQueue,\n followUpQueue: state.messageFollowUpQueue,\n },\n editor.getText(),\n );\n if (restored.restoredCount === 0) {\n chatLog.addStatus(theme.dim('No queued messages to restore.'));\n tui.requestRender();\n return;\n }\n editor.setText(restored.text);\n chatLog.addStatus(\n theme.dim(\n `Restored ${restored.restoredCount} queued message${restored.restoredCount > 1 ? 's' : ''} to editor.`,\n ),\n );\n bottomBar.invalidate();\n tui.requestRender();\n };\n\n const setSessionKey = (key: string) => {\n state.currentSessionKey = resolveSessionKey(key);\n updateAgentFromPicker(key);\n };\n\n const updateAgentFromPicker = (key: string) => {\n const parsed = parseAgentSessionKey(resolveSessionKey(key));\n if (parsed?.agentId) {\n currentAgentId = parsed.agentId;\n }\n };\n\n let ctrlCHandling = false;\n const handleCtrlC = () => {\n if (ctrlCHandling) return;\n ctrlCHandling = true;\n try {\n const now = Date.now();\n const decision = resolveCtrlCAction({\n hasInput: editor.getText().trim().length > 0,\n now,\n lastCtrlCAt: state.lastCtrlCAt,\n });\n state.lastCtrlCAt = decision.nextLastCtrlCAt;\n if (decision.action === 'clear') {\n editor.setText('');\n setActivityStatus('cleared input; press ctrl+c again to exit');\n tui.requestRender();\n return;\n }\n if (decision.action === 'exit') {\n requestExit();\n return;\n }\n setActivityStatus('press ctrl+c again to exit');\n tui.requestRender();\n } finally {\n ctrlCHandling = false;\n }\n };\n\n const setModelChoices = (models: TuiModelChoice[]) => {\n modelChoices = models;\n };\n\n const pickerSvc = {\n tui,\n editor,\n openOverlay: openCommandOverlay,\n closeOverlay: closeCommandOverlay,\n chatLog,\n client,\n sendMessage,\n switchModel: switchCurrentModel,\n openEditorSelector,\n refreshSessionInfo,\n updateHeader,\n state,\n setSessionKey,\n switchAgentSession,\n clearChatForSessionSwitch,\n loadSessionHistory,\n setEditorText: (text: string) => editor.setText(text),\n setModelChoices,\n getScopedModelRefs: () => state.scopedModelRefs,\n setScopedModelRefs: (refs: string[] | null) => {\n state.scopedModelRefs = refs;\n saveScopedModelRefs(refs);\n },\n refreshCycleModels,\n getTuiSettings: () => ({ ...tuiSettings }),\n applyTuiSettings,\n previewTheme,\n reloadKeybindings: reloadTuiRuntime,\n setThinkingLevel,\n getProjectTrustStore: () => projectTrustStore,\n getProjectTrustSessionDecision: () => projectTrustSessionDecision,\n setProjectTrustSessionDecision: (decision: boolean | null) => {\n projectTrustSessionDecision = decision;\n },\n keybindings,\n };\n\n uiOverlays.openModelPicker = (initialSearch?: string) =>\n void openModelPickerOverlay(pickerSvc, initialSearch);\n uiOverlays.openAgentPicker = () => void openAgentPickerOverlay(pickerSvc);\n uiOverlays.openSessionPicker = () => void openSessionPickerOverlay(pickerSvc);\n uiOverlays.openSessionTree = () => void openSessionTreeOverlay(pickerSvc);\n uiOverlays.openTranscriptTree = () => void openTranscriptTreeOverlay(pickerSvc);\n uiOverlays.openUserMessageFork = () => void openUserMessageForkOverlay(pickerSvc);\n uiOverlays.openScopedModels = () => void openScopedModelsOverlay(pickerSvc);\n uiOverlays.openThinkingSelector = () => openThinkingSelectorOverlay(pickerSvc);\n uiOverlays.openSettings = () => openSettingsOverlay(pickerSvc);\n uiOverlays.openProjectTrust = () => openProjectTrustOverlay(pickerSvc);\n\n const showSessionTree = () => {\n uiOverlays.openTranscriptTree();\n };\n\n const handleDoubleEscape = () => {\n switch (tuiSettings.doubleEscapeAction) {\n case 'tree':\n showSessionTree();\n break;\n case 'fork':\n uiOverlays.openUserMessageFork();\n break;\n default:\n break;\n }\n };\n\n defaultEditor.onEscape = () => {\n if (state.activeRunId) {\n void abortActive();\n return;\n }\n if (editor.getText().trim().length > 0) return;\n const now = Date.now();\n if (now - state.lastEscapeAt <= DOUBLE_ESCAPE_WINDOW_MS) {\n state.lastEscapeAt = 0;\n handleDoubleEscape();\n return;\n }\n state.lastEscapeAt = now;\n };\n defaultEditor.onCtrlD = () => requestExit();\n\n defaultEditor.onAction('app.clear', handleCtrlC);\n defaultEditor.onAction('app.exit', () => requestExit());\n defaultEditor.onAction('app.suspend', handleCtrlZ);\n defaultEditor.onAction('app.thinking.cycle', () => {\n const cur = state.sessionInfo.thinkingLevel ?? opts.thinking ?? 'medium';\n void setThinkingLevel(nextThinkLevel(cur));\n });\n defaultEditor.onAction('app.model.cycleForward', () => cycleModel('forward'));\n defaultEditor.onAction('app.model.cycleBackward', () => cycleModel('backward'));\n defaultEditor.onAction('app.model.select', () => uiOverlays.openModelPicker());\n defaultEditor.onAction('app.session.resume', () => void openSessionPickerOverlay(pickerSvc));\n defaultEditor.onAction('app.session.tree', showSessionTree);\n defaultEditor.onAction('app.session.fork', () => uiOverlays.openUserMessageFork());\n defaultEditor.onAction('app.tools.expand', () => {\n state.toolsExpanded = !state.toolsExpanded;\n tuiSettings = { ...tuiSettings, toolsExpanded: state.toolsExpanded };\n saveTuiSettings(tuiSettings);\n chatLog.setToolsExpanded(state.toolsExpanded);\n setActivityStatus(state.toolsExpanded ? 'tools expanded' : 'tools collapsed');\n tui.requestRender();\n });\n defaultEditor.onAction('app.thinking.toggle', () => {\n state.showThinking = !state.showThinking;\n tuiSettings = { ...tuiSettings, showThinking: state.showThinking };\n saveTuiSettings(tuiSettings);\n chatLog.setShowThinking(state.showThinking);\n updateFooter();\n tui.requestRender();\n });\n defaultEditor.onAction('app.editor.external', openExternalEditor);\n defaultEditor.onPasteImage = () => {\n void (async () => {\n const image = await readClipboardImage();\n if (!image) {\n chatLog.addStatus(theme.dim('No image found on clipboard.'));\n tui.requestRender();\n return;\n }\n if (pendingImageAttachments.length >= MAX_CHAT_ATTACHMENTS) {\n chatLog.addSystem(`Attachment limit reached (${MAX_CHAT_ATTACHMENTS}). Send or clear the current draft first.`);\n tui.requestRender();\n return;\n }\n if (image.bytes.byteLength > MAX_WEBCHAT_ATTACHMENT_FILE_BYTES) {\n chatLog.addSystem(\n `Clipboard image is too large (${image.bytes.byteLength} bytes; max ${MAX_WEBCHAT_ATTACHMENT_FILE_BYTES}).`,\n );\n tui.requestRender();\n return;\n }\n const ext = extensionForImageMimeType(image.mimeType) ?? 'png';\n const name = `clipboard-${pendingImageAttachments.length + 1}.${ext}`;\n pendingImageAttachments.push({\n type: 'image',\n mimeType: image.mimeType,\n data: Buffer.from(image.bytes).toString('base64'),\n name,\n size: image.bytes.byteLength,\n });\n chatLog.addStatus(\n theme.dim(\n `Attached image: ${name} (${pendingImageAttachments.length} pending). Send a message to include it.`,\n ),\n );\n tui.requestRender();\n })();\n };\n defaultEditor.onAction('app.message.followUp', handleFollowUp);\n defaultEditor.onAction('app.message.dequeue', handleDequeue);\n\n streamWatchdogId = setInterval(() => {\n const now = Date.now();\n if (!isActiveRunStreamStale(state, now, DEFAULT_STREAMING_WATCHDOG_MS)) return;\n if (!markActiveRunStalled(state, now)) return;\n chatLog.addSystem(\n theme.dim(\n 'No stream activity for 30s; preserving active run and reloading persisted history.',\n ),\n );\n setActivityStatus('stalled');\n void recoverActiveRunFromHistory('stream watchdog');\n tui.requestRender();\n }, 5000);\n\n const onAgentRunEnded = () => {\n state.progressMessage = null;\n steeringInFlightForRunId = null;\n void refreshSessionInfoWithBorder().finally(() => {\n updateFooter();\n tui.requestRender();\n });\n flushSteeringQueue();\n flushFollowUpQueue();\n };\n\n const handleWorkflowRunUpdated = (data: Record<string, unknown>): boolean => {\n const runId = typeof data.runId === 'string' ? data.runId : '';\n const view = data.view && typeof data.view === 'object' ? data.view as WorkflowRunView : null;\n if (!runId || !view || !visibleWorkflowRunIds.has(runId)) return false;\n\n const snapshot = runViewToSnapshot(view);\n const completed = isTerminalWorkflowRunStatus(view.run.status);\n chatLog.updateWorkflowRun(runId, renderWorkflowPanel(snapshot, { status: view.run.status }));\n if (completed) {\n chatLog.addSystem(renderWorkflowFinalSummary(snapshot, { status: view.run.status }));\n visibleWorkflowRunIds.delete(runId);\n void refreshSessionInfoWithBorder().finally(() => {\n updateFooter();\n });\n }\n tui.requestRender();\n return true;\n };\n\n client.onEvent = (evt: TuiEvent) => {\n const data = (evt.data ?? {}) as Record<string, unknown>;\n if (evt.event === 'workflow.run.updated' && handleWorkflowRunUpdated(data)) {\n return;\n }\n dispatchAgentEvent(\n evt.event,\n data,\n state,\n chatLog,\n tui,\n setActivityStatus,\n touchStreamingActivity,\n onAgentRunEnded,\n (message) => sessionSnapshot.appendMessage('assistant', assistantMessagePlainText(message)),\n evt.source,\n );\n };\n\n client.onConnected = () => {\n state.isConnected = true;\n setConnectionStatus(isLocalMode ? 'local ready' : 'gateway connected');\n touchStreamingActivity();\n void (async () => {\n try {\n await applyStartupWorkingDirectory();\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Working directory not changed: ${errorMessage}`);\n }\n await refreshSessionInfoWithBorder();\n await refreshModelChoices();\n await refreshStartupResources();\n await loadSessionHistory({ merge: true });\n showStartupCardOnce();\n if (state.activeRunId) {\n void recoverActiveRunFromHistory('broadcast reconnect');\n }\n updateHeader();\n updateFooter();\n tui.requestRender();\n if (!state.autoMessageSent && opts.message) {\n state.autoMessageSent = true;\n sendMessage(opts.message);\n }\n })();\n };\n\n client.onDisconnected = (reason: string) => {\n const wasConnected = state.isConnected;\n state.isConnected = false;\n touchStreamingActivity();\n if (isLocalMode) {\n setConnectionStatus(`local stopped: ${reason}`);\n } else {\n const hint =\n wasConnected || state.historyLoaded\n ? ` (${reason}). Reconnecting broadcast stream…`\n : `. Ensure gateway is running (xopc gateway) or use --local.`;\n setConnectionStatus(`disconnected${hint}`);\n if (!wasConnected && !state.historyLoaded) {\n const gatewayUrl = opts.url ?? 'http://localhost:3120';\n chatLog.addSystem(\n `Cannot reach gateway at ${gatewayUrl}.\\n` +\n 'Start the gateway (`xopc gateway`) or run `xopc tui --local` for embedded mode.',\n );\n }\n }\n tui.requestRender();\n };\n\n client.onGap = (info) => {\n chatLog.addSystem(\n `⚠️ Event gap: expected ${info.expected}, received ${info.received}. Some updates may be missing.`,\n );\n setConnectionStatus(`event gap: expected ${info.expected}, got ${info.received}`);\n if (state.activeRunId) {\n void recoverActiveRunFromHistory('broadcast event gap');\n } else {\n void loadSessionHistory({ merge: true });\n }\n tui.requestRender();\n };\n\n const sigintHandler = () => handleCtrlC();\n const sigtermHandler = () => requestExit();\n process.on('SIGINT', sigintHandler);\n process.on('SIGTERM', sigtermHandler);\n\n updateHeader();\n updateEditorBorderColor();\n setConnectionStatus(isLocalMode ? 'starting local runtime' : 'connecting');\n updateFooter();\n await extensionRuntime.activate();\n tui.start();\n client.start();\n\n await new Promise<void>((resolve) => {\n finishTui = () => {\n process.removeListener('SIGINT', sigintHandler);\n process.removeListener('SIGTERM', sigtermHandler);\n if (streamWatchdogId) {\n clearInterval(streamWatchdogId);\n streamWatchdogId = null;\n }\n finishTui = null;\n resolve();\n };\n });\n\n return exitResult;\n}\n"],"mappings":"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"}