@di-code/coding-agent 0.1.7 → 0.1.8

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 (333) hide show
  1. package/README.md +104 -46
  2. package/compositions/base.yml +54 -0
  3. package/compositions/interactive.yml +14 -0
  4. package/compositions/json.yml +6 -0
  5. package/compositions/print.yml +5 -0
  6. package/compositions/rpc.yml +12 -0
  7. package/compositions/webui.yml +9 -0
  8. package/dist/cli.d.ts +22 -1
  9. package/dist/cli.d.ts.map +1 -1
  10. package/dist/cli.js +97 -3
  11. package/dist/cli.js.map +1 -1
  12. package/dist/composition-loader-entry.d.ts +11 -0
  13. package/dist/composition-loader-entry.d.ts.map +1 -0
  14. package/dist/composition-loader-entry.js +12 -0
  15. package/dist/composition-loader-entry.js.map +1 -0
  16. package/dist/compositions.d.ts +32 -0
  17. package/dist/compositions.d.ts.map +1 -0
  18. package/dist/compositions.js +173 -0
  19. package/dist/compositions.js.map +1 -0
  20. package/dist/core/session/session-manager.d.ts +9 -2
  21. package/dist/core/session/session-manager.d.ts.map +1 -1
  22. package/dist/core/session/session-manager.js +28 -0
  23. package/dist/core/session/session-manager.js.map +1 -1
  24. package/dist/core/session/session-storage.d.ts.map +1 -1
  25. package/dist/core/session/session-storage.js +20 -3
  26. package/dist/core/session/session-storage.js.map +1 -1
  27. package/dist/core/session/types.d.ts +11 -2
  28. package/dist/core/session/types.d.ts.map +1 -1
  29. package/dist/core/session/types.js.map +1 -1
  30. package/dist/core/session-tools.d.ts +5 -0
  31. package/dist/core/session-tools.d.ts.map +1 -0
  32. package/dist/core/session-tools.js +17 -0
  33. package/dist/core/session-tools.js.map +1 -0
  34. package/dist/core/session.d.ts +19 -7
  35. package/dist/core/session.d.ts.map +1 -1
  36. package/dist/core/session.js +71 -39
  37. package/dist/core/session.js.map +1 -1
  38. package/dist/core/tools/bash.d.ts +1 -38
  39. package/dist/core/tools/bash.d.ts.map +1 -1
  40. package/dist/core/tools/bash.js +1 -207
  41. package/dist/core/tools/bash.js.map +1 -1
  42. package/dist/core/tools/edit-diff.d.ts +1 -24
  43. package/dist/core/tools/edit-diff.d.ts.map +1 -1
  44. package/dist/core/tools/edit-diff.js +1 -135
  45. package/dist/core/tools/edit-diff.js.map +1 -1
  46. package/dist/core/tools/edit.d.ts +1 -26
  47. package/dist/core/tools/edit.d.ts.map +1 -1
  48. package/dist/core/tools/edit.js +1 -140
  49. package/dist/core/tools/edit.js.map +1 -1
  50. package/dist/core/tools/file-mutation-queue.d.ts +1 -1
  51. package/dist/core/tools/file-mutation-queue.d.ts.map +1 -1
  52. package/dist/core/tools/file-mutation-queue.js +1 -23
  53. package/dist/core/tools/file-mutation-queue.js.map +1 -1
  54. package/dist/core/tools/file-search.d.ts +1 -13
  55. package/dist/core/tools/file-search.d.ts.map +1 -1
  56. package/dist/core/tools/file-search.js +1 -98
  57. package/dist/core/tools/file-search.js.map +1 -1
  58. package/dist/core/tools/glob.d.ts +1 -10
  59. package/dist/core/tools/glob.d.ts.map +1 -1
  60. package/dist/core/tools/glob.js +1 -43
  61. package/dist/core/tools/glob.js.map +1 -1
  62. package/dist/core/tools/grep.d.ts +1 -12
  63. package/dist/core/tools/grep.d.ts.map +1 -1
  64. package/dist/core/tools/grep.js +1 -66
  65. package/dist/core/tools/grep.js.map +1 -1
  66. package/dist/core/tools/load-skill.d.ts +1 -9
  67. package/dist/core/tools/load-skill.d.ts.map +1 -1
  68. package/dist/core/tools/load-skill.js +1 -21
  69. package/dist/core/tools/load-skill.js.map +1 -1
  70. package/dist/core/tools/path-boundary.d.ts +1 -4
  71. package/dist/core/tools/path-boundary.d.ts.map +1 -1
  72. package/dist/core/tools/path-boundary.js +1 -65
  73. package/dist/core/tools/path-boundary.js.map +1 -1
  74. package/dist/core/tools/read.d.ts +1 -16
  75. package/dist/core/tools/read.d.ts.map +1 -1
  76. package/dist/core/tools/read.js +1 -131
  77. package/dist/core/tools/read.js.map +1 -1
  78. package/dist/core/tools/write.d.ts +1 -16
  79. package/dist/core/tools/write.d.ts.map +1 -1
  80. package/dist/core/tools/write.js +1 -44
  81. package/dist/core/tools/write.js.map +1 -1
  82. package/dist/entry.js +30 -28
  83. package/dist/entry.js.map +1 -1
  84. package/dist/index.d.ts +6 -3
  85. package/dist/index.d.ts.map +1 -1
  86. package/dist/index.js +6 -3
  87. package/dist/index.js.map +1 -1
  88. package/dist/interactive/builtin.d.ts +17 -0
  89. package/dist/interactive/builtin.d.ts.map +1 -0
  90. package/dist/interactive/builtin.js +47 -0
  91. package/dist/interactive/builtin.js.map +1 -0
  92. package/dist/interactive/controller.d.ts +85 -0
  93. package/dist/interactive/controller.d.ts.map +1 -0
  94. package/dist/interactive/controller.js +211 -0
  95. package/dist/interactive/controller.js.map +1 -0
  96. package/dist/interactive/index.d.ts +3 -0
  97. package/dist/interactive/index.d.ts.map +1 -0
  98. package/dist/interactive/index.js +3 -0
  99. package/dist/interactive/index.js.map +1 -0
  100. package/dist/interactive-host-entry.d.ts +7 -0
  101. package/dist/interactive-host-entry.d.ts.map +1 -0
  102. package/dist/interactive-host-entry.js +123 -0
  103. package/dist/interactive-host-entry.js.map +1 -0
  104. package/dist/interactive-profile.d.ts +18 -0
  105. package/dist/interactive-profile.d.ts.map +1 -0
  106. package/dist/interactive-profile.js +290 -0
  107. package/dist/interactive-profile.js.map +1 -0
  108. package/dist/interactive-resources-entry.d.ts +7 -0
  109. package/dist/interactive-resources-entry.d.ts.map +1 -0
  110. package/dist/interactive-resources-entry.js +42 -0
  111. package/dist/interactive-resources-entry.js.map +1 -0
  112. package/dist/legacy-main.d.ts +39 -0
  113. package/dist/legacy-main.d.ts.map +1 -0
  114. package/dist/legacy-main.js +611 -0
  115. package/dist/legacy-main.js.map +1 -0
  116. package/dist/main.d.ts +15 -34
  117. package/dist/main.d.ts.map +1 -1
  118. package/dist/main.js +130 -518
  119. package/dist/main.js.map +1 -1
  120. package/dist/mcp/entries.d.ts +42 -0
  121. package/dist/mcp/entries.d.ts.map +1 -0
  122. package/dist/mcp/entries.js +98 -0
  123. package/dist/mcp/entries.js.map +1 -0
  124. package/dist/mcp-client-entry.d.ts +5 -0
  125. package/dist/mcp-client-entry.d.ts.map +1 -0
  126. package/dist/mcp-client-entry.js +6 -0
  127. package/dist/mcp-client-entry.js.map +1 -0
  128. package/dist/mcp-config-entry.d.ts +5 -0
  129. package/dist/mcp-config-entry.d.ts.map +1 -0
  130. package/dist/mcp-config-entry.js +6 -0
  131. package/dist/mcp-config-entry.js.map +1 -0
  132. package/dist/mcp-tools-entry.d.ts +5 -0
  133. package/dist/mcp-tools-entry.d.ts.map +1 -0
  134. package/dist/mcp-tools-entry.js +6 -0
  135. package/dist/mcp-tools-entry.js.map +1 -0
  136. package/dist/mcp-transport-entry.d.ts +5 -0
  137. package/dist/mcp-transport-entry.d.ts.map +1 -0
  138. package/dist/mcp-transport-entry.js +6 -0
  139. package/dist/mcp-transport-entry.js.map +1 -0
  140. package/dist/modes/interactive-entry.d.ts +18 -0
  141. package/dist/modes/interactive-entry.d.ts.map +1 -0
  142. package/dist/modes/interactive-entry.js +21 -0
  143. package/dist/modes/interactive-entry.js.map +1 -0
  144. package/dist/modes/interactive.d.ts +16 -6
  145. package/dist/modes/interactive.d.ts.map +1 -1
  146. package/dist/modes/interactive.js +81 -32
  147. package/dist/modes/interactive.js.map +1 -1
  148. package/dist/modes/json-entry.d.ts +13 -0
  149. package/dist/modes/json-entry.d.ts.map +1 -0
  150. package/dist/modes/json-entry.js +14 -0
  151. package/dist/modes/json-entry.js.map +1 -0
  152. package/dist/modes/json.d.ts +4 -1
  153. package/dist/modes/json.d.ts.map +1 -1
  154. package/dist/modes/json.js +3 -3
  155. package/dist/modes/json.js.map +1 -1
  156. package/dist/modes/print-entry.d.ts +10 -0
  157. package/dist/modes/print-entry.d.ts.map +1 -0
  158. package/dist/modes/print-entry.js +11 -0
  159. package/dist/modes/print-entry.js.map +1 -0
  160. package/dist/modes/tree-selector.d.ts.map +1 -1
  161. package/dist/modes/tree-selector.js +4 -0
  162. package/dist/modes/tree-selector.js.map +1 -1
  163. package/dist/plugin-dump-composition.d.ts +6 -0
  164. package/dist/plugin-dump-composition.d.ts.map +1 -0
  165. package/dist/plugin-dump-composition.js +7 -0
  166. package/dist/plugin-dump-composition.js.map +1 -0
  167. package/dist/plugin-inventory.d.ts +7 -0
  168. package/dist/plugin-inventory.d.ts.map +1 -0
  169. package/dist/plugin-inventory.js +8 -0
  170. package/dist/plugin-inventory.js.map +1 -0
  171. package/dist/plugin-manager.d.ts +6 -0
  172. package/dist/plugin-manager.d.ts.map +1 -0
  173. package/dist/plugin-manager.js +7 -0
  174. package/dist/plugin-manager.js.map +1 -0
  175. package/dist/plugin-trace.d.ts +6 -0
  176. package/dist/plugin-trace.d.ts.map +1 -0
  177. package/dist/plugin-trace.js +7 -0
  178. package/dist/plugin-trace.js.map +1 -0
  179. package/dist/plugins/dynamic-broker.d.ts +76 -0
  180. package/dist/plugins/dynamic-broker.d.ts.map +1 -0
  181. package/dist/plugins/dynamic-broker.js +852 -0
  182. package/dist/plugins/dynamic-broker.js.map +1 -0
  183. package/dist/plugins/profile.d.ts +15 -0
  184. package/dist/plugins/profile.d.ts.map +1 -0
  185. package/dist/plugins/profile.js +34 -0
  186. package/dist/plugins/profile.js.map +1 -0
  187. package/dist/plugins/runtime-host.d.ts +37 -0
  188. package/dist/plugins/runtime-host.d.ts.map +1 -0
  189. package/dist/plugins/runtime-host.js +95 -0
  190. package/dist/plugins/runtime-host.js.map +1 -0
  191. package/dist/plugins/trust.d.ts +8 -0
  192. package/dist/plugins/trust.d.ts.map +1 -0
  193. package/dist/plugins/trust.js +59 -0
  194. package/dist/plugins/trust.js.map +1 -0
  195. package/dist/project-trust-entry.d.ts +15 -0
  196. package/dist/project-trust-entry.d.ts.map +1 -0
  197. package/dist/project-trust-entry.js +15 -0
  198. package/dist/project-trust-entry.js.map +1 -0
  199. package/dist/rpc/client.d.ts +78 -6
  200. package/dist/rpc/client.d.ts.map +1 -1
  201. package/dist/rpc/client.js +172 -4
  202. package/dist/rpc/client.js.map +1 -1
  203. package/dist/rpc/dispatcher.d.ts +121 -0
  204. package/dist/rpc/dispatcher.d.ts.map +1 -0
  205. package/dist/rpc/dispatcher.js +994 -0
  206. package/dist/rpc/dispatcher.js.map +1 -0
  207. package/dist/rpc/index.d.ts +2 -0
  208. package/dist/rpc/index.d.ts.map +1 -1
  209. package/dist/rpc/index.js +2 -0
  210. package/dist/rpc/index.js.map +1 -1
  211. package/dist/rpc/lifecycle.d.ts +6 -0
  212. package/dist/rpc/lifecycle.d.ts.map +1 -0
  213. package/dist/rpc/lifecycle.js +24 -0
  214. package/dist/rpc/lifecycle.js.map +1 -0
  215. package/dist/rpc/protocol.d.ts +112 -31
  216. package/dist/rpc/protocol.d.ts.map +1 -1
  217. package/dist/rpc/protocol.js +569 -117
  218. package/dist/rpc/protocol.js.map +1 -1
  219. package/dist/rpc/server-service.d.ts +7 -0
  220. package/dist/rpc/server-service.d.ts.map +1 -0
  221. package/dist/rpc/server-service.js +3 -0
  222. package/dist/rpc/server-service.js.map +1 -0
  223. package/dist/rpc/server.d.ts +16 -19
  224. package/dist/rpc/server.d.ts.map +1 -1
  225. package/dist/rpc/server.js +59 -115
  226. package/dist/rpc/server.js.map +1 -1
  227. package/dist/rpc-client-sdk-entry.d.ts +12 -0
  228. package/dist/rpc-client-sdk-entry.d.ts.map +1 -0
  229. package/dist/rpc-client-sdk-entry.js +11 -0
  230. package/dist/rpc-client-sdk-entry.js.map +1 -0
  231. package/dist/rpc-entry.js +50 -18
  232. package/dist/rpc-entry.js.map +1 -1
  233. package/dist/rpc-server-entry.d.ts +8 -0
  234. package/dist/rpc-server-entry.d.ts.map +1 -0
  235. package/dist/rpc-server-entry.js +67 -0
  236. package/dist/rpc-server-entry.js.map +1 -0
  237. package/dist/runtime/attachment-store.d.ts +13 -0
  238. package/dist/runtime/attachment-store.d.ts.map +1 -0
  239. package/dist/runtime/attachment-store.js +93 -0
  240. package/dist/runtime/attachment-store.js.map +1 -0
  241. package/dist/runtime/bootstrap.d.ts +14 -0
  242. package/dist/runtime/bootstrap.d.ts.map +1 -0
  243. package/dist/runtime/bootstrap.js +29 -0
  244. package/dist/runtime/bootstrap.js.map +1 -0
  245. package/dist/runtime/interactive-host-service.d.ts +22 -0
  246. package/dist/runtime/interactive-host-service.d.ts.map +1 -0
  247. package/dist/runtime/interactive-host-service.js +2 -0
  248. package/dist/runtime/interactive-host-service.js.map +1 -0
  249. package/dist/runtime/interactive-resource-service.d.ts +11 -0
  250. package/dist/runtime/interactive-resource-service.d.ts.map +1 -0
  251. package/dist/runtime/interactive-resource-service.js +3 -0
  252. package/dist/runtime/interactive-resource-service.js.map +1 -0
  253. package/dist/runtime/plugin-inventory-entry.d.ts +5 -0
  254. package/dist/runtime/plugin-inventory-entry.d.ts.map +1 -0
  255. package/dist/runtime/plugin-inventory-entry.js +18 -0
  256. package/dist/runtime/plugin-inventory-entry.js.map +1 -0
  257. package/dist/runtime/plugin-inventory-service.d.ts +8 -0
  258. package/dist/runtime/plugin-inventory-service.d.ts.map +1 -0
  259. package/dist/runtime/plugin-inventory-service.js +3 -0
  260. package/dist/runtime/plugin-inventory-service.js.map +1 -0
  261. package/dist/runtime/plugin-manager-entry.d.ts +20 -0
  262. package/dist/runtime/plugin-manager-entry.d.ts.map +1 -0
  263. package/dist/runtime/plugin-manager-entry.js +96 -0
  264. package/dist/runtime/plugin-manager-entry.js.map +1 -0
  265. package/dist/runtime/plugin-observability-entry.d.ts +12 -0
  266. package/dist/runtime/plugin-observability-entry.d.ts.map +1 -0
  267. package/dist/runtime/plugin-observability-entry.js +73 -0
  268. package/dist/runtime/plugin-observability-entry.js.map +1 -0
  269. package/dist/runtime/product-host.d.ts +91 -0
  270. package/dist/runtime/product-host.d.ts.map +1 -0
  271. package/dist/runtime/product-host.js +529 -0
  272. package/dist/runtime/product-host.js.map +1 -0
  273. package/dist/runtime/session-factory.d.ts +17 -0
  274. package/dist/runtime/session-factory.d.ts.map +1 -0
  275. package/dist/runtime/session-factory.js +75 -0
  276. package/dist/runtime/session-factory.js.map +1 -0
  277. package/dist/runtime/session-host.d.ts +152 -0
  278. package/dist/runtime/session-host.d.ts.map +1 -0
  279. package/dist/runtime/session-host.js +895 -0
  280. package/dist/runtime/session-host.js.map +1 -0
  281. package/dist/runtime-core-entry.d.ts +11 -0
  282. package/dist/runtime-core-entry.d.ts.map +1 -0
  283. package/dist/runtime-core-entry.js +9 -0
  284. package/dist/runtime-core-entry.js.map +1 -0
  285. package/dist/session-factory-entry.d.ts +7 -0
  286. package/dist/session-factory-entry.d.ts.map +1 -0
  287. package/dist/session-factory-entry.js +9 -0
  288. package/dist/session-factory-entry.js.map +1 -0
  289. package/dist/session-store-jsonl-entry.d.ts +7 -0
  290. package/dist/session-store-jsonl-entry.d.ts.map +1 -0
  291. package/dist/session-store-jsonl-entry.js +33 -0
  292. package/dist/session-store-jsonl-entry.js.map +1 -0
  293. package/dist/startup.d.ts +12 -1
  294. package/dist/startup.d.ts.map +1 -1
  295. package/dist/startup.js +106 -15
  296. package/dist/startup.js.map +1 -1
  297. package/dist/subagents/index.d.ts +2 -0
  298. package/dist/subagents/index.d.ts.map +1 -0
  299. package/dist/subagents/index.js +2 -0
  300. package/dist/subagents/index.js.map +1 -0
  301. package/dist/subagents/service.d.ts +50 -0
  302. package/dist/subagents/service.d.ts.map +1 -0
  303. package/dist/subagents/service.js +521 -0
  304. package/dist/subagents/service.js.map +1 -0
  305. package/dist/ui-host.d.ts +125 -0
  306. package/dist/ui-host.d.ts.map +1 -0
  307. package/dist/ui-host.js +275 -0
  308. package/dist/ui-host.js.map +1 -0
  309. package/dist/web/assets/index-BwfuGMvv.css +1 -0
  310. package/dist/web/assets/index-DPUaJqFJ.js +41 -0
  311. package/dist/web/assets/index-DPUaJqFJ.js.map +1 -0
  312. package/dist/web/index.html +14 -0
  313. package/dist/web-command.d.ts +11 -0
  314. package/dist/web-command.d.ts.map +1 -0
  315. package/dist/web-command.js +114 -0
  316. package/dist/web-command.js.map +1 -0
  317. package/dist/web-frontend.d.ts +73 -0
  318. package/dist/web-frontend.d.ts.map +1 -0
  319. package/dist/web-frontend.js +249 -0
  320. package/dist/web-frontend.js.map +1 -0
  321. package/dist/web.d.ts +254 -0
  322. package/dist/web.d.ts.map +1 -0
  323. package/dist/web.js +740 -0
  324. package/dist/web.js.map +1 -0
  325. package/dist/webui-entry.d.ts +3 -0
  326. package/dist/webui-entry.d.ts.map +1 -0
  327. package/dist/webui-entry.js +73 -0
  328. package/dist/webui-entry.js.map +1 -0
  329. package/dist/webui.d.ts +91 -0
  330. package/dist/webui.d.ts.map +1 -0
  331. package/dist/webui.js +882 -0
  332. package/dist/webui.js.map +1 -0
  333. package/package.json +89 -8
@@ -64,6 +64,16 @@ function steeringCommandArgument(prompt) {
64
64
  const match = /^\/steer(?:\s+([\s\S]*))?$/i.exec(prompt);
65
65
  return match ? (match[1] ?? "").trim() : undefined;
66
66
  }
67
+ function isContextSessionChoice(value) {
68
+ return (typeof value === "object" &&
69
+ value !== null &&
70
+ "id" in value &&
71
+ typeof value.id === "string" &&
72
+ "label" in value &&
73
+ typeof value.label === "string" &&
74
+ "open" in value &&
75
+ typeof value.open === "function");
76
+ }
67
77
  export class InteractiveMode {
68
78
  projection = new InteractiveProjection();
69
79
  root;
@@ -71,7 +81,6 @@ export class InteractiveMode {
71
81
  session;
72
82
  tui;
73
83
  sessionChoices;
74
- extensionHost;
75
84
  providerOnboarding;
76
85
  agentDir;
77
86
  readClipboardImagePath;
@@ -91,19 +100,32 @@ export class InteractiveMode {
91
100
  overlay;
92
101
  autocompleteOverlay;
93
102
  spinnerTimer;
94
- shutdownEmitted = false;
95
103
  preserveClipboardFiles = false;
96
104
  locale;
105
+ commandRegistry;
106
+ context;
97
107
  constructor(options) {
98
108
  this.session = options.session;
99
109
  this.projection.configureFilePreview(this.session.allowedRoot, () => this.refresh());
100
110
  this.tui = options.tui;
101
111
  this.onExit = options.onExit;
102
- this.sessionChoices = [...(options.sessions ?? [])];
103
- this.extensionHost = options.extensionHost;
112
+ const contextChoices = (options.context?.sessionChoices() ?? []).filter(isContextSessionChoice).map((choice) => ({
113
+ ...choice,
114
+ open: async () => {
115
+ const session = await choice.open();
116
+ if (typeof session !== "object" || session === null)
117
+ throw new Error(`Session choice ${choice.id} is invalid`);
118
+ return session;
119
+ },
120
+ }));
121
+ this.sessionChoices = [...(options.sessions ?? contextChoices)];
104
122
  this.providerOnboarding = options.providerOnboarding;
105
123
  this.agentDir = resolve(options.agentDir ?? join(homedir(), ".di-code"));
106
124
  this.locale = options.locale ?? DEFAULT_LOCALE;
125
+ this.commandRegistry = options.commandRegistry;
126
+ this.context = options.context;
127
+ if (this.context?.theme() === "light")
128
+ this.theme = "light";
107
129
  this.readClipboardImagePath = options.readClipboardImagePath ?? readClipboardImagePath;
108
130
  this.clipboardDirectory = clipboardImageDirectory(this.agentDir, this.session.allowedRoot);
109
131
  const autocomplete = {
@@ -117,9 +139,12 @@ export class InteractiveMode {
117
139
  });
118
140
  this.editor.onSubmit = (text) => void this.submit(text);
119
141
  this.editor.onEscape = () => {
120
- if (!this.activeAbort)
142
+ if (!this.activeAbort) {
143
+ this.context?.cancel();
121
144
  return;
145
+ }
122
146
  this.projection.setStatus(translate(this.locale, "cancelled"));
147
+ this.context?.cancel();
123
148
  this.activeAbort.abort();
124
149
  this.refresh();
125
150
  };
@@ -155,8 +180,6 @@ export class InteractiveMode {
155
180
  if (this.started)
156
181
  throw new Error("Interactive mode is already started");
157
182
  this.started = true;
158
- this.shutdownEmitted = false;
159
- void this.extensionHost?.emit({ type: "session_start", cwd: this.session.allowedRoot });
160
183
  this.projection.replaceTranscript(this.session.transcript);
161
184
  this.projection.setUsage(this.session.usage);
162
185
  this.subscribeToSession();
@@ -191,16 +214,22 @@ export class InteractiveMode {
191
214
  this.unsubscribeSession = undefined;
192
215
  void this.cleanupClipboardFiles();
193
216
  this.tui.stop({ finalLines: this.root.renderTranscript(this.tui.columns) });
194
- if (!this.shutdownEmitted) {
195
- this.shutdownEmitted = true;
196
- void this.extensionHost?.emit({ type: "session_shutdown", reason: "user" });
197
- }
217
+ }
218
+ /** Cancels the active prompt without changing Session history. */
219
+ cancelActivePrompt() {
220
+ this.activeAbort?.abort();
221
+ }
222
+ /** Re-submits the last failed prompt when the mode is idle. */
223
+ retryLastPrompt() {
224
+ if (this.lastFailedPrompt && !this.promptInFlight)
225
+ void this.submit(this.lastFailedPrompt, true);
198
226
  }
199
227
  exit() {
200
228
  this.stop();
201
229
  this.onExit?.();
202
230
  }
203
231
  handleCommand(data) {
232
+ this.context?.keybindings();
204
233
  if (matchesKey(data, Key.alt("s"))) {
205
234
  void this.submitSteering(this.editor.getValue());
206
235
  return true;
@@ -273,6 +302,7 @@ export class InteractiveMode {
273
302
  ]);
274
303
  list.onSelect = (item) => {
275
304
  this.theme = item.value === "light" ? "light" : "dark";
305
+ this.context?.setTheme(this.theme);
276
306
  this.projection.setStatus(`theme=${this.theme}`);
277
307
  this.closeOverlay();
278
308
  this.refresh();
@@ -619,7 +649,9 @@ export class InteractiveMode {
619
649
  const input = await extractImageAttachments(normalizeDroppedImagePrompt(prompt, this.session.allowedRoot), this.session.allowedRoot);
620
650
  this.preserveClipboardFiles = true;
621
651
  this.editor.setValue("");
622
- const result = await this.session.promptWithImages(input.text, input.images, this.activeAbort.signal);
652
+ const result = retry && "retry" in this.session
653
+ ? await this.session.retry(this.activeAbort.signal)
654
+ : await this.session.promptWithImages(input.text, input.images, this.activeAbort.signal);
623
655
  if (result.stopReason === "error" || result.stopReason === "aborted")
624
656
  this.lastFailedPrompt = prompt;
625
657
  else {
@@ -706,6 +738,22 @@ export class InteractiveMode {
706
738
  const [rawCommand = "", ...argParts] = trimmed.split(/\s+/);
707
739
  const command = rawCommand.toLowerCase();
708
740
  const args = argParts.join(" ");
741
+ if (this.commandRegistry?.list().some((entry) => entry.name === command)) {
742
+ void this.commandRegistry
743
+ .execute(command, {
744
+ host: { runCommand: (name, value) => this.runRegisteredCommand(name, value) },
745
+ args,
746
+ })
747
+ .catch((cause) => {
748
+ this.projection.setError(cause instanceof Error ? cause.message : String(cause));
749
+ this.refresh();
750
+ });
751
+ this.refresh();
752
+ return;
753
+ }
754
+ this.runRegisteredCommand(command, args);
755
+ }
756
+ runRegisteredCommand(command, _args) {
709
757
  switch (command) {
710
758
  case "help":
711
759
  this.projection.setStatus(`commands: ${this.listSlashCommands()
@@ -718,49 +766,46 @@ export class InteractiveMode {
718
766
  break;
719
767
  case "model":
720
768
  this.openModelSelector();
721
- return;
769
+ return 0;
722
770
  case "session":
723
771
  this.openSessionSelector();
724
- return;
772
+ return 0;
725
773
  case "tree":
726
774
  this.openTreeSelector();
727
- return;
775
+ return 0;
728
776
  case "theme":
729
777
  this.openThemeSelector();
730
- return;
778
+ return 0;
731
779
  case "settings":
732
780
  this.openSettingsSelector();
733
- return;
781
+ return 0;
734
782
  case "login":
735
783
  this.openProviderLogin();
736
- return;
784
+ return 0;
737
785
  case "logout":
738
786
  void this.logoutProvider();
739
- return;
787
+ return 0;
740
788
  case "compact":
741
789
  void this.runManualCompaction();
742
- return;
790
+ return 0;
743
791
  case "usage":
744
792
  this.projection.setStatus(this.formatUsage());
745
793
  break;
746
794
  case "retry":
747
- if (this.lastFailedPrompt && !this.promptInFlight)
748
- void this.submit(this.lastFailedPrompt, true);
795
+ if (this.lastFailedPrompt && !this.promptInFlight) {
796
+ if (this.context)
797
+ void this.context.retry();
798
+ else
799
+ void this.submit(this.lastFailedPrompt, true);
800
+ }
749
801
  else
750
802
  this.projection.setStatus(translate(this.locale, "nothingToRetry"));
751
803
  break;
752
- default: {
753
- if (this.extensionHost?.listCommands().some((entry) => entry.name === command)) {
754
- void this.extensionHost.runCommand(command, args).catch((cause) => {
755
- this.projection.setError(cause instanceof Error ? cause.message : String(cause));
756
- this.refresh();
757
- });
758
- break;
759
- }
804
+ default:
760
805
  this.projection.setError(`Unknown command: /${command}`);
761
- }
762
806
  }
763
807
  this.refresh();
808
+ return 0;
764
809
  }
765
810
  openProviderLogin() {
766
811
  if (!this.providerOnboarding) {
@@ -830,7 +875,11 @@ export class InteractiveMode {
830
875
  name: `skill:${skill.name}`,
831
876
  description: skill.description,
832
877
  }));
833
- return [...builtinSlashCommands(this.locale), ...(this.extensionHost?.listCommands() ?? []), ...skills];
878
+ const registryCommands = this.commandRegistry?.list().map((command) => ({
879
+ name: command.name,
880
+ description: typeof command.description === "function" ? command.description(this.locale) : command.description,
881
+ }));
882
+ return [...(registryCommands ?? builtinSlashCommands(this.locale)), ...skills];
834
883
  }
835
884
  isLoadedSkillCommand(input) {
836
885
  const name = /^\/skill:([a-z0-9]+(?:-[a-z0-9]+)*)(?:\s|$)/.exec(input)?.[1];
@@ -1 +1 @@
1
- {"version":3,"file":"interactive.js","sourceRoot":"","sources":["../../src/modes/interactive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAEN,4BAA4B,EAE5B,MAAM,EACN,GAAG,EACH,UAAU,EAEV,UAAU,EACV,YAAY,GAGZ,MAAM,cAAc,CAAC;AACtB,OAAO,EACN,2BAA2B,EAC3B,uBAAuB,EACvB,oBAAoB,EACpB,sBAAsB,EACtB,oBAAoB,GACpB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAGjE,OAAO,EAAE,cAAc,EAAe,SAAS,EAAE,MAAM,YAAY,CAAC;AACpE,OAAO,EAEN,iCAAiC,GACjC,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACN,0BAA0B,EAC1B,gBAAgB,EAChB,wBAAwB,EACxB,uBAAuB,GACvB,MAAM,eAAe,CAAC;AACvB,OAAO,EACN,gBAAgB,EAChB,eAAe,EACf,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,GAEjB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAIlD,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAE/D,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAC7E,MAAM,eAAe,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACpF,MAAM,oBAAoB,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC;AAE/E,SAAS,oBAAoB,CAAC,MAAc;IAC3C,MAAM,CAAC,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAClD,OAAO;QACN,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC,yBAAyB,CAAC,EAAE;QAC3D,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC,sBAAsB,CAAC,EAAE;QACzD,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC,mBAAmB,CAAC,EAAE;QACtD,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC,CAAC,qBAAqB,CAAC,EAAE;QAC1D,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC,kBAAkB,CAAC,EAAE;QACpD,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC,mBAAmB,CAAC,EAAE;QACtD,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC,sBAAsB,CAAC,EAAE;QAC5D,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC,gBAAgB,CAAC,EAAE;QACnD,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC,mBAAmB,CAAC,EAAE;QACvD,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC,CAAC,gBAAgB,CAAC,EAAE;QACrD,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,CAAC,EAAE;QAC9C,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC,aAAa,CAAC,EAAE;QAChD,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC,YAAY,CAAC,EAAE;KAC/C,CAAC;AACH,CAAC;AAED,SAAS,0BAA0B,CAAC,MAAc,EAAE,GAAW;IAC9D,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,MAAM,CAAC;IACzC,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,+BAA+B,EAAE,MAAM,CAAC,CAAC;IACjF,IAAI,CAAC,SAAS,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;QAAE,OAAO,MAAM,CAAC;IACzF,IAAI,CAAC;QACJ,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC,MAAM,EAAE;YAAE,OAAO,MAAM,CAAC;IAChE,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,MAAM,CAAC;IACf,CAAC;IACD,OAAO,KAAK,SAAS,CAAC,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC;AAClD,CAAC;AAED,SAAS,2BAA2B,CAAC,MAAc,EAAE,GAAW;IAC/D,MAAM,UAAU,GAAG,0BAA0B,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3D,IAAI,UAAU,KAAK,MAAM;QAAE,OAAO,UAAU,CAAC;IAC7C,MAAM,MAAM,GAAG,wFAAwF,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACrH,IAAI,CAAC,MAAM;QAAE,OAAO,MAAM,CAAC;IAC3B,MAAM,cAAc,GAAG,0BAA0B,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC;IACxE,OAAO,cAAc,KAAK,MAAM,CAAC,CAAC,CAAC;QAClC,CAAC,CAAC,MAAM;QACR,CAAC,CAAC,GAAG,cAAc,GAAG,2BAA2B,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC;AAC5E,CAAC;AAED,SAAS,uBAAuB,CAAC,MAAc;IAC9C,MAAM,KAAK,GAAG,6BAA6B,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACzD,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AACpD,CAAC;AAsBD,MAAM,OAAO,eAAe;IACV,UAAU,GAAG,IAAI,qBAAqB,EAAE,CAAC;IACzC,IAAI,CAAoB;IACxB,MAAM,CAAS;IACxB,OAAO,CAAe;IACb,GAAG,CAAM;IACT,cAAc,CAAsC;IACpD,aAAa,CAAiB;IAC9B,kBAAkB,CAAqD;IACvE,QAAQ,CAAS;IACjB,sBAAsB,CAAiD;IAChF,kBAAkB,CAAS;IAClB,cAAc,GAAG,IAAI,GAAG,EAAU,CAAC;IAC5C,kBAAkB,CAAc;IAChC,gBAAgB,GAAG,KAAK,CAAC;IACzB,cAAc,GAAG,KAAK,CAAC;IACvB,kBAAkB,GAAG,KAAK,CAAC;IAC3B,WAAW,CAAmB;IAC9B,OAAO,GAAG,KAAK,CAAC;IAChB,gBAAgB,CAAU;IAC1B,aAAa,GAAa,EAAE,CAAC;IAC7B,eAAe,GAAa,EAAE,CAAC;IACtB,MAAM,CAAc;IAC7B,KAAK,GAAqB,MAAM,CAAC;IACjC,OAAO,CAAiB;IACxB,mBAAmB,CAAiB;IACpC,YAAY,CAAkC;IAC9C,eAAe,GAAG,KAAK,CAAC;IACxB,sBAAsB,GAAG,KAAK,CAAC;IAC/B,MAAM,CAAS;IAEvB,YAAY,OAA+B;QAC1C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,UAAU,CAAC,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QACrF,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;QACvB,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,cAAc,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC;QACpD,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;QAC3C,IAAI,CAAC,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,CAAC;QACrD,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC;QACzE,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,cAAc,CAAC;QAC/C,IAAI,CAAC,sBAAsB,GAAG,OAAO,CAAC,sBAAsB,IAAI,sBAAsB,CAAC;QACvF,IAAI,CAAC,kBAAkB,GAAG,uBAAuB,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAC3F,MAAM,YAAY,GAAyB;YAC1C,cAAc,EAAE,CAAC,OAAO,EAAE,mBAAmB,EAAE,EAAE,CAChD,IAAI,4BAA4B,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,cAAc,CAClG,OAAO,EACP,mBAAmB,CACnB;YACF,eAAe,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,CAC1C,IAAI,4BAA4B,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,eAAe,CACnG,OAAO,EACP,IAAI,EACJ,MAAM,CACN;SACF,CAAC;QACF,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC;YACxB,SAAS,EAAE,CAAC;YACZ,YAAY;YACZ,kBAAkB,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;SAC1F,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,QAAQ,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACxD,IAAI,CAAC,MAAM,CAAC,QAAQ,GAAG,GAAG,EAAE;YAC3B,IAAI,CAAC,IAAI,CAAC,WAAW;gBAAE,OAAO;YAC9B,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;YAC/D,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,OAAO,EAAE,CAAC;QAChB,CAAC,CAAC;QACF,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAC3D,IAAI,CAAC,MAAM,CAAC,WAAW,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5C,IAAI,CAAC,MAAM,CAAC,QAAQ,GAAG,GAAG,EAAE;YAC3B,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE,CAAC;gBAClC,KAAK,IAAI,CAAC,iCAAiC,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;oBAC7D,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;oBACjF,IAAI,CAAC,OAAO,EAAE,CAAC;gBAChB,CAAC,CAAC,CAAC;YACJ,CAAC;QACF,CAAC,CAAC;QACF,IAAI,CAAC,MAAM,CAAC,oBAAoB,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,yBAAyB,EAAE,CAAC;QAC1E,MAAM,aAAa,GAAG,GAAyB,EAAE,CAAC,CAAC;YAClD,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK;YACxB,KAAK,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACtG,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,kBAAkB,EAAE,oBAAoB;SACxC,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,GAAG,IAAI,iBAAiB,CAAC;YACjC,MAAM,EAAE,IAAI,iBAAiB,CAAC,aAAa,CAAC;YAC5C,IAAI,EAAE,IAAI,eAAe,CAAC,aAAa,CAAC;YACxC,QAAQ,EAAE,IAAI,mBAAmB,CAAC,aAAa,CAAC;YAChD,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,MAAM,EAAE,IAAI,iBAAiB,CAAC,aAAa,CAAC;SAC5C,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,aAAsB;QAC3B,IAAI,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;QACzE,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;QAC7B,KAAK,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;QACxF,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC3D,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC7C,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,KAAK,2BAA2B,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;YACzF,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YACjF,IAAI,CAAC,OAAO,EAAE,CAAC;QAChB,CAAC,CAAC,CAAC;QACH,IAAI,CAAC;YACJ,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;QAClB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;YACrB,IAAI,CAAC,kBAAkB,EAAE,EAAE,CAAC;YAC5B,IAAI,CAAC,kBAAkB,GAAG,SAAS,CAAC;YACpC,MAAM,KAAK,CAAC;QACb,CAAC;QACD,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,IAAI,aAAa,EAAE,IAAI,EAAE;YAAE,KAAK,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IAC5D,CAAC;IAED,IAAI;QACH,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,kBAAkB;YAAE,OAAO;QACtD,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACrB,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,CAAC;QAC1B,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC;QAC7B,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,IAAI,CAAC,UAAU,CAAC,qBAAqB,EAAE,CAAC;QACxC,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAChC,IAAI,CAAC,kBAAkB,EAAE,EAAE,CAAC;QAC5B,IAAI,CAAC,kBAAkB,GAAG,SAAS,CAAC;QACpC,KAAK,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAClC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC5E,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;YAC3B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;YAC5B,KAAK,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QAC7E,CAAC;IACF,CAAC;IAEO,IAAI;QACX,IAAI,CAAC,IAAI,EAAE,CAAC;QACZ,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;IACjB,CAAC;IAEO,aAAa,CAAC,IAAY;QACjC,IAAI,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YACpC,KAAK,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;YACjD,OAAO,IAAI,CAAC;QACb,CAAC;QACD,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvB,IAAI,CAAC;gBACJ,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC;gBAChD,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,KAAK,EAAE,CAAC,CAAC,CAAC,iDAAiD,CAAC,CAAC;gBAC3G,IAAI,KAAK,EAAE,CAAC;oBACX,KAAK,uBAAuB,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,KAAK,CACtG,CAAC,KAAK,EAAE,EAAE;wBACT,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;wBACjF,IAAI,CAAC,OAAO,EAAE,CAAC;oBAChB,CAAC,CACD,CAAC;gBACH,CAAC;YACF,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAClF,CAAC;YACD,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,OAAO,IAAI,CAAC;QACb,CAAC;QACD,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YACrB,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACzB,OAAO,IAAI,CAAC;QACb,CAAC;QACD,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YACrB,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC;QACb,CAAC;QACD,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YACrB,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACzB,OAAO,IAAI,CAAC;QACb,CAAC;QACD,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YACrB,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC3B,OAAO,IAAI,CAAC;QACb,CAAC;QACD,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,gBAAgB,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;YACtE,KAAK,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;YAC9C,OAAO,IAAI,CAAC;QACb,CAAC;QACD,IAAI,UAAU,CAAC,IAAI,EAAE,eAAe,CAAC,EAAE,CAAC;YACvC,KAAK,IAAI,CAAC,oBAAoB,EAAE,CAAC;YACjC,OAAO,IAAI,CAAC;QACb,CAAC;QACD,OAAO,KAAK,CAAC;IACd,CAAC;IAEO,KAAK,CAAC,oBAAoB;QACjC,IAAI,CAAC;YACJ,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;YACxE,IAAI,CAAC,IAAI,EAAE,CAAC;gBACX,IAAI,CAAC,UAAU,CAAC,SAAS,CACxB,IAAI,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,mCAAmC,CAC/E,CAAC;YACH,CAAC;iBAAM,CAAC;gBACP,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;gBACrC,IAAI,oBAAoB,CAAC,IAAI,EAAE,IAAI,CAAC,kBAAkB,CAAC;oBAAE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACxF,CAAC;QACF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAClF,CAAC;QACD,IAAI,CAAC,OAAO,EAAE,CAAC;IAChB,CAAC;IAEO,iBAAiB;QACxB,MAAM,CAAC,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QACvD,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC;YAC3B,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,CAAC,EAAE;YAChE,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,YAAY,CAAC,EAAE;SACnE,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,GAAG,CAAC,IAAI,EAAE,EAAE;YACxB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;YACvD,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,SAAS,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;YACjD,IAAI,CAAC,YAAY,EAAE,CAAC;YACpB,IAAI,CAAC,OAAO,EAAE,CAAC;QAChB,CAAC,CAAC;QACF,IAAI,CAAC,QAAQ,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;QAC1C,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC;IAEO,iBAAiB;QACxB,MAAM,IAAI,GAAG,IAAI,UAAU,CAC1B,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAC5C,KAAK,EAAE,KAAK,CAAC,EAAE;YACf,KAAK,EAAE,KAAK,CAAC,IAAI;YACjB,WAAW,EAAE,GAAG,KAAK,CAAC,QAAQ,MAAM,KAAK,CAAC,EAAE,cAAc,KAAK,CAAC,aAAa,EAAE;SAC/E,CAAC,CAAC,CACH,CAAC;QACF,IAAI,CAAC,QAAQ,GAAG,CAAC,IAAI,EAAE,EAAE;YACxB,IAAI,CAAC;gBACJ,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAClC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,SAAS,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;gBACjD,KAAK,wBAAwB,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;oBAC3G,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;oBACjF,IAAI,CAAC,OAAO,EAAE,CAAC;gBAChB,CAAC,CAAC,CAAC;gBACH,IAAI,CAAC,YAAY,EAAE,CAAC;gBACpB,IAAI,CAAC,OAAO,EAAE,CAAC;YAChB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAClF,CAAC;QACF,CAAC,CAAC;QACF,IAAI,CAAC,QAAQ,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;QAC1C,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC;IAEO,mBAAmB;QAC1B,MAAM,CAAC,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QACvD,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC;YAC3B;gBACC,KAAK,EAAE,aAAa;gBACpB,KAAK,EAAE,CAAC,CAAC,gBAAgB,CAAC;gBAC1B,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,CAAC,CAAC,iBAAiB,CAAC;aAC7D;YACD,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;gBACvC,KAAK,EAAE,MAAM,CAAC,EAAE;gBAChB,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAClE,CAAC,CAAC;SACH,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,GAAG,CAAC,IAAI,EAAE,EAAE;YACxB,IAAI,IAAI,CAAC,KAAK,KAAK,aAAa,EAAE,CAAC;gBAClC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;gBAC7C,IAAI,CAAC,YAAY,EAAE,CAAC;gBACpB,IAAI,CAAC,OAAO,EAAE,CAAC;gBACf,OAAO;YACR,CAAC;YACD,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC;YACpF,IAAI,CAAC,MAAM;gBAAE,OAAO;YACpB,IAAI,CAAC,YAAY,EAAE,CAAC;YACpB,KAAK,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QACjC,CAAC,CAAC;QACF,IAAI,CAAC,QAAQ,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;QAC1C,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC;IAEO,gBAAgB;QACvB,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC7E,IAAI,CAAC,UAAU,CAAC,QAAQ,CACvB,IAAI,CAAC,MAAM,KAAK,OAAO;gBACtB,CAAC,CAAC,gBAAgB;gBAClB,CAAC,CAAC,2DAA2D,CAC9D,CAAC;YACF,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,OAAO;QACR,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3C,IAAI,CAAC,UAAU,CAAC,SAAS,CACxB,IAAI,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,2CAA2C,CACtF,CAAC;YACF,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,OAAO;QACR,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,YAAY,CAAC;YACjC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW;YAC/B,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,aAAa;YAClC,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,UAAU,EAAE,CAAC,KAAK,EAAE,EAAE;gBACrB,IAAI,CAAC,YAAY,EAAE,CAAC;gBACpB,KAAK,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACvC,CAAC;YACD,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;gBACjB,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;oBAC/D,IAAI,CAAC,UAAU,CAAC,QAAQ,CACvB,IAAI,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,8CAA8C,CACxF,CAAC;oBACF,IAAI,CAAC,OAAO,EAAE,CAAC;oBACf,OAAO;gBACR,CAAC;gBACD,IAAI,CAAC,YAAY,EAAE,CAAC;gBACpB,KAAK,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACvC,CAAC;YACD,WAAW,EAAE,CAAC,KAAK,EAAE,EAAE;gBACtB,IAAI,CAAC,YAAY,EAAE,CAAC;gBACpB,KAAK,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACzC,CAAC;YACD,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,YAAY,EAAE;SACnC,CAAC,CAAC;QACH,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IACzC,CAAC;IAEO,KAAK,CAAC,iBAAiB,CAAC,OAAe;QAC9C,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YACxD,IAAI,CAAC,IAAI,CAAC,OAAO;gBAAE,OAAO,KAAK,CAAC;YAChC,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YAC3D,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;YAC9C,IAAI,CAAC,UAAU,CAAC,SAAS,CACxB,MAAM,CAAC,aAAa;gBACnB,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,OAAO;oBACxB,CAAC,CAAC,gBAAgB;oBAClB,CAAC,CAAC,gDAAgD;gBACnD,CAAC,CAAC,QAAQ,MAAM,CAAC,eAAe,EAAE,CACnC,CAAC;YACF,OAAO,IAAI,CAAC;QACb,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YACjF,OAAO,KAAK,CAAC;QACd,CAAC;gBAAS,CAAC;YACV,IAAI,CAAC,OAAO,EAAE,CAAC;QAChB,CAAC;IACF,CAAC;IAEO,KAAK,CAAC,mBAAmB,CAAC,OAAe;QAChD,IAAI,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,cAAc;YAAE,OAAO;QAC3D,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QAC/B,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,8BAA8B,CAAC,CAAC;QACnG,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,IAAI,CAAC;YACJ,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;gBAAE,OAAO;YACrD,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YAC7B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YACzB,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YAC3D,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC;QAC7F,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAClF,CAAC;gBAAS,CAAC;YACV,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;YAChC,IAAI,CAAC,OAAO,EAAE,CAAC;QAChB,CAAC;IACF,CAAC;IAEO,oBAAoB;QAC3B,MAAM,CAAC,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QACvD,MAAM,IAAI,GAAG,IAAI,YAAY,CAC5B;YACC;gBACC,EAAE,EAAE,YAAY;gBAChB,KAAK,EAAE,CAAC,CAAC,mBAAmB,CAAC;gBAC7B,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;gBACjE,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;aAC3B;YACD;gBACC,EAAE,EAAE,QAAQ;gBACZ,KAAK,EAAE,CAAC,CAAC,UAAU,CAAC;gBACpB,YAAY,EAAE,IAAI,CAAC,MAAM;gBACzB,MAAM,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC;aACvB;SACD,EACD,EAAE,KAAK,EAAE,CAAC,CAAC,UAAU,CAAC,EAAE,CACxB,CAAC;QACF,IAAI,CAAC,QAAQ,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE;YAC7B,IAAI,EAAE,KAAK,QAAQ,EAAE,CAAC;gBACrB,IAAI,CAAC,MAAM,GAAG,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;gBACjD,KAAK,gBAAgB,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;oBACjE,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;oBACjF,IAAI,CAAC,OAAO,EAAE,CAAC;gBAChB,CAAC,CAAC,CAAC;gBACH,IAAI,CAAC,YAAY,EAAE,CAAC;gBACpB,IAAI,CAAC,oBAAoB,EAAE,CAAC;gBAC5B,OAAO;YACR,CAAC;YACD,IAAI,EAAE,KAAK,YAAY;gBAAE,OAAO;YAChC,IAAI,CAAC;gBACJ,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,KAAK,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;gBACrE,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;gBACnD,IAAI,CAAC,UAAU,CAAC,SAAS,CACxB,OAAO,KAAK,CAAC,KAAK,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAC3G,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC1E,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;gBACjF,IAAI,CAAC,YAAY,EAAE,CAAC;YACrB,CAAC;YACD,IAAI,CAAC,OAAO,EAAE,CAAC;QAChB,CAAC,CAAC;QACF,IAAI,CAAC,QAAQ,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;QAC1C,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC;IAEO,WAAW,CAAC,SAAoB,EAAE,gBAAgB,GAAG,KAAK,EAAE,YAA2B,KAAK;QACnG,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC;QACjC,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAChC,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,SAAS,EAAE;YAC9C,KAAK,EAAE,KAAK;YACZ,SAAS;YACT,MAAM,EAAE,QAAQ;YAChB,MAAM,EAAE,CAAC;YACT,gBAAgB;SAChB,CAAC,CAAC;IACJ,CAAC;IAEO,YAAY;QACnB,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;IAC1B,CAAC;IAEO,yBAAyB;QAChC,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAChC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,qBAAqB,EAAE,EAAE,CAAC;YAC1C,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,OAAO;QACR,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,gBAAgB,CAAC,GAAG,EAAE,CAAC,CAAC;YACxC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,oBAAoB,EAAE;YACzC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,oBAAoB,EAAE;SACzC,CAAC,CAAC,CAAC;QACJ,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACjE,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,EAAE;YACrD,KAAK,EAAE,KAAK;YACZ,SAAS,EAAE,CAAC;YACZ,MAAM,EAAE,aAAa;YACrB,SAAS,EAAE;gBACV,SAAS,EAAE,YAAY,CAAC,GAAG,GAAG,CAAC;gBAC/B,aAAa,EAAE,YAAY,CAAC,KAAK;gBACjC,SAAS,EAAE,OAAO;aAClB;YACD,MAAM,EAAE,CAAC;YACT,gBAAgB,EAAE,IAAI;YACtB,YAAY,EAAE,IAAI;SAClB,CAAC,CAAC;QACH,IAAI,CAAC,OAAO,EAAE,CAAC;IAChB,CAAC;IAEO,wBAAwB;QAC/B,IAAI,CAAC,mBAAmB,EAAE,IAAI,EAAE,CAAC;QACjC,IAAI,CAAC,mBAAmB,GAAG,SAAS,CAAC;IACtC,CAAC;IAEO,OAAO;QACd,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;QACvB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC1B,CAAC;IAEO,iBAAiB;QACxB,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE;YACpC,IAAI,IAAI,CAAC,UAAU,CAAC,cAAc,EAAE;gBAAE,IAAI,CAAC,OAAO,EAAE,CAAC;QACtD,CAAC,EAAE,GAAG,CAAC,CAAC;QACR,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,EAAE,CAAC;IAC7B,CAAC;IAEO,gBAAgB;QACvB,IAAI,IAAI,CAAC,YAAY;YAAE,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACxD,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC;IAC/B,CAAC;IAEO,kBAAkB;QACzB,IAAI,CAAC,kBAAkB,EAAE,EAAE,CAAC;QAC5B,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,KAAK,EAAE,EAAE;YACjE,IAAI,CAAC,IAAI,CAAC,OAAO;gBAAE,OAAO;YAC1B,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;gBACrC,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;gBAC3D,IAAI,CAAC,OAAO,EAAE,CAAC;gBACf,OAAO;YACR,CAAC;YACD,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;gBACnC,IAAI,CAAC,eAAe,GAAG,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC;gBAC3C,IAAI,CAAC,YAAY,EAAE,CAAC;gBACpB,IAAI,CAAC,OAAO,EAAE,CAAC;gBACf,OAAO;YACR,CAAC;YACD,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC7B,IAAI,CAAC,OAAO,EAAE,CAAC;QAChB,CAAC,CAAC,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,aAAa,CAAC,MAAgC;QAC3D,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAClD,IAAI,CAAC,UAAU,CAAC,QAAQ,CACvB,IAAI,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,mDAAmD,CAC/F,CAAC;YACF,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,OAAO;QACR,CAAC;QACD,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC7B,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,mBAAmB,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;QAC1D,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,IAAI,CAAC;YACJ,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YACjC,IAAI,CAAC,IAAI,CAAC,OAAO;gBAAE,OAAO;YAC1B,IAAI,CAAC,kBAAkB,EAAE,EAAE,CAAC;YAC5B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,IAAI,CAAC,UAAU,CAAC,oBAAoB,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;YAC7E,IAAI,CAAC,kBAAkB,GAAG,uBAAuB,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;YACnF,KAAK,2BAA2B,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;YAClE,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;YACxB,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC;YAC1B,IAAI,CAAC,YAAY,EAAE,CAAC;YACpB,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACnD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,WAAW,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;YAClD,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC3B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAClF,CAAC;gBAAS,CAAC;YACV,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;QAC/B,CAAC;QACD,IAAI,CAAC,OAAO,EAAE,CAAC;IAChB,CAAC;IAEO,KAAK,CAAC,MAAM,CAAC,IAAY,EAAE,KAAK,GAAG,KAAK;QAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC3B,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO;QACjD,MAAM,gBAAgB,GAAG,uBAAuB,CAAC,MAAM,CAAC,CAAC;QACzD,IAAI,gBAAgB,KAAK,SAAS,EAAE,CAAC;YACpC,MAAM,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;YAC5C,OAAO;QACR,CAAC;QACD,IAAI,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,EAAE,CAAC;YAClE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YACzB,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;YAChC,OAAO;QACR,CAAC;QACD,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC3B,IAAI,CAAC,UAAU,CAAC,QAAQ,CACvB,IAAI,CAAC,MAAM,KAAK,OAAO;gBACtB,CAAC,CAAC,oBAAoB;gBACtB,CAAC,CAAC,wDAAwD,CAC3D,CAAC;YACF,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,OAAO;QACR,CAAC;QACD,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC7B,IAAI,CAAC,UAAU,CAAC,QAAQ,CACvB,IAAI,CAAC,MAAM,KAAK,OAAO;gBACtB,CAAC,CAAC,qBAAqB;gBACvB,CAAC,CAAC,2DAA2D,CAC9D,CAAC;YACF,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,OAAO;QACR,CAAC;QACD,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACzB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAChC,IAAI,CAAC,YAAY,EAAE,CAAC;YACpB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACvB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;YACzB,OAAO;QACR,CAAC;QACD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC3B,IAAI,CAAC,WAAW,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACnC,IAAI,CAAC;YACJ,MAAM,KAAK,GAAG,MAAM,uBAAuB,CAC1C,2BAA2B,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,EAC7D,IAAI,CAAC,OAAO,CAAC,WAAW,CACxB,CAAC;YACF,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC;YACnC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YACzB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YACtG,IAAI,MAAM,CAAC,UAAU,KAAK,OAAO,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS;gBAAE,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC;iBAChG,CAAC;gBACL,IAAI,CAAC,gBAAgB,GAAG,SAAS,CAAC;gBAClC,MAAM,IAAI,CAAC,qBAAqB,EAAE,CAAC;YACpC,CAAC;QACF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC;YAC/B,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAClF,CAAC;gBAAS,CAAC;YACV,IAAI,CAAC,sBAAsB,GAAG,KAAK,CAAC;YACpC,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;YAC5B,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC;YAC7B,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YACnC,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;YACxC,IAAI,CAAC,YAAY,EAAE,CAAC;YACpB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACvB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;YACzB,IAAI,IAAI,IAAI,IAAI,CAAC,OAAO;gBAAE,KAAK,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAClD,CAAC;IACF,CAAC;IAEO,KAAK,CAAC,cAAc,CAAC,IAAY;QACxC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC3B,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,qCAAqC,CAAC,CAAC;YACxG,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,OAAO;QACR,CAAC;QACD,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC3B,IAAI,CAAC,UAAU,CAAC,QAAQ,CACvB,IAAI,CAAC,MAAM,KAAK,OAAO;gBACtB,CAAC,CAAC,uBAAuB;gBACzB,CAAC,CAAC,uDAAuD,CAC1D,CAAC;YACF,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,OAAO;QACR,CAAC;QACD,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC7B,IAAI,CAAC,UAAU,CAAC,QAAQ,CACvB,IAAI,CAAC,MAAM,KAAK,OAAO;gBACtB,CAAC,CAAC,wBAAwB;gBAC1B,CAAC,CAAC,0DAA0D,CAC7D,CAAC;YACF,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,OAAO;QACR,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;YAC1B,IAAI,CAAC,UAAU,CAAC,QAAQ,CACvB,IAAI,CAAC,MAAM,KAAK,OAAO;gBACtB,CAAC,CAAC,oBAAoB;gBACtB,CAAC,CAAC,uDAAuD,CAC1D,CAAC;YACF,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,OAAO;QACR,CAAC;QACD,IAAI,CAAC;YACJ,MAAM,KAAK,GAAG,MAAM,uBAAuB,CAC1C,2BAA2B,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,EAC7D,IAAI,CAAC,OAAO,CAAC,WAAW,CACxB,CAAC;YACF,MAAM,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;YAC7D,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC1B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAClF,CAAC;QACD,IAAI,CAAC,OAAO,EAAE,CAAC;IAChB,CAAC;IAEO,YAAY;QACnB,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;YACxB,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,UAAU,MAAM,EAAE,CAAC;YAC3D,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,WAAW,MAAM,EAAE,CAAC;SAC1D,CAAC,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,iCAAiC;QAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QACpC,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9E,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,oBAAoB,CAAC,IAAI,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC;QAC5F,KAAK,MAAM,IAAI,IAAI,KAAK;YAAE,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC5D,CAAC;IAEO,KAAK,CAAC,qBAAqB;QAClC,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC;QACvC,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,oBAAoB,CAAC,IAAI,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC;QAC5F,KAAK,MAAM,IAAI,IAAI,KAAK;YAAE,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC5D,CAAC;IAEO,kBAAkB,CAAC,KAAa;QACvC,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACtC,MAAM,CAAC,UAAU,GAAG,EAAE,EAAE,GAAG,QAAQ,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC5D,MAAM,OAAO,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC;QACzC,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChC,QAAQ,OAAO,EAAE,CAAC;YACjB,KAAK,MAAM;gBACV,IAAI,CAAC,UAAU,CAAC,SAAS,CACxB,aAAa,IAAI,CAAC,iBAAiB,EAAE;qBACnC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;qBAC9B,IAAI,CAAC,GAAG,CAAC,EAAE,CACb,CAAC;gBACF,MAAM;YACP,KAAK,OAAO;gBACX,IAAI,CAAC,UAAU,CAAC,oBAAoB,EAAE,CAAC;gBACvC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAAC,CAAC;gBAC5E,MAAM;YACP,KAAK,OAAO;gBACX,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBACzB,OAAO;YACR,KAAK,SAAS;gBACb,IAAI,CAAC,mBAAmB,EAAE,CAAC;gBAC3B,OAAO;YACR,KAAK,MAAM;gBACV,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACxB,OAAO;YACR,KAAK,OAAO;gBACX,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBACzB,OAAO;YACR,KAAK,UAAU;gBACd,IAAI,CAAC,oBAAoB,EAAE,CAAC;gBAC5B,OAAO;YACR,KAAK,OAAO;gBACX,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBACzB,OAAO;YACR,KAAK,QAAQ;gBACZ,KAAK,IAAI,CAAC,cAAc,EAAE,CAAC;gBAC3B,OAAO;YACR,KAAK,SAAS;gBACb,KAAK,IAAI,CAAC,mBAAmB,EAAE,CAAC;gBAChC,OAAO;YACR,KAAK,OAAO;gBACX,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;gBAC9C,MAAM;YACP,KAAK,OAAO;gBACX,IAAI,IAAI,CAAC,gBAAgB,IAAI,CAAC,IAAI,CAAC,cAAc;oBAAE,KAAK,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;;oBAC5F,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAC;gBACzE,MAAM;YACP,OAAO,CAAC,CAAC,CAAC;gBACT,IAAI,IAAI,CAAC,aAAa,EAAE,YAAY,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,EAAE,CAAC;oBAChF,KAAK,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;wBACjE,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;wBACjF,IAAI,CAAC,OAAO,EAAE,CAAC;oBAChB,CAAC,CAAC,CAAC;oBACH,MAAM;gBACP,CAAC;gBACD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,qBAAqB,OAAO,EAAE,CAAC,CAAC;YAC1D,CAAC;QACF,CAAC;QACD,IAAI,CAAC,OAAO,EAAE,CAAC;IAChB,CAAC;IAEO,iBAAiB;QACxB,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC9B,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,gDAAgD,CAAC,CAAC;YAC3E,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,OAAO;QACR,CAAC;QACD,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAClD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,mDAAmD,CAAC,CAAC;YAC9E,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,OAAO;QACR,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC;QACjC,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAChC,KAAK,iCAAiC,CAAC;YACtC,GAAG,IAAI,CAAC,kBAAkB;YAC1B,aAAa,EAAE,EAAE,GAAG,IAAI,CAAC,kBAAkB,CAAC,aAAa,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE;YAChF,GAAG,EAAE,IAAI,CAAC,GAAG;SACb,CAAC;aACA,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE;YACjB,IAAI,CAAC,IAAI,CAAC,OAAO;gBAAE,OAAO;YAC1B,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC/B,IAAI,CAAC,OAAO,EAAE,CAAC;gBACd,IAAI,CAAC,OAAO,EAAE,CAAC;gBACf,OAAO;YACR,CAAC;YACD,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;YACzD,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,YAAY,OAAO,CAAC,QAAQ,CAAC,EAAE,UAAU,OAAO,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;YACvF,IAAI,CAAC,OAAO,EAAE,CAAC;QAChB,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;YAChB,IAAI,IAAI,CAAC,OAAO;gBAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACjD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YACjF,IAAI,CAAC,OAAO,EAAE,CAAC;QAChB,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,cAAc;QAC3B,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC9B,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,iDAAiD,CAAC,CAAC;YAC5E,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,OAAO;QACR,CAAC;QACD,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAClD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,mDAAmD,CAAC,CAAC;YAC9E,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,OAAO;QACR,CAAC;QACD,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;QAC3C,IAAI,CAAC;YACJ,MAAM,OAAO,GAAG,MAAM,0BAA0B,CAAC,IAAI,CAAC,kBAAkB,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;YAC/F,IAAI,CAAC,OAAO,EAAE,CAAC;gBACd,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,yCAAyC,UAAU,EAAE,CAAC,CAAC;gBACjF,IAAI,CAAC,OAAO,EAAE,CAAC;gBACf,OAAO;YACR,CAAC;YACD,IAAI,CAAC,UAAU,CAAC,SAAS,CACxB,uCAAuC,UAAU,6CAA6C,CAC9F,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAClF,CAAC;QACD,IAAI,CAAC,OAAO,EAAE,CAAC;IAChB,CAAC;IAEO,iBAAiB;QACxB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAC3D,IAAI,EAAE,SAAS,KAAK,CAAC,IAAI,EAAE;YAC3B,WAAW,EAAE,KAAK,CAAC,WAAW;SAC9B,CAAC,CAAC,CAAC;QACJ,OAAO,CAAC,GAAG,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,MAAM,CAAC,CAAC;IACzG,CAAC;IAEO,oBAAoB,CAAC,KAAa;QACzC,MAAM,IAAI,GAAG,6CAA6C,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC5E,OAAO,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IAChG,CAAC;IAEO,WAAW;QAClB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;QACjC,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;YAC7B,OAAO,SAAS,KAAK,CAAC,YAAY,OAAO,KAAK,CAAC,WAAW,OAAO,KAAK,CAAC,YAAY,OAAO,KAAK,CAAC,WAAW,QAAQ,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,KAAK,CAAC,sBAAsB,IAAI,KAAK,CAAC,aAAa,EAAE,CAAC;QAC7M,CAAC;QACD,OAAO,mBAAmB,KAAK,CAAC,YAAY,UAAU,KAAK,CAAC,WAAW,WAAW,KAAK,CAAC,YAAY,UAAU,KAAK,CAAC,WAAW,UAAU,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,KAAK,CAAC,sBAAsB,IAAI,KAAK,CAAC,aAAa,EAAE,CAAC;IACvO,CAAC;IAEO,KAAK,CAAC,mBAAmB;QAChC,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;YACpD,IAAI,CAAC,UAAU,CAAC,QAAQ,CACvB,IAAI,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,2CAA2C,CACxF,CAAC;YACF,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,OAAO;QACR,CAAC;QACD,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QAC/B,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,0BAA0B,CAAC,CAAC,CAAC;QAC9E,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,IAAI,CAAC;YACJ,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YAC7B,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,0BAA0B,CAAC,CAAC,CAAC;QAC/E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAClF,CAAC;gBAAS,CAAC;YACV,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;YAChC,IAAI,CAAC,OAAO,EAAE,CAAC;QAChB,CAAC;IACF,CAAC;CACD","sourcesContent":["import { statSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { extname, join, resolve } from \"node:path\";\nimport {\n\ttype AutocompleteProvider,\n\tCombinedAutocompleteProvider,\n\ttype Component,\n\tEditor,\n\tKey,\n\tmatchesKey,\n\ttype OverlayHandle,\n\tSelectList,\n\tSettingsList,\n\ttype SlashCommand,\n\ttype TUI,\n} from \"@di-code/tui\";\nimport {\n\tcleanupStaleClipboardImages,\n\tclipboardImageDirectory,\n\tisClipboardImagePath,\n\treadClipboardImagePath,\n\tremoveClipboardImage,\n} from \"../core/clipboard-image.ts\";\nimport { extractImageAttachments } from \"../core/image-input.ts\";\nimport type { AgentSession, AgentSessionEvent } from \"../core/session.ts\";\nimport type { ExtensionHost } from \"../extensions/runtime.ts\";\nimport { DEFAULT_LOCALE, type Locale, translate } from \"../i18n.ts\";\nimport {\n\ttype InteractiveProviderOnboardingOptions,\n\tshowInteractiveProviderOnboarding,\n} from \"../provider-onboarding.ts\";\nimport {\n\tremoveGlobalProviderApiKey,\n\tsaveGlobalLocale,\n\tsaveGlobalModelSelection,\n\tsaveGlobalThinkingLevel,\n} from \"../startup.ts\";\nimport {\n\tAutocompleteMenu,\n\tInteractiveChat,\n\tInteractiveComposer,\n\tInteractiveFooter,\n\tInteractiveHeader,\n\ttype InteractiveViewState,\n} from \"./interactive-components.ts\";\nimport { InteractiveLayout } from \"./interactive-layout.ts\";\nimport { InteractiveProjection } from \"./interactive-state.ts\";\nimport { TreeSelector } from \"./tree-selector.ts\";\n\nexport type { AgentSessionEvent };\nexport type { InteractiveMessage, InteractiveProcessItem, InteractiveState } from \"./interactive-state.ts\";\nexport { InteractiveProjection } from \"./interactive-state.ts\";\n\nconst IMAGE_EXTENSIONS = new Set([\".gif\", \".jpeg\", \".jpg\", \".png\", \".webp\"]);\nconst PASTE_IMAGE_KEY = process.platform === \"win32\" ? Key.alt(\"v\") : Key.ctrl(\"v\");\nconst PASTE_IMAGE_SHORTCUT = process.platform === \"win32\" ? \"Alt+V\" : \"Ctrl+V\";\n\nfunction builtinSlashCommands(locale: Locale): readonly SlashCommand[] {\n\tconst t = (key: string) => translate(locale, key);\n\treturn [\n\t\t{ name: \"help\", description: t(\"showInteractiveCommands\") },\n\t\t{ name: \"clear\", description: t(\"clearVisibleMessages\") },\n\t\t{ name: \"model\", description: t(\"openModelSelector\") },\n\t\t{ name: \"session\", description: t(\"openSessionSelector\") },\n\t\t{ name: \"tree\", description: t(\"openTreeSelector\") },\n\t\t{ name: \"theme\", description: t(\"openThemeSelector\") },\n\t\t{ name: \"settings\", description: t(\"openSettingsSelector\") },\n\t\t{ name: \"login\", description: t(\"chooseProvider\") },\n\t\t{ name: \"logout\", description: t(\"removeProviderKey\") },\n\t\t{ name: \"compact\", description: t(\"compactContext\") },\n\t\t{ name: \"usage\", description: t(\"showUsage\") },\n\t\t{ name: \"retry\", description: t(\"retryPrompt\") },\n\t\t{ name: \"steer\", description: t(\"steerAgent\") },\n\t];\n}\n\nfunction asImageAttachmentReference(pasted: string, cwd: string): string {\n\tif (pasted.includes(\"\\n\")) return pasted;\n\tconst candidate = pasted.trim().replace(/^(?:\"([\\s\\S]*)\"|'([\\s\\S]*)')$/, \"$1$2\");\n\tif (!candidate || !IMAGE_EXTENSIONS.has(extname(candidate).toLowerCase())) return pasted;\n\ttry {\n\t\tif (!statSync(resolve(cwd, candidate)).isFile()) return pasted;\n\t} catch {\n\t\treturn pasted;\n\t}\n\treturn `@\"${candidate.replaceAll('\"', '\\\\\"')}\" `;\n}\n\nfunction normalizeDroppedImagePrompt(prompt: string, cwd: string): string {\n\tconst normalized = asImageAttachmentReference(prompt, cwd);\n\tif (normalized !== prompt) return normalized;\n\tconst prefix = /^((?:(?:[A-Za-z]:[\\\\/])|(?:\\.\\.?[\\\\/])|\\/)[\\s\\S]*?\\.(?:gif|jpe?g|png|webp))([\\s\\S]*)$/i.exec(prompt);\n\tif (!prefix) return prompt;\n\tconst imageReference = asImageAttachmentReference(prefix[1] ?? \"\", cwd);\n\treturn imageReference === prefix[1]\n\t\t? prompt\n\t\t: `${imageReference}${normalizeDroppedImagePrompt(prefix[2] ?? \"\", cwd)}`;\n}\n\nfunction steeringCommandArgument(prompt: string): string | undefined {\n\tconst match = /^\\/steer(?:\\s+([\\s\\S]*))?$/i.exec(prompt);\n\treturn match ? (match[1] ?? \"\").trim() : undefined;\n}\n\nexport interface InteractiveModeOptions {\n\treadonly session: AgentSession;\n\treadonly tui: TUI;\n\treadonly onExit?: () => void;\n\treadonly sessions?: readonly InteractiveSessionChoice[];\n\treadonly extensionHost?: ExtensionHost;\n\treadonly providerOnboarding?: Omit<InteractiveProviderOnboardingOptions, \"tui\">;\n\t/** User data directory that owns clipboard image temporaries. */\n\treadonly agentDir?: string;\n\treadonly readClipboardImagePath?: (directory?: string) => Promise<string | null>;\n\treadonly locale?: Locale;\n}\n\nexport interface InteractiveSessionChoice {\n\treadonly id: string;\n\treadonly label: string;\n\treadonly description?: string;\n\topen(): AgentSession | Promise<AgentSession>;\n}\n\nexport class InteractiveMode {\n\tprivate readonly projection = new InteractiveProjection();\n\tprivate readonly root: InteractiveLayout;\n\tprivate readonly editor: Editor;\n\tprivate session: AgentSession;\n\tprivate readonly tui: TUI;\n\tprivate readonly sessionChoices: readonly InteractiveSessionChoice[];\n\tprivate readonly extensionHost?: ExtensionHost;\n\tprivate readonly providerOnboarding?: Omit<InteractiveProviderOnboardingOptions, \"tui\">;\n\tprivate readonly agentDir: string;\n\tprivate readonly readClipboardImagePath: (directory?: string) => Promise<string | null>;\n\tprivate clipboardDirectory: string;\n\tprivate readonly clipboardFiles = new Set<string>();\n\tprivate unsubscribeSession?: () => void;\n\tprivate sessionSwitching = false;\n\tprivate promptInFlight = false;\n\tprivate compactionInFlight = false;\n\tprivate activeAbort?: AbortController;\n\tprivate started = false;\n\tprivate lastFailedPrompt?: string;\n\tprivate queuedPrompts: string[] = [];\n\tprivate steeringPrompts: string[] = [];\n\tprivate readonly onExit?: () => void;\n\tprivate theme: \"dark\" | \"light\" = \"dark\";\n\tprivate overlay?: OverlayHandle;\n\tprivate autocompleteOverlay?: OverlayHandle;\n\tprivate spinnerTimer?: ReturnType<typeof setInterval>;\n\tprivate shutdownEmitted = false;\n\tprivate preserveClipboardFiles = false;\n\tprivate locale: Locale;\n\n\tconstructor(options: InteractiveModeOptions) {\n\t\tthis.session = options.session;\n\t\tthis.projection.configureFilePreview(this.session.allowedRoot, () => this.refresh());\n\t\tthis.tui = options.tui;\n\t\tthis.onExit = options.onExit;\n\t\tthis.sessionChoices = [...(options.sessions ?? [])];\n\t\tthis.extensionHost = options.extensionHost;\n\t\tthis.providerOnboarding = options.providerOnboarding;\n\t\tthis.agentDir = resolve(options.agentDir ?? join(homedir(), \".di-code\"));\n\t\tthis.locale = options.locale ?? DEFAULT_LOCALE;\n\t\tthis.readClipboardImagePath = options.readClipboardImagePath ?? readClipboardImagePath;\n\t\tthis.clipboardDirectory = clipboardImageDirectory(this.agentDir, this.session.allowedRoot);\n\t\tconst autocomplete: AutocompleteProvider = {\n\t\t\tgetSuggestions: (context, autocompleteOptions) =>\n\t\t\t\tnew CombinedAutocompleteProvider(this.listSlashCommands(), this.session.allowedRoot).getSuggestions(\n\t\t\t\t\tcontext,\n\t\t\t\t\tautocompleteOptions,\n\t\t\t\t),\n\t\t\tapplyCompletion: (context, item, prefix) =>\n\t\t\t\tnew CombinedAutocompleteProvider(this.listSlashCommands(), this.session.allowedRoot).applyCompletion(\n\t\t\t\t\tcontext,\n\t\t\t\t\titem,\n\t\t\t\t\tprefix,\n\t\t\t\t),\n\t\t};\n\t\tthis.editor = new Editor({\n\t\t\tmaxHeight: 3,\n\t\t\tautocomplete,\n\t\t\tsubmitAutocomplete: (context) => /^\\/[^\\s/]*$/.test(context.text.slice(0, context.cursor)),\n\t\t});\n\t\tthis.editor.onSubmit = (text) => void this.submit(text);\n\t\tthis.editor.onEscape = () => {\n\t\t\tif (!this.activeAbort) return;\n\t\t\tthis.projection.setStatus(translate(this.locale, \"cancelled\"));\n\t\t\tthis.activeAbort.abort();\n\t\t\tthis.refresh();\n\t\t};\n\t\tthis.editor.onCommand = (data) => this.handleCommand(data);\n\t\tthis.editor.onInterrupt = () => this.exit();\n\t\tthis.editor.onChange = () => {\n\t\t\tif (!this.preserveClipboardFiles) {\n\t\t\t\tvoid this.cleanupUnreferencedClipboardFiles().catch((cause) => {\n\t\t\t\t\tthis.projection.setError(cause instanceof Error ? cause.message : String(cause));\n\t\t\t\t\tthis.refresh();\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\t\tthis.editor.onAutocompleteChange = () => this.updateAutocompleteOverlay();\n\t\tconst readViewState = (): InteractiveViewState => ({\n\t\t\t...this.projection.state,\n\t\t\tmodel: `${this.session.modelId}${this.session.thinkingLevel ? `(${this.session.thinkingLevel})` : \"\"}`,\n\t\t\ttheme: this.theme,\n\t\t\tlocale: this.locale,\n\t\t\tpasteImageShortcut: PASTE_IMAGE_SHORTCUT,\n\t\t});\n\t\tthis.root = new InteractiveLayout({\n\t\t\theader: new InteractiveHeader(readViewState),\n\t\t\tchat: new InteractiveChat(readViewState),\n\t\t\tcomposer: new InteractiveComposer(readViewState),\n\t\t\teditor: this.editor,\n\t\t\tfooter: new InteractiveFooter(readViewState),\n\t\t});\n\t\tthis.tui.addChild(this.root);\n\t\tthis.tui.setFocus(this.editor);\n\t}\n\n\tstart(initialPrompt?: string): void {\n\t\tif (this.started) throw new Error(\"Interactive mode is already started\");\n\t\tthis.started = true;\n\t\tthis.shutdownEmitted = false;\n\t\tvoid this.extensionHost?.emit({ type: \"session_start\", cwd: this.session.allowedRoot });\n\t\tthis.projection.replaceTranscript(this.session.transcript);\n\t\tthis.projection.setUsage(this.session.usage);\n\t\tthis.subscribeToSession();\n\t\tvoid cleanupStaleClipboardImages(this.agentDir, this.session.allowedRoot).catch((cause) => {\n\t\t\tthis.projection.setError(cause instanceof Error ? cause.message : String(cause));\n\t\t\tthis.refresh();\n\t\t});\n\t\ttry {\n\t\t\tthis.tui.start();\n\t\t} catch (cause) {\n\t\t\tthis.started = false;\n\t\t\tthis.unsubscribeSession?.();\n\t\t\tthis.unsubscribeSession = undefined;\n\t\t\tthrow cause;\n\t\t}\n\t\tthis.startSpinnerTimer();\n\t\tif (initialPrompt?.trim()) void this.submit(initialPrompt);\n\t}\n\n\tstop(): void {\n\t\tif (!this.started && !this.unsubscribeSession) return;\n\t\tthis.started = false;\n\t\tthis.activeAbort?.abort();\n\t\tthis.activeAbort = undefined;\n\t\tthis.stopSpinnerTimer();\n\t\tthis.projection.clearTransientProcess();\n\t\tthis.closeOverlay();\n\t\tthis.closeAutocompleteOverlay();\n\t\tthis.unsubscribeSession?.();\n\t\tthis.unsubscribeSession = undefined;\n\t\tvoid this.cleanupClipboardFiles();\n\t\tthis.tui.stop({ finalLines: this.root.renderTranscript(this.tui.columns) });\n\t\tif (!this.shutdownEmitted) {\n\t\t\tthis.shutdownEmitted = true;\n\t\t\tvoid this.extensionHost?.emit({ type: \"session_shutdown\", reason: \"user\" });\n\t\t}\n\t}\n\n\tprivate exit(): void {\n\t\tthis.stop();\n\t\tthis.onExit?.();\n\t}\n\n\tprivate handleCommand(data: string): boolean {\n\t\tif (matchesKey(data, Key.alt(\"s\"))) {\n\t\t\tvoid this.submitSteering(this.editor.getValue());\n\t\t\treturn true;\n\t\t}\n\t\tif (data === \"\\x1b[Z\") {\n\t\t\ttry {\n\t\t\t\tconst level = this.session.cycleThinkingLevel();\n\t\t\t\tthis.projection.setStatus(level ? `thinking=${level}` : \"Current model does not support thinking levels.\");\n\t\t\t\tif (level) {\n\t\t\t\t\tvoid saveGlobalThinkingLevel(this.agentDir, this.session.providerId, this.session.modelId, level).catch(\n\t\t\t\t\t\t(cause) => {\n\t\t\t\t\t\t\tthis.projection.setError(cause instanceof Error ? cause.message : String(cause));\n\t\t\t\t\t\t\tthis.refresh();\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} catch (cause) {\n\t\t\t\tthis.projection.setError(cause instanceof Error ? cause.message : String(cause));\n\t\t\t}\n\t\t\tthis.refresh();\n\t\t\treturn true;\n\t\t}\n\t\tif (data === \"\\x14\") {\n\t\t\tthis.openThemeSelector();\n\t\t\treturn true;\n\t\t}\n\t\tif (data === \"\\x13\") {\n\t\t\tthis.openSettingsSelector();\n\t\t\treturn true;\n\t\t}\n\t\tif (data === \"\\x0f\") {\n\t\t\tthis.openModelSelector();\n\t\t\treturn true;\n\t\t}\n\t\tif (data === \"\\x0c\") {\n\t\t\tthis.openSessionSelector();\n\t\t\treturn true;\n\t\t}\n\t\tif (data === \"\\x12\" && this.lastFailedPrompt && !this.promptInFlight) {\n\t\t\tvoid this.submit(this.lastFailedPrompt, true);\n\t\t\treturn true;\n\t\t}\n\t\tif (matchesKey(data, PASTE_IMAGE_KEY)) {\n\t\t\tvoid this.attachClipboardImage();\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tprivate async attachClipboardImage(): Promise<void> {\n\t\ttry {\n\t\t\tconst path = await this.readClipboardImagePath(this.clipboardDirectory);\n\t\t\tif (!path) {\n\t\t\t\tthis.projection.setStatus(\n\t\t\t\t\tthis.locale === \"zh-CN\" ? \"剪贴板中没有受支持的图片。\" : \"Clipboard has no supported image.\",\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tthis.editor.insertTextAtCursor(path);\n\t\t\t\tif (isClipboardImagePath(path, this.clipboardDirectory)) this.clipboardFiles.add(path);\n\t\t\t}\n\t\t} catch (cause) {\n\t\t\tthis.projection.setError(cause instanceof Error ? cause.message : String(cause));\n\t\t}\n\t\tthis.refresh();\n\t}\n\n\tprivate openThemeSelector(): void {\n\t\tconst t = (key: string) => translate(this.locale, key);\n\t\tconst list = new SelectList([\n\t\t\t{ value: \"dark\", label: t(\"dark\"), description: t(\"darkTheme\") },\n\t\t\t{ value: \"light\", label: t(\"light\"), description: t(\"lightTheme\") },\n\t\t]);\n\t\tlist.onSelect = (item) => {\n\t\t\tthis.theme = item.value === \"light\" ? \"light\" : \"dark\";\n\t\t\tthis.projection.setStatus(`theme=${this.theme}`);\n\t\t\tthis.closeOverlay();\n\t\t\tthis.refresh();\n\t\t};\n\t\tlist.onCancel = () => this.closeOverlay();\n\t\tthis.showOverlay(list);\n\t}\n\n\tprivate openModelSelector(): void {\n\t\tconst list = new SelectList(\n\t\t\tthis.session.availableModels.map((model) => ({\n\t\t\t\tvalue: model.id,\n\t\t\t\tlabel: model.name,\n\t\t\t\tdescription: `${model.provider} / ${model.id} / context ${model.contextWindow}`,\n\t\t\t})),\n\t\t);\n\t\tlist.onSelect = (item) => {\n\t\t\ttry {\n\t\t\t\tthis.session.setModel(item.value);\n\t\t\t\tthis.projection.setStatus(`model=${item.value}`);\n\t\t\t\tvoid saveGlobalModelSelection(this.agentDir, this.session.providerId, this.session.modelId).catch((cause) => {\n\t\t\t\t\tthis.projection.setError(cause instanceof Error ? cause.message : String(cause));\n\t\t\t\t\tthis.refresh();\n\t\t\t\t});\n\t\t\t\tthis.closeOverlay();\n\t\t\t\tthis.refresh();\n\t\t\t} catch (cause) {\n\t\t\t\tthis.projection.setError(cause instanceof Error ? cause.message : String(cause));\n\t\t\t}\n\t\t};\n\t\tlist.onCancel = () => this.closeOverlay();\n\t\tthis.showOverlay(list);\n\t}\n\n\tprivate openSessionSelector(): void {\n\t\tconst t = (key: string) => translate(this.locale, key);\n\t\tconst list = new SelectList([\n\t\t\t{\n\t\t\t\tvalue: \"__current__\",\n\t\t\t\tlabel: t(\"currentSession\"),\n\t\t\t\tdescription: this.session.sessionFile ?? t(\"inMemorySession\"),\n\t\t\t},\n\t\t\t...this.sessionChoices.map((choice) => ({\n\t\t\t\tvalue: choice.id,\n\t\t\t\tlabel: choice.label,\n\t\t\t\t...(choice.description ? { description: choice.description } : {}),\n\t\t\t})),\n\t\t]);\n\t\tlist.onSelect = (item) => {\n\t\t\tif (item.value === \"__current__\") {\n\t\t\t\tthis.projection.setStatus(\"session=current\");\n\t\t\t\tthis.closeOverlay();\n\t\t\t\tthis.refresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst choice = this.sessionChoices.find((candidate) => candidate.id === item.value);\n\t\t\tif (!choice) return;\n\t\t\tthis.closeOverlay();\n\t\t\tvoid this.switchSession(choice);\n\t\t};\n\t\tlist.onCancel = () => this.closeOverlay();\n\t\tthis.showOverlay(list);\n\t}\n\n\tprivate openTreeSelector(): void {\n\t\tif (this.promptInFlight || this.compactionInFlight || this.sessionSwitching) {\n\t\t\tthis.projection.setError(\n\t\t\t\tthis.locale === \"zh-CN\"\n\t\t\t\t\t? \"提示词运行时不能浏览会话树。\"\n\t\t\t\t\t: \"Cannot browse the session tree while a prompt is running.\",\n\t\t\t);\n\t\t\tthis.refresh();\n\t\t\treturn;\n\t\t}\n\t\tif (this.session.sessionTree.length === 0) {\n\t\t\tthis.projection.setStatus(\n\t\t\t\tthis.locale === \"zh-CN\" ? \"当前会话还没有历史节点。\" : \"The current session has no history nodes.\",\n\t\t\t);\n\t\t\tthis.refresh();\n\t\t\treturn;\n\t\t}\n\t\tconst selector = new TreeSelector({\n\t\t\tnodes: this.session.sessionTree,\n\t\t\tleafId: this.session.sessionLeafId,\n\t\t\tlocale: this.locale,\n\t\t\tonContinue: (entry) => {\n\t\t\t\tthis.closeOverlay();\n\t\t\t\tvoid this.navigateTreeEntry(entry.id);\n\t\t\t},\n\t\t\tonEdit: (entry) => {\n\t\t\t\tif (entry.type !== \"message\" || entry.message.role !== \"user\") {\n\t\t\t\t\tthis.projection.setError(\n\t\t\t\t\t\tthis.locale === \"zh-CN\" ? \"只能编辑历史用户消息。\" : \"Only historical user messages can be edited.\",\n\t\t\t\t\t);\n\t\t\t\t\tthis.refresh();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tthis.closeOverlay();\n\t\t\t\tvoid this.navigateTreeEntry(entry.id);\n\t\t\t},\n\t\t\tonSummarize: (entry) => {\n\t\t\t\tthis.closeOverlay();\n\t\t\t\tvoid this.summarizeTreeBranch(entry.id);\n\t\t\t},\n\t\t\tonCancel: () => this.closeOverlay(),\n\t\t});\n\t\tthis.showOverlay(selector, true, \"80%\");\n\t}\n\n\tprivate async navigateTreeEntry(entryId: string): Promise<boolean> {\n\t\ttry {\n\t\t\tconst result = await this.session.navigateTree(entryId);\n\t\t\tif (!this.started) return false;\n\t\t\tthis.projection.replaceTranscript(this.session.transcript);\n\t\t\tthis.editor.setValue(result.editorText ?? \"\");\n\t\t\tthis.projection.setStatus(\n\t\t\t\tresult.imagesOmitted\n\t\t\t\t\t? this.locale === \"zh-CN\"\n\t\t\t\t\t\t? \"已恢复文本;请重新附加图片。\"\n\t\t\t\t\t\t: \"Text restored; reattach images before sending.\"\n\t\t\t\t\t: `tree=${result.selectedEntryId}`,\n\t\t\t);\n\t\t\treturn true;\n\t\t} catch (cause) {\n\t\t\tthis.projection.setError(cause instanceof Error ? cause.message : String(cause));\n\t\t\treturn false;\n\t\t} finally {\n\t\t\tthis.refresh();\n\t\t}\n\t}\n\n\tprivate async summarizeTreeBranch(entryId: string): Promise<void> {\n\t\tif (this.compactionInFlight || this.promptInFlight) return;\n\t\tthis.compactionInFlight = true;\n\t\tthis.projection.setStatus(this.locale === \"zh-CN\" ? \"正在为分支生成摘要。\" : \"Summarizing selected branch.\");\n\t\tthis.refresh();\n\t\ttry {\n\t\t\tif (!(await this.navigateTreeEntry(entryId))) return;\n\t\t\tawait this.session.compact();\n\t\t\tthis.editor.setValue(\"\");\n\t\t\tthis.projection.replaceTranscript(this.session.transcript);\n\t\t\tthis.projection.setStatus(this.locale === \"zh-CN\" ? \"摘要分支已创建。\" : \"Summary branch created.\");\n\t\t} catch (cause) {\n\t\t\tthis.projection.setError(cause instanceof Error ? cause.message : String(cause));\n\t\t} finally {\n\t\t\tthis.compactionInFlight = false;\n\t\t\tthis.refresh();\n\t\t}\n\t}\n\n\tprivate openSettingsSelector(): void {\n\t\tconst t = (key: string) => translate(this.locale, key);\n\t\tconst list = new SettingsList(\n\t\t\t[\n\t\t\t\t{\n\t\t\t\t\tid: \"compaction\",\n\t\t\t\t\tlabel: t(\"contextCompaction\"),\n\t\t\t\t\tcurrentValue: this.session.compactionEnabled ? t(\"on\") : t(\"off\"),\n\t\t\t\t\tvalues: [t(\"on\"), t(\"off\")],\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"locale\",\n\t\t\t\t\tlabel: t(\"language\"),\n\t\t\t\t\tcurrentValue: this.locale,\n\t\t\t\t\tvalues: [\"en\", \"zh-CN\"],\n\t\t\t\t},\n\t\t\t],\n\t\t\t{ title: t(\"settings\") },\n\t\t);\n\t\tlist.onChange = (id, value) => {\n\t\t\tif (id === \"locale\") {\n\t\t\t\tthis.locale = value === \"zh-CN\" ? \"zh-CN\" : \"en\";\n\t\t\t\tvoid saveGlobalLocale(this.agentDir, this.locale).catch((cause) => {\n\t\t\t\t\tthis.projection.setError(cause instanceof Error ? cause.message : String(cause));\n\t\t\t\t\tthis.refresh();\n\t\t\t\t});\n\t\t\t\tthis.closeOverlay();\n\t\t\t\tthis.openSettingsSelector();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (id !== \"compaction\") return;\n\t\t\ttry {\n\t\t\t\tconst enabled = this.session.setCompactionEnabled(value === t(\"on\"));\n\t\t\t\tlist.updateValue(id, enabled ? t(\"on\") : t(\"off\"));\n\t\t\t\tthis.projection.setStatus(\n\t\t\t\t\tenabled === (value === t(\"on\")) ? `compaction=${enabled ? t(\"on\") : t(\"off\")}` : t(\"compactionUnavailable\"),\n\t\t\t\t);\n\t\t\t} catch (cause) {\n\t\t\t\tlist.updateValue(id, this.session.compactionEnabled ? t(\"on\") : t(\"off\"));\n\t\t\t\tthis.projection.setError(cause instanceof Error ? cause.message : String(cause));\n\t\t\t\tthis.closeOverlay();\n\t\t\t}\n\t\t\tthis.refresh();\n\t\t};\n\t\tlist.onCancel = () => this.closeOverlay();\n\t\tthis.showOverlay(list);\n\t}\n\n\tprivate showOverlay(component: Component, preserveLastLine = false, maxHeight: \"60%\" | \"80%\" = \"60%\"): void {\n\t\tthis.editor.cancelAutocomplete();\n\t\tthis.closeAutocompleteOverlay();\n\t\tthis.closeOverlay();\n\t\tthis.overlay = this.tui.showOverlay(component, {\n\t\t\twidth: \"70%\",\n\t\t\tmaxHeight,\n\t\t\tanchor: \"center\",\n\t\t\tmargin: 1,\n\t\t\tpreserveLastLine,\n\t\t});\n\t}\n\n\tprivate closeOverlay(): void {\n\t\tthis.overlay?.hide();\n\t\tthis.overlay = undefined;\n\t}\n\n\tprivate updateAutocompleteOverlay(): void {\n\t\tthis.closeAutocompleteOverlay();\n\t\tif (!this.editor.isShowingAutocomplete()) {\n\t\t\tthis.refresh();\n\t\t\treturn;\n\t\t}\n\t\tconst menu = new AutocompleteMenu(() => ({\n\t\t\titems: this.editor.getAutocompleteItems(),\n\t\t\tindex: this.editor.getAutocompleteIndex(),\n\t\t}));\n\t\tconst editorBounds = this.root.getEditorBounds(this.tui.columns);\n\t\tthis.autocompleteOverlay = this.tui.showOverlay(menu, {\n\t\t\twidth: \"55%\",\n\t\t\tmaxHeight: 9,\n\t\t\tanchor: \"bottom-left\",\n\t\t\tplacement: {\n\t\t\t\tanchorRow: editorBounds.end - 1,\n\t\t\t\tavoidStartRow: editorBounds.start,\n\t\t\t\tpreferred: \"below\",\n\t\t\t},\n\t\t\tmargin: 1,\n\t\t\tpreserveLastLine: true,\n\t\t\tnonCapturing: true,\n\t\t});\n\t\tthis.refresh();\n\t}\n\n\tprivate closeAutocompleteOverlay(): void {\n\t\tthis.autocompleteOverlay?.hide();\n\t\tthis.autocompleteOverlay = undefined;\n\t}\n\n\tprivate refresh(): void {\n\t\tthis.root.invalidate();\n\t\tthis.tui.requestRender();\n\t}\n\n\tprivate startSpinnerTimer(): void {\n\t\tthis.stopSpinnerTimer();\n\t\tthis.spinnerTimer = setInterval(() => {\n\t\t\tif (this.projection.advanceSpinner()) this.refresh();\n\t\t}, 120);\n\t\tthis.spinnerTimer.unref?.();\n\t}\n\n\tprivate stopSpinnerTimer(): void {\n\t\tif (this.spinnerTimer) clearInterval(this.spinnerTimer);\n\t\tthis.spinnerTimer = undefined;\n\t}\n\n\tprivate subscribeToSession(): void {\n\t\tthis.unsubscribeSession?.();\n\t\tthis.unsubscribeSession = this.session.subscribeSession((event) => {\n\t\t\tif (!this.started) return;\n\t\t\tif (event.type === \"tree_navigated\") {\n\t\t\t\tthis.projection.replaceTranscript(this.session.transcript);\n\t\t\t\tthis.refresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (event.type === \"queue_update\") {\n\t\t\t\tthis.steeringPrompts = [...event.steering];\n\t\t\t\tthis.refreshQueue();\n\t\t\t\tthis.refresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.projection.apply(event);\n\t\t\tthis.refresh();\n\t\t});\n\t}\n\n\tprivate async switchSession(choice: InteractiveSessionChoice): Promise<void> {\n\t\tif (this.promptInFlight || this.sessionSwitching) {\n\t\t\tthis.projection.setError(\n\t\t\t\tthis.locale === \"zh-CN\" ? \"提示词运行时不能切换会话。\" : \"Cannot switch sessions while a prompt is running.\",\n\t\t\t);\n\t\t\tthis.refresh();\n\t\t\treturn;\n\t\t}\n\t\tthis.sessionSwitching = true;\n\t\tthis.projection.setStatus(`opening session=${choice.id}`);\n\t\tthis.refresh();\n\t\ttry {\n\t\t\tconst next = await choice.open();\n\t\t\tif (!this.started) return;\n\t\t\tthis.unsubscribeSession?.();\n\t\t\tthis.session = next;\n\t\t\tthis.projection.configureFilePreview(next.allowedRoot, () => this.refresh());\n\t\t\tthis.clipboardDirectory = clipboardImageDirectory(this.agentDir, next.allowedRoot);\n\t\t\tvoid cleanupStaleClipboardImages(this.agentDir, next.allowedRoot);\n\t\t\tthis.queuedPrompts = [];\n\t\t\tthis.steeringPrompts = [];\n\t\t\tthis.refreshQueue();\n\t\t\tthis.projection.replaceTranscript(next.transcript);\n\t\t\tthis.projection.setUsage(next.usage);\n\t\t\tthis.projection.setStatus(`session=${choice.id}`);\n\t\t\tthis.subscribeToSession();\n\t\t} catch (cause) {\n\t\t\tthis.projection.setError(cause instanceof Error ? cause.message : String(cause));\n\t\t} finally {\n\t\t\tthis.sessionSwitching = false;\n\t\t}\n\t\tthis.refresh();\n\t}\n\n\tprivate async submit(text: string, retry = false): Promise<void> {\n\t\tconst prompt = text.trim();\n\t\tif (prompt.length === 0 || !this.started) return;\n\t\tconst steeringArgument = steeringCommandArgument(prompt);\n\t\tif (steeringArgument !== undefined) {\n\t\t\tawait this.submitSteering(steeringArgument);\n\t\t\treturn;\n\t\t}\n\t\tif (prompt.startsWith(\"/\") && !this.isLoadedSkillCommand(prompt)) {\n\t\t\tthis.editor.setValue(\"\");\n\t\t\tthis.handleSlashCommand(prompt);\n\t\t\treturn;\n\t\t}\n\t\tif (this.sessionSwitching) {\n\t\t\tthis.projection.setError(\n\t\t\t\tthis.locale === \"zh-CN\"\n\t\t\t\t\t? \"会话正在打开,请等待后再提交提示词。\"\n\t\t\t\t\t: \"A session is opening; wait before submitting a prompt.\",\n\t\t\t);\n\t\t\tthis.refresh();\n\t\t\treturn;\n\t\t}\n\t\tif (this.compactionInFlight) {\n\t\t\tthis.projection.setError(\n\t\t\t\tthis.locale === \"zh-CN\"\n\t\t\t\t\t? \"正在压缩上下文,请等待后再提交提示词。\"\n\t\t\t\t\t: \"A compaction is running; wait before submitting a prompt.\",\n\t\t\t);\n\t\t\tthis.refresh();\n\t\t\treturn;\n\t\t}\n\t\tif (this.promptInFlight) {\n\t\t\tthis.queuedPrompts.push(prompt);\n\t\t\tthis.refreshQueue();\n\t\t\tthis.root.invalidate();\n\t\t\tthis.tui.requestRender();\n\t\t\treturn;\n\t\t}\n\t\tthis.promptInFlight = true;\n\t\tthis.activeAbort = new AbortController();\n\t\tthis.projection.setRetrying(retry);\n\t\ttry {\n\t\t\tconst input = await extractImageAttachments(\n\t\t\t\tnormalizeDroppedImagePrompt(prompt, this.session.allowedRoot),\n\t\t\t\tthis.session.allowedRoot,\n\t\t\t);\n\t\t\tthis.preserveClipboardFiles = true;\n\t\t\tthis.editor.setValue(\"\");\n\t\t\tconst result = await this.session.promptWithImages(input.text, input.images, this.activeAbort.signal);\n\t\t\tif (result.stopReason === \"error\" || result.stopReason === \"aborted\") this.lastFailedPrompt = prompt;\n\t\t\telse {\n\t\t\t\tthis.lastFailedPrompt = undefined;\n\t\t\t\tawait this.cleanupClipboardFiles();\n\t\t\t}\n\t\t} catch (cause) {\n\t\t\tthis.lastFailedPrompt = prompt;\n\t\t\tthis.projection.setError(cause instanceof Error ? cause.message : String(cause));\n\t\t} finally {\n\t\t\tthis.preserveClipboardFiles = false;\n\t\t\tthis.promptInFlight = false;\n\t\t\tthis.activeAbort = undefined;\n\t\t\tthis.projection.setRetrying(false);\n\t\t\tconst next = this.queuedPrompts.shift();\n\t\t\tthis.refreshQueue();\n\t\t\tthis.root.invalidate();\n\t\t\tthis.tui.requestRender();\n\t\t\tif (next && this.started) void this.submit(next);\n\t\t}\n\t}\n\n\tprivate async submitSteering(text: string): Promise<void> {\n\t\tconst prompt = text.trim();\n\t\tif (prompt.length === 0) {\n\t\t\tthis.projection.setError(this.locale === \"zh-CN\" ? \"引导内容不能为空。\" : \"Steering content must not be empty.\");\n\t\t\tthis.refresh();\n\t\t\treturn;\n\t\t}\n\t\tif (this.sessionSwitching) {\n\t\t\tthis.projection.setError(\n\t\t\t\tthis.locale === \"zh-CN\"\n\t\t\t\t\t? \"会话正在打开,请等待后再引导 Agent。\"\n\t\t\t\t\t: \"A session is opening; wait before steering the agent.\",\n\t\t\t);\n\t\t\tthis.refresh();\n\t\t\treturn;\n\t\t}\n\t\tif (this.compactionInFlight) {\n\t\t\tthis.projection.setError(\n\t\t\t\tthis.locale === \"zh-CN\"\n\t\t\t\t\t? \"正在压缩上下文,请等待后再引导 Agent。\"\n\t\t\t\t\t: \"A compaction is running; wait before steering the agent.\",\n\t\t\t);\n\t\t\tthis.refresh();\n\t\t\treturn;\n\t\t}\n\t\tif (!this.promptInFlight) {\n\t\t\tthis.projection.setError(\n\t\t\t\tthis.locale === \"zh-CN\"\n\t\t\t\t\t? \"只能在提示词运行时引导 Agent。\"\n\t\t\t\t\t: \"Steering is only available while a prompt is running.\",\n\t\t\t);\n\t\t\tthis.refresh();\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\tconst input = await extractImageAttachments(\n\t\t\t\tnormalizeDroppedImagePrompt(prompt, this.session.allowedRoot),\n\t\t\t\tthis.session.allowedRoot,\n\t\t\t);\n\t\t\tawait this.session.steerWithImages(input.text, input.images);\n\t\t\tthis.editor.setValue(\"\");\n\t\t} catch (cause) {\n\t\t\tthis.projection.setError(cause instanceof Error ? cause.message : String(cause));\n\t\t}\n\t\tthis.refresh();\n\t}\n\n\tprivate refreshQueue(): void {\n\t\tthis.projection.setQueue([\n\t\t\t...this.steeringPrompts.map((prompt) => `steer: ${prompt}`),\n\t\t\t...this.queuedPrompts.map((prompt) => `queued: ${prompt}`),\n\t\t]);\n\t}\n\n\tprivate async cleanupUnreferencedClipboardFiles(): Promise<void> {\n\t\tconst text = this.editor.getValue();\n\t\tconst files = [...this.clipboardFiles].filter((path) => !text.includes(path));\n\t\tawait Promise.all(files.map((path) => removeClipboardImage(path, this.clipboardDirectory)));\n\t\tfor (const path of files) this.clipboardFiles.delete(path);\n\t}\n\n\tprivate async cleanupClipboardFiles(): Promise<void> {\n\t\tconst files = [...this.clipboardFiles];\n\t\tawait Promise.all(files.map((path) => removeClipboardImage(path, this.clipboardDirectory)));\n\t\tfor (const path of files) this.clipboardFiles.delete(path);\n\t}\n\n\tprivate handleSlashCommand(input: string): void {\n\t\tconst trimmed = input.slice(1).trim();\n\t\tconst [rawCommand = \"\", ...argParts] = trimmed.split(/\\s+/);\n\t\tconst command = rawCommand.toLowerCase();\n\t\tconst args = argParts.join(\" \");\n\t\tswitch (command) {\n\t\t\tcase \"help\":\n\t\t\t\tthis.projection.setStatus(\n\t\t\t\t\t`commands: ${this.listSlashCommands()\n\t\t\t\t\t\t.map((item) => `/${item.name}`)\n\t\t\t\t\t\t.join(\" \")}`,\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\tcase \"clear\":\n\t\t\t\tthis.projection.clearVisibleMessages();\n\t\t\t\tthis.projection.setStatus(translate(this.locale, \"visibleMessagesCleared\"));\n\t\t\t\tbreak;\n\t\t\tcase \"model\":\n\t\t\t\tthis.openModelSelector();\n\t\t\t\treturn;\n\t\t\tcase \"session\":\n\t\t\t\tthis.openSessionSelector();\n\t\t\t\treturn;\n\t\t\tcase \"tree\":\n\t\t\t\tthis.openTreeSelector();\n\t\t\t\treturn;\n\t\t\tcase \"theme\":\n\t\t\t\tthis.openThemeSelector();\n\t\t\t\treturn;\n\t\t\tcase \"settings\":\n\t\t\t\tthis.openSettingsSelector();\n\t\t\t\treturn;\n\t\t\tcase \"login\":\n\t\t\t\tthis.openProviderLogin();\n\t\t\t\treturn;\n\t\t\tcase \"logout\":\n\t\t\t\tvoid this.logoutProvider();\n\t\t\t\treturn;\n\t\t\tcase \"compact\":\n\t\t\t\tvoid this.runManualCompaction();\n\t\t\t\treturn;\n\t\t\tcase \"usage\":\n\t\t\t\tthis.projection.setStatus(this.formatUsage());\n\t\t\t\tbreak;\n\t\t\tcase \"retry\":\n\t\t\t\tif (this.lastFailedPrompt && !this.promptInFlight) void this.submit(this.lastFailedPrompt, true);\n\t\t\t\telse this.projection.setStatus(translate(this.locale, \"nothingToRetry\"));\n\t\t\t\tbreak;\n\t\t\tdefault: {\n\t\t\t\tif (this.extensionHost?.listCommands().some((entry) => entry.name === command)) {\n\t\t\t\t\tvoid this.extensionHost.runCommand(command, args).catch((cause) => {\n\t\t\t\t\t\tthis.projection.setError(cause instanceof Error ? cause.message : String(cause));\n\t\t\t\t\t\tthis.refresh();\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tthis.projection.setError(`Unknown command: /${command}`);\n\t\t\t}\n\t\t}\n\t\tthis.refresh();\n\t}\n\n\tprivate openProviderLogin(): void {\n\t\tif (!this.providerOnboarding) {\n\t\t\tthis.projection.setError(\"Provider login is unavailable in this session.\");\n\t\t\tthis.refresh();\n\t\t\treturn;\n\t\t}\n\t\tif (this.promptInFlight || this.sessionSwitching) {\n\t\t\tthis.projection.setError(\"Cannot change Provider while a prompt is running.\");\n\t\t\tthis.refresh();\n\t\t\treturn;\n\t\t}\n\t\tthis.editor.cancelAutocomplete();\n\t\tthis.closeAutocompleteOverlay();\n\t\tvoid showInteractiveProviderOnboarding({\n\t\t\t...this.providerOnboarding,\n\t\t\tconfiguration: { ...this.providerOnboarding.configuration, locale: this.locale },\n\t\t\ttui: this.tui,\n\t\t})\n\t\t\t.then((runtime) => {\n\t\t\t\tif (!this.started) return;\n\t\t\t\tthis.tui.setFocus(this.editor);\n\t\t\t\tif (!runtime) {\n\t\t\t\t\tthis.refresh();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tthis.session.setRuntime(runtime.provider, runtime.model);\n\t\t\t\tthis.projection.setStatus(`provider=${runtime.provider.id} model=${runtime.model.id}`);\n\t\t\t\tthis.refresh();\n\t\t\t})\n\t\t\t.catch((cause) => {\n\t\t\t\tif (this.started) this.tui.setFocus(this.editor);\n\t\t\t\tthis.projection.setError(cause instanceof Error ? cause.message : String(cause));\n\t\t\t\tthis.refresh();\n\t\t\t});\n\t}\n\n\tprivate async logoutProvider(): Promise<void> {\n\t\tif (!this.providerOnboarding) {\n\t\t\tthis.projection.setError(\"Provider logout is unavailable in this session.\");\n\t\t\tthis.refresh();\n\t\t\treturn;\n\t\t}\n\t\tif (this.promptInFlight || this.sessionSwitching) {\n\t\t\tthis.projection.setError(\"Cannot change Provider while a prompt is running.\");\n\t\t\tthis.refresh();\n\t\t\treturn;\n\t\t}\n\t\tconst providerId = this.session.providerId;\n\t\ttry {\n\t\t\tconst removed = await removeGlobalProviderApiKey(this.providerOnboarding.agentDir, providerId);\n\t\t\tif (!removed) {\n\t\t\t\tthis.projection.setStatus(`no global API key stored for provider=${providerId}`);\n\t\t\t\tthis.refresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.projection.setStatus(\n\t\t\t\t`global API key removed for provider=${providerId}; it remains active until this session ends`,\n\t\t\t);\n\t\t} catch (cause) {\n\t\t\tthis.projection.setError(cause instanceof Error ? cause.message : String(cause));\n\t\t}\n\t\tthis.refresh();\n\t}\n\n\tprivate listSlashCommands(): readonly SlashCommand[] {\n\t\tconst skills = this.session.availableSkills.map((skill) => ({\n\t\t\tname: `skill:${skill.name}`,\n\t\t\tdescription: skill.description,\n\t\t}));\n\t\treturn [...builtinSlashCommands(this.locale), ...(this.extensionHost?.listCommands() ?? []), ...skills];\n\t}\n\n\tprivate isLoadedSkillCommand(input: string): boolean {\n\t\tconst name = /^\\/skill:([a-z0-9]+(?:-[a-z0-9]+)*)(?:\\s|$)/.exec(input)?.[1];\n\t\treturn name !== undefined && this.session.availableSkills.some((skill) => skill.name === name);\n\t}\n\n\tprivate formatUsage(): string {\n\t\tconst usage = this.session.usage;\n\t\tif (this.locale === \"zh-CN\") {\n\t\t\treturn `用量:请求=${usage.requestCount} 输入=${usage.inputTokens} 输出=${usage.outputTokens} 总计=${usage.totalTokens} 费用=$${usage.cost.total.toFixed(4)} 上下文=${usage.estimatedContextTokens}/${usage.contextWindow}`;\n\t\t}\n\t\treturn `usage: requests=${usage.requestCount} input=${usage.inputTokens} output=${usage.outputTokens} total=${usage.totalTokens} cost=$${usage.cost.total.toFixed(4)} context=${usage.estimatedContextTokens}/${usage.contextWindow}`;\n\t}\n\n\tprivate async runManualCompaction(): Promise<void> {\n\t\tif (this.promptInFlight || this.compactionInFlight) {\n\t\t\tthis.projection.setError(\n\t\t\t\tthis.locale === \"zh-CN\" ? \"提示词运行时不能压缩上下文。\" : \"Cannot compact while a prompt is running.\",\n\t\t\t);\n\t\t\tthis.refresh();\n\t\t\treturn;\n\t\t}\n\t\tthis.compactionInFlight = true;\n\t\tthis.projection.setStatus(translate(this.locale, \"manualCompactionStarting\"));\n\t\tthis.refresh();\n\t\ttry {\n\t\t\tawait this.session.compact();\n\t\t\tthis.projection.setStatus(translate(this.locale, \"manualCompactionComplete\"));\n\t\t} catch (cause) {\n\t\t\tthis.projection.setError(cause instanceof Error ? cause.message : String(cause));\n\t\t} finally {\n\t\t\tthis.compactionInFlight = false;\n\t\t\tthis.refresh();\n\t\t}\n\t}\n}\n"]}
1
+ {"version":3,"file":"interactive.js","sourceRoot":"","sources":["../../src/modes/interactive.ts"],"names":[],"mappings":"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","sourcesContent":["import { statSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { extname, join, resolve } from \"node:path\";\nimport type { CommandRegistry, InteractiveContextService } from \"@di-code/builtins\";\nimport {\n\ttype AutocompleteProvider,\n\tCombinedAutocompleteProvider,\n\ttype Component,\n\tEditor,\n\tKey,\n\tmatchesKey,\n\ttype OverlayHandle,\n\tSelectList,\n\tSettingsList,\n\ttype SlashCommand,\n\ttype TUI,\n} from \"@di-code/tui\";\nimport {\n\tcleanupStaleClipboardImages,\n\tclipboardImageDirectory,\n\tisClipboardImagePath,\n\treadClipboardImagePath,\n\tremoveClipboardImage,\n} from \"../core/clipboard-image.ts\";\nimport { extractImageAttachments } from \"../core/image-input.ts\";\nimport type { AgentSession, AgentSessionEvent } from \"../core/session.ts\";\nimport { DEFAULT_LOCALE, type Locale, translate } from \"../i18n.ts\";\nimport {\n\ttype InteractiveProviderOnboardingOptions,\n\tshowInteractiveProviderOnboarding,\n} from \"../provider-onboarding.ts\";\nimport type { SessionHostUi } from \"../runtime/session-host.ts\";\nimport {\n\tremoveGlobalProviderApiKey,\n\tsaveGlobalLocale,\n\tsaveGlobalModelSelection,\n\tsaveGlobalThinkingLevel,\n} from \"../startup.ts\";\nimport {\n\tAutocompleteMenu,\n\tInteractiveChat,\n\tInteractiveComposer,\n\tInteractiveFooter,\n\tInteractiveHeader,\n\ttype InteractiveViewState,\n} from \"./interactive-components.ts\";\nimport { InteractiveLayout } from \"./interactive-layout.ts\";\nimport { InteractiveProjection } from \"./interactive-state.ts\";\nimport { TreeSelector } from \"./tree-selector.ts\";\n\nexport type { AgentSessionEvent };\nexport type { InteractiveMessage, InteractiveProcessItem, InteractiveState } from \"./interactive-state.ts\";\nexport { InteractiveProjection } from \"./interactive-state.ts\";\n\nconst IMAGE_EXTENSIONS = new Set([\".gif\", \".jpeg\", \".jpg\", \".png\", \".webp\"]);\nconst PASTE_IMAGE_KEY = process.platform === \"win32\" ? Key.alt(\"v\") : Key.ctrl(\"v\");\nconst PASTE_IMAGE_SHORTCUT = process.platform === \"win32\" ? \"Alt+V\" : \"Ctrl+V\";\n\nfunction builtinSlashCommands(locale: Locale): readonly SlashCommand[] {\n\tconst t = (key: string) => translate(locale, key);\n\treturn [\n\t\t{ name: \"help\", description: t(\"showInteractiveCommands\") },\n\t\t{ name: \"clear\", description: t(\"clearVisibleMessages\") },\n\t\t{ name: \"model\", description: t(\"openModelSelector\") },\n\t\t{ name: \"session\", description: t(\"openSessionSelector\") },\n\t\t{ name: \"tree\", description: t(\"openTreeSelector\") },\n\t\t{ name: \"theme\", description: t(\"openThemeSelector\") },\n\t\t{ name: \"settings\", description: t(\"openSettingsSelector\") },\n\t\t{ name: \"login\", description: t(\"chooseProvider\") },\n\t\t{ name: \"logout\", description: t(\"removeProviderKey\") },\n\t\t{ name: \"compact\", description: t(\"compactContext\") },\n\t\t{ name: \"usage\", description: t(\"showUsage\") },\n\t\t{ name: \"retry\", description: t(\"retryPrompt\") },\n\t\t{ name: \"steer\", description: t(\"steerAgent\") },\n\t];\n}\n\nfunction asImageAttachmentReference(pasted: string, cwd: string): string {\n\tif (pasted.includes(\"\\n\")) return pasted;\n\tconst candidate = pasted.trim().replace(/^(?:\"([\\s\\S]*)\"|'([\\s\\S]*)')$/, \"$1$2\");\n\tif (!candidate || !IMAGE_EXTENSIONS.has(extname(candidate).toLowerCase())) return pasted;\n\ttry {\n\t\tif (!statSync(resolve(cwd, candidate)).isFile()) return pasted;\n\t} catch {\n\t\treturn pasted;\n\t}\n\treturn `@\"${candidate.replaceAll('\"', '\\\\\"')}\" `;\n}\n\nfunction normalizeDroppedImagePrompt(prompt: string, cwd: string): string {\n\tconst normalized = asImageAttachmentReference(prompt, cwd);\n\tif (normalized !== prompt) return normalized;\n\tconst prefix = /^((?:(?:[A-Za-z]:[\\\\/])|(?:\\.\\.?[\\\\/])|\\/)[\\s\\S]*?\\.(?:gif|jpe?g|png|webp))([\\s\\S]*)$/i.exec(prompt);\n\tif (!prefix) return prompt;\n\tconst imageReference = asImageAttachmentReference(prefix[1] ?? \"\", cwd);\n\treturn imageReference === prefix[1]\n\t\t? prompt\n\t\t: `${imageReference}${normalizeDroppedImagePrompt(prefix[2] ?? \"\", cwd)}`;\n}\n\nfunction steeringCommandArgument(prompt: string): string | undefined {\n\tconst match = /^\\/steer(?:\\s+([\\s\\S]*))?$/i.exec(prompt);\n\treturn match ? (match[1] ?? \"\").trim() : undefined;\n}\n\nexport interface InteractiveModeOptions {\n\treadonly session: InteractiveSessionHandle;\n\treadonly tui: TUI;\n\treadonly onExit?: () => void;\n\treadonly sessions?: readonly InteractiveSessionChoice[];\n\treadonly providerOnboarding?: Omit<InteractiveProviderOnboardingOptions, \"tui\">;\n\t/** User data directory that owns clipboard image temporaries. */\n\treadonly agentDir?: string;\n\treadonly readClipboardImagePath?: (directory?: string) => Promise<string | null>;\n\treadonly locale?: Locale;\n\t/** Command contributions are resolved through the composition registry. */\n\treadonly commandRegistry?: CommandRegistry;\n\t/** Session controls and preferences are supplied by the active Context. */\n\treadonly context?: InteractiveContextService;\n}\n\nexport interface InteractiveSessionChoice {\n\treadonly id: string;\n\treadonly label: string;\n\treadonly description?: string;\n\topen(): InteractiveSessionHandle | Promise<InteractiveSessionHandle>;\n}\n\nexport type InteractiveSessionHandle = AgentSession | SessionHostUi;\n\ninterface ContextSessionChoice {\n\treadonly id: string;\n\treadonly label: string;\n\treadonly description?: string;\n\treadonly open: () => unknown | Promise<unknown>;\n}\n\nfunction isContextSessionChoice(value: unknown): value is ContextSessionChoice {\n\treturn (\n\t\ttypeof value === \"object\" &&\n\t\tvalue !== null &&\n\t\t\"id\" in value &&\n\t\ttypeof value.id === \"string\" &&\n\t\t\"label\" in value &&\n\t\ttypeof value.label === \"string\" &&\n\t\t\"open\" in value &&\n\t\ttypeof value.open === \"function\"\n\t);\n}\n\nexport class InteractiveMode {\n\tprivate readonly projection = new InteractiveProjection();\n\tprivate readonly root: InteractiveLayout;\n\tprivate readonly editor: Editor;\n\tprivate session: InteractiveSessionHandle;\n\tprivate readonly tui: TUI;\n\tprivate readonly sessionChoices: readonly InteractiveSessionChoice[];\n\tprivate readonly providerOnboarding?: Omit<InteractiveProviderOnboardingOptions, \"tui\">;\n\tprivate readonly agentDir: string;\n\tprivate readonly readClipboardImagePath: (directory?: string) => Promise<string | null>;\n\tprivate clipboardDirectory: string;\n\tprivate readonly clipboardFiles = new Set<string>();\n\tprivate unsubscribeSession?: () => void;\n\tprivate sessionSwitching = false;\n\tprivate promptInFlight = false;\n\tprivate compactionInFlight = false;\n\tprivate activeAbort?: AbortController;\n\tprivate started = false;\n\tprivate lastFailedPrompt?: string;\n\tprivate queuedPrompts: string[] = [];\n\tprivate steeringPrompts: string[] = [];\n\tprivate readonly onExit?: () => void;\n\tprivate theme: \"dark\" | \"light\" = \"dark\";\n\tprivate overlay?: OverlayHandle;\n\tprivate autocompleteOverlay?: OverlayHandle;\n\tprivate spinnerTimer?: ReturnType<typeof setInterval>;\n\tprivate preserveClipboardFiles = false;\n\tprivate locale: Locale;\n\tprivate readonly commandRegistry?: CommandRegistry;\n\tprivate readonly context?: InteractiveContextService;\n\n\tconstructor(options: InteractiveModeOptions) {\n\t\tthis.session = options.session;\n\t\tthis.projection.configureFilePreview(this.session.allowedRoot, () => this.refresh());\n\t\tthis.tui = options.tui;\n\t\tthis.onExit = options.onExit;\n\t\tconst contextChoices = (options.context?.sessionChoices() ?? []).filter(isContextSessionChoice).map((choice) => ({\n\t\t\t...choice,\n\t\t\topen: async () => {\n\t\t\t\tconst session = await choice.open();\n\t\t\t\tif (typeof session !== \"object\" || session === null) throw new Error(`Session choice ${choice.id} is invalid`);\n\t\t\t\treturn session as InteractiveSessionHandle;\n\t\t\t},\n\t\t}));\n\t\tthis.sessionChoices = [...(options.sessions ?? contextChoices)];\n\t\tthis.providerOnboarding = options.providerOnboarding;\n\t\tthis.agentDir = resolve(options.agentDir ?? join(homedir(), \".di-code\"));\n\t\tthis.locale = options.locale ?? DEFAULT_LOCALE;\n\t\tthis.commandRegistry = options.commandRegistry;\n\t\tthis.context = options.context;\n\t\tif (this.context?.theme() === \"light\") this.theme = \"light\";\n\t\tthis.readClipboardImagePath = options.readClipboardImagePath ?? readClipboardImagePath;\n\t\tthis.clipboardDirectory = clipboardImageDirectory(this.agentDir, this.session.allowedRoot);\n\t\tconst autocomplete: AutocompleteProvider = {\n\t\t\tgetSuggestions: (context, autocompleteOptions) =>\n\t\t\t\tnew CombinedAutocompleteProvider(this.listSlashCommands(), this.session.allowedRoot).getSuggestions(\n\t\t\t\t\tcontext,\n\t\t\t\t\tautocompleteOptions,\n\t\t\t\t),\n\t\t\tapplyCompletion: (context, item, prefix) =>\n\t\t\t\tnew CombinedAutocompleteProvider(this.listSlashCommands(), this.session.allowedRoot).applyCompletion(\n\t\t\t\t\tcontext,\n\t\t\t\t\titem,\n\t\t\t\t\tprefix,\n\t\t\t\t),\n\t\t};\n\t\tthis.editor = new Editor({\n\t\t\tmaxHeight: 3,\n\t\t\tautocomplete,\n\t\t\tsubmitAutocomplete: (context) => /^\\/[^\\s/]*$/.test(context.text.slice(0, context.cursor)),\n\t\t});\n\t\tthis.editor.onSubmit = (text) => void this.submit(text);\n\t\tthis.editor.onEscape = () => {\n\t\t\tif (!this.activeAbort) {\n\t\t\t\tthis.context?.cancel();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.projection.setStatus(translate(this.locale, \"cancelled\"));\n\t\t\tthis.context?.cancel();\n\t\t\tthis.activeAbort.abort();\n\t\t\tthis.refresh();\n\t\t};\n\t\tthis.editor.onCommand = (data) => this.handleCommand(data);\n\t\tthis.editor.onInterrupt = () => this.exit();\n\t\tthis.editor.onChange = () => {\n\t\t\tif (!this.preserveClipboardFiles) {\n\t\t\t\tvoid this.cleanupUnreferencedClipboardFiles().catch((cause) => {\n\t\t\t\t\tthis.projection.setError(cause instanceof Error ? cause.message : String(cause));\n\t\t\t\t\tthis.refresh();\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\t\tthis.editor.onAutocompleteChange = () => this.updateAutocompleteOverlay();\n\t\tconst readViewState = (): InteractiveViewState => ({\n\t\t\t...this.projection.state,\n\t\t\tmodel: `${this.session.modelId}${this.session.thinkingLevel ? `(${this.session.thinkingLevel})` : \"\"}`,\n\t\t\ttheme: this.theme,\n\t\t\tlocale: this.locale,\n\t\t\tpasteImageShortcut: PASTE_IMAGE_SHORTCUT,\n\t\t});\n\t\tthis.root = new InteractiveLayout({\n\t\t\theader: new InteractiveHeader(readViewState),\n\t\t\tchat: new InteractiveChat(readViewState),\n\t\t\tcomposer: new InteractiveComposer(readViewState),\n\t\t\teditor: this.editor,\n\t\t\tfooter: new InteractiveFooter(readViewState),\n\t\t});\n\t\tthis.tui.addChild(this.root);\n\t\tthis.tui.setFocus(this.editor);\n\t}\n\n\tstart(initialPrompt?: string): void {\n\t\tif (this.started) throw new Error(\"Interactive mode is already started\");\n\t\tthis.started = true;\n\t\tthis.projection.replaceTranscript(this.session.transcript);\n\t\tthis.projection.setUsage(this.session.usage);\n\t\tthis.subscribeToSession();\n\t\tvoid cleanupStaleClipboardImages(this.agentDir, this.session.allowedRoot).catch((cause) => {\n\t\t\tthis.projection.setError(cause instanceof Error ? cause.message : String(cause));\n\t\t\tthis.refresh();\n\t\t});\n\t\ttry {\n\t\t\tthis.tui.start();\n\t\t} catch (cause) {\n\t\t\tthis.started = false;\n\t\t\tthis.unsubscribeSession?.();\n\t\t\tthis.unsubscribeSession = undefined;\n\t\t\tthrow cause;\n\t\t}\n\t\tthis.startSpinnerTimer();\n\t\tif (initialPrompt?.trim()) void this.submit(initialPrompt);\n\t}\n\n\tstop(): void {\n\t\tif (!this.started && !this.unsubscribeSession) return;\n\t\tthis.started = false;\n\t\tthis.activeAbort?.abort();\n\t\tthis.activeAbort = undefined;\n\t\tthis.stopSpinnerTimer();\n\t\tthis.projection.clearTransientProcess();\n\t\tthis.closeOverlay();\n\t\tthis.closeAutocompleteOverlay();\n\t\tthis.unsubscribeSession?.();\n\t\tthis.unsubscribeSession = undefined;\n\t\tvoid this.cleanupClipboardFiles();\n\t\tthis.tui.stop({ finalLines: this.root.renderTranscript(this.tui.columns) });\n\t}\n\n\t/** Cancels the active prompt without changing Session history. */\n\tcancelActivePrompt(): void {\n\t\tthis.activeAbort?.abort();\n\t}\n\n\t/** Re-submits the last failed prompt when the mode is idle. */\n\tretryLastPrompt(): void {\n\t\tif (this.lastFailedPrompt && !this.promptInFlight) void this.submit(this.lastFailedPrompt, true);\n\t}\n\n\tprivate exit(): void {\n\t\tthis.stop();\n\t\tthis.onExit?.();\n\t}\n\n\tprivate handleCommand(data: string): boolean {\n\t\tthis.context?.keybindings();\n\t\tif (matchesKey(data, Key.alt(\"s\"))) {\n\t\t\tvoid this.submitSteering(this.editor.getValue());\n\t\t\treturn true;\n\t\t}\n\t\tif (data === \"\\x1b[Z\") {\n\t\t\ttry {\n\t\t\t\tconst level = this.session.cycleThinkingLevel();\n\t\t\t\tthis.projection.setStatus(level ? `thinking=${level}` : \"Current model does not support thinking levels.\");\n\t\t\t\tif (level) {\n\t\t\t\t\tvoid saveGlobalThinkingLevel(this.agentDir, this.session.providerId, this.session.modelId, level).catch(\n\t\t\t\t\t\t(cause) => {\n\t\t\t\t\t\t\tthis.projection.setError(cause instanceof Error ? cause.message : String(cause));\n\t\t\t\t\t\t\tthis.refresh();\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} catch (cause) {\n\t\t\t\tthis.projection.setError(cause instanceof Error ? cause.message : String(cause));\n\t\t\t}\n\t\t\tthis.refresh();\n\t\t\treturn true;\n\t\t}\n\t\tif (data === \"\\x14\") {\n\t\t\tthis.openThemeSelector();\n\t\t\treturn true;\n\t\t}\n\t\tif (data === \"\\x13\") {\n\t\t\tthis.openSettingsSelector();\n\t\t\treturn true;\n\t\t}\n\t\tif (data === \"\\x0f\") {\n\t\t\tthis.openModelSelector();\n\t\t\treturn true;\n\t\t}\n\t\tif (data === \"\\x0c\") {\n\t\t\tthis.openSessionSelector();\n\t\t\treturn true;\n\t\t}\n\t\tif (data === \"\\x12\" && this.lastFailedPrompt && !this.promptInFlight) {\n\t\t\tvoid this.submit(this.lastFailedPrompt, true);\n\t\t\treturn true;\n\t\t}\n\t\tif (matchesKey(data, PASTE_IMAGE_KEY)) {\n\t\t\tvoid this.attachClipboardImage();\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tprivate async attachClipboardImage(): Promise<void> {\n\t\ttry {\n\t\t\tconst path = await this.readClipboardImagePath(this.clipboardDirectory);\n\t\t\tif (!path) {\n\t\t\t\tthis.projection.setStatus(\n\t\t\t\t\tthis.locale === \"zh-CN\" ? \"剪贴板中没有受支持的图片。\" : \"Clipboard has no supported image.\",\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tthis.editor.insertTextAtCursor(path);\n\t\t\t\tif (isClipboardImagePath(path, this.clipboardDirectory)) this.clipboardFiles.add(path);\n\t\t\t}\n\t\t} catch (cause) {\n\t\t\tthis.projection.setError(cause instanceof Error ? cause.message : String(cause));\n\t\t}\n\t\tthis.refresh();\n\t}\n\n\tprivate openThemeSelector(): void {\n\t\tconst t = (key: string) => translate(this.locale, key);\n\t\tconst list = new SelectList([\n\t\t\t{ value: \"dark\", label: t(\"dark\"), description: t(\"darkTheme\") },\n\t\t\t{ value: \"light\", label: t(\"light\"), description: t(\"lightTheme\") },\n\t\t]);\n\t\tlist.onSelect = (item) => {\n\t\t\tthis.theme = item.value === \"light\" ? \"light\" : \"dark\";\n\t\t\tthis.context?.setTheme(this.theme);\n\t\t\tthis.projection.setStatus(`theme=${this.theme}`);\n\t\t\tthis.closeOverlay();\n\t\t\tthis.refresh();\n\t\t};\n\t\tlist.onCancel = () => this.closeOverlay();\n\t\tthis.showOverlay(list);\n\t}\n\n\tprivate openModelSelector(): void {\n\t\tconst list = new SelectList(\n\t\t\tthis.session.availableModels.map((model) => ({\n\t\t\t\tvalue: model.id,\n\t\t\t\tlabel: model.name,\n\t\t\t\tdescription: `${model.provider} / ${model.id} / context ${model.contextWindow}`,\n\t\t\t})),\n\t\t);\n\t\tlist.onSelect = (item) => {\n\t\t\ttry {\n\t\t\t\tthis.session.setModel(item.value);\n\t\t\t\tthis.projection.setStatus(`model=${item.value}`);\n\t\t\t\tvoid saveGlobalModelSelection(this.agentDir, this.session.providerId, this.session.modelId).catch((cause) => {\n\t\t\t\t\tthis.projection.setError(cause instanceof Error ? cause.message : String(cause));\n\t\t\t\t\tthis.refresh();\n\t\t\t\t});\n\t\t\t\tthis.closeOverlay();\n\t\t\t\tthis.refresh();\n\t\t\t} catch (cause) {\n\t\t\t\tthis.projection.setError(cause instanceof Error ? cause.message : String(cause));\n\t\t\t}\n\t\t};\n\t\tlist.onCancel = () => this.closeOverlay();\n\t\tthis.showOverlay(list);\n\t}\n\n\tprivate openSessionSelector(): void {\n\t\tconst t = (key: string) => translate(this.locale, key);\n\t\tconst list = new SelectList([\n\t\t\t{\n\t\t\t\tvalue: \"__current__\",\n\t\t\t\tlabel: t(\"currentSession\"),\n\t\t\t\tdescription: this.session.sessionFile ?? t(\"inMemorySession\"),\n\t\t\t},\n\t\t\t...this.sessionChoices.map((choice) => ({\n\t\t\t\tvalue: choice.id,\n\t\t\t\tlabel: choice.label,\n\t\t\t\t...(choice.description ? { description: choice.description } : {}),\n\t\t\t})),\n\t\t]);\n\t\tlist.onSelect = (item) => {\n\t\t\tif (item.value === \"__current__\") {\n\t\t\t\tthis.projection.setStatus(\"session=current\");\n\t\t\t\tthis.closeOverlay();\n\t\t\t\tthis.refresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst choice = this.sessionChoices.find((candidate) => candidate.id === item.value);\n\t\t\tif (!choice) return;\n\t\t\tthis.closeOverlay();\n\t\t\tvoid this.switchSession(choice);\n\t\t};\n\t\tlist.onCancel = () => this.closeOverlay();\n\t\tthis.showOverlay(list);\n\t}\n\n\tprivate openTreeSelector(): void {\n\t\tif (this.promptInFlight || this.compactionInFlight || this.sessionSwitching) {\n\t\t\tthis.projection.setError(\n\t\t\t\tthis.locale === \"zh-CN\"\n\t\t\t\t\t? \"提示词运行时不能浏览会话树。\"\n\t\t\t\t\t: \"Cannot browse the session tree while a prompt is running.\",\n\t\t\t);\n\t\t\tthis.refresh();\n\t\t\treturn;\n\t\t}\n\t\tif (this.session.sessionTree.length === 0) {\n\t\t\tthis.projection.setStatus(\n\t\t\t\tthis.locale === \"zh-CN\" ? \"当前会话还没有历史节点。\" : \"The current session has no history nodes.\",\n\t\t\t);\n\t\t\tthis.refresh();\n\t\t\treturn;\n\t\t}\n\t\tconst selector = new TreeSelector({\n\t\t\tnodes: this.session.sessionTree,\n\t\t\tleafId: this.session.sessionLeafId,\n\t\t\tlocale: this.locale,\n\t\t\tonContinue: (entry) => {\n\t\t\t\tthis.closeOverlay();\n\t\t\t\tvoid this.navigateTreeEntry(entry.id);\n\t\t\t},\n\t\t\tonEdit: (entry) => {\n\t\t\t\tif (entry.type !== \"message\" || entry.message.role !== \"user\") {\n\t\t\t\t\tthis.projection.setError(\n\t\t\t\t\t\tthis.locale === \"zh-CN\" ? \"只能编辑历史用户消息。\" : \"Only historical user messages can be edited.\",\n\t\t\t\t\t);\n\t\t\t\t\tthis.refresh();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tthis.closeOverlay();\n\t\t\t\tvoid this.navigateTreeEntry(entry.id);\n\t\t\t},\n\t\t\tonSummarize: (entry) => {\n\t\t\t\tthis.closeOverlay();\n\t\t\t\tvoid this.summarizeTreeBranch(entry.id);\n\t\t\t},\n\t\t\tonCancel: () => this.closeOverlay(),\n\t\t});\n\t\tthis.showOverlay(selector, true, \"80%\");\n\t}\n\n\tprivate async navigateTreeEntry(entryId: string): Promise<boolean> {\n\t\ttry {\n\t\t\tconst result = await this.session.navigateTree(entryId);\n\t\t\tif (!this.started) return false;\n\t\t\tthis.projection.replaceTranscript(this.session.transcript);\n\t\t\tthis.editor.setValue(result.editorText ?? \"\");\n\t\t\tthis.projection.setStatus(\n\t\t\t\tresult.imagesOmitted\n\t\t\t\t\t? this.locale === \"zh-CN\"\n\t\t\t\t\t\t? \"已恢复文本;请重新附加图片。\"\n\t\t\t\t\t\t: \"Text restored; reattach images before sending.\"\n\t\t\t\t\t: `tree=${result.selectedEntryId}`,\n\t\t\t);\n\t\t\treturn true;\n\t\t} catch (cause) {\n\t\t\tthis.projection.setError(cause instanceof Error ? cause.message : String(cause));\n\t\t\treturn false;\n\t\t} finally {\n\t\t\tthis.refresh();\n\t\t}\n\t}\n\n\tprivate async summarizeTreeBranch(entryId: string): Promise<void> {\n\t\tif (this.compactionInFlight || this.promptInFlight) return;\n\t\tthis.compactionInFlight = true;\n\t\tthis.projection.setStatus(this.locale === \"zh-CN\" ? \"正在为分支生成摘要。\" : \"Summarizing selected branch.\");\n\t\tthis.refresh();\n\t\ttry {\n\t\t\tif (!(await this.navigateTreeEntry(entryId))) return;\n\t\t\tawait this.session.compact();\n\t\t\tthis.editor.setValue(\"\");\n\t\t\tthis.projection.replaceTranscript(this.session.transcript);\n\t\t\tthis.projection.setStatus(this.locale === \"zh-CN\" ? \"摘要分支已创建。\" : \"Summary branch created.\");\n\t\t} catch (cause) {\n\t\t\tthis.projection.setError(cause instanceof Error ? cause.message : String(cause));\n\t\t} finally {\n\t\t\tthis.compactionInFlight = false;\n\t\t\tthis.refresh();\n\t\t}\n\t}\n\n\tprivate openSettingsSelector(): void {\n\t\tconst t = (key: string) => translate(this.locale, key);\n\t\tconst list = new SettingsList(\n\t\t\t[\n\t\t\t\t{\n\t\t\t\t\tid: \"compaction\",\n\t\t\t\t\tlabel: t(\"contextCompaction\"),\n\t\t\t\t\tcurrentValue: this.session.compactionEnabled ? t(\"on\") : t(\"off\"),\n\t\t\t\t\tvalues: [t(\"on\"), t(\"off\")],\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"locale\",\n\t\t\t\t\tlabel: t(\"language\"),\n\t\t\t\t\tcurrentValue: this.locale,\n\t\t\t\t\tvalues: [\"en\", \"zh-CN\"],\n\t\t\t\t},\n\t\t\t],\n\t\t\t{ title: t(\"settings\") },\n\t\t);\n\t\tlist.onChange = (id, value) => {\n\t\t\tif (id === \"locale\") {\n\t\t\t\tthis.locale = value === \"zh-CN\" ? \"zh-CN\" : \"en\";\n\t\t\t\tvoid saveGlobalLocale(this.agentDir, this.locale).catch((cause) => {\n\t\t\t\t\tthis.projection.setError(cause instanceof Error ? cause.message : String(cause));\n\t\t\t\t\tthis.refresh();\n\t\t\t\t});\n\t\t\t\tthis.closeOverlay();\n\t\t\t\tthis.openSettingsSelector();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (id !== \"compaction\") return;\n\t\t\ttry {\n\t\t\t\tconst enabled = this.session.setCompactionEnabled(value === t(\"on\"));\n\t\t\t\tlist.updateValue(id, enabled ? t(\"on\") : t(\"off\"));\n\t\t\t\tthis.projection.setStatus(\n\t\t\t\t\tenabled === (value === t(\"on\")) ? `compaction=${enabled ? t(\"on\") : t(\"off\")}` : t(\"compactionUnavailable\"),\n\t\t\t\t);\n\t\t\t} catch (cause) {\n\t\t\t\tlist.updateValue(id, this.session.compactionEnabled ? t(\"on\") : t(\"off\"));\n\t\t\t\tthis.projection.setError(cause instanceof Error ? cause.message : String(cause));\n\t\t\t\tthis.closeOverlay();\n\t\t\t}\n\t\t\tthis.refresh();\n\t\t};\n\t\tlist.onCancel = () => this.closeOverlay();\n\t\tthis.showOverlay(list);\n\t}\n\n\tprivate showOverlay(component: Component, preserveLastLine = false, maxHeight: \"60%\" | \"80%\" = \"60%\"): void {\n\t\tthis.editor.cancelAutocomplete();\n\t\tthis.closeAutocompleteOverlay();\n\t\tthis.closeOverlay();\n\t\tthis.overlay = this.tui.showOverlay(component, {\n\t\t\twidth: \"70%\",\n\t\t\tmaxHeight,\n\t\t\tanchor: \"center\",\n\t\t\tmargin: 1,\n\t\t\tpreserveLastLine,\n\t\t});\n\t}\n\n\tprivate closeOverlay(): void {\n\t\tthis.overlay?.hide();\n\t\tthis.overlay = undefined;\n\t}\n\n\tprivate updateAutocompleteOverlay(): void {\n\t\tthis.closeAutocompleteOverlay();\n\t\tif (!this.editor.isShowingAutocomplete()) {\n\t\t\tthis.refresh();\n\t\t\treturn;\n\t\t}\n\t\tconst menu = new AutocompleteMenu(() => ({\n\t\t\titems: this.editor.getAutocompleteItems(),\n\t\t\tindex: this.editor.getAutocompleteIndex(),\n\t\t}));\n\t\tconst editorBounds = this.root.getEditorBounds(this.tui.columns);\n\t\tthis.autocompleteOverlay = this.tui.showOverlay(menu, {\n\t\t\twidth: \"55%\",\n\t\t\tmaxHeight: 9,\n\t\t\tanchor: \"bottom-left\",\n\t\t\tplacement: {\n\t\t\t\tanchorRow: editorBounds.end - 1,\n\t\t\t\tavoidStartRow: editorBounds.start,\n\t\t\t\tpreferred: \"below\",\n\t\t\t},\n\t\t\tmargin: 1,\n\t\t\tpreserveLastLine: true,\n\t\t\tnonCapturing: true,\n\t\t});\n\t\tthis.refresh();\n\t}\n\n\tprivate closeAutocompleteOverlay(): void {\n\t\tthis.autocompleteOverlay?.hide();\n\t\tthis.autocompleteOverlay = undefined;\n\t}\n\n\tprivate refresh(): void {\n\t\tthis.root.invalidate();\n\t\tthis.tui.requestRender();\n\t}\n\n\tprivate startSpinnerTimer(): void {\n\t\tthis.stopSpinnerTimer();\n\t\tthis.spinnerTimer = setInterval(() => {\n\t\t\tif (this.projection.advanceSpinner()) this.refresh();\n\t\t}, 120);\n\t\tthis.spinnerTimer.unref?.();\n\t}\n\n\tprivate stopSpinnerTimer(): void {\n\t\tif (this.spinnerTimer) clearInterval(this.spinnerTimer);\n\t\tthis.spinnerTimer = undefined;\n\t}\n\n\tprivate subscribeToSession(): void {\n\t\tthis.unsubscribeSession?.();\n\t\tthis.unsubscribeSession = this.session.subscribeSession((event) => {\n\t\t\tif (!this.started) return;\n\t\t\tif (event.type === \"tree_navigated\") {\n\t\t\t\tthis.projection.replaceTranscript(this.session.transcript);\n\t\t\t\tthis.refresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (event.type === \"queue_update\") {\n\t\t\t\tthis.steeringPrompts = [...event.steering];\n\t\t\t\tthis.refreshQueue();\n\t\t\t\tthis.refresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.projection.apply(event);\n\t\t\tthis.refresh();\n\t\t});\n\t}\n\n\tprivate async switchSession(choice: InteractiveSessionChoice): Promise<void> {\n\t\tif (this.promptInFlight || this.sessionSwitching) {\n\t\t\tthis.projection.setError(\n\t\t\t\tthis.locale === \"zh-CN\" ? \"提示词运行时不能切换会话。\" : \"Cannot switch sessions while a prompt is running.\",\n\t\t\t);\n\t\t\tthis.refresh();\n\t\t\treturn;\n\t\t}\n\t\tthis.sessionSwitching = true;\n\t\tthis.projection.setStatus(`opening session=${choice.id}`);\n\t\tthis.refresh();\n\t\ttry {\n\t\t\tconst next = await choice.open();\n\t\t\tif (!this.started) return;\n\t\t\tthis.unsubscribeSession?.();\n\t\t\tthis.session = next;\n\t\t\tthis.projection.configureFilePreview(next.allowedRoot, () => this.refresh());\n\t\t\tthis.clipboardDirectory = clipboardImageDirectory(this.agentDir, next.allowedRoot);\n\t\t\tvoid cleanupStaleClipboardImages(this.agentDir, next.allowedRoot);\n\t\t\tthis.queuedPrompts = [];\n\t\t\tthis.steeringPrompts = [];\n\t\t\tthis.refreshQueue();\n\t\t\tthis.projection.replaceTranscript(next.transcript);\n\t\t\tthis.projection.setUsage(next.usage);\n\t\t\tthis.projection.setStatus(`session=${choice.id}`);\n\t\t\tthis.subscribeToSession();\n\t\t} catch (cause) {\n\t\t\tthis.projection.setError(cause instanceof Error ? cause.message : String(cause));\n\t\t} finally {\n\t\t\tthis.sessionSwitching = false;\n\t\t}\n\t\tthis.refresh();\n\t}\n\n\tprivate async submit(text: string, retry = false): Promise<void> {\n\t\tconst prompt = text.trim();\n\t\tif (prompt.length === 0 || !this.started) return;\n\t\tconst steeringArgument = steeringCommandArgument(prompt);\n\t\tif (steeringArgument !== undefined) {\n\t\t\tawait this.submitSteering(steeringArgument);\n\t\t\treturn;\n\t\t}\n\t\tif (prompt.startsWith(\"/\") && !this.isLoadedSkillCommand(prompt)) {\n\t\t\tthis.editor.setValue(\"\");\n\t\t\tthis.handleSlashCommand(prompt);\n\t\t\treturn;\n\t\t}\n\t\tif (this.sessionSwitching) {\n\t\t\tthis.projection.setError(\n\t\t\t\tthis.locale === \"zh-CN\"\n\t\t\t\t\t? \"会话正在打开,请等待后再提交提示词。\"\n\t\t\t\t\t: \"A session is opening; wait before submitting a prompt.\",\n\t\t\t);\n\t\t\tthis.refresh();\n\t\t\treturn;\n\t\t}\n\t\tif (this.compactionInFlight) {\n\t\t\tthis.projection.setError(\n\t\t\t\tthis.locale === \"zh-CN\"\n\t\t\t\t\t? \"正在压缩上下文,请等待后再提交提示词。\"\n\t\t\t\t\t: \"A compaction is running; wait before submitting a prompt.\",\n\t\t\t);\n\t\t\tthis.refresh();\n\t\t\treturn;\n\t\t}\n\t\tif (this.promptInFlight) {\n\t\t\tthis.queuedPrompts.push(prompt);\n\t\t\tthis.refreshQueue();\n\t\t\tthis.root.invalidate();\n\t\t\tthis.tui.requestRender();\n\t\t\treturn;\n\t\t}\n\t\tthis.promptInFlight = true;\n\t\tthis.activeAbort = new AbortController();\n\t\tthis.projection.setRetrying(retry);\n\t\ttry {\n\t\t\tconst input = await extractImageAttachments(\n\t\t\t\tnormalizeDroppedImagePrompt(prompt, this.session.allowedRoot),\n\t\t\t\tthis.session.allowedRoot,\n\t\t\t);\n\t\t\tthis.preserveClipboardFiles = true;\n\t\t\tthis.editor.setValue(\"\");\n\t\t\tconst result =\n\t\t\t\tretry && \"retry\" in this.session\n\t\t\t\t\t? await this.session.retry(this.activeAbort.signal)\n\t\t\t\t\t: await this.session.promptWithImages(input.text, input.images, this.activeAbort.signal);\n\t\t\tif (result.stopReason === \"error\" || result.stopReason === \"aborted\") this.lastFailedPrompt = prompt;\n\t\t\telse {\n\t\t\t\tthis.lastFailedPrompt = undefined;\n\t\t\t\tawait this.cleanupClipboardFiles();\n\t\t\t}\n\t\t} catch (cause) {\n\t\t\tthis.lastFailedPrompt = prompt;\n\t\t\tthis.projection.setError(cause instanceof Error ? cause.message : String(cause));\n\t\t} finally {\n\t\t\tthis.preserveClipboardFiles = false;\n\t\t\tthis.promptInFlight = false;\n\t\t\tthis.activeAbort = undefined;\n\t\t\tthis.projection.setRetrying(false);\n\t\t\tconst next = this.queuedPrompts.shift();\n\t\t\tthis.refreshQueue();\n\t\t\tthis.root.invalidate();\n\t\t\tthis.tui.requestRender();\n\t\t\tif (next && this.started) void this.submit(next);\n\t\t}\n\t}\n\n\tprivate async submitSteering(text: string): Promise<void> {\n\t\tconst prompt = text.trim();\n\t\tif (prompt.length === 0) {\n\t\t\tthis.projection.setError(this.locale === \"zh-CN\" ? \"引导内容不能为空。\" : \"Steering content must not be empty.\");\n\t\t\tthis.refresh();\n\t\t\treturn;\n\t\t}\n\t\tif (this.sessionSwitching) {\n\t\t\tthis.projection.setError(\n\t\t\t\tthis.locale === \"zh-CN\"\n\t\t\t\t\t? \"会话正在打开,请等待后再引导 Agent。\"\n\t\t\t\t\t: \"A session is opening; wait before steering the agent.\",\n\t\t\t);\n\t\t\tthis.refresh();\n\t\t\treturn;\n\t\t}\n\t\tif (this.compactionInFlight) {\n\t\t\tthis.projection.setError(\n\t\t\t\tthis.locale === \"zh-CN\"\n\t\t\t\t\t? \"正在压缩上下文,请等待后再引导 Agent。\"\n\t\t\t\t\t: \"A compaction is running; wait before steering the agent.\",\n\t\t\t);\n\t\t\tthis.refresh();\n\t\t\treturn;\n\t\t}\n\t\tif (!this.promptInFlight) {\n\t\t\tthis.projection.setError(\n\t\t\t\tthis.locale === \"zh-CN\"\n\t\t\t\t\t? \"只能在提示词运行时引导 Agent。\"\n\t\t\t\t\t: \"Steering is only available while a prompt is running.\",\n\t\t\t);\n\t\t\tthis.refresh();\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\tconst input = await extractImageAttachments(\n\t\t\t\tnormalizeDroppedImagePrompt(prompt, this.session.allowedRoot),\n\t\t\t\tthis.session.allowedRoot,\n\t\t\t);\n\t\t\tawait this.session.steerWithImages(input.text, input.images);\n\t\t\tthis.editor.setValue(\"\");\n\t\t} catch (cause) {\n\t\t\tthis.projection.setError(cause instanceof Error ? cause.message : String(cause));\n\t\t}\n\t\tthis.refresh();\n\t}\n\n\tprivate refreshQueue(): void {\n\t\tthis.projection.setQueue([\n\t\t\t...this.steeringPrompts.map((prompt) => `steer: ${prompt}`),\n\t\t\t...this.queuedPrompts.map((prompt) => `queued: ${prompt}`),\n\t\t]);\n\t}\n\n\tprivate async cleanupUnreferencedClipboardFiles(): Promise<void> {\n\t\tconst text = this.editor.getValue();\n\t\tconst files = [...this.clipboardFiles].filter((path) => !text.includes(path));\n\t\tawait Promise.all(files.map((path) => removeClipboardImage(path, this.clipboardDirectory)));\n\t\tfor (const path of files) this.clipboardFiles.delete(path);\n\t}\n\n\tprivate async cleanupClipboardFiles(): Promise<void> {\n\t\tconst files = [...this.clipboardFiles];\n\t\tawait Promise.all(files.map((path) => removeClipboardImage(path, this.clipboardDirectory)));\n\t\tfor (const path of files) this.clipboardFiles.delete(path);\n\t}\n\n\tprivate handleSlashCommand(input: string): void {\n\t\tconst trimmed = input.slice(1).trim();\n\t\tconst [rawCommand = \"\", ...argParts] = trimmed.split(/\\s+/);\n\t\tconst command = rawCommand.toLowerCase();\n\t\tconst args = argParts.join(\" \");\n\t\tif (this.commandRegistry?.list().some((entry) => entry.name === command)) {\n\t\t\tvoid this.commandRegistry\n\t\t\t\t.execute(command, {\n\t\t\t\t\thost: { runCommand: (name: string, value: string) => this.runRegisteredCommand(name, value) },\n\t\t\t\t\targs,\n\t\t\t\t})\n\t\t\t\t.catch((cause) => {\n\t\t\t\t\tthis.projection.setError(cause instanceof Error ? cause.message : String(cause));\n\t\t\t\t\tthis.refresh();\n\t\t\t\t});\n\t\t\tthis.refresh();\n\t\t\treturn;\n\t\t}\n\t\tthis.runRegisteredCommand(command, args);\n\t}\n\n\tprivate runRegisteredCommand(command: string, _args: string): number {\n\t\tswitch (command) {\n\t\t\tcase \"help\":\n\t\t\t\tthis.projection.setStatus(\n\t\t\t\t\t`commands: ${this.listSlashCommands()\n\t\t\t\t\t\t.map((item) => `/${item.name}`)\n\t\t\t\t\t\t.join(\" \")}`,\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\tcase \"clear\":\n\t\t\t\tthis.projection.clearVisibleMessages();\n\t\t\t\tthis.projection.setStatus(translate(this.locale, \"visibleMessagesCleared\"));\n\t\t\t\tbreak;\n\t\t\tcase \"model\":\n\t\t\t\tthis.openModelSelector();\n\t\t\t\treturn 0;\n\t\t\tcase \"session\":\n\t\t\t\tthis.openSessionSelector();\n\t\t\t\treturn 0;\n\t\t\tcase \"tree\":\n\t\t\t\tthis.openTreeSelector();\n\t\t\t\treturn 0;\n\t\t\tcase \"theme\":\n\t\t\t\tthis.openThemeSelector();\n\t\t\t\treturn 0;\n\t\t\tcase \"settings\":\n\t\t\t\tthis.openSettingsSelector();\n\t\t\t\treturn 0;\n\t\t\tcase \"login\":\n\t\t\t\tthis.openProviderLogin();\n\t\t\t\treturn 0;\n\t\t\tcase \"logout\":\n\t\t\t\tvoid this.logoutProvider();\n\t\t\t\treturn 0;\n\t\t\tcase \"compact\":\n\t\t\t\tvoid this.runManualCompaction();\n\t\t\t\treturn 0;\n\t\t\tcase \"usage\":\n\t\t\t\tthis.projection.setStatus(this.formatUsage());\n\t\t\t\tbreak;\n\t\t\tcase \"retry\":\n\t\t\t\tif (this.lastFailedPrompt && !this.promptInFlight) {\n\t\t\t\t\tif (this.context) void this.context.retry();\n\t\t\t\t\telse void this.submit(this.lastFailedPrompt, true);\n\t\t\t\t} else this.projection.setStatus(translate(this.locale, \"nothingToRetry\"));\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tthis.projection.setError(`Unknown command: /${command}`);\n\t\t}\n\t\tthis.refresh();\n\t\treturn 0;\n\t}\n\n\tprivate openProviderLogin(): void {\n\t\tif (!this.providerOnboarding) {\n\t\t\tthis.projection.setError(\"Provider login is unavailable in this session.\");\n\t\t\tthis.refresh();\n\t\t\treturn;\n\t\t}\n\t\tif (this.promptInFlight || this.sessionSwitching) {\n\t\t\tthis.projection.setError(\"Cannot change Provider while a prompt is running.\");\n\t\t\tthis.refresh();\n\t\t\treturn;\n\t\t}\n\t\tthis.editor.cancelAutocomplete();\n\t\tthis.closeAutocompleteOverlay();\n\t\tvoid showInteractiveProviderOnboarding({\n\t\t\t...this.providerOnboarding,\n\t\t\tconfiguration: { ...this.providerOnboarding.configuration, locale: this.locale },\n\t\t\ttui: this.tui,\n\t\t})\n\t\t\t.then((runtime) => {\n\t\t\t\tif (!this.started) return;\n\t\t\t\tthis.tui.setFocus(this.editor);\n\t\t\t\tif (!runtime) {\n\t\t\t\t\tthis.refresh();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tthis.session.setRuntime(runtime.provider, runtime.model);\n\t\t\t\tthis.projection.setStatus(`provider=${runtime.provider.id} model=${runtime.model.id}`);\n\t\t\t\tthis.refresh();\n\t\t\t})\n\t\t\t.catch((cause) => {\n\t\t\t\tif (this.started) this.tui.setFocus(this.editor);\n\t\t\t\tthis.projection.setError(cause instanceof Error ? cause.message : String(cause));\n\t\t\t\tthis.refresh();\n\t\t\t});\n\t}\n\n\tprivate async logoutProvider(): Promise<void> {\n\t\tif (!this.providerOnboarding) {\n\t\t\tthis.projection.setError(\"Provider logout is unavailable in this session.\");\n\t\t\tthis.refresh();\n\t\t\treturn;\n\t\t}\n\t\tif (this.promptInFlight || this.sessionSwitching) {\n\t\t\tthis.projection.setError(\"Cannot change Provider while a prompt is running.\");\n\t\t\tthis.refresh();\n\t\t\treturn;\n\t\t}\n\t\tconst providerId = this.session.providerId;\n\t\ttry {\n\t\t\tconst removed = await removeGlobalProviderApiKey(this.providerOnboarding.agentDir, providerId);\n\t\t\tif (!removed) {\n\t\t\t\tthis.projection.setStatus(`no global API key stored for provider=${providerId}`);\n\t\t\t\tthis.refresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.projection.setStatus(\n\t\t\t\t`global API key removed for provider=${providerId}; it remains active until this session ends`,\n\t\t\t);\n\t\t} catch (cause) {\n\t\t\tthis.projection.setError(cause instanceof Error ? cause.message : String(cause));\n\t\t}\n\t\tthis.refresh();\n\t}\n\n\tprivate listSlashCommands(): readonly SlashCommand[] {\n\t\tconst skills = this.session.availableSkills.map((skill) => ({\n\t\t\tname: `skill:${skill.name}`,\n\t\t\tdescription: skill.description,\n\t\t}));\n\t\tconst registryCommands = this.commandRegistry?.list().map((command) => ({\n\t\t\tname: command.name,\n\t\t\tdescription: typeof command.description === \"function\" ? command.description(this.locale) : command.description,\n\t\t}));\n\t\treturn [...(registryCommands ?? builtinSlashCommands(this.locale)), ...skills];\n\t}\n\n\tprivate isLoadedSkillCommand(input: string): boolean {\n\t\tconst name = /^\\/skill:([a-z0-9]+(?:-[a-z0-9]+)*)(?:\\s|$)/.exec(input)?.[1];\n\t\treturn name !== undefined && this.session.availableSkills.some((skill) => skill.name === name);\n\t}\n\n\tprivate formatUsage(): string {\n\t\tconst usage = this.session.usage;\n\t\tif (this.locale === \"zh-CN\") {\n\t\t\treturn `用量:请求=${usage.requestCount} 输入=${usage.inputTokens} 输出=${usage.outputTokens} 总计=${usage.totalTokens} 费用=$${usage.cost.total.toFixed(4)} 上下文=${usage.estimatedContextTokens}/${usage.contextWindow}`;\n\t\t}\n\t\treturn `usage: requests=${usage.requestCount} input=${usage.inputTokens} output=${usage.outputTokens} total=${usage.totalTokens} cost=$${usage.cost.total.toFixed(4)} context=${usage.estimatedContextTokens}/${usage.contextWindow}`;\n\t}\n\n\tprivate async runManualCompaction(): Promise<void> {\n\t\tif (this.promptInFlight || this.compactionInFlight) {\n\t\t\tthis.projection.setError(\n\t\t\t\tthis.locale === \"zh-CN\" ? \"提示词运行时不能压缩上下文。\" : \"Cannot compact while a prompt is running.\",\n\t\t\t);\n\t\t\tthis.refresh();\n\t\t\treturn;\n\t\t}\n\t\tthis.compactionInFlight = true;\n\t\tthis.projection.setStatus(translate(this.locale, \"manualCompactionStarting\"));\n\t\tthis.refresh();\n\t\ttry {\n\t\t\tawait this.session.compact();\n\t\t\tthis.projection.setStatus(translate(this.locale, \"manualCompactionComplete\"));\n\t\t} catch (cause) {\n\t\t\tthis.projection.setError(cause instanceof Error ? cause.message : String(cause));\n\t\t} finally {\n\t\t\tthis.compactionInFlight = false;\n\t\t\tthis.refresh();\n\t\t}\n\t}\n}\n"]}
@@ -0,0 +1,13 @@
1
+ import type { RendererDefinition } from "@di-code/builtins";
2
+ import { type JsonRunner } from "./json.ts";
3
+ import type { PrintIo } from "./print.ts";
4
+ export interface JsonModeEntryOptions {
5
+ readonly prompt: string;
6
+ readonly runner: JsonRunner;
7
+ readonly io: PrintIo;
8
+ readonly renderer?: RendererDefinition;
9
+ readonly onStart: () => void | Promise<void>;
10
+ readonly onStop: () => void | Promise<void>;
11
+ }
12
+ export declare function runJsonModeEntry(options: JsonModeEntryOptions): Promise<number>;
13
+ //# sourceMappingURL=json-entry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-entry.d.ts","sourceRoot":"","sources":["../../src/modes/json-entry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAqB,KAAK,UAAU,EAAe,MAAM,WAAW,CAAC;AAC5E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C,MAAM,WAAW,oBAAoB;IACpC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,QAAQ,CAAC,EAAE,kBAAkB,CAAC;IACvC,QAAQ,CAAC,OAAO,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C,QAAQ,CAAC,MAAM,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5C;AAED,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,MAAM,CAAC,CAUrF"}
@@ -0,0 +1,14 @@
1
+ import { runJsonMode } from "./json.js";
2
+ export async function runJsonModeEntry(options) {
3
+ await options.onStart();
4
+ try {
5
+ const renderer = options.renderer
6
+ ? { render: (event) => options.renderer?.render(event) }
7
+ : undefined;
8
+ return await runJsonMode(options.prompt, options.runner, options.io, renderer);
9
+ }
10
+ finally {
11
+ await options.onStop();
12
+ }
13
+ }
14
+ //# sourceMappingURL=json-entry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-entry.js","sourceRoot":"","sources":["../../src/modes/json-entry.ts"],"names":[],"mappings":"AACA,OAAO,EAAsC,WAAW,EAAE,MAAM,WAAW,CAAC;AAY5E,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,OAA6B;IACnE,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;IACxB,IAAI,CAAC;QACJ,MAAM,QAAQ,GAA6B,OAAO,CAAC,QAAQ;YAC1D,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE;YACxD,CAAC,CAAC,SAAS,CAAC;QACb,OAAO,MAAM,WAAW,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;IAChF,CAAC;YAAS,CAAC;QACV,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC;IACxB,CAAC;AACF,CAAC","sourcesContent":["import type { RendererDefinition } from \"@di-code/builtins\";\nimport { type JsonRenderer, type JsonRunner, runJsonMode } from \"./json.ts\";\nimport type { PrintIo } from \"./print.ts\";\n\nexport interface JsonModeEntryOptions {\n\treadonly prompt: string;\n\treadonly runner: JsonRunner;\n\treadonly io: PrintIo;\n\treadonly renderer?: RendererDefinition;\n\treadonly onStart: () => void | Promise<void>;\n\treadonly onStop: () => void | Promise<void>;\n}\n\nexport async function runJsonModeEntry(options: JsonModeEntryOptions): Promise<number> {\n\tawait options.onStart();\n\ttry {\n\t\tconst renderer: JsonRenderer | undefined = options.renderer\n\t\t\t? { render: (event) => options.renderer?.render(event) }\n\t\t\t: undefined;\n\t\treturn await runJsonMode(options.prompt, options.runner, options.io, renderer);\n\t} finally {\n\t\tawait options.onStop();\n\t}\n}\n"]}