@xopcai/xopc 0.0.86 → 0.0.88

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 (658) hide show
  1. package/dist/browser-ext/manifest.json +1 -1
  2. package/dist/extensions/feishu/src/adapters/cli-login.js +3 -3
  3. package/dist/extensions/feishu/src/adapters/cli-login.js.map +1 -1
  4. package/dist/extensions/feishu/src/outbound/media-load.js +1 -1
  5. package/dist/extensions/feishu/src/workflow-progress.js +1 -1
  6. package/dist/extensions/telegram/src/delivery-chat-id.d.ts +1 -1
  7. package/dist/extensions/telegram/src/delivery-chat-id.js +1 -1
  8. package/dist/extensions/telegram/src/delivery-chat-id.js.map +1 -1
  9. package/dist/extensions/telegram/src/plugin.js +1 -1
  10. package/dist/extensions/telegram/src/routing-integration.js +3 -2
  11. package/dist/extensions/telegram/src/routing-integration.js.map +1 -1
  12. package/dist/extensions/telegram/src/workflow-progress.js +1 -1
  13. package/dist/extensions/telegram/xopc.extension.json +1 -1
  14. package/dist/extensions/weixin/src/__tests__/workflow-progress.test.js +2 -2
  15. package/dist/extensions/weixin/src/__tests__/workflow-progress.test.js.map +1 -1
  16. package/dist/extensions/weixin/src/api/api.js +3 -3
  17. package/dist/extensions/weixin/src/api/api.js.map +1 -1
  18. package/dist/extensions/weixin/src/auth/accounts.js +12 -12
  19. package/dist/extensions/weixin/src/auth/accounts.js.map +1 -1
  20. package/dist/extensions/weixin/src/cdn/upload.js +1 -1
  21. package/dist/extensions/weixin/src/delivery-to.js +2 -2
  22. package/dist/extensions/weixin/src/delivery-to.js.map +1 -1
  23. package/dist/extensions/weixin/src/media/data-url.js +1 -1
  24. package/dist/extensions/weixin/src/messaging/debug-mode.js +5 -5
  25. package/dist/extensions/weixin/src/messaging/debug-mode.js.map +1 -1
  26. package/dist/extensions/weixin/src/messaging/inbound.js +11 -11
  27. package/dist/extensions/weixin/src/messaging/inbound.js.map +1 -1
  28. package/dist/extensions/weixin/src/messaging/process-message.js +1 -1
  29. package/dist/extensions/weixin/src/plugin.js +1 -1
  30. package/dist/extensions/weixin/src/storage/sync-buf.js +4 -4
  31. package/dist/extensions/weixin/src/storage/sync-buf.js.map +1 -1
  32. package/dist/extensions/weixin/src/workflow-progress.d.ts +1 -1
  33. package/dist/extensions/weixin/src/workflow-progress.js +1 -1
  34. package/dist/extensions/weixin/src/workflow-progress.js.map +1 -1
  35. package/dist/gateway/static/root/assets/agents-CRxETUZx.js +222 -0
  36. package/dist/gateway/static/root/assets/{apps-page-DrfytjOb.js → apps-page-wKWf3l57.js} +1 -1
  37. package/dist/gateway/static/root/assets/channels-settings-DDbqVNkx.js +1 -0
  38. package/dist/gateway/static/root/assets/{channels-status-swr-Bs5kMCMI.js → channels-status-swr-DIsl75Y3.js} +1 -1
  39. package/dist/gateway/static/root/assets/copy-SxMW6Xpc.js +1 -0
  40. package/dist/gateway/static/root/assets/{cron-api-BuVcZ5zR.js → cron-api-N9hvuRrn.js} +1 -1
  41. package/dist/gateway/static/root/assets/{cron-page-BMrloeFH.js → cron-page-tlNGNxhP.js} +1 -1
  42. package/dist/gateway/static/root/assets/{dist-CKU1OOTf.js → dist-CJwfHYvT.js} +1 -1
  43. package/dist/gateway/static/root/assets/{extension-debug-page-BdW_46sN.js → extension-debug-page-BVJohZoZ.js} +1 -1
  44. package/dist/gateway/static/root/assets/{extension-page-DW47KI82.js → extension-page-BT2tmElC.js} +1 -1
  45. package/dist/gateway/static/root/assets/extension-settings-page-BSS47c2j.js +1 -0
  46. package/dist/gateway/static/root/assets/{fetch-B2MYHbWg.js → fetch-BaFNUtkE.js} +1 -1
  47. package/dist/gateway/static/root/assets/{field-primitives-DPG-oJmx.js → field-primitives-QwYEq6Hz.js} +1 -1
  48. package/dist/gateway/static/root/assets/{heartbeat-config-api-C8dNts9i.js → heartbeat-config-api-BVSidEDJ.js} +1 -1
  49. package/dist/gateway/static/root/assets/index-CqZzHNEg.css +1 -0
  50. package/dist/gateway/static/root/assets/{index-BmVYculr.js → index-qNrVJp-y.js} +97 -95
  51. package/dist/gateway/static/root/assets/{logs-page-sTsVWz0X.js → logs-page-DDonPVLn.js} +1 -1
  52. package/dist/gateway/static/root/assets/sessions-page-DKt-Wmib.js +1 -0
  53. package/dist/gateway/static/root/assets/{settings-form-section-DuvRQW--.js → settings-form-section-B8N3A3Zo.js} +1 -1
  54. package/dist/gateway/static/root/assets/settings-page-DcJjvvw4.js +3 -0
  55. package/dist/gateway/static/root/assets/{share-preview-page-BtG2kLDh.js → share-preview-page-Q7KqkO-u.js} +1 -1
  56. package/dist/gateway/static/root/assets/skills-page-DuJ4BTO3.js +2 -0
  57. package/dist/gateway/static/root/assets/{theme-store-DryYl3qD.js → theme-store-BbRc5ugR.js} +1 -1
  58. package/dist/gateway/static/root/assets/url-D6jvVYIA.js +7 -0
  59. package/dist/gateway/static/root/assets/{utils-BY7bU1DT.js → utils-CxDGduqK.js} +1 -1
  60. package/dist/gateway/static/root/assets/voice-api-key-field-CTyHz7L_.js +1 -0
  61. package/dist/gateway/static/root/assets/workflows-page-GacJ41Fv.js +27 -0
  62. package/dist/gateway/static/root/index.html +6 -5
  63. package/dist/package.js +1 -1
  64. package/dist/src/agent/agent-manager.js +7 -7
  65. package/dist/src/agent/agent-scope.d.ts +4 -0
  66. package/dist/src/agent/agent-scope.js +53 -10
  67. package/dist/src/agent/agent-scope.js.map +1 -1
  68. package/dist/src/agent/bootstrap/filter-bootstrap-files.js +2 -1
  69. package/dist/src/agent/bootstrap/filter-bootstrap-files.js.map +1 -1
  70. package/dist/src/agent/bootstrap/load-bootstrap-files.js +1 -1
  71. package/dist/src/agent/child-agent-factory.d.ts +15 -0
  72. package/dist/src/agent/child-agent-factory.js +35 -2
  73. package/dist/src/agent/child-agent-factory.js.map +1 -1
  74. package/dist/src/agent/client-error-format.d.ts +20 -0
  75. package/dist/src/agent/client-error-format.js +97 -0
  76. package/dist/src/agent/client-error-format.js.map +1 -0
  77. package/dist/src/agent/context/workspace-seed.js +2 -2
  78. package/dist/src/agent/embedded/run-turn.js +23 -4
  79. package/dist/src/agent/embedded/run-turn.js.map +1 -1
  80. package/dist/src/agent/embedded/session-tool-result-guard.js +2 -1
  81. package/dist/src/agent/embedded/session-tool-result-guard.js.map +1 -1
  82. package/dist/src/agent/embedded/tool-result-truncation.js +2 -1
  83. package/dist/src/agent/embedded/tool-result-truncation.js.map +1 -1
  84. package/dist/src/agent/fallback/candidates.js +2 -2
  85. package/dist/src/agent/fallback/candidates.js.map +1 -1
  86. package/dist/src/agent/goals/goal-locale.d.ts +1 -1
  87. package/dist/src/agent/goals/goal-run-store.js +4 -4
  88. package/dist/src/agent/goals/persistent-goal-apis.d.ts +0 -2
  89. package/dist/src/agent/goals/persistent-goal-service.js +1 -2
  90. package/dist/src/agent/goals/persistent-goal-service.js.map +1 -1
  91. package/dist/src/agent/goals/post-turn.js +2 -2
  92. package/dist/src/agent/image/generation/normalization.js +2 -12
  93. package/dist/src/agent/image/generation/normalization.js.map +1 -1
  94. package/dist/src/agent/image/generation/provider-registry.d.ts +4 -8
  95. package/dist/src/agent/image/generation/provider-registry.js.map +1 -1
  96. package/dist/src/agent/image/generation/runtime.d.ts +2 -2
  97. package/dist/src/agent/image/generation/runtime.js.map +1 -1
  98. package/dist/src/agent/image/generation/types.d.ts +0 -18
  99. package/dist/src/agent/image/image-helpers.js +6 -1
  100. package/dist/src/agent/image/image-helpers.js.map +1 -1
  101. package/dist/src/agent/image/index.d.ts +1 -1
  102. package/dist/src/agent/image/load-image-media.js +2 -2
  103. package/dist/src/agent/inbound/inbound-loop.d.ts +5 -0
  104. package/dist/src/agent/inbound/inbound-loop.js +41 -10
  105. package/dist/src/agent/inbound/inbound-loop.js.map +1 -1
  106. package/dist/src/agent/inbound/turn-dispatcher.d.ts +4 -0
  107. package/dist/src/agent/inbound/turn-dispatcher.js +7 -5
  108. package/dist/src/agent/inbound/turn-dispatcher.js.map +1 -1
  109. package/dist/src/agent/ipc/bus.js +1 -1
  110. package/dist/src/agent/ipc/inbox.js +2 -2
  111. package/dist/src/agent/ipc/socket.js +1 -1
  112. package/dist/src/agent/mcp/bundle-mcp-materialize.js +2 -1
  113. package/dist/src/agent/mcp/bundle-mcp-materialize.js.map +1 -1
  114. package/dist/src/agent/mcp/bundle-mcp-names.js +2 -1
  115. package/dist/src/agent/mcp/bundle-mcp-names.js.map +1 -1
  116. package/dist/src/agent/mcp/bundle-mcp-runtime.js +2 -1
  117. package/dist/src/agent/mcp/bundle-mcp-runtime.js.map +1 -1
  118. package/dist/src/agent/mcp/mcp-transport-config.js +2 -1
  119. package/dist/src/agent/mcp/mcp-transport-config.js.map +1 -1
  120. package/dist/src/agent/mcp/mcp-transport.js +2 -1
  121. package/dist/src/agent/mcp/mcp-transport.js.map +1 -1
  122. package/dist/src/agent/media-generation/runtime-shared.js +2 -9
  123. package/dist/src/agent/media-generation/runtime-shared.js.map +1 -1
  124. package/dist/src/agent/memory/builtin-memory-store.js +1 -1
  125. package/dist/src/agent/memory/dreaming/deep-promotion.js +1 -1
  126. package/dist/src/agent/memory/dreaming/events.js +1 -1
  127. package/dist/src/agent/memory/dreaming/last-run.js +1 -1
  128. package/dist/src/agent/memory/dreaming/light-sweep.js +1 -1
  129. package/dist/src/agent/memory/dreaming/preview.js +1 -1
  130. package/dist/src/agent/memory/dreaming/rem-patterns.js +1 -1
  131. package/dist/src/agent/memory/dreaming/short-term-store.js +1 -1
  132. package/dist/src/agent/memory/dreaming/utils.js +1 -1
  133. package/dist/src/agent/memory/plugin-discovery.js +1 -1
  134. package/dist/src/agent/messaging/command-handler.d.ts +6 -0
  135. package/dist/src/agent/messaging/command-handler.js +5 -0
  136. package/dist/src/agent/messaging/command-handler.js.map +1 -1
  137. package/dist/src/agent/models/manager.js +1 -1
  138. package/dist/src/agent/orchestration/llm-turn-retry.d.ts +2 -0
  139. package/dist/src/agent/orchestration/llm-turn-retry.js +9 -1
  140. package/dist/src/agent/orchestration/llm-turn-retry.js.map +1 -1
  141. package/dist/src/agent/prompt/safety.d.ts +0 -7
  142. package/dist/src/agent/prompt/safety.js +1 -20
  143. package/dist/src/agent/prompt/safety.js.map +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/build-direct-message-content.js +2 -2
  149. package/dist/src/agent/service/build-direct-message-content.js.map +1 -1
  150. package/dist/src/agent/service/direct-turn-helpers.d.ts +3 -1
  151. package/dist/src/agent/service/direct-turn-helpers.js +6 -1
  152. package/dist/src/agent/service/direct-turn-helpers.js.map +1 -1
  153. package/dist/src/agent/service/process-direct-one-shot.d.ts +4 -0
  154. package/dist/src/agent/service/process-direct-one-shot.js +15 -2
  155. package/dist/src/agent/service/process-direct-one-shot.js.map +1 -1
  156. package/dist/src/agent/service/process-direct-streaming.d.ts +4 -0
  157. package/dist/src/agent/service/process-direct-streaming.js +53 -7
  158. package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
  159. package/dist/src/agent/service/webchat-tts.d.ts +1 -2
  160. package/dist/src/agent/service/webchat-tts.js +2 -2
  161. package/dist/src/agent/service/webchat-tts.js.map +1 -1
  162. package/dist/src/agent/service.d.ts +8 -0
  163. package/dist/src/agent/service.js +25 -5
  164. package/dist/src/agent/service.js.map +1 -1
  165. package/dist/src/agent/session/session-inspector.js +1 -1
  166. package/dist/src/agent/skills/config.js +1 -1
  167. package/dist/src/agent/skills/hub-hash.js +2 -2
  168. package/dist/src/agent/skills/hub-lock.js +1 -1
  169. package/dist/src/agent/skills/hub-pull.js +2 -2
  170. package/dist/src/agent/skills/index.js +1 -1
  171. package/dist/src/agent/skills/managed-store.js +1 -1
  172. package/dist/src/agent/skills/scanner.js +1 -1
  173. package/dist/src/agent/skills/skill-manage-ops.js +1 -1
  174. package/dist/src/agent/skills/skill-manager.js +1 -1
  175. package/dist/src/agent/tools/create-share-tool.js +27 -20
  176. package/dist/src/agent/tools/create-share-tool.js.map +1 -1
  177. package/dist/src/agent/tools/dreaming-tool.js +1 -1
  178. package/dist/src/agent/tools/factory.js +2 -2
  179. package/dist/src/agent/tools/image-generate-tool.js +1 -1
  180. package/dist/src/agent/tools/index.d.ts +0 -1
  181. package/dist/src/agent/tools/index.js +4 -5
  182. package/dist/src/agent/tools/send-media.js +1 -1
  183. package/dist/src/agent/tools/shell.js +0 -13
  184. package/dist/src/agent/tools/shell.js.map +1 -1
  185. package/dist/src/agent/tools/skill-manage-tool.js +1 -1
  186. package/dist/src/agent/tools/workflow-tool.js +70 -16
  187. package/dist/src/agent/tools/workflow-tool.js.map +1 -1
  188. package/dist/src/agent/tools/write.js +1 -1
  189. package/dist/src/agent/workflow/agent-progress.d.ts +5 -0
  190. package/dist/src/agent/workflow/agent-progress.js +65 -0
  191. package/dist/src/agent/workflow/agent-progress.js.map +1 -0
  192. package/dist/src/agent/workflow/builtins/audit-repo.d.ts +1 -1
  193. package/dist/src/agent/workflow/builtins/audit-repo.js +14 -0
  194. package/dist/src/agent/workflow/builtins/audit-repo.js.map +1 -1
  195. package/dist/src/agent/workflow/builtins/debug-incident.d.ts +1 -1
  196. package/dist/src/agent/workflow/builtins/debug-incident.js +14 -0
  197. package/dist/src/agent/workflow/builtins/debug-incident.js.map +1 -1
  198. package/dist/src/agent/workflow/builtins/implementation-plan.d.ts +12 -0
  199. package/dist/src/agent/workflow/builtins/implementation-plan.js +175 -0
  200. package/dist/src/agent/workflow/builtins/implementation-plan.js.map +1 -0
  201. package/dist/src/agent/workflow/builtins/index.d.ts +3 -1
  202. package/dist/src/agent/workflow/builtins/index.js +11 -1
  203. package/dist/src/agent/workflow/builtins/index.js.map +1 -1
  204. package/dist/src/agent/workflow/builtins/multi-perspective-review.d.ts +1 -1
  205. package/dist/src/agent/workflow/builtins/multi-perspective-review.js +14 -0
  206. package/dist/src/agent/workflow/builtins/multi-perspective-review.js.map +1 -1
  207. package/dist/src/agent/workflow/builtins/pr-review.d.ts +1 -1
  208. package/dist/src/agent/workflow/builtins/pr-review.js +14 -0
  209. package/dist/src/agent/workflow/builtins/pr-review.js.map +1 -1
  210. package/dist/src/agent/workflow/builtins/release-check.d.ts +11 -0
  211. package/dist/src/agent/workflow/builtins/release-check.js +165 -0
  212. package/dist/src/agent/workflow/builtins/release-check.js.map +1 -0
  213. package/dist/src/agent/workflow/builtins/research.d.ts +1 -1
  214. package/dist/src/agent/workflow/builtins/research.js +14 -0
  215. package/dist/src/agent/workflow/builtins/research.js.map +1 -1
  216. package/dist/src/agent/workflow/catalog.js +1 -1
  217. package/dist/src/agent/workflow/channel-capability.d.ts +3 -3
  218. package/dist/src/agent/workflow/index.d.ts +2 -1
  219. package/dist/src/agent/workflow/index.js +3 -2
  220. package/dist/src/agent/workflow/lint.d.ts +38 -0
  221. package/dist/src/agent/workflow/lint.js +74 -0
  222. package/dist/src/agent/workflow/lint.js.map +1 -0
  223. package/dist/src/agent/workflow/meta-locale.d.ts +12 -0
  224. package/dist/src/agent/workflow/meta-locale.js +62 -0
  225. package/dist/src/agent/workflow/meta-locale.js.map +1 -0
  226. package/dist/src/agent/workflow/parser.js +7 -1
  227. package/dist/src/agent/workflow/parser.js.map +1 -1
  228. package/dist/src/agent/workflow/runtime.d.ts +4 -1
  229. package/dist/src/agent/workflow/runtime.js +88 -8
  230. package/dist/src/agent/workflow/runtime.js.map +1 -1
  231. package/dist/src/agent/workflow/snapshot.js +2 -12
  232. package/dist/src/agent/workflow/snapshot.js.map +1 -1
  233. package/dist/src/agent/workflow/step-labels.d.ts +8 -0
  234. package/dist/src/agent/workflow/step-labels.js +48 -0
  235. package/dist/src/agent/workflow/step-labels.js.map +1 -0
  236. package/dist/src/agent/workflow/subagent-runner.js +46 -1
  237. package/dist/src/agent/workflow/subagent-runner.js.map +1 -1
  238. package/dist/src/agent/workflow/types.d.ts +76 -1
  239. package/dist/src/auth/credentials.d.ts +5 -0
  240. package/dist/src/auth/credentials.js +12 -3
  241. package/dist/src/auth/credentials.js.map +1 -1
  242. package/dist/src/auth/profiles/store.js +1 -1
  243. package/dist/src/auth/sync-provider-auth.js +1 -1
  244. package/dist/src/browser/cache-dir-policy.js +1 -1
  245. package/dist/src/browser/cdp-local-launcher.js +2 -2
  246. package/dist/src/browser/index.js +4 -4
  247. package/dist/src/browser/manager.d.ts +1 -3
  248. package/dist/src/browser/manager.js +0 -6
  249. package/dist/src/browser/manager.js.map +1 -1
  250. package/dist/src/browser/providers/browser-ext-install.d.ts +4 -4
  251. package/dist/src/browser/providers/browser-ext-install.js +41 -88
  252. package/dist/src/browser/providers/browser-ext-install.js.map +1 -1
  253. package/dist/src/browser/providers/cloakbrowser.d.ts +0 -5
  254. package/dist/src/browser/providers/cloakbrowser.js +6 -59
  255. package/dist/src/browser/providers/cloakbrowser.js.map +1 -1
  256. package/dist/src/browser/providers/playwright-doctor.js +1 -1
  257. package/dist/src/browser/stealth.js +1 -1
  258. package/dist/src/channels/attachments/inbound-persist.js +1 -1
  259. package/dist/src/channels/attachments/outbound-tts-persist.js +1 -1
  260. package/dist/src/channels/attachments/voice-stt-webchat.js +10 -8
  261. package/dist/src/channels/attachments/voice-stt-webchat.js.map +1 -1
  262. package/dist/src/channels/outbound/persist-store.js +1 -1
  263. package/dist/src/channels/pairing/allow-from-file.js +9 -9
  264. package/dist/src/channels/pairing/allow-from-file.js.map +1 -1
  265. package/dist/src/channels/pairing/pairing-store.js +7 -7
  266. package/dist/src/channels/pairing/pairing-store.js.map +1 -1
  267. package/dist/src/chat-commands/builtins/config.js +2 -2
  268. package/dist/src/chat-commands/builtins/session.js +1 -1
  269. package/dist/src/chat-commands/builtins/session.js.map +1 -1
  270. package/dist/src/chat-commands/builtins/tts.js +2 -2
  271. package/dist/src/chat-commands/builtins/tts.js.map +1 -1
  272. package/dist/src/chat-commands/context.d.ts +3 -0
  273. package/dist/src/chat-commands/context.js +22 -4
  274. package/dist/src/chat-commands/context.js.map +1 -1
  275. package/dist/src/chat-commands/session-key.d.ts +4 -37
  276. package/dist/src/chat-commands/session-key.js +49 -85
  277. package/dist/src/chat-commands/session-key.js.map +1 -1
  278. package/dist/src/chat-commands/types.d.ts +2 -0
  279. package/dist/src/cli/commands/agent/interactive.js +2 -2
  280. package/dist/src/cli/commands/agent/interactive.js.map +1 -1
  281. package/dist/src/cli/commands/agent/sessions.js +2 -2
  282. package/dist/src/cli/commands/agent/sessions.js.map +1 -1
  283. package/dist/src/cli/commands/agent.js +4 -5
  284. package/dist/src/cli/commands/agent.js.map +1 -1
  285. package/dist/src/cli/commands/channels.js +1 -5
  286. package/dist/src/cli/commands/channels.js.map +1 -1
  287. package/dist/src/cli/commands/config.js +1 -1
  288. package/dist/src/cli/commands/doctor/checks/config-health.js +1 -1
  289. package/dist/src/cli/commands/doctor/checks/provider-auth.js +1 -1
  290. package/dist/src/cli/commands/doctor/checks/session-integrity.js +1 -1
  291. package/dist/src/cli/commands/doctor/checks/state-integrity.js +1 -1
  292. package/dist/src/cli/commands/doctor/checks/workspace-status.js +1 -1
  293. package/dist/src/cli/commands/extension-dev.js +1 -1
  294. package/dist/src/cli/commands/extension-marketplace.js +1 -1
  295. package/dist/src/cli/commands/extension-pack.js +1 -1
  296. package/dist/src/cli/commands/gateway/lifecycle-core.js +1 -1
  297. package/dist/src/cli/commands/gateway/lifecycle-core.js.map +1 -1
  298. package/dist/src/cli/commands/gateway/logs.d.ts +9 -0
  299. package/dist/src/cli/commands/gateway/logs.js +50 -17
  300. package/dist/src/cli/commands/gateway/logs.js.map +1 -1
  301. package/dist/src/cli/commands/image.js +23 -22
  302. package/dist/src/cli/commands/image.js.map +1 -1
  303. package/dist/src/cli/commands/init.js +4 -4
  304. package/dist/src/cli/commands/onboard.js +1 -1
  305. package/dist/src/cli/commands/session/utils.js +2 -2
  306. package/dist/src/cli/commands/session/utils.js.map +1 -1
  307. package/dist/src/cli/commands/update.js +26 -46
  308. package/dist/src/cli/commands/update.js.map +1 -1
  309. package/dist/src/cli/utils/init-workspace-core.js +2 -2
  310. package/dist/src/cli/utils/session.d.ts +0 -5
  311. package/dist/src/cli/utils/session.js +1 -6
  312. package/dist/src/cli/utils/session.js.map +1 -1
  313. package/dist/src/commands/agents.config.js +1 -1
  314. package/dist/src/commands/agents.config.js.map +1 -1
  315. package/dist/src/config/agent-profile.js +6 -28
  316. package/dist/src/config/agent-profile.js.map +1 -1
  317. package/dist/src/config/agent-typed-models.d.ts +18 -0
  318. package/dist/src/config/agent-typed-models.js +53 -0
  319. package/dist/src/config/agent-typed-models.js.map +1 -0
  320. package/dist/src/config/gateway-bind.js +1 -1
  321. package/dist/src/config/index.js +6 -6
  322. package/dist/src/config/loader.js +2 -2
  323. package/dist/src/config/model-input.js +2 -5
  324. package/dist/src/config/model-input.js.map +1 -1
  325. package/dist/src/config/models-json.js +2 -2
  326. package/dist/src/config/paths-state.js +1 -1
  327. package/dist/src/config/profile.js +2 -2
  328. package/dist/src/config/schema.d.ts +253 -217
  329. package/dist/src/config/schema.js +91 -40
  330. package/dist/src/config/schema.js.map +1 -1
  331. package/dist/src/config/voice.d.ts +3 -28
  332. package/dist/src/config/voice.js +27 -261
  333. package/dist/src/config/voice.js.map +1 -1
  334. package/dist/src/config/workspace-path-helpers.d.ts +1 -2
  335. package/dist/src/config/workspace-path-helpers.js.map +1 -1
  336. package/dist/src/config/workspace-path.js +1 -1
  337. package/dist/src/cron/executor.js +2 -2
  338. package/dist/src/cron/persistence.js +1 -1
  339. package/dist/src/cron/run-log-store.js +1 -1
  340. package/dist/src/daemon/constants.js +1 -1
  341. package/dist/src/daemon/install-plan.js +27 -3
  342. package/dist/src/daemon/install-plan.js.map +1 -1
  343. package/dist/src/daemon/launchd.d.ts +8 -0
  344. package/dist/src/daemon/launchd.js +7 -14
  345. package/dist/src/daemon/launchd.js.map +1 -1
  346. package/dist/src/daemon/schtasks.d.ts +25 -0
  347. package/dist/src/daemon/schtasks.js +168 -48
  348. package/dist/src/daemon/schtasks.js.map +1 -1
  349. package/dist/src/daemon/service.js +5 -4
  350. package/dist/src/daemon/service.js.map +1 -1
  351. package/dist/src/daemon/systemd.d.ts +6 -0
  352. package/dist/src/daemon/systemd.js +20 -5
  353. package/dist/src/daemon/systemd.js.map +1 -1
  354. package/dist/src/extensions/activation-context.js +0 -1
  355. package/dist/src/extensions/activation-context.js.map +1 -1
  356. package/dist/src/extensions/bundle-mcp.js +1 -1
  357. package/dist/src/extensions/discover-extensions.js +1 -1
  358. package/dist/src/extensions/health.js +1 -1
  359. package/dist/src/extensions/loader.js +1 -1
  360. package/dist/src/extensions/lockfile.js +2 -2
  361. package/dist/src/extensions/normalize-manifest.js +0 -1
  362. package/dist/src/extensions/normalize-manifest.js.map +1 -1
  363. package/dist/src/extensions/types/manifest.d.ts +0 -2
  364. package/dist/src/gateway/agent-builtin-tools.d.ts +1 -1
  365. package/dist/src/gateway/agent-builtin-tools.js +1 -0
  366. package/dist/src/gateway/agent-builtin-tools.js.map +1 -1
  367. package/dist/src/gateway/agents-admin.d.ts +9 -0
  368. package/dist/src/gateway/agents-admin.js +28 -4
  369. package/dist/src/gateway/agents-admin.js.map +1 -1
  370. package/dist/src/gateway/config-tools-web.js +3 -2
  371. package/dist/src/gateway/config-tools-web.js.map +1 -1
  372. package/dist/src/gateway/file-path-classifier.js +2 -2
  373. package/dist/src/gateway/heartbeat/service.js +2 -2
  374. package/dist/src/gateway/heartbeat/service.js.map +1 -1
  375. package/dist/src/gateway/hono/app.js +1 -1
  376. package/dist/src/gateway/hono/lib/agent-model.d.ts +25 -10
  377. package/dist/src/gateway/hono/lib/agent-model.js +60 -36
  378. package/dist/src/gateway/hono/lib/agent-model.js.map +1 -1
  379. package/dist/src/gateway/hono/lib/config-payload.js +29 -6
  380. package/dist/src/gateway/hono/lib/config-payload.js.map +1 -1
  381. package/dist/src/gateway/hono/lib/extension-store.js +2 -2
  382. package/dist/src/gateway/hono/lib/mask-secret-length.d.ts +6 -0
  383. package/dist/src/gateway/hono/lib/mask-secret-length.js +16 -0
  384. package/dist/src/gateway/hono/lib/mask-secret-length.js.map +1 -0
  385. package/dist/src/gateway/hono/lib/safe-providers-config.d.ts +1 -1
  386. package/dist/src/gateway/hono/lib/safe-providers-config.js +2 -1
  387. package/dist/src/gateway/hono/lib/safe-providers-config.js.map +1 -1
  388. package/dist/src/gateway/hono/lib/safe-voice-config.js +16 -54
  389. package/dist/src/gateway/hono/lib/safe-voice-config.js.map +1 -1
  390. package/dist/src/gateway/hono/lib/static-ui.js +2 -2
  391. package/dist/src/gateway/hono/oauth.js +1 -1
  392. package/dist/src/gateway/hono/routes/agents.js +2 -2
  393. package/dist/src/gateway/hono/routes/auth-registry-extensions.js +1 -1
  394. package/dist/src/gateway/hono/routes/config-patch/agents.js +25 -7
  395. package/dist/src/gateway/hono/routes/config-patch/agents.js.map +1 -1
  396. package/dist/src/gateway/hono/routes/config-patch/channels.js +0 -11
  397. package/dist/src/gateway/hono/routes/config-patch/channels.js.map +1 -1
  398. package/dist/src/gateway/hono/routes/config-patch/gateway.js +3 -2
  399. package/dist/src/gateway/hono/routes/config-patch/gateway.js.map +1 -1
  400. package/dist/src/gateway/hono/routes/config-patch/misc.js +8 -3
  401. package/dist/src/gateway/hono/routes/config-patch/misc.js.map +1 -1
  402. package/dist/src/gateway/hono/routes/config.js +59 -0
  403. package/dist/src/gateway/hono/routes/config.js.map +1 -1
  404. package/dist/src/gateway/hono/routes/dreaming.js +1 -1
  405. package/dist/src/gateway/hono/routes/goals.js +1 -1
  406. package/dist/src/gateway/hono/routes/goals.js.map +1 -1
  407. package/dist/src/gateway/hono/routes/host-fs.js +2 -2
  408. package/dist/src/gateway/hono/routes/lazy-bundles.js +8 -0
  409. package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
  410. package/dist/src/gateway/hono/routes/models.js +75 -12
  411. package/dist/src/gateway/hono/routes/models.js.map +1 -1
  412. package/dist/src/gateway/hono/routes/sessions.js +28 -7
  413. package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
  414. package/dist/src/gateway/hono/routes/shares.js +15 -13
  415. package/dist/src/gateway/hono/routes/shares.js.map +1 -1
  416. package/dist/src/gateway/hono/routes/tunnel.js +1 -1
  417. package/dist/src/gateway/hono/routes/update.js +4 -2
  418. package/dist/src/gateway/hono/routes/update.js.map +1 -1
  419. package/dist/src/gateway/hono/routes/voice.js +75 -0
  420. package/dist/src/gateway/hono/routes/voice.js.map +1 -1
  421. package/dist/src/gateway/hono/routes/workflows.d.ts +3 -0
  422. package/dist/src/gateway/hono/routes/workflows.js +347 -0
  423. package/dist/src/gateway/hono/routes/workflows.js.map +1 -0
  424. package/dist/src/gateway/hono/routes/workspace.js +4 -4
  425. package/dist/src/gateway/hono/sse.js +16 -33
  426. package/dist/src/gateway/hono/sse.js.map +1 -1
  427. package/dist/src/gateway/lock.js +11 -11
  428. package/dist/src/gateway/lock.js.map +1 -1
  429. package/dist/src/gateway/ports.js +6 -6
  430. package/dist/src/gateway/ports.js.map +1 -1
  431. package/dist/src/gateway/resolve-webchat-session-key.d.ts +19 -0
  432. package/dist/src/gateway/resolve-webchat-session-key.js +46 -0
  433. package/dist/src/gateway/resolve-webchat-session-key.js.map +1 -0
  434. package/dist/src/gateway/service/agent-runner.js +2 -2
  435. package/dist/src/gateway/service/marketplace-service.js +2 -2
  436. package/dist/src/gateway/service/run-gateway-agent.js +9 -11
  437. package/dist/src/gateway/service/run-gateway-agent.js.map +1 -1
  438. package/dist/src/gateway/service/sessions-api.d.ts +3 -0
  439. package/dist/src/gateway/service/sessions-api.js +8 -0
  440. package/dist/src/gateway/service/sessions-api.js.map +1 -1
  441. package/dist/src/gateway/service.d.ts +3 -2
  442. package/dist/src/gateway/service.js +9 -8
  443. package/dist/src/gateway/service.js.map +1 -1
  444. package/dist/src/gateway/session-reset-service.d.ts +20 -0
  445. package/dist/src/gateway/session-reset-service.js +54 -0
  446. package/dist/src/gateway/session-reset-service.js.map +1 -0
  447. package/dist/src/gateway/startup-readiness.d.ts +1 -1
  448. package/dist/src/gateway/startup-readiness.js +1 -0
  449. package/dist/src/gateway/startup-readiness.js.map +1 -1
  450. package/dist/src/gateway/workspace-fs-file-list.js +1 -1
  451. package/dist/src/heartbeat/index.js +1 -1
  452. package/dist/src/infra/gateway-processes.js +2 -2
  453. package/dist/src/infra/gateway-processes.js.map +1 -1
  454. package/dist/src/infra/restart.js +2 -2
  455. package/dist/src/infra/run-command.d.ts +16 -0
  456. package/dist/src/infra/run-command.js +67 -0
  457. package/dist/src/infra/run-command.js.map +1 -0
  458. package/dist/src/infra/update-check.js +1 -1
  459. package/dist/src/infra/update-global.d.ts +45 -0
  460. package/dist/src/infra/update-global.js +224 -0
  461. package/dist/src/infra/update-global.js.map +1 -0
  462. package/dist/src/infra/update-lock.js +3 -3
  463. package/dist/src/infra/update-runner.js +1 -1
  464. package/dist/src/infra/update-startup.js +2 -2
  465. package/dist/src/infra/write-file-atomic.js +2 -2
  466. package/dist/src/mcp/channel-shared.js +2 -1
  467. package/dist/src/mcp/channel-shared.js.map +1 -1
  468. package/dist/src/providers/auth-runtime/auth-profile-store.js +2 -2
  469. package/dist/src/providers/auth-runtime/auth-profile-store.js.map +1 -1
  470. package/dist/src/providers/auth-runtime/resolve-auth.js +1 -12
  471. package/dist/src/providers/auth-runtime/resolve-auth.js.map +1 -1
  472. package/dist/src/providers/auth-runtime/types.d.ts +6 -12
  473. package/dist/src/providers/index.js +2 -2
  474. package/dist/src/providers/model-registry.js +1 -1
  475. package/dist/src/routing/agent-session-key.d.ts +58 -0
  476. package/dist/src/routing/agent-session-key.js +164 -0
  477. package/dist/src/routing/agent-session-key.js.map +1 -0
  478. package/dist/src/routing/index.d.ts +1 -1
  479. package/dist/src/routing/index.js +4 -2
  480. package/dist/src/routing/index.js.map +1 -1
  481. package/dist/src/routing/resolve-route.d.ts +15 -0
  482. package/dist/src/routing/resolve-route.js +41 -20
  483. package/dist/src/routing/resolve-route.js.map +1 -1
  484. package/dist/src/routing/resolve-tui-session-key.d.ts +25 -0
  485. package/dist/src/routing/resolve-tui-session-key.js +54 -0
  486. package/dist/src/routing/resolve-tui-session-key.js.map +1 -0
  487. package/dist/src/routing/session-key-utils.d.ts +24 -0
  488. package/dist/src/routing/session-key-utils.js +92 -0
  489. package/dist/src/routing/session-key-utils.js.map +1 -0
  490. package/dist/src/routing/session-key.d.ts +19 -49
  491. package/dist/src/routing/session-key.js +143 -116
  492. package/dist/src/routing/session-key.js.map +1 -1
  493. package/dist/src/session/config-store.js +2 -2
  494. package/dist/src/session/index.d.ts +6 -0
  495. package/dist/src/session/index.js +7 -1
  496. package/dist/src/session/init-session-turn.d.ts +30 -0
  497. package/dist/src/session/init-session-turn.js +102 -0
  498. package/dist/src/session/init-session-turn.js.map +1 -0
  499. package/dist/src/session/lifecycle-timestamps.d.ts +8 -0
  500. package/dist/src/session/lifecycle-timestamps.js +16 -0
  501. package/dist/src/session/lifecycle-timestamps.js.map +1 -0
  502. package/dist/src/session/manager.d.ts +7 -1
  503. package/dist/src/session/manager.js +8 -1
  504. package/dist/src/session/manager.js.map +1 -1
  505. package/dist/src/session/parity/jsonl-transcript-io.js +2 -2
  506. package/dist/src/session/parity/sessions-json-file.js +1 -1
  507. package/dist/src/session/parity/transcript-file-lock.js +2 -2
  508. package/dist/src/session/parity/transcript-paths.js +2 -2
  509. package/dist/src/session/parity/transcript-paths.js.map +1 -1
  510. package/dist/src/session/parity/xopc-session-disk-entry.d.ts +6 -0
  511. package/dist/src/session/reset-policy.d.ts +32 -0
  512. package/dist/src/session/reset-policy.js +65 -0
  513. package/dist/src/session/reset-policy.js.map +1 -0
  514. package/dist/src/session/reset-triggers.d.ts +20 -0
  515. package/dist/src/session/reset-triggers.js +63 -0
  516. package/dist/src/session/reset-triggers.js.map +1 -0
  517. package/dist/src/session/reset-type.d.ts +12 -0
  518. package/dist/src/session/reset-type.js +25 -0
  519. package/dist/src/session/reset-type.js.map +1 -0
  520. package/dist/src/session/resolve-session.d.ts +30 -0
  521. package/dist/src/session/resolve-session.js +93 -0
  522. package/dist/src/session/resolve-session.js.map +1 -0
  523. package/dist/src/session/search-index-cache.js +1 -1
  524. package/dist/src/session/search-index.js +1 -1
  525. package/dist/src/session/session-title.js +3 -2
  526. package/dist/src/session/session-title.js.map +1 -1
  527. package/dist/src/session/store.d.ts +11 -4
  528. package/dist/src/session/store.js +62 -11
  529. package/dist/src/session/store.js.map +1 -1
  530. package/dist/src/session/transcript-events.js +2 -1
  531. package/dist/src/session/transcript-events.js.map +1 -1
  532. package/dist/src/share/share-auto.js +2 -2
  533. package/dist/src/share/share-store.js +3 -3
  534. package/dist/src/share/share-thumbnail.js +2 -2
  535. package/dist/src/share/share-url.d.ts +33 -0
  536. package/dist/src/share/share-url.js +56 -14
  537. package/dist/src/share/share-url.js.map +1 -1
  538. package/dist/src/share/share-zip.js +1 -1
  539. package/dist/src/share/site-share-store.js +3 -3
  540. package/dist/src/share/site-static-serve.js +1 -1
  541. package/dist/src/tui/backends/embedded-backend.js +4 -9
  542. package/dist/src/tui/backends/embedded-backend.js.map +1 -1
  543. package/dist/src/tui/backends/gateway-sse-backend.js +1 -1
  544. package/dist/src/tui/backends/gateway-sse-backend.js.map +1 -1
  545. package/dist/src/tui/clipboard-image.js +3 -3
  546. package/dist/src/tui/components/chat-log.js +3 -3
  547. package/dist/src/tui/components/chat-log.js.map +1 -1
  548. package/dist/src/tui/theme-manager.js +1 -1
  549. package/dist/src/tui/theme.d.ts +0 -2
  550. package/dist/src/tui/theme.js +1 -3
  551. package/dist/src/tui/theme.js.map +1 -1
  552. package/dist/src/tui/tui-agent-events.js +2 -1
  553. package/dist/src/tui/tui-agent-events.js.map +1 -1
  554. package/dist/src/tui/tui-commands.d.ts +3 -0
  555. package/dist/src/tui/tui-commands.js +45 -10
  556. package/dist/src/tui/tui-commands.js.map +1 -1
  557. package/dist/src/tui/tui-keybindings-file.js +2 -22
  558. package/dist/src/tui/tui-keybindings-file.js.map +1 -1
  559. package/dist/src/tui/tui-scoped-models.js +2 -2
  560. package/dist/src/tui/tui-session-actions.d.ts +28 -0
  561. package/dist/src/tui/tui-session-actions.js +88 -0
  562. package/dist/src/tui/tui-session-actions.js.map +1 -0
  563. package/dist/src/tui/tui-settings.js +1 -1
  564. package/dist/src/tui/tui.js +54 -49
  565. package/dist/src/tui/tui.js.map +1 -1
  566. package/dist/src/tunnel/frpc-binary.js +3 -3
  567. package/dist/src/tunnel/frpc-config.js +1 -1
  568. package/dist/src/tunnel/frpc-extract.js +1 -1
  569. package/dist/src/tunnel/tunnel-state.js +1 -1
  570. package/dist/src/utils/logger/audit.js +1 -1
  571. package/dist/src/utils/logger/log-store.js +1 -1
  572. package/dist/src/utils/logger/rotation.js +1 -1
  573. package/dist/src/utils/string-coerce.d.ts +2 -0
  574. package/dist/src/utils/string-coerce.js +10 -1
  575. package/dist/src/utils/string-coerce.js.map +1 -1
  576. package/dist/src/voice/metadata/builtin.d.ts +2 -0
  577. package/dist/src/voice/metadata/builtin.js +420 -0
  578. package/dist/src/voice/metadata/builtin.js.map +1 -0
  579. package/dist/src/voice/metadata/index.d.ts +4 -0
  580. package/dist/src/voice/metadata/index.js +3 -0
  581. package/dist/src/voice/metadata/registry.d.ts +5 -0
  582. package/dist/src/voice/metadata/registry.js +34 -0
  583. package/dist/src/voice/metadata/registry.js.map +1 -0
  584. package/dist/src/voice/metadata/types.d.ts +41 -0
  585. package/dist/src/voice/metadata/types.js +1 -0
  586. package/dist/src/voice/stt/config-slice.d.ts +2 -5
  587. package/dist/src/voice/stt/config-slice.js +5 -26
  588. package/dist/src/voice/stt/config-slice.js.map +1 -1
  589. package/dist/src/voice/stt/list-providers.d.ts +3 -3
  590. package/dist/src/voice/stt/list-providers.js +41 -6
  591. package/dist/src/voice/stt/list-providers.js.map +1 -1
  592. package/dist/src/voice/stt/types.d.ts +1 -18
  593. package/dist/src/voice/stt/types.js +4 -2
  594. package/dist/src/voice/stt/types.js.map +1 -1
  595. package/dist/src/voice/tts/audio.js +1 -1
  596. package/dist/src/voice/tts/config-slice.d.ts +3 -7
  597. package/dist/src/voice/tts/config-slice.js +7 -38
  598. package/dist/src/voice/tts/config-slice.js.map +1 -1
  599. package/dist/src/voice/tts/list-providers.d.ts +3 -3
  600. package/dist/src/voice/tts/list-providers.js +41 -6
  601. package/dist/src/voice/tts/list-providers.js.map +1 -1
  602. package/dist/src/voice/tts/merge-config.js +2 -48
  603. package/dist/src/voice/tts/merge-config.js.map +1 -1
  604. package/dist/src/voice/tts/providers/alibaba-speech.js +1 -1
  605. package/dist/src/voice/tts/providers/alibaba-speech.js.map +1 -1
  606. package/dist/src/voice/tts/providers/edge-speech.js +2 -2
  607. package/dist/src/voice/tts/types.d.ts +1 -29
  608. package/dist/src/voice/tts/types.js +19 -17
  609. package/dist/src/voice/tts/types.js.map +1 -1
  610. package/dist/src/workflows/domain/command.d.ts +18 -0
  611. package/dist/src/workflows/domain/command.js +1 -0
  612. package/dist/src/workflows/domain/definition.d.ts +62 -0
  613. package/dist/src/workflows/domain/definition.js +1 -0
  614. package/dist/src/workflows/domain/event.d.ts +67 -0
  615. package/dist/src/workflows/domain/event.js +1 -0
  616. package/dist/src/workflows/domain/index.d.ts +5 -0
  617. package/dist/src/workflows/domain/index.js +2 -0
  618. package/dist/src/workflows/domain/result.d.ts +65 -0
  619. package/dist/src/workflows/domain/result.js +1 -0
  620. package/dist/src/workflows/domain/run.d.ts +120 -0
  621. package/dist/src/workflows/domain/run.js +14 -0
  622. package/dist/src/workflows/domain/run.js.map +1 -0
  623. package/dist/src/workflows/engine/index.d.ts +2 -0
  624. package/dist/src/workflows/engine/index.js +3 -0
  625. package/dist/src/workflows/engine/projector.d.ts +3 -0
  626. package/dist/src/workflows/engine/projector.js +205 -0
  627. package/dist/src/workflows/engine/projector.js.map +1 -0
  628. package/dist/src/workflows/engine/workflow-engine.d.ts +31 -0
  629. package/dist/src/workflows/engine/workflow-engine.js +188 -0
  630. package/dist/src/workflows/engine/workflow-engine.js.map +1 -0
  631. package/dist/src/workflows/index.d.ts +6 -0
  632. package/dist/src/workflows/index.js +11 -0
  633. package/dist/src/workflows/runtime/index.d.ts +1 -0
  634. package/dist/src/workflows/runtime/index.js +4 -0
  635. package/dist/src/workflows/runtime/script-runtime.d.ts +3 -0
  636. package/dist/src/workflows/runtime/script-runtime.js +3 -0
  637. package/dist/src/workflows/store/event-store.d.ts +17 -0
  638. package/dist/src/workflows/store/event-store.js +83 -0
  639. package/dist/src/workflows/store/event-store.js.map +1 -0
  640. package/dist/src/workflows/store/paths.d.ts +7 -0
  641. package/dist/src/workflows/store/paths.js +26 -0
  642. package/dist/src/workflows/store/paths.js.map +1 -0
  643. package/dist/src/workflows/store/run-store.d.ts +13 -0
  644. package/dist/src/workflows/store/run-store.js +68 -0
  645. package/dist/src/workflows/store/run-store.js.map +1 -0
  646. package/package.json +5 -8
  647. package/dist/gateway/static/root/assets/agents-mS3_HpRI.js +0 -222
  648. package/dist/gateway/static/root/assets/channels-settings-BG6b9KrW.js +0 -1
  649. package/dist/gateway/static/root/assets/extension-settings-page-B-W4x2xP.js +0 -1
  650. package/dist/gateway/static/root/assets/index-ew_2L2We.css +0 -1
  651. package/dist/gateway/static/root/assets/sessions-page-FaG_Vlkb.js +0 -1
  652. package/dist/gateway/static/root/assets/settings-page-Bet1OerL.js +0 -3
  653. package/dist/gateway/static/root/assets/skills-page-DhUO235y.js +0 -2
  654. package/dist/gateway/static/root/assets/url-BwNL6Rgk.js +0 -3
  655. package/dist/gateway/static/root/assets/voice-api-key-field-CGEydndO.js +0 -1
  656. package/dist/src/agent/tools/browser-legacy-tools.d.ts +0 -17
  657. package/dist/src/agent/tools/browser-legacy-tools.js +0 -766
  658. package/dist/src/agent/tools/browser-legacy-tools.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"tui-commands.js","names":[],"sources":["../../../src/tui/tui-commands.ts"],"sourcesContent":["import type { KeybindingsManager, TUI } from '@earendil-works/pi-tui';\n\nimport type { ChatLog } from './components/chat-log.js';\nimport { formatXopcTuiHotkeys } from './format-tui-hotkeys.js';\nimport { getTuiKeybindingsPath } from './tui-keybindings-file.js';\nimport type { StreamAssembler } from './stream-assembler.js';\nimport type { TuiState } from './tui-types.js';\n\nimport { rewriteUnknownSlashAsWorkflow } from './tui-workflow-slash.js';\n\ninterface SlashCommandDef {\n name: string;\n description: string;\n}\n\nexport type TuiExtensionSlashCommandEntry = SlashCommandDef & {\n handler: (args: string) => void | Promise<void>;\n};\n\nexport function getSlashCommands(_isLocal: boolean): SlashCommandDef[] {\n return [\n { name: 'help', description: 'Show available commands' },\n { name: 'abort', description: 'Abort active run (or press Escape)' },\n { name: 'tools', description: 'Toggle tool output expanded/collapsed (or Ctrl+O)' },\n { name: 'thinking', description: 'Toggle thinking display (or Ctrl+T)' },\n { name: 'exit', description: 'Exit the TUI' },\n { name: 'models', description: 'List available models' },\n { name: 'switch', description: 'Switch model — copy `provider/model` from /models' },\n { name: 'usage', description: 'Show token usage statistics' },\n { name: 'new', description: 'Start a new session' },\n { name: 'clear', description: 'Clear current session' },\n { name: 'list', description: 'List sessions' },\n { name: 'resume', description: 'Open session picker (or Ctrl+Shift+P)' },\n { name: 'scoped-models', description: 'Choose models for Ctrl+P cycling' },\n { name: 'compact', description: 'Compact session history (local API)' },\n { name: 'think', description: 'Set thinking level (e.g. /think high)' },\n { name: 'reasoning', description: 'Set reasoning visibility (e.g. /reasoning stream)' },\n { name: 'verbose', description: 'Toggle verbose mode' },\n { name: 'status', description: 'Show agent status' },\n { name: 'config', description: 'Show or update configuration' },\n { name: 'context', description: 'Show context budget' },\n { name: 'btw', description: 'Side question without saving to session' },\n { name: 'export', description: 'Export session (markdown/html/json)' },\n { name: 'settings', description: 'Open TUI settings overlay' },\n { name: 'reload-keybindings', description: 'Reload ~/.xopc/keybindings.json' },\n { name: 'start', description: 'Show welcome message' },\n { name: 'hotkeys', description: 'Show resolved keyboard shortcuts (pi-style)' },\n { name: 'workflows', description: 'List saved workflows (built-in + ~/.xopc/workflows/)' },\n { name: 'workflow', description: 'Workflow subcommands: list, view <name>, save <name>' },\n ];\n}\n\nexport function formatTuiHelpText(isLocal: boolean): string {\n const commands = getSlashCommands(isLocal);\n const lines = ['Available commands:'];\n for (const c of commands) {\n lines.push(` /${c.name} — ${c.description}`);\n }\n lines.push('', 'Keyboard shortcuts (defaults align with pi coding-agent where noted):');\n lines.push(' Escape — Abort active run');\n lines.push(' Shift+Tab — Cycle /think level');\n lines.push(' Ctrl+P / Shift+Ctrl+P — Next / previous model (/switch)');\n lines.push(' Ctrl+L — Model picker');\n lines.push(' Ctrl+Shift+P — Session picker (rename/delete)');\n lines.push(' /scoped-models — Limit Ctrl+P model cycle set');\n lines.push(' Ctrl+O — Toggle tool output');\n lines.push(' Ctrl+T — Toggle thinking block display');\n lines.push(' Ctrl+G — Edit draft in $EDITOR');\n lines.push(' Ctrl+Z — Suspend to shell (Unix)');\n lines.push(' Alt+Enter — Queue follow-up while busy (sends when this reply finishes)');\n lines.push(' Alt+Up — Restore queued follow-up messages to editor');\n lines.push(' Enter (while busy) — Steer: inject at next tool boundary');\n lines.push(' Ctrl+V (mac/Linux) / Alt+V (Win) — Paste image from clipboard');\n lines.push(' /settings — Theme, thinking display, terminal progress, …');\n lines.push(' ~/.xopc/keybindings.json — Custom shortcuts (use /reload-keybindings)');\n lines.push(' Ctrl+C — Clear input; repeat within ~0.5s to exit when empty');\n lines.push(' Ctrl+D — Exit when input empty');\n lines.push(' !cmd — Local shell (gated; runs on this machine)');\n lines.push('', 'Use /hotkeys for the resolved binding list from the active keymap.');\n return lines.join('\\n');\n}\n\nexport type CommandHandlerDeps = {\n state: TuiState;\n chatLog: ChatLog;\n tui: TUI;\n assembler: StreamAssembler;\n isLocalMode: boolean;\n abortActive: () => Promise<void>;\n sendMessage: (text: string) => void;\n requestExit: () => void;\n updateFooter: () => void;\n keybindings: KeybindingsManager;\n uiOverlays?: {\n openSessionPicker: () => void;\n openScopedModels: () => void;\n openSettings: () => void;\n reloadKeybindings: () => void;\n };\n runCompaction?: () => void | Promise<void>;\n extensionSlashCommands?: TuiExtensionSlashCommandEntry[];\n};\n\nexport function createTuiCommandHandler(deps: CommandHandlerDeps): (input: string) => void {\n const {\n state,\n chatLog,\n tui,\n assembler,\n isLocalMode,\n abortActive,\n sendMessage,\n requestExit,\n updateFooter,\n keybindings,\n uiOverlays,\n extensionSlashCommands = [],\n } = deps;\n\n return (input: string) => {\n const trimmed = input.replace(/^\\//, '').trim();\n const [commandName, ...restParts] = trimmed.split(/\\s+/);\n const normalizedCommand = (commandName ?? '').toLowerCase();\n const commandArgs = restParts.join(' ');\n\n const extensionCmd = extensionSlashCommands.find((c) => c.name === normalizedCommand);\n if (extensionCmd) {\n void Promise.resolve(extensionCmd.handler(commandArgs)).then(() => {\n tui.requestRender();\n });\n return;\n }\n\n switch (normalizedCommand) {\n case 'help':\n chatLog.addSystem(formatTuiHelpText(isLocalMode));\n tui.requestRender();\n return;\n case 'hotkeys':\n case 'keys':\n chatLog.addSystem(formatXopcTuiHotkeys(keybindings));\n tui.requestRender();\n return;\n case 'exit':\n case 'quit':\n requestExit();\n return;\n case 'abort':\n case 'stop':\n case 'cancel':\n void abortActive().then(() => {\n chatLog.addSystem('Aborted.');\n tui.requestRender();\n });\n return;\n case 'tools':\n state.toolsExpanded = !state.toolsExpanded;\n chatLog.setToolsExpanded(state.toolsExpanded);\n chatLog.addSystem(`Tools: ${state.toolsExpanded ? 'expanded' : 'collapsed'}`);\n tui.requestRender();\n return;\n case 'thinking':\n state.showThinking = !state.showThinking;\n chatLog.addSystem(`Thinking display: ${state.showThinking ? 'on' : 'off'}`);\n updateFooter();\n tui.requestRender();\n return;\n case 'resume':\n case 'sessions':\n uiOverlays?.openSessionPicker();\n return;\n case 'scoped-models':\n case 'scopedmodels':\n uiOverlays?.openScopedModels();\n return;\n case 'settings':\n uiOverlays?.openSettings();\n return;\n case 'reload-keybindings':\n case 'reload-keybind':\n uiOverlays?.reloadKeybindings();\n chatLog.addSystem(`Keybindings reloaded from ${getTuiKeybindingsPath()}`);\n tui.requestRender();\n return;\n case 'compact':\n void deps.runCompaction?.();\n return;\n default:\n break;\n }\n\n switch (normalizedCommand) {\n case 'new':\n case 'reset':\n case 'restart':\n case 'clear': {\n void abortActive().then(() => {\n assembler.clear();\n chatLog.clearAll();\n state.messageFollowUpQueue.length = 0;\n tui.requestRender();\n sendMessage(input);\n });\n return;\n }\n default:\n break;\n }\n\n // Unknown slash that names a known workflow → rewrite into a natural prompt\n // so the assistant deterministically calls workflow({name}) instead of\n // depending on the model to puzzle out \"/audit_repo\".\n if (input.trimStart().startsWith('/')) {\n const rewritten = rewriteUnknownSlashAsWorkflow(normalizedCommand, commandArgs);\n if (rewritten) {\n chatLog.addSystem(`▶ Running workflow: ${normalizedCommand}`);\n tui.requestRender();\n sendMessage(rewritten);\n return;\n }\n }\n\n sendMessage(input);\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"tui-commands.js","names":[],"sources":["../../../src/tui/tui-commands.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\n\nimport type { KeybindingsManager, TUI } from '@earendil-works/pi-tui';\n\nimport type { ChatLog } from './components/chat-log.js';\nimport { formatXopcTuiHotkeys } from './format-tui-hotkeys.js';\nimport { getTuiKeybindingsPath } from './tui-keybindings-file.js';\nimport type { StreamAssembler } from './stream-assembler.js';\nimport type { TuiState } from './tui-types.js';\n\nimport { rewriteUnknownSlashAsWorkflow } from './tui-workflow-slash.js';\n\ninterface SlashCommandDef {\n name: string;\n description: string;\n}\n\nexport type TuiExtensionSlashCommandEntry = SlashCommandDef & {\n handler: (args: string) => void | Promise<void>;\n};\n\nexport function getSlashCommands(_isLocal: boolean): SlashCommandDef[] {\n return [\n { name: 'help', description: 'Show available commands' },\n { name: 'abort', description: 'Abort active run (or press Escape)' },\n { name: 'tools', description: 'Toggle tool output expanded/collapsed (or Ctrl+O)' },\n { name: 'thinking', description: 'Toggle thinking display (or Ctrl+T)' },\n { name: 'exit', description: 'Exit the TUI' },\n { name: 'models', description: 'List available models' },\n { name: 'switch', description: 'Switch model — copy `provider/model` from /models' },\n { name: 'usage', description: 'Show token usage statistics' },\n { name: 'new', description: 'Start a new isolated TUI session (tui-{uuid})' },\n { name: 'reset', description: 'Reset current session transcript and reload history' },\n { name: 'clear', description: 'Alias for /reset' },\n { name: 'list', description: 'List sessions' },\n { name: 'resume', description: 'Open session picker (or Ctrl+Shift+P)' },\n { name: 'scoped-models', description: 'Choose models for Ctrl+P cycling' },\n { name: 'compact', description: 'Compact session history (local API)' },\n { name: 'think', description: 'Set thinking level (e.g. /think high)' },\n { name: 'reasoning', description: 'Set reasoning visibility (e.g. /reasoning stream)' },\n { name: 'verbose', description: 'Toggle verbose mode' },\n { name: 'status', description: 'Show agent status' },\n { name: 'config', description: 'Show or update configuration' },\n { name: 'context', description: 'Show context budget' },\n { name: 'btw', description: 'Side question without saving to session' },\n { name: 'export', description: 'Export session (markdown/html/json)' },\n { name: 'settings', description: 'Open TUI settings overlay' },\n { name: 'reload-keybindings', description: 'Reload ~/.xopc/keybindings.json' },\n { name: 'start', description: 'Show welcome message' },\n { name: 'hotkeys', description: 'Show resolved keyboard shortcuts (pi-style)' },\n { name: 'workflows', description: 'List saved workflows (built-in + ~/.xopc/workflows/)' },\n { name: 'workflow', description: 'Workflow subcommands: list, view <name>, save <name>' },\n ];\n}\n\nexport function formatTuiHelpText(isLocal: boolean): string {\n const commands = getSlashCommands(isLocal);\n const lines = ['Available commands:'];\n for (const c of commands) {\n lines.push(` /${c.name} — ${c.description}`);\n }\n lines.push('', 'Keyboard shortcuts (defaults align with pi coding-agent where noted):');\n lines.push(' Escape — Abort active run');\n lines.push(' Shift+Tab — Cycle /think level');\n lines.push(' Ctrl+P / Shift+Ctrl+P — Next / previous model (/switch)');\n lines.push(' Ctrl+L — Model picker');\n lines.push(' Ctrl+Shift+P — Session picker (rename/delete)');\n lines.push(' /scoped-models — Limit Ctrl+P model cycle set');\n lines.push(' Ctrl+O — Toggle tool output');\n lines.push(' Ctrl+T — Toggle thinking block display');\n lines.push(' Ctrl+G — Edit draft in $EDITOR');\n lines.push(' Ctrl+Z — Suspend to shell (Unix)');\n lines.push(' Alt+Enter — Queue follow-up while busy (sends when this reply finishes)');\n lines.push(' Alt+Up — Restore queued follow-up messages to editor');\n lines.push(' Enter (while busy) — Steer: inject at next tool boundary');\n lines.push(' Ctrl+V (mac/Linux) / Alt+V (Win) — Paste image from clipboard');\n lines.push(' /settings — Theme, thinking display, terminal progress, …');\n lines.push(' ~/.xopc/keybindings.json — Custom shortcuts (use /reload-keybindings)');\n lines.push(' Ctrl+C — Clear input; repeat within ~0.5s to exit when empty');\n lines.push(' Ctrl+D — Exit when input empty');\n lines.push(' !cmd — Local shell (gated; runs on this machine)');\n lines.push('', 'Use /hotkeys for the resolved binding list from the active keymap.');\n return lines.join('\\n');\n}\n\nexport type CommandHandlerDeps = {\n state: TuiState;\n chatLog: ChatLog;\n tui: TUI;\n assembler: StreamAssembler;\n isLocalMode: boolean;\n abortActive: () => Promise<void>;\n sendMessage: (text: string) => void;\n requestExit: () => void;\n updateFooter: () => void;\n keybindings: KeybindingsManager;\n uiOverlays?: {\n openSessionPicker: () => void;\n openScopedModels: () => void;\n openSettings: () => void;\n reloadKeybindings: () => void;\n };\n runCompaction?: () => void | Promise<void>;\n extensionSlashCommands?: TuiExtensionSlashCommandEntry[];\n currentAgentId?: string;\n setSession?: (rawKey: string) => Promise<void>;\n resetSession?: () => Promise<void>;\n};\n\nexport function createTuiCommandHandler(deps: CommandHandlerDeps): (input: string) => void {\n const {\n state,\n chatLog,\n tui,\n assembler,\n isLocalMode,\n abortActive,\n sendMessage,\n requestExit,\n updateFooter,\n keybindings,\n uiOverlays,\n extensionSlashCommands = [],\n setSession,\n resetSession,\n } = deps;\n\n const runReset = async () => {\n await abortActive();\n if (resetSession) {\n await resetSession();\n chatLog.addSystem(`session ${state.currentSessionKey} reset`);\n } else {\n assembler.clear();\n chatLog.clearAll();\n state.messageFollowUpQueue.length = 0;\n chatLog.addSystem('Session cleared (reset not available in this mode).');\n }\n tui.requestRender();\n };\n\n return (input: string) => {\n const trimmed = input.replace(/^\\//, '').trim();\n const [commandName, ...restParts] = trimmed.split(/\\s+/);\n const normalizedCommand = (commandName ?? '').toLowerCase();\n const commandArgs = restParts.join(' ');\n\n const extensionCmd = extensionSlashCommands.find((c) => c.name === normalizedCommand);\n if (extensionCmd) {\n void Promise.resolve(extensionCmd.handler(commandArgs)).then(() => {\n tui.requestRender();\n });\n return;\n }\n\n switch (normalizedCommand) {\n case 'help':\n chatLog.addSystem(formatTuiHelpText(isLocalMode));\n tui.requestRender();\n return;\n case 'hotkeys':\n case 'keys':\n chatLog.addSystem(formatXopcTuiHotkeys(keybindings));\n tui.requestRender();\n return;\n case 'exit':\n case 'quit':\n requestExit();\n return;\n case 'abort':\n case 'stop':\n case 'cancel':\n void abortActive().then(() => {\n chatLog.addSystem('Aborted.');\n tui.requestRender();\n });\n return;\n case 'tools':\n state.toolsExpanded = !state.toolsExpanded;\n chatLog.setToolsExpanded(state.toolsExpanded);\n chatLog.addSystem(`Tools: ${state.toolsExpanded ? 'expanded' : 'collapsed'}`);\n tui.requestRender();\n return;\n case 'thinking':\n state.showThinking = !state.showThinking;\n chatLog.addSystem(`Thinking display: ${state.showThinking ? 'on' : 'off'}`);\n updateFooter();\n tui.requestRender();\n return;\n case 'resume':\n case 'sessions':\n uiOverlays?.openSessionPicker();\n return;\n case 'scoped-models':\n case 'scopedmodels':\n uiOverlays?.openScopedModels();\n return;\n case 'settings':\n uiOverlays?.openSettings();\n return;\n case 'reload-keybindings':\n case 'reload-keybind':\n uiOverlays?.reloadKeybindings();\n chatLog.addSystem(`Keybindings reloaded from ${getTuiKeybindingsPath()}`);\n tui.requestRender();\n return;\n case 'compact':\n void deps.runCompaction?.();\n return;\n default:\n break;\n }\n\n switch (normalizedCommand) {\n case 'new': {\n void (async () => {\n try {\n await abortActive();\n const uniqueKey = `tui-${randomUUID()}`;\n if (setSession) {\n await setSession(uniqueKey);\n chatLog.addSystem(`new session: ${state.currentSessionKey}`);\n } else {\n assembler.clear();\n chatLog.clearAll();\n state.messageFollowUpQueue.length = 0;\n chatLog.addSystem('New session requires gateway or local session support.');\n }\n tui.requestRender();\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`new session failed: ${errorMessage}`);\n tui.requestRender();\n }\n })();\n return;\n }\n case 'reset':\n case 'restart':\n void runReset();\n return;\n case 'clear':\n void runReset();\n return;\n default:\n break;\n }\n\n // Unknown slash that names a known workflow → rewrite into a natural prompt\n // so the assistant deterministically calls workflow({name}) instead of\n // depending on the model to puzzle out \"/audit_repo\".\n if (input.trimStart().startsWith('/')) {\n const rewritten = rewriteUnknownSlashAsWorkflow(normalizedCommand, commandArgs);\n if (rewritten) {\n chatLog.addSystem(`▶ Running workflow: ${normalizedCommand}`);\n tui.requestRender();\n sendMessage(rewritten);\n return;\n }\n }\n\n sendMessage(input);\n };\n}\n"],"mappings":"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"}
@@ -1,20 +1,11 @@
1
1
  import { resolveStateDir } from "../config/paths-state.js";
2
2
  import { init_paths } from "../config/paths.js";
3
3
  import { XOPC_TUI_KEYBINDINGS } from "./xopc-tui-keybindings.js";
4
- import { join } from "node:path";
5
4
  import { existsSync, readFileSync } from "node:fs";
5
+ import { join } from "node:path";
6
6
  import { KeybindingsManager } from "@earendil-works/pi-tui";
7
7
  //#region src/tui/tui-keybindings-file.ts
8
8
  init_paths();
9
- const LEGACY_KEYBINDING_MIGRATIONS = {
10
- interrupt: "app.interrupt",
11
- clear: "app.clear",
12
- exit: "app.exit",
13
- suspend: "app.suspend",
14
- pasteImage: "app.clipboard.pasteImage",
15
- followUp: "app.message.followUp",
16
- dequeue: "app.message.dequeue"
17
- };
18
9
  function isRecord(value) {
19
10
  return typeof value === "object" && value !== null && !Array.isArray(value);
20
11
  }
@@ -30,15 +21,6 @@ function toKeybindingsConfig(value) {
30
21
  }
31
22
  return config;
32
23
  }
33
- function migrateKeybindingsConfig(rawConfig) {
34
- const config = {};
35
- for (const [key, value] of Object.entries(rawConfig)) {
36
- const nextKey = LEGACY_KEYBINDING_MIGRATIONS[key] ?? key;
37
- if (Object.hasOwn(rawConfig, nextKey) && nextKey !== key) continue;
38
- config[nextKey] = value;
39
- }
40
- return config;
41
- }
42
24
  function loadRawConfig(path) {
43
25
  if (!existsSync(path)) return void 0;
44
26
  try {
@@ -52,9 +34,7 @@ function getTuiKeybindingsPath() {
52
34
  return join(resolveStateDir(), "keybindings.json");
53
35
  }
54
36
  function loadTuiKeybindingsConfig(path = getTuiKeybindingsPath()) {
55
- const raw = loadRawConfig(path);
56
- if (!raw) return {};
57
- return toKeybindingsConfig(migrateKeybindingsConfig(raw));
37
+ return toKeybindingsConfig(loadRawConfig(path));
58
38
  }
59
39
  var XopcKeybindingsManager = class extends KeybindingsManager {
60
40
  constructor(userBindings = {}, configPath = getTuiKeybindingsPath()) {
@@ -1 +1 @@
1
- {"version":3,"file":"tui-keybindings-file.js","names":[],"sources":["../../../src/tui/tui-keybindings-file.ts"],"sourcesContent":["import { existsSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\n\nimport {\n KeybindingsManager,\n type KeybindingsConfig,\n type KeyId,\n} from '@earendil-works/pi-tui';\n\nimport { resolveStateDir } from '../config/paths.js';\nimport { XOPC_TUI_KEYBINDINGS } from './xopc-tui-keybindings.js';\n\nconst LEGACY_KEYBINDING_MIGRATIONS: Record<string, string> = {\n interrupt: 'app.interrupt',\n clear: 'app.clear',\n exit: 'app.exit',\n suspend: 'app.suspend',\n pasteImage: 'app.clipboard.pasteImage',\n followUp: 'app.message.followUp',\n dequeue: 'app.message.dequeue',\n};\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction toKeybindingsConfig(value: unknown): KeybindingsConfig {\n if (!isRecord(value)) return {};\n const config: KeybindingsConfig = {};\n for (const [key, binding] of Object.entries(value)) {\n if (typeof binding === 'string') {\n config[key] = binding as KeyId;\n continue;\n }\n if (Array.isArray(binding) && binding.every((entry) => typeof entry === 'string')) {\n config[key] = binding as KeyId[];\n }\n }\n return config;\n}\n\nfunction migrateKeybindingsConfig(rawConfig: Record<string, unknown>): KeybindingsConfig {\n const config: KeybindingsConfig = {};\n for (const [key, value] of Object.entries(rawConfig)) {\n const nextKey = LEGACY_KEYBINDING_MIGRATIONS[key] ?? key;\n if (Object.hasOwn(rawConfig, nextKey) && nextKey !== key) continue;\n config[nextKey] = value as KeyId | KeyId[];\n }\n return config;\n}\n\nfunction loadRawConfig(path: string): Record<string, unknown> | undefined {\n if (!existsSync(path)) return undefined;\n try {\n const parsed = JSON.parse(readFileSync(path, 'utf8')) as unknown;\n return isRecord(parsed) ? parsed : undefined;\n } catch {\n return undefined;\n }\n}\n\nexport function getTuiKeybindingsPath(): string {\n return join(resolveStateDir(), 'keybindings.json');\n}\n\nexport function loadTuiKeybindingsConfig(path = getTuiKeybindingsPath()): KeybindingsConfig {\n const raw = loadRawConfig(path);\n if (!raw) return {};\n return toKeybindingsConfig(migrateKeybindingsConfig(raw));\n}\n\nexport class XopcKeybindingsManager extends KeybindingsManager {\n constructor(\n userBindings: KeybindingsConfig = {},\n private readonly configPath = getTuiKeybindingsPath(),\n ) {\n super(XOPC_TUI_KEYBINDINGS, userBindings);\n }\n\n reload(): void {\n this.setUserBindings(loadTuiKeybindingsConfig(this.configPath));\n }\n\n getConfigPath(): string {\n return this.configPath;\n }\n}\n\nexport function createXopcTuiKeybindingsManager(): XopcKeybindingsManager {\n const configPath = getTuiKeybindingsPath();\n return new XopcKeybindingsManager(loadTuiKeybindingsConfig(configPath), configPath);\n}\n"],"mappings":";;;;;;;YASqD;AAGrD,MAAM,+BAAuD;CAC3D,WAAW;CACX,OAAO;CACP,MAAM;CACN,SAAS;CACT,YAAY;CACZ,UAAU;CACV,SAAS;CACV;AAED,SAAS,SAAS,OAAkD;AAClE,QAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,MAAM;;AAG7E,SAAS,oBAAoB,OAAmC;AAC9D,KAAI,CAAC,SAAS,MAAM,CAAE,QAAO,EAAE;CAC/B,MAAM,SAA4B,EAAE;AACpC,MAAK,MAAM,CAAC,KAAK,YAAY,OAAO,QAAQ,MAAM,EAAE;AAClD,MAAI,OAAO,YAAY,UAAU;AAC/B,UAAO,OAAO;AACd;;AAEF,MAAI,MAAM,QAAQ,QAAQ,IAAI,QAAQ,OAAO,UAAU,OAAO,UAAU,SAAS,CAC/E,QAAO,OAAO;;AAGlB,QAAO;;AAGT,SAAS,yBAAyB,WAAuD;CACvF,MAAM,SAA4B,EAAE;AACpC,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,UAAU,EAAE;EACpD,MAAM,UAAU,6BAA6B,QAAQ;AACrD,MAAI,OAAO,OAAO,WAAW,QAAQ,IAAI,YAAY,IAAK;AAC1D,SAAO,WAAW;;AAEpB,QAAO;;AAGT,SAAS,cAAc,MAAmD;AACxE,KAAI,CAAC,WAAW,KAAK,CAAE,QAAO,KAAA;AAC9B,KAAI;EACF,MAAM,SAAS,KAAK,MAAM,aAAa,MAAM,OAAO,CAAC;AACrD,SAAO,SAAS,OAAO,GAAG,SAAS,KAAA;SAC7B;AACN;;;AAIJ,SAAgB,wBAAgC;AAC9C,QAAO,KAAK,iBAAiB,EAAE,mBAAmB;;AAGpD,SAAgB,yBAAyB,OAAO,uBAAuB,EAAqB;CAC1F,MAAM,MAAM,cAAc,KAAK;AAC/B,KAAI,CAAC,IAAK,QAAO,EAAE;AACnB,QAAO,oBAAoB,yBAAyB,IAAI,CAAC;;AAG3D,IAAa,yBAAb,cAA4C,mBAAmB;CAC7D,YACE,eAAkC,EAAE,EACpC,aAA8B,uBAAuB,EACrD;AACA,QAAM,sBAAsB,aAAa;AAFxB,OAAA,aAAA;;CAKnB,SAAe;AACb,OAAK,gBAAgB,yBAAyB,KAAK,WAAW,CAAC;;CAGjE,gBAAwB;AACtB,SAAO,KAAK;;;AAIhB,SAAgB,kCAA0D;CACxE,MAAM,aAAa,uBAAuB;AAC1C,QAAO,IAAI,uBAAuB,yBAAyB,WAAW,EAAE,WAAW"}
1
+ {"version":3,"file":"tui-keybindings-file.js","names":[],"sources":["../../../src/tui/tui-keybindings-file.ts"],"sourcesContent":["import { existsSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\n\nimport {\n KeybindingsManager,\n type KeybindingsConfig,\n type KeyId,\n} from '@earendil-works/pi-tui';\n\nimport { resolveStateDir } from '../config/paths.js';\nimport { XOPC_TUI_KEYBINDINGS } from './xopc-tui-keybindings.js';\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction toKeybindingsConfig(value: unknown): KeybindingsConfig {\n if (!isRecord(value)) return {};\n const config: KeybindingsConfig = {};\n for (const [key, binding] of Object.entries(value)) {\n if (typeof binding === 'string') {\n config[key] = binding as KeyId;\n continue;\n }\n if (Array.isArray(binding) && binding.every((entry) => typeof entry === 'string')) {\n config[key] = binding as KeyId[];\n }\n }\n return config;\n}\n\nfunction loadRawConfig(path: string): Record<string, unknown> | undefined {\n if (!existsSync(path)) return undefined;\n try {\n const parsed = JSON.parse(readFileSync(path, 'utf8')) as unknown;\n return isRecord(parsed) ? parsed : undefined;\n } catch {\n return undefined;\n }\n}\n\nexport function getTuiKeybindingsPath(): string {\n return join(resolveStateDir(), 'keybindings.json');\n}\n\nexport function loadTuiKeybindingsConfig(path = getTuiKeybindingsPath()): KeybindingsConfig {\n return toKeybindingsConfig(loadRawConfig(path));\n}\n\nexport class XopcKeybindingsManager extends KeybindingsManager {\n constructor(\n userBindings: KeybindingsConfig = {},\n private readonly configPath = getTuiKeybindingsPath(),\n ) {\n super(XOPC_TUI_KEYBINDINGS, userBindings);\n }\n\n reload(): void {\n this.setUserBindings(loadTuiKeybindingsConfig(this.configPath));\n }\n\n getConfigPath(): string {\n return this.configPath;\n }\n}\n\nexport function createXopcTuiKeybindingsManager(): XopcKeybindingsManager {\n const configPath = getTuiKeybindingsPath();\n return new XopcKeybindingsManager(loadTuiKeybindingsConfig(configPath), configPath);\n}\n"],"mappings":";;;;;;;YASqD;AAGrD,SAAS,SAAS,OAAkD;AAClE,QAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,MAAM;;AAG7E,SAAS,oBAAoB,OAAmC;AAC9D,KAAI,CAAC,SAAS,MAAM,CAAE,QAAO,EAAE;CAC/B,MAAM,SAA4B,EAAE;AACpC,MAAK,MAAM,CAAC,KAAK,YAAY,OAAO,QAAQ,MAAM,EAAE;AAClD,MAAI,OAAO,YAAY,UAAU;AAC/B,UAAO,OAAO;AACd;;AAEF,MAAI,MAAM,QAAQ,QAAQ,IAAI,QAAQ,OAAO,UAAU,OAAO,UAAU,SAAS,CAC/E,QAAO,OAAO;;AAGlB,QAAO;;AAGT,SAAS,cAAc,MAAmD;AACxE,KAAI,CAAC,WAAW,KAAK,CAAE,QAAO,KAAA;AAC9B,KAAI;EACF,MAAM,SAAS,KAAK,MAAM,aAAa,MAAM,OAAO,CAAC;AACrD,SAAO,SAAS,OAAO,GAAG,SAAS,KAAA;SAC7B;AACN;;;AAIJ,SAAgB,wBAAgC;AAC9C,QAAO,KAAK,iBAAiB,EAAE,mBAAmB;;AAGpD,SAAgB,yBAAyB,OAAO,uBAAuB,EAAqB;AAC1F,QAAO,oBAAoB,cAAc,KAAK,CAAC;;AAGjD,IAAa,yBAAb,cAA4C,mBAAmB;CAC7D,YACE,eAAkC,EAAE,EACpC,aAA8B,uBAAuB,EACrD;AACA,QAAM,sBAAsB,aAAa;AAFxB,OAAA,aAAA;;CAKnB,SAAe;AACb,OAAK,gBAAgB,yBAAyB,KAAK,WAAW,CAAC;;CAGjE,gBAAwB;AACtB,SAAO,KAAK;;;AAIhB,SAAgB,kCAA0D;CACxE,MAAM,aAAa,uBAAuB;AAC1C,QAAO,IAAI,uBAAuB,yBAAyB,WAAW,EAAE,WAAW"}
@@ -1,6 +1,6 @@
1
- import { homedir } from "node:os";
2
- import { join } from "node:path";
3
1
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { homedir } from "node:os";
4
4
  //#region src/tui/tui-scoped-models.ts
5
5
  const STORE_PATH = join(homedir(), ".xopc", "tui-scoped-models.json");
6
6
  function normalizeWorkspaceKey(cwd) {
@@ -0,0 +1,28 @@
1
+ import type { TUI } from '@earendil-works/pi-tui';
2
+ import type { ChatLog } from './components/chat-log.js';
3
+ import type { TuiBackend } from './tui-backend.js';
4
+ import type { StreamAssembler } from './stream-assembler.js';
5
+ import type { TuiState } from './tui-types.js';
6
+ export type SessionActionsContext = {
7
+ client: TuiBackend;
8
+ chatLog: ChatLog;
9
+ tui: TUI;
10
+ state: TuiState;
11
+ assembler: StreamAssembler;
12
+ resolveSessionKey: (raw?: string) => string;
13
+ updateHeader: () => void;
14
+ updateFooter: () => void;
15
+ setActivityStatus: (status: string) => void;
16
+ historyLimit?: number;
17
+ onAgentIdChange?: (agentId: string) => void;
18
+ };
19
+ export declare function createSessionActions(context: SessionActionsContext): {
20
+ refreshSessionInfo: () => Promise<void>;
21
+ loadHistory: () => Promise<void>;
22
+ setSession: (rawKey: string) => Promise<void>;
23
+ abortActive: (opts?: {
24
+ clearUi?: boolean;
25
+ }) => Promise<void>;
26
+ resetCurrentSession: () => Promise<void>;
27
+ clearChatForSessionSwitch: () => void;
28
+ };
@@ -0,0 +1,88 @@
1
+ import { parseAgentSessionKey } from "../routing/session-key-utils.js";
2
+ import { init_agent_session_key } from "../routing/agent-session-key.js";
3
+ import { appendHistoryToChatLog } from "./chat-history.js";
4
+ import { clearPendingToolCallIds } from "./tui-agent-events.js";
5
+ //#region src/tui/tui-session-actions.ts
6
+ init_agent_session_key();
7
+ function createSessionActions(context) {
8
+ const { client, chatLog, tui, state, assembler, resolveSessionKey, updateHeader, updateFooter, setActivityStatus, historyLimit = 200, onAgentIdChange } = context;
9
+ let refreshSessionInfoPromise = Promise.resolve();
10
+ const updateAgentFromSessionKey = (key) => {
11
+ const parsed = parseAgentSessionKey(key);
12
+ if (!parsed?.agentId) return;
13
+ onAgentIdChange?.(parsed.agentId);
14
+ };
15
+ const runRefreshSessionInfo = async () => {
16
+ try {
17
+ state.sessionInfo = await client.getSessionInfo(state.currentSessionKey);
18
+ updateFooter();
19
+ tui.requestRender();
20
+ } catch {}
21
+ };
22
+ const refreshSessionInfo = async () => {
23
+ refreshSessionInfoPromise = refreshSessionInfoPromise.then(runRefreshSessionInfo, runRefreshSessionInfo);
24
+ await refreshSessionInfoPromise;
25
+ };
26
+ const clearChatForSessionSwitch = () => {
27
+ assembler.clear();
28
+ chatLog.clearAll();
29
+ clearPendingToolCallIds();
30
+ state.historyLoaded = false;
31
+ state.messageFollowUpQueue.length = 0;
32
+ };
33
+ const loadHistory = async () => {
34
+ try {
35
+ const { messages } = await client.loadHistory({
36
+ sessionKey: state.currentSessionKey,
37
+ limit: historyLimit
38
+ });
39
+ chatLog.clearAll();
40
+ appendHistoryToChatLog(chatLog, messages, state.toolsExpanded);
41
+ } catch {} finally {
42
+ state.historyLoaded = true;
43
+ await refreshSessionInfo();
44
+ tui.requestRender();
45
+ }
46
+ };
47
+ const setSession = async (rawKey) => {
48
+ const nextKey = resolveSessionKey(rawKey);
49
+ updateAgentFromSessionKey(nextKey);
50
+ state.currentSessionKey = nextKey;
51
+ state.activeRunId = null;
52
+ setActivityStatus("idle");
53
+ clearChatForSessionSwitch();
54
+ updateHeader();
55
+ updateFooter();
56
+ await loadHistory();
57
+ };
58
+ const abortActive = async (opts) => {
59
+ if (!state.activeRunId) return;
60
+ const runId = state.activeRunId;
61
+ state.activeRunId = null;
62
+ assembler.drop(runId);
63
+ if (opts?.clearUi !== false) chatLog.dropAssistant(runId);
64
+ setActivityStatus("idle");
65
+ tui.requestRender();
66
+ await client.abortChat({
67
+ sessionKey: state.currentSessionKey,
68
+ runId
69
+ }).catch(() => {});
70
+ };
71
+ const resetCurrentSession = async () => {
72
+ await client.resetSession(state.currentSessionKey);
73
+ clearChatForSessionSwitch();
74
+ await loadHistory();
75
+ };
76
+ return {
77
+ refreshSessionInfo,
78
+ loadHistory,
79
+ setSession,
80
+ abortActive,
81
+ resetCurrentSession,
82
+ clearChatForSessionSwitch
83
+ };
84
+ }
85
+ //#endregion
86
+ export { createSessionActions };
87
+
88
+ //# sourceMappingURL=tui-session-actions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tui-session-actions.js","names":[],"sources":["../../../src/tui/tui-session-actions.ts"],"sourcesContent":["import type { TUI } from '@earendil-works/pi-tui';\n\nimport { parseAgentSessionKey } from '../routing/agent-session-key.js';\nimport { appendHistoryToChatLog } from './chat-history.js';\nimport type { ChatLog } from './components/chat-log.js';\nimport { clearPendingToolCallIds } from './tui-agent-events.js';\nimport type { TuiBackend } from './tui-backend.js';\nimport type { StreamAssembler } from './stream-assembler.js';\nimport type { TuiState } from './tui-types.js';\n\nexport type SessionActionsContext = {\n client: TuiBackend;\n chatLog: ChatLog;\n tui: TUI;\n state: TuiState;\n assembler: StreamAssembler;\n resolveSessionKey: (raw?: string) => string;\n updateHeader: () => void;\n updateFooter: () => void;\n setActivityStatus: (status: string) => void;\n historyLimit?: number;\n onAgentIdChange?: (agentId: string) => void;\n};\n\nexport function createSessionActions(context: SessionActionsContext) {\n const {\n client,\n chatLog,\n tui,\n state,\n assembler,\n resolveSessionKey,\n updateHeader,\n updateFooter,\n setActivityStatus,\n historyLimit = 200,\n onAgentIdChange,\n } = context;\n\n let refreshSessionInfoPromise: Promise<void> = Promise.resolve();\n\n const updateAgentFromSessionKey = (key: string) => {\n const parsed = parseAgentSessionKey(key);\n if (!parsed?.agentId) {\n return;\n }\n onAgentIdChange?.(parsed.agentId);\n };\n\n const runRefreshSessionInfo = async () => {\n try {\n state.sessionInfo = await client.getSessionInfo(state.currentSessionKey);\n updateFooter();\n tui.requestRender();\n } catch {\n // ignore\n }\n };\n\n const refreshSessionInfo = async () => {\n refreshSessionInfoPromise = refreshSessionInfoPromise.then(\n runRefreshSessionInfo,\n runRefreshSessionInfo,\n );\n await refreshSessionInfoPromise;\n };\n\n const clearChatForSessionSwitch = () => {\n assembler.clear();\n chatLog.clearAll();\n clearPendingToolCallIds();\n state.historyLoaded = false;\n state.messageFollowUpQueue.length = 0;\n };\n\n const loadHistory = async () => {\n try {\n const { messages } = await client.loadHistory({\n sessionKey: state.currentSessionKey,\n limit: historyLimit,\n });\n chatLog.clearAll();\n appendHistoryToChatLog(chatLog, messages, state.toolsExpanded);\n } catch {\n // ignore; footer already hints on disconnect\n } finally {\n state.historyLoaded = true;\n await refreshSessionInfo();\n tui.requestRender();\n }\n };\n\n const setSession = async (rawKey: string) => {\n const nextKey = resolveSessionKey(rawKey);\n updateAgentFromSessionKey(nextKey);\n state.currentSessionKey = nextKey;\n state.activeRunId = null;\n setActivityStatus('idle');\n clearChatForSessionSwitch();\n updateHeader();\n updateFooter();\n await loadHistory();\n };\n\n const abortActive = async (opts?: { clearUi?: boolean }) => {\n if (!state.activeRunId) {\n return;\n }\n const runId = state.activeRunId;\n state.activeRunId = null;\n assembler.drop(runId);\n if (opts?.clearUi !== false) {\n chatLog.dropAssistant(runId);\n }\n setActivityStatus('idle');\n tui.requestRender();\n await client.abortChat({ sessionKey: state.currentSessionKey, runId }).catch(() => {});\n };\n\n const resetCurrentSession = async () => {\n await client.resetSession(state.currentSessionKey);\n clearChatForSessionSwitch();\n await loadHistory();\n };\n\n return {\n refreshSessionInfo,\n loadHistory,\n setSession,\n abortActive,\n resetCurrentSession,\n clearChatForSessionSwitch,\n };\n}\n"],"mappings":";;;;;wBAEuE;AAsBvE,SAAgB,qBAAqB,SAAgC;CACnE,MAAM,EACJ,QACA,SACA,KACA,OACA,WACA,mBACA,cACA,cACA,mBACA,eAAe,KACf,oBACE;CAEJ,IAAI,4BAA2C,QAAQ,SAAS;CAEhE,MAAM,6BAA6B,QAAgB;EACjD,MAAM,SAAS,qBAAqB,IAAI;AACxC,MAAI,CAAC,QAAQ,QACX;AAEF,oBAAkB,OAAO,QAAQ;;CAGnC,MAAM,wBAAwB,YAAY;AACxC,MAAI;AACF,SAAM,cAAc,MAAM,OAAO,eAAe,MAAM,kBAAkB;AACxE,iBAAc;AACd,OAAI,eAAe;UACb;;CAKV,MAAM,qBAAqB,YAAY;AACrC,8BAA4B,0BAA0B,KACpD,uBACA,sBACD;AACD,QAAM;;CAGR,MAAM,kCAAkC;AACtC,YAAU,OAAO;AACjB,UAAQ,UAAU;AAClB,2BAAyB;AACzB,QAAM,gBAAgB;AACtB,QAAM,qBAAqB,SAAS;;CAGtC,MAAM,cAAc,YAAY;AAC9B,MAAI;GACF,MAAM,EAAE,aAAa,MAAM,OAAO,YAAY;IAC5C,YAAY,MAAM;IAClB,OAAO;IACR,CAAC;AACF,WAAQ,UAAU;AAClB,0BAAuB,SAAS,UAAU,MAAM,cAAc;UACxD,WAEE;AACR,SAAM,gBAAgB;AACtB,SAAM,oBAAoB;AAC1B,OAAI,eAAe;;;CAIvB,MAAM,aAAa,OAAO,WAAmB;EAC3C,MAAM,UAAU,kBAAkB,OAAO;AACzC,4BAA0B,QAAQ;AAClC,QAAM,oBAAoB;AAC1B,QAAM,cAAc;AACpB,oBAAkB,OAAO;AACzB,6BAA2B;AAC3B,gBAAc;AACd,gBAAc;AACd,QAAM,aAAa;;CAGrB,MAAM,cAAc,OAAO,SAAiC;AAC1D,MAAI,CAAC,MAAM,YACT;EAEF,MAAM,QAAQ,MAAM;AACpB,QAAM,cAAc;AACpB,YAAU,KAAK,MAAM;AACrB,MAAI,MAAM,YAAY,MACpB,SAAQ,cAAc,MAAM;AAE9B,oBAAkB,OAAO;AACzB,MAAI,eAAe;AACnB,QAAM,OAAO,UAAU;GAAE,YAAY,MAAM;GAAmB;GAAO,CAAC,CAAC,YAAY,GAAG;;CAGxF,MAAM,sBAAsB,YAAY;AACtC,QAAM,OAAO,aAAa,MAAM,kBAAkB;AAClD,6BAA2B;AAC3B,QAAM,aAAa;;AAGrB,QAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACD"}
@@ -1,7 +1,7 @@
1
1
  import { resolveStateDir } from "../config/paths-state.js";
2
2
  import { init_paths } from "../config/paths.js";
3
- import { join } from "node:path";
4
3
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
4
+ import { join } from "node:path";
5
5
  //#region src/tui/tui-settings.ts
6
6
  init_paths();
7
7
  const DEFAULT_TUI_SETTINGS = {
@@ -1,5 +1,9 @@
1
1
  import { version } from "../../package.js";
2
- import { appendHistoryToChatLog } from "./chat-history.js";
2
+ import { loadConfig } from "../config/loader.js";
3
+ import { parseAgentSessionKey } from "../routing/session-key-utils.js";
4
+ import { init_agent_session_key } from "../routing/agent-session-key.js";
5
+ import "../config/index.js";
6
+ import { resolveTuiSessionKey, resolveTuiStartupSessionKey } from "../routing/resolve-tui-session-key.js";
3
7
  import { saveClipboardImageToTempFile } from "./clipboard-image.js";
4
8
  import { createXopcTuiKeybindingsManager } from "./tui-keybindings-file.js";
5
9
  import { StreamAssembler } from "./stream-assembler.js";
@@ -13,6 +17,7 @@ import { createLocalShellRunner } from "./tui-local-shell.js";
13
17
  import { createOverlayHandlers } from "./tui-overlays.js";
14
18
  import { filterModelsForCycle, loadScopedModelRefs, saveScopedModelRefs } from "./tui-scoped-models.js";
15
19
  import { openModelPickerOverlay, openScopedModelsOverlay, openSessionPickerOverlay, openSettingsOverlay } from "./tui-picker-overlay.js";
20
+ import { createSessionActions } from "./tui-session-actions.js";
16
21
  import { loadTuiSettings, saveTuiSettings } from "./tui-settings.js";
17
22
  import { installTuiStdioFilter } from "./tui-stdio-filter.js";
18
23
  import { createEditorSubmitHandler, createSubmitBurstCoalescer, shouldEnableWindowsGitBashPasteFallback } from "./tui-submit.js";
@@ -26,12 +31,13 @@ import { TuiBottomBar } from "./components/tui-bottom-bar.js";
26
31
  import { TuiHeader } from "./components/tui-header.js";
27
32
  import { loadExtensionsForTuiLocalMode } from "./extension-host/load-extensions.js";
28
33
  import { createTuiExtensionRuntime } from "./extension-host/runtime.js";
29
- import { tmpdir } from "node:os";
30
- import { join } from "node:path";
31
34
  import { mkdtempSync, readFileSync, unlinkSync, writeFileSync } from "node:fs";
35
+ import { join } from "node:path";
36
+ import { tmpdir } from "node:os";
32
37
  import { spawnSync } from "node:child_process";
33
38
  import { Container, Loader, ProcessTerminal, TUI, setKeybindings } from "@earendil-works/pi-tui";
34
39
  //#region src/tui/tui.ts
40
+ init_agent_session_key();
35
41
  const THINK_LEVEL_CYCLE = [
36
42
  "off",
37
43
  "minimal",
@@ -52,10 +58,23 @@ async function runTui(opts) {
52
58
  const stdioFilter = installTuiStdioFilter();
53
59
  const restoreStdio = () => stdioFilter.restore();
54
60
  const isLocalMode = opts.local === true;
55
- const sessionKey = opts.session ?? "cli:tui";
61
+ const startup = resolveTuiStartupSessionKey({
62
+ cfg: loadConfig(),
63
+ sessionOption: opts.session,
64
+ cwd: process.cwd()
65
+ });
66
+ let currentAgentId = startup.agentId;
67
+ const sessionScope = startup.sessionScope;
68
+ const sessionMainKey = startup.sessionMainKey;
69
+ const resolveSessionKey = (raw) => resolveTuiSessionKey({
70
+ raw,
71
+ sessionScope,
72
+ currentAgentId,
73
+ sessionMainKey
74
+ });
56
75
  let tuiSettings = loadTuiSettings();
57
76
  initTuiTheme({ themeId: opts.theme ?? tuiSettings.theme });
58
- const state = createInitialState(sessionKey);
77
+ const state = createInitialState(startup.sessionKey);
59
78
  state.scopedModelRefs = loadScopedModelRefs();
60
79
  state.showThinking = tuiSettings.showThinking;
61
80
  state.toolsExpanded = tuiSettings.toolsExpanded;
@@ -226,14 +245,6 @@ async function runTui(opts) {
226
245
  bottomBar.invalidate();
227
246
  tui.requestRender();
228
247
  };
229
- const refreshSessionInfo = async () => {
230
- try {
231
- state.sessionInfo = await client.getSessionInfo(state.currentSessionKey);
232
- updateEditorBorderColor();
233
- updateFooter();
234
- tui.requestRender();
235
- } catch {}
236
- };
237
248
  let finishTui = null;
238
249
  let exitResult = { exitReason: "exit" };
239
250
  const requestExit = () => {
@@ -255,18 +266,23 @@ async function runTui(opts) {
255
266
  process.exit(0);
256
267
  });
257
268
  };
258
- const abortActive = async () => {
259
- if (!state.activeRunId) return;
260
- const runId = state.activeRunId;
261
- state.activeRunId = null;
262
- assembler.drop(runId);
263
- chatLog.dropAssistant(runId);
264
- setActivityStatus("idle");
265
- tui.requestRender();
266
- await client.abortChat({
267
- sessionKey: state.currentSessionKey,
268
- runId
269
- }).catch(() => {});
269
+ const { refreshSessionInfo, loadHistory: loadSessionHistory, setSession, abortActive, resetCurrentSession, clearChatForSessionSwitch } = createSessionActions({
270
+ client,
271
+ chatLog,
272
+ tui,
273
+ state,
274
+ assembler,
275
+ resolveSessionKey,
276
+ updateHeader,
277
+ updateFooter,
278
+ setActivityStatus,
279
+ onAgentIdChange: (agentId) => {
280
+ currentAgentId = agentId;
281
+ }
282
+ });
283
+ const refreshSessionInfoWithBorder = async () => {
284
+ await refreshSessionInfo();
285
+ updateEditorBorderColor();
270
286
  };
271
287
  const resolveModelChoiceIndex = () => {
272
288
  const choices = cycleModelChoices();
@@ -411,7 +427,7 @@ async function runTui(opts) {
411
427
  } finally {
412
428
  state.isCompacting = false;
413
429
  setActivityStatus("idle");
414
- await refreshSessionInfo();
430
+ await refreshSessionInfoWithBorder();
415
431
  const queued = state.compactionQueue.shift();
416
432
  if (queued && !state.activeRunId) sendMessage(queued);
417
433
  updateFooter();
@@ -460,7 +476,10 @@ async function runTui(opts) {
460
476
  keybindings,
461
477
  uiOverlays,
462
478
  runCompaction,
463
- extensionSlashCommands: extensionRuntime.slashCommands
479
+ extensionSlashCommands: extensionRuntime.slashCommands,
480
+ currentAgentId,
481
+ setSession,
482
+ resetSession: resetCurrentSession
464
483
  });
465
484
  const { runLocalShellLine } = createLocalShellRunner({
466
485
  chatLog,
@@ -523,26 +542,12 @@ async function runTui(opts) {
523
542
  tui.requestRender();
524
543
  };
525
544
  const setSessionKey = (key) => {
526
- state.currentSessionKey = key;
527
- };
528
- const clearChatForSessionSwitch = () => {
529
- assembler.clear();
530
- chatLog.clearAll();
531
- clearPendingToolCallIds();
532
- state.historyLoaded = false;
533
- state.messageFollowUpQueue.length = 0;
545
+ state.currentSessionKey = resolveSessionKey(key);
546
+ updateAgentFromPicker(key);
534
547
  };
535
- const loadSessionHistory = async () => {
536
- try {
537
- const { messages } = await client.loadHistory({
538
- sessionKey: state.currentSessionKey,
539
- limit: 200
540
- });
541
- appendHistoryToChatLog(chatLog, messages, state.toolsExpanded);
542
- } catch {} finally {
543
- state.historyLoaded = true;
544
- tui.requestRender();
545
- }
548
+ const updateAgentFromPicker = (key) => {
549
+ const parsed = parseAgentSessionKey(resolveSessionKey(key));
550
+ if (parsed?.agentId) currentAgentId = parsed.agentId;
546
551
  };
547
552
  let ctrlCHandling = false;
548
553
  const handleCtrlC = () => {
@@ -685,7 +690,7 @@ async function runTui(opts) {
685
690
  chatLog.addSystem("⚠️ No stream activity for 30s; UI reset (connection may have stalled). Retry or check gateway.");
686
691
  state.activeRunId = null;
687
692
  setActivityStatus("idle");
688
- refreshSessionInfo().finally(() => {
693
+ refreshSessionInfoWithBorder().finally(() => {
689
694
  updateFooter();
690
695
  tui.requestRender();
691
696
  });
@@ -694,7 +699,7 @@ async function runTui(opts) {
694
699
  }, 5e3);
695
700
  const onAgentRunEnded = () => {
696
701
  state.progressMessage = null;
697
- refreshSessionInfo().finally(() => {
702
+ refreshSessionInfoWithBorder().finally(() => {
698
703
  updateFooter();
699
704
  tui.requestRender();
700
705
  });
@@ -709,7 +714,7 @@ async function runTui(opts) {
709
714
  setConnectionStatus(isLocalMode ? "local ready" : "gateway connected");
710
715
  touchStreamingActivity();
711
716
  (async () => {
712
- await refreshSessionInfo();
717
+ await refreshSessionInfoWithBorder();
713
718
  await refreshModelChoices();
714
719
  await loadSessionHistory();
715
720
  updateHeader();