@sortedyuan/maybecode 0.3.2 → 0.5.0

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 (295) hide show
  1. package/README.md +166 -55
  2. package/README.zh-CN.md +267 -0
  3. package/dist/application.d.ts +40 -34
  4. package/dist/application.d.ts.map +1 -1
  5. package/dist/application.js +290 -170
  6. package/dist/application.js.map +1 -1
  7. package/dist/args.d.ts +2 -2
  8. package/dist/args.d.ts.map +1 -1
  9. package/dist/args.js +50 -27
  10. package/dist/args.js.map +1 -1
  11. package/dist/bin.js +82 -71
  12. package/dist/bin.js.map +4 -4
  13. package/dist/cli/chunk-3IORPKBL.js +3572 -0
  14. package/dist/cli/chunk-3IORPKBL.js.map +7 -0
  15. package/dist/cli/{chunk-LVTRXPDS.js → chunk-4B2Z6KW7.js} +1547 -1536
  16. package/dist/cli/chunk-4B2Z6KW7.js.map +7 -0
  17. package/dist/cli/{chunk-JT6VBKOM.js → chunk-4WG6JIJJ.js} +127 -33
  18. package/dist/cli/{chunk-JT6VBKOM.js.map → chunk-4WG6JIJJ.js.map} +3 -3
  19. package/dist/cli/{chunk-K5JWPNSY.js → chunk-5SLWALZK.js} +3521 -16164
  20. package/dist/cli/chunk-5SLWALZK.js.map +7 -0
  21. package/dist/cli/chunk-MNBYXL5Y.js +132 -0
  22. package/dist/cli/chunk-MNBYXL5Y.js.map +7 -0
  23. package/dist/cli/{chunk-F4XRPLUM.js → chunk-SLWLUEHQ.js} +226 -86
  24. package/dist/cli/chunk-SLWLUEHQ.js.map +7 -0
  25. package/dist/cli/chunk-UQDZ55LQ.js +199 -0
  26. package/dist/cli/chunk-UQDZ55LQ.js.map +7 -0
  27. package/dist/cli/{chunk-7ISOHFS7.js → chunk-WMSG5ZTR.js} +717 -388
  28. package/dist/cli/chunk-WMSG5ZTR.js.map +7 -0
  29. package/dist/cli/chunk-WVIRS76R.js +4057 -0
  30. package/dist/cli/chunk-WVIRS76R.js.map +7 -0
  31. package/dist/cli/{chunk-HOU5ITUK.js → chunk-XTEMRAQW.js} +1 -1
  32. package/dist/cli/chunk-XTEMRAQW.js.map +7 -0
  33. package/dist/cli/chunk-Z3BOPBVU.js +91 -0
  34. package/dist/cli/chunk-Z3BOPBVU.js.map +7 -0
  35. package/dist/cli/{configured-WHY3GGAJ.js → configured-ACNM6TRQ.js} +10 -9
  36. package/dist/cli/{file-type-R2T7TBHI.js → file-type-HLHPV7WC.js} +817 -13
  37. package/dist/cli/file-type-HLHPV7WC.js.map +7 -0
  38. package/dist/cli/mcp-auth-XD5U7WCV.js +74 -0
  39. package/dist/cli/mcp-auth-XD5U7WCV.js.map +7 -0
  40. package/dist/cli/onboarding-WQWCPYEO.js +530 -0
  41. package/dist/cli/onboarding-WQWCPYEO.js.map +7 -0
  42. package/dist/cli/onboarding-check-HRRI5OJ7.js +32 -0
  43. package/dist/cli/onboarding-check-HRRI5OJ7.js.map +7 -0
  44. package/dist/cli/{retained-tui-VJ3VX4R3.js → retained-tui-QF5VMYLC.js} +788 -332
  45. package/dist/cli/retained-tui-QF5VMYLC.js.map +7 -0
  46. package/dist/cli/{sixel-LWTCM76G.js → sixel-ISZ4FZ3U.js} +37 -37
  47. package/dist/cli/{sixel-LWTCM76G.js.map → sixel-ISZ4FZ3U.js.map} +1 -1
  48. package/dist/cli/{team-T7G7PPNN.js → team-O2I5BXHM.js} +7 -6
  49. package/dist/cli/{team-v2-JGBBQ7FR.js → team-v2-YYO2G7DJ.js} +816 -390
  50. package/dist/cli/team-v2-YYO2G7DJ.js.map +7 -0
  51. package/dist/cli/{web-server-FOMNPY7Q.js → web-server-SXMH6FGA.js} +55 -19
  52. package/dist/cli/web-server-SXMH6FGA.js.map +7 -0
  53. package/dist/cli/{web-ui-COB6PKC5.js → web-ui-UWQUFE4W.js} +7 -6
  54. package/dist/config-schema.json +337 -0
  55. package/dist/configured.d.ts +18 -11
  56. package/dist/configured.d.ts.map +1 -1
  57. package/dist/configured.js +213 -390
  58. package/dist/configured.js.map +1 -1
  59. package/dist/controller.d.ts +19 -18
  60. package/dist/controller.d.ts.map +1 -1
  61. package/dist/delegation-commands.d.ts +1 -1
  62. package/dist/delegation-commands.d.ts.map +1 -1
  63. package/dist/delegation-commands.js +8 -8
  64. package/dist/delegation-commands.js.map +1 -1
  65. package/dist/errors.d.ts +2 -1
  66. package/dist/errors.d.ts.map +1 -1
  67. package/dist/errors.js +2 -1
  68. package/dist/errors.js.map +1 -1
  69. package/dist/events.d.ts +8 -6
  70. package/dist/events.d.ts.map +1 -1
  71. package/dist/fork-picker.d.ts.map +1 -1
  72. package/dist/fork-picker.js +19 -5
  73. package/dist/fork-picker.js.map +1 -1
  74. package/dist/git-request.d.ts +6 -6
  75. package/dist/git-request.d.ts.map +1 -1
  76. package/dist/git-request.js +28 -15
  77. package/dist/git-request.js.map +1 -1
  78. package/dist/goal-commands.d.ts +1 -1
  79. package/dist/goal-commands.d.ts.map +1 -1
  80. package/dist/goal-commands.js +12 -5
  81. package/dist/goal-commands.js.map +1 -1
  82. package/dist/index.d.ts +5 -37
  83. package/dist/index.d.ts.map +1 -1
  84. package/dist/index.js +3 -36
  85. package/dist/index.js.map +1 -1
  86. package/dist/instructions.d.ts +2 -7
  87. package/dist/instructions.d.ts.map +1 -1
  88. package/dist/instructions.js +7 -15
  89. package/dist/instructions.js.map +1 -1
  90. package/dist/keymap.d.ts +2 -2
  91. package/dist/keymap.d.ts.map +1 -1
  92. package/dist/keymap.js +2 -2
  93. package/dist/keymap.js.map +1 -1
  94. package/dist/maybecode-config.schema.json +1765 -0
  95. package/dist/mcp-auth.d.ts +1 -1
  96. package/dist/mcp-auth.d.ts.map +1 -1
  97. package/dist/mcp-auth.js +11 -8
  98. package/dist/mcp-auth.js.map +1 -1
  99. package/dist/mcp-commands.d.ts.map +1 -1
  100. package/dist/mcp-commands.js +18 -4
  101. package/dist/mcp-commands.js.map +1 -1
  102. package/dist/mcp-interaction-ui.d.ts.map +1 -1
  103. package/dist/mcp-interaction-ui.js +11 -4
  104. package/dist/mcp-interaction-ui.js.map +1 -1
  105. package/dist/media-history.d.ts +1 -1
  106. package/dist/media-history.d.ts.map +1 -1
  107. package/dist/media-history.js +8 -2
  108. package/dist/media-history.js.map +1 -1
  109. package/dist/model-picker.d.ts.map +1 -1
  110. package/dist/model-picker.js +10 -11
  111. package/dist/model-picker.js.map +1 -1
  112. package/dist/model-transition.d.ts +11 -0
  113. package/dist/model-transition.d.ts.map +1 -0
  114. package/dist/model-transition.js +48 -0
  115. package/dist/model-transition.js.map +1 -0
  116. package/dist/model.d.ts +2 -2
  117. package/dist/model.d.ts.map +1 -1
  118. package/dist/model.js +8 -4
  119. package/dist/model.js.map +1 -1
  120. package/dist/onboarding-check.d.ts +3 -0
  121. package/dist/onboarding-check.d.ts.map +1 -0
  122. package/dist/onboarding-check.js +22 -0
  123. package/dist/onboarding-check.js.map +1 -0
  124. package/dist/onboarding.d.ts +6 -0
  125. package/dist/onboarding.d.ts.map +1 -0
  126. package/dist/onboarding.js +463 -0
  127. package/dist/onboarding.js.map +1 -0
  128. package/dist/plugins/application.d.ts +6 -4
  129. package/dist/plugins/application.d.ts.map +1 -1
  130. package/dist/plugins/application.js +106 -52
  131. package/dist/plugins/application.js.map +1 -1
  132. package/dist/plugins/instructions.d.ts +1 -1
  133. package/dist/plugins/instructions.d.ts.map +1 -1
  134. package/dist/plugins/instructions.js +24 -11
  135. package/dist/plugins/instructions.js.map +1 -1
  136. package/dist/plugins/resources.d.ts +2 -2
  137. package/dist/plugins/resources.d.ts.map +1 -1
  138. package/dist/plugins/resources.js +22 -12
  139. package/dist/plugins/resources.js.map +1 -1
  140. package/dist/policy.d.ts +1 -1
  141. package/dist/policy.d.ts.map +1 -1
  142. package/dist/policy.js +59 -11
  143. package/dist/policy.js.map +1 -1
  144. package/dist/run.d.ts +2 -0
  145. package/dist/run.d.ts.map +1 -1
  146. package/dist/run.js +38 -33
  147. package/dist/run.js.map +1 -1
  148. package/dist/runtime-instructions.d.ts +1 -1
  149. package/dist/runtime-instructions.d.ts.map +1 -1
  150. package/dist/runtime-instructions.js +15 -7
  151. package/dist/runtime-instructions.js.map +1 -1
  152. package/dist/session-navigation.d.ts +6 -0
  153. package/dist/session-navigation.d.ts.map +1 -0
  154. package/dist/session-navigation.js +64 -0
  155. package/dist/session-navigation.js.map +1 -0
  156. package/dist/session-picker.d.ts +1 -1
  157. package/dist/session-picker.d.ts.map +1 -1
  158. package/dist/session-picker.js +23 -32
  159. package/dist/session-picker.js.map +1 -1
  160. package/dist/settings.d.ts +718 -0
  161. package/dist/settings.d.ts.map +1 -0
  162. package/dist/settings.js +14 -0
  163. package/dist/settings.js.map +1 -0
  164. package/dist/skills.d.ts +1 -1
  165. package/dist/skills.d.ts.map +1 -1
  166. package/dist/skills.js +10 -12
  167. package/dist/skills.js.map +1 -1
  168. package/dist/slash-commands.d.ts +2 -2
  169. package/dist/slash-commands.d.ts.map +1 -1
  170. package/dist/slash-commands.js +149 -67
  171. package/dist/slash-commands.js.map +1 -1
  172. package/dist/team-execution.d.ts +10 -0
  173. package/dist/team-execution.d.ts.map +1 -0
  174. package/dist/team-execution.js +29 -0
  175. package/dist/team-execution.js.map +1 -0
  176. package/dist/team-patches.d.ts.map +1 -1
  177. package/dist/team-patches.js +149 -52
  178. package/dist/team-patches.js.map +1 -1
  179. package/dist/team-plan.d.ts +2 -2
  180. package/dist/team-plan.d.ts.map +1 -1
  181. package/dist/team-plan.js +115 -34
  182. package/dist/team-plan.js.map +1 -1
  183. package/dist/team-recovery.d.ts +1 -1
  184. package/dist/team-recovery.d.ts.map +1 -1
  185. package/dist/team-recovery.js +40 -10
  186. package/dist/team-recovery.js.map +1 -1
  187. package/dist/team-v2.d.ts.map +1 -1
  188. package/dist/team-v2.js +335 -104
  189. package/dist/team-v2.js.map +1 -1
  190. package/dist/team-verification.d.ts +4 -2
  191. package/dist/team-verification.d.ts.map +1 -1
  192. package/dist/team-verification.js +300 -97
  193. package/dist/team-verification.js.map +1 -1
  194. package/dist/team.d.ts +2 -2
  195. package/dist/team.d.ts.map +1 -1
  196. package/dist/team.js +172 -62
  197. package/dist/team.js.map +1 -1
  198. package/dist/terminal-web.d.ts +1 -0
  199. package/dist/terminal-web.d.ts.map +1 -1
  200. package/dist/terminal-web.js +28 -10
  201. package/dist/terminal-web.js.map +1 -1
  202. package/dist/ui/actions.d.ts.map +1 -1
  203. package/dist/ui/actions.js.map +1 -1
  204. package/dist/ui/retained-tui.d.ts.map +1 -1
  205. package/dist/ui/retained-tui.js +231 -173
  206. package/dist/ui/retained-tui.js.map +1 -1
  207. package/dist/ui/{prototype-view.d.ts → terminal-view.d.ts} +7 -7
  208. package/dist/ui/terminal-view.d.ts.map +1 -0
  209. package/dist/ui/{prototype-view.js → terminal-view.js} +185 -98
  210. package/dist/ui/terminal-view.js.map +1 -0
  211. package/dist/web-commands.d.ts.map +1 -1
  212. package/dist/web-commands.js +160 -57
  213. package/dist/web-commands.js.map +1 -1
  214. package/dist/web-extension.d.ts.map +1 -1
  215. package/dist/web-extension.js +14 -4
  216. package/dist/web-extension.js.map +1 -1
  217. package/dist/web-server.d.ts.map +1 -1
  218. package/dist/web-server.js +2 -1
  219. package/dist/web-server.js.map +1 -1
  220. package/dist/web-ui.d.ts.map +1 -1
  221. package/dist/web-ui.js +167 -40
  222. package/dist/web-ui.js.map +1 -1
  223. package/dist/workspace-configuration.d.ts +7 -0
  224. package/dist/workspace-configuration.d.ts.map +1 -0
  225. package/dist/workspace-configuration.js +134 -0
  226. package/dist/workspace-configuration.js.map +1 -0
  227. package/dist/workspace-state.d.ts +20 -0
  228. package/dist/workspace-state.d.ts.map +1 -0
  229. package/dist/workspace-state.js +2 -0
  230. package/dist/workspace-state.js.map +1 -0
  231. package/dist/workspace.d.ts +26 -43
  232. package/dist/workspace.d.ts.map +1 -1
  233. package/dist/workspace.js +261 -323
  234. package/dist/workspace.js.map +1 -1
  235. package/package.json +21 -31
  236. package/dist/cli/chunk-7ISOHFS7.js.map +0 -7
  237. package/dist/cli/chunk-F4XRPLUM.js.map +0 -7
  238. package/dist/cli/chunk-H7SNBFO4.js +0 -5522
  239. package/dist/cli/chunk-H7SNBFO4.js.map +0 -7
  240. package/dist/cli/chunk-HOU5ITUK.js.map +0 -7
  241. package/dist/cli/chunk-K5JWPNSY.js.map +0 -7
  242. package/dist/cli/chunk-LVTRXPDS.js.map +0 -7
  243. package/dist/cli/chunk-VAZMCNBB.js +0 -686
  244. package/dist/cli/chunk-VAZMCNBB.js.map +0 -7
  245. package/dist/cli/chunk-WOFEI42C.js +0 -7820
  246. package/dist/cli/chunk-WOFEI42C.js.map +0 -7
  247. package/dist/cli/file-type-R2T7TBHI.js.map +0 -7
  248. package/dist/cli/mcp-auth-UNRHSIKJ.js +0 -63
  249. package/dist/cli/mcp-auth-UNRHSIKJ.js.map +0 -7
  250. package/dist/cli/retained-tui-VJ3VX4R3.js.map +0 -7
  251. package/dist/cli/team-v2-JGBBQ7FR.js.map +0 -7
  252. package/dist/cli/tui-SA74DKMA.js +0 -1705
  253. package/dist/cli/tui-SA74DKMA.js.map +0 -7
  254. package/dist/cli/web-server-FOMNPY7Q.js.map +0 -7
  255. package/dist/delegation.d.ts +0 -2
  256. package/dist/delegation.d.ts.map +0 -1
  257. package/dist/delegation.js +0 -2
  258. package/dist/delegation.js.map +0 -1
  259. package/dist/history-memory.d.ts +0 -2
  260. package/dist/history-memory.d.ts.map +0 -1
  261. package/dist/history-memory.js +0 -2
  262. package/dist/history-memory.js.map +0 -1
  263. package/dist/subagent-budget.d.ts +0 -2
  264. package/dist/subagent-budget.d.ts.map +0 -1
  265. package/dist/subagent-budget.js +0 -2
  266. package/dist/subagent-budget.js.map +0 -1
  267. package/dist/subagent-files.d.ts +0 -2
  268. package/dist/subagent-files.d.ts.map +0 -1
  269. package/dist/subagent-files.js +0 -2
  270. package/dist/subagent-files.js.map +0 -1
  271. package/dist/subagent-host.d.ts +0 -2
  272. package/dist/subagent-host.d.ts.map +0 -1
  273. package/dist/subagent-host.js +0 -2
  274. package/dist/subagent-host.js.map +0 -1
  275. package/dist/subagent-instructions.d.ts +0 -2
  276. package/dist/subagent-instructions.d.ts.map +0 -1
  277. package/dist/subagent-instructions.js +0 -2
  278. package/dist/subagent-instructions.js.map +0 -1
  279. package/dist/subagents.d.ts +0 -2
  280. package/dist/subagents.d.ts.map +0 -1
  281. package/dist/subagents.js +0 -2
  282. package/dist/subagents.js.map +0 -1
  283. package/dist/summarizer.d.ts +0 -2
  284. package/dist/summarizer.d.ts.map +0 -1
  285. package/dist/summarizer.js +0 -2
  286. package/dist/summarizer.js.map +0 -1
  287. package/dist/tui.d.ts +0 -7
  288. package/dist/tui.d.ts.map +0 -1
  289. package/dist/tui.js +0 -1109
  290. package/dist/tui.js.map +0 -1
  291. package/dist/ui/prototype-view.d.ts.map +0 -1
  292. package/dist/ui/prototype-view.js.map +0 -1
  293. /package/dist/cli/{configured-WHY3GGAJ.js.map → configured-ACNM6TRQ.js.map} +0 -0
  294. /package/dist/cli/{team-T7G7PPNN.js.map → team-O2I5BXHM.js.map} +0 -0
  295. /package/dist/cli/{web-ui-COB6PKC5.js.map → web-ui-UWQUFE4W.js.map} +0 -0
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/tui.ts", "../../src/model-picker.ts", "../../src/session-picker.ts", "../../src/fork-picker.ts"],
4
- "sourcesContent": ["import type { ContentPart, MayEvent, UserMessage } from \"@sortedyuan/core\";\nimport { userInfo } from \"node:os\";\nimport type { AgentApplicationEvent } from \"@sortedyuan/application\";\nimport type { ContextInspection } from \"@sortedyuan/context\";\nimport type { ApprovalRequest, PermissionEvent } from \"@sortedyuan/permissions\";\nimport type { SessionEvent } from \"@sortedyuan/session\";\nimport { sanitizeTerminalText, TerminalImages, encodeImage, workspaceGitLabel } from \"@sortedyuan/tui\";\n\nimport type { FileChangeKind, ToolChangePreview } from \"@sortedyuan/coding-tools/change-preview\";\nimport type {\n MaybeCodeDelegationState,\n MaybeCodeDelegationTask,\n} from \"./delegation.js\";\nimport type { MaybeCodeEvent } from \"./events.js\";\nimport {\n createMaybeCodeSlashCommandSuggester,\n executeMaybeCodeSlashCommand,\n formatMaybeCodeMcpStatus,\n parseMaybeCodeSlashCommand,\n type MaybeCodeSlashCommand,\n type MaybeCodeSlashCommandResult,\n} from \"./slash-commands.js\";\nimport type {\n TerminalIO,\n TerminalQuestionOptions,\n} from \"@sortedyuan/tui/node-terminal\";\nimport { createNodeTerminal } from \"@sortedyuan/tui/node-terminal\";\nimport type {\n MaybeCodeController,\n MaybeCodeReasoningEffortState,\n} from \"./controller.js\";\nimport { runModelPicker } from \"./model-picker.js\";\nimport { runSessionPicker } from \"./session-picker.js\";\nimport { runForkPicker, runChangesPicker } from \"./fork-picker.js\";\nimport { presentMcpInteraction } from \"./mcp-interaction-ui.js\";\nimport { MaybeCodeTerminalWeb } from \"./terminal-web.js\";\nimport { formatGoal } from \"./goal-commands.js\";\nimport { renderDelegationTask } from \"./delegation-commands.js\";\n\ntype UIQuestion = (\n prompt: string,\n options?: TerminalQuestionOptions,\n) => Promise<string>;\n\nexport interface RunTerminalUIOptions {\n readonly terminal?: TerminalIO;\n}\n\nexport async function runTerminalUI(\n app: MaybeCodeController,\n options: RunTerminalUIOptions = {},\n): Promise<void> {\n const terminal = options.terminal ?? createNodeTerminal();\n terminal.imageSupport?.query();\n await terminal.imageSupport?.ready();\n let terminalClosed = false;\n const closeTerminal = (): void => {\n if (terminalClosed) return;\n terminalClosed = true;\n terminal.close();\n };\n const renderer = new TerminalRenderer(terminal);\n const slashCommandSuggestions = createMaybeCodeSlashCommandSuggester(app);\n let activeQuestion: AbortController | undefined;\n let inputQuestionController: AbortController | undefined;\n let inputContinuation = false;\n let gitLabel = \"\";\n let interactionDone: Promise<void> = Promise.resolve();\n const pendingRuns = new Set<Promise<void>>();\n const observeRun = (result: Promise<unknown>): void => {\n const pending = result.then(() => undefined, error => {\n if (!terminalClosed && !isCancellation(error)) terminal.write(`\\nError: ${sanitizeTerminalText(errorMessage(error))}\\n`);\n }).finally(() => pendingRuns.delete(pending));\n pendingRuns.add(pending);\n };\n let exit = false;\n const handleProcessSignal = (): void => {\n exit = true;\n if (app.isRunning) app.cancel(\"Interrupted by process signal\");\n activeQuestion?.abort();\n closeTerminal();\n };\n process.on(\"SIGINT\", handleProcessSignal);\n process.on(\"SIGTERM\", handleProcessSignal);\n\n const question: UIQuestion = async (prompt, questionOptions = {}) => {\n inputQuestionController?.abort();\n const previousInteraction = interactionDone;\n let release!: () => void;\n interactionDone = new Promise<void>(resolve => { release = resolve; });\n const controller = new AbortController();\n activeQuestion = controller;\n try {\n await previousInteraction;\n return await terminal.question(prompt, {\n ...questionOptions,\n signal: questionOptions.signal === undefined ? controller.signal : AbortSignal.any([controller.signal, questionOptions.signal]),\n });\n } finally {\n release();\n if (activeQuestion === controller) activeQuestion = undefined;\n }\n };\n\n const inputQuestion: UIQuestion = async (prompt, questionOptions = {}) => {\n await interactionDone;\n const controller = new AbortController();\n inputQuestionController = controller;\n inputContinuation = prompt.endsWith(\"... \");\n activeQuestion = controller;\n try { return await terminal.question(prompt, { ...questionOptions, signal: controller.signal }); }\n finally {\n if (activeQuestion === controller) activeQuestion = undefined;\n if (inputQuestionController === controller) inputQuestionController = undefined;\n }\n };\n\n const removeInterrupt = terminal.onInterrupt?.(() => {\n if (app.isRunning) {\n terminal.write(\"\\nCancelling current operation...\\n\");\n app.cancel(\"Interrupted\");\n activeQuestion?.abort();\n } else {\n exit = true;\n activeQuestion?.abort();\n }\n });\n\n const web = new MaybeCodeTerminalWeb(app, handleProcessSignal);\n const eventTask = consumeEvents(app, renderer, question, web.events, () => {\n if (inputQuestionController !== undefined) terminal.updatePrompt?.(inputPrompt(app.permissionMode === \"yolo\", inputContinuation, gitLabel));\n });\n const refreshWorkspace = async () => {\n if (!app.getWorkspaceGit || terminalClosed) return;\n try { gitLabel = workspaceGitLabel(await app.getWorkspaceGit()); }\n catch (error) { gitLabel = `Git \u9519\u8BEF\uFF1A${sanitizeTerminalText(errorMessage(error))}`; }\n if (inputQuestionController) terminal.updatePrompt?.(inputPrompt(app.permissionMode === \"yolo\", inputContinuation, gitLabel));\n };\n await refreshWorkspace();\n let refreshingWorkspace = false;\n const workspaceTimer = app.getWorkspaceGit ? setInterval(() => {\n if (refreshingWorkspace || terminalClosed) return;\n refreshingWorkspace = true; void refreshWorkspace().finally(() => { refreshingWorkspace = false; });\n }, 2_000) : undefined;\n terminal.write(sanitizeTerminalText(\n `MaybeCode\\nWorkspace: ${app.workspace}\\n` +\n `Model: ${modelLabel(app)}\\n` +\n (app.permissionMode === \"yolo\" ? \"YOLO \u00B7 Auto-approve\\n\" : \"\") +\n `${renderInstructionSources(app)}` +\n \"Type /help for commands. End a line with \\\\ for multiline input.\\n\",\n ));\n\n try {\n while (!exit) {\n let input: string;\n try {\n input = await readInput(inputQuestion, slashCommandSuggestions, () => app.permissionMode === \"yolo\", () => gitLabel);\n } catch (error) {\n if (isAbortError(error)) {\n if (exit) break;\n continue;\n }\n throw error;\n }\n\n if (input === \"\") continue;\n terminal.addHistory?.(input);\n if (input.startsWith(\"/\")) {\n try {\n exit = await handleCommand(input, app, terminal, question, web, observeRun);\n } catch (error) {\n if (!isCancellation(error) && !isAbortError(error)) {\n terminal.write(\n `\\nError: ${sanitizeTerminalText(errorMessage(error))}\\n`,\n );\n }\n }\n continue;\n }\n\n try {\n const run = await app.submit({ input });\n observeRun(run.result);\n } catch (error) {\n if (!isCancellation(error)) {\n terminal.write(\n `\\nError: ${sanitizeTerminalText(errorMessage(error))}\\n`,\n );\n }\n }\n }\n } finally {\n process.removeListener(\"SIGINT\", handleProcessSignal);\n if (workspaceTimer) clearInterval(workspaceTimer);\n process.removeListener(\"SIGTERM\", handleProcessSignal);\n activeQuestion?.abort();\n removeInterrupt?.();\n // Restore readline/raw terminal state before potentially slow application\n // cancellation and event-drain work.\n closeTerminal();\n await web.close();\n await Promise.all(pendingRuns);\n await eventTask;\n }\n}\n\nasync function consumeEvents(\n app: MaybeCodeController,\n renderer: TerminalRenderer,\n question: UIQuestion,\n events: AsyncIterable<MaybeCodeEvent>,\n permissionModeChanged: () => void,\n): Promise<void> {\n const pending = new Map<string, AbortController>();\n let lastGoalDisplay = \"\";\n let prompts = Promise.resolve();\n const enqueue = (id: string, work: (signal: AbortSignal) => Promise<void>, expiresAt?: number) => {\n const controller = new AbortController();\n pending.set(id, controller);\n const signal = expiresAt === undefined ? controller.signal : AbortSignal.any([controller.signal, AbortSignal.timeout(Math.max(0, Math.ceil(expiresAt - Date.now())))]);\n prompts = prompts.then(async () => { if (!signal.aborted) await work(signal); }).catch(() => {\n if (!signal.aborted) {\n renderer.write(\"\\nInteraction could not be completed.\\n\");\n app.cancel(\"User interaction is unavailable\");\n }\n }).finally(() => pending.delete(id));\n };\n for await (const event of events) {\n if (event.type === \"goal.changed\") {\n const display = `${event.goal.id}:${event.goal.status}:${event.goal.progress}`;\n if (display !== lastGoalDisplay) {\n lastGoalDisplay = display;\n renderer.write(`\\n${sanitizeTerminalText(formatGoal(event.goal))}\\n`);\n }\n } else if (event.type === \"permission-mode.changed\") {\n permissionModeChanged();\n renderer.write(event.mode === \"yolo\" ? \"\\nYOLO enabled\\n\" : \"\\nYOLO disabled\\n\");\n } else if (event.type === \"run.event\") {\n await renderer.runEvent(event.event);\n } else if (event.type === \"permission.event\") {\n if (event.event.type === \"approval.requested\") {\n enqueue(`approval:${event.event.request.id}`, (signal) => handlePermissionEvent(event.event, app, renderer,\n (prompt, options) => question(prompt, { ...options, signal })));\n } else {\n if (event.event.type === \"approval.resolved\" || event.event.type === \"approval.cancelled\") pending.get(`approval:${event.event.requestId}`)?.abort();\n renderer.permissionEvent(event.event);\n }\n } else if (event.type === \"mcp.interaction.requested\") {\n enqueue(event.request.id, (signal) => presentMcpInteraction(event.request, app,\n (prompt, signal) => question(prompt, { history: false, signal }), signal), event.request.expiresAt);\n } else if (event.type === \"mcp.interaction.settled\") {\n pending.get(event.requestId)?.abort();\n } else if (event.type === \"change.preview\") {\n renderer.changePreview(event);\n } else if (event.type === \"context.compacted\") {\n renderer.contextCompacted(event);\n } else if (event.type === \"context.compaction.failed\") {\n renderer.contextCompactionFailed(event);\n } else if (event.type === \"model.changed\") {\n renderer.modelChanged(event.model);\n } else if (event.type === \"model.default.changed\") {\n renderer.defaultModelChanged(event.profile);\n } else if (\n event.type === \"delegation.started\" ||\n event.type === \"delegation.finished\"\n ) {\n renderer.delegationLifecycle(event, app.delegationNotifications === true);\n } else if (event.type === \"delegation.event\") {\n const inner = event.event;\n if (inner.type === \"permission.event\") {\n if (inner.event.type === \"approval.requested\") {\n enqueue(`approval:${inner.event.request.id}`, (signal) => handlePermissionEvent(inner.event, app, renderer,\n (prompt, options) => question(prompt, { ...options, signal })));\n } else {\n if (inner.event.type === \"approval.resolved\" || inner.event.type === \"approval.cancelled\") {\n pending.get(`approval:${inner.event.requestId}`)?.abort();\n }\n renderer.permissionEvent(inner.event);\n }\n } else {\n await renderer.delegationEvent(event);\n }\n } else if (event.type === \"delegation.updated\") {\n renderer.delegationState(event.state, app.delegationNotifications === true);\n } else if (\n event.type === \"mcp.resource.updated\" ||\n event.type === \"mcp.resource.watch-closed\" ||\n event.type === \"mcp.server.connected\" ||\n event.type === \"mcp.server.catalog-updated\" ||\n event.type === \"mcp.server.failed\" ||\n event.type === \"mcp.server.disconnected\"\n ) {\n renderer.mcpEvent(event);\n } else if (event.type === \"workspace.git.changed\") {\n if (event.checkpoint.error) renderer.write(`\\nGit checkpoint\uFF1A${sanitizeTerminalText(event.checkpoint.error)}\\n`);\n } else if (event.type === \"session.changed\") {\n await renderer.sessionChanged(event, app);\n }\n }\n for (const controller of pending.values()) controller.abort();\n await prompts;\n}\n\nasync function handlePermissionEvent(\n event: PermissionEvent,\n app: MaybeCodeController,\n renderer: TerminalRenderer,\n question: UIQuestion,\n): Promise<void> {\n if (event.type !== \"approval.requested\") {\n renderer.permissionEvent(event);\n return;\n }\n\n renderer.approvalRequest(event.request);\n while (true) {\n const choices = event.request.grantKey === undefined\n ? \"[a]llow once / [d]eny\"\n : permissionChoices(event.request.tool.name) + (event.request.persistent ? ` / [p]ersistent (${event.request.persistent.description})` : \"\");\n let answer: string;\n try {\n answer = (await question(`${choices}: `, { history: false }))\n .trim()\n .toLowerCase();\n } catch (error) {\n if (isAbortError(error)) return;\n throw error;\n }\n\n const decision = answer === \"a\" || answer === \"allow\" || answer === \"y\"\n ? \"allow\"\n : answer === \"d\" || answer === \"deny\" || answer === \"n\"\n ? \"deny\"\n : answer === \"s\" || answer === \"session\"\n ? \"allow-session\"\n : answer === \"p\" || answer === \"persistent\"\n ? \"allow-persistent\"\n : undefined;\n if (decision === undefined) {\n renderer.write(event.request.persistent ? \"\u8BF7\u8F93\u5165 a\u3001s\u3001p \u6216 d\u3002\\n\" : \"\u8BF7\u8F93\u5165 a\u3001s \u6216 d\u3002\\n\");\n continue;\n }\n if (decision === \"allow-session\" && event.request.grantKey === undefined) {\n renderer.write(\"This request cannot be granted for the session.\\n\");\n continue;\n }\n if (decision === \"allow-persistent\" && !event.request.persistent) {\n renderer.write(\"\u6B64\u8BF7\u6C42\u6CA1\u6709\u53EF\u4FDD\u5B58\u7684\u6388\u6743\u8303\u56F4\u3002\\n\");\n continue;\n }\n await app.resolveApproval(event.request.id, decision, decision === \"allow-persistent\" ? { createdBy: `local:${userInfo().username}` } : undefined);\n return;\n }\n}\n\nasync function handleCommand(\n input: string,\n app: MaybeCodeController,\n terminal: TerminalIO,\n question: UIQuestion,\n web: MaybeCodeTerminalWeb,\n observeRun: (result: Promise<unknown>) => void,\n): Promise<boolean> {\n const parsed = parseMaybeCodeSlashCommand(input);\n if (\n parsed.type === \"command\" &&\n parsed.definition.name === \"/retry\" &&\n parsed.arguments.length === 0\n ) {\n terminal.write(\"\\nRetrying the latest failed run...\\n\");\n }\n if (\n parsed.type === \"command\" &&\n parsed.definition.name === \"/compact\" &&\n parsed.arguments.length === 0\n ) {\n terminal.write(\"\\nPruning old tool results and summarizing context...\\n\");\n }\n\n const result = await executeMaybeCodeSlashCommand(input, app);\n if (result.type === \"web.requested\") {\n terminal.write(`\\nWeb UI \u5DF2\u6253\u5F00\uFF1A${await web.open()}\\n`);\n return false;\n }\n return renderSlashCommandResult(result, app, terminal, question, observeRun);\n}\n\nasync function renderSlashCommandResult(\n result: MaybeCodeSlashCommandResult,\n app: MaybeCodeController,\n terminal: TerminalIO,\n question: UIQuestion,\n observeRun: (result: Promise<unknown>) => void,\n): Promise<boolean> {\n switch (result.type) {\n case \"exit\":\n return true;\n case \"help\":\n terminal.write(`\\n${renderSlashCommandHelp(result.commands)}`);\n break;\n case \"instructions\":\n terminal.write(sanitizeTerminalText(\n `\\n${renderInstructionSources(app)}` +\n `Effective instructions:\\n---\\n${result.instructions.effective}\\n---\\n`,\n ));\n break;\n case \"mcp.run-started\":\n case \"skill.run-started\":\n case \"retry.started\":\n observeRun(result.run.result);\n break;\n case \"status\":\n terminal.write(`\\n${renderStatus(app, result.inspection)}`);\n break;\n case \"display\":\n case \"mcp.display\":\n terminal.write(`\\n${sanitizeTerminalText(result.text)}\\n`);\n break;\n case \"mcp.status\":\n terminal.write(\n `\\n${sanitizeTerminalText(formatMaybeCodeMcpStatus(result.servers))}\\n`,\n );\n break;\n case \"context\":\n terminal.write(\n result.inspection === undefined\n ? \"\\nContext inspection is not supported by the active context.\\n\"\n : `\\n${renderContextInspection(result.inspection)}`,\n );\n break;\n case \"compacted\":\n terminal.write(`\\n${renderCompactionResult(result.result)}`);\n break;\n case \"session.created\":\n terminal.write(`\\nCreated session ${result.sessionId}\\n`);\n break;\n case \"session.selection.requested\": {\n const selection = await runSessionPicker({\n controller: app,\n terminal,\n sessions: result.sessions,\n question: (prompt) => question(prompt, { history: false }),\n });\n if (selection.type === \"empty\") {\n terminal.write(\"\\nNo sessions found for this workspace.\\n\");\n } else if (selection.type === \"resume\") {\n await app.resumeSession(selection.sessionId);\n terminal.write(`\\nResumed session ${selection.sessionId}\\n`);\n }\n break;\n }\n case \"fork.selection.requested\": {\n const selection = await runForkPicker({ points: result.points, currentSessionId: app.sessionId, terminal, question: prompt => question(prompt, { history: false }) });\n if (selection) {\n if (!app.forkSession) throw new Error(\"Session \u5206\u652F\u80FD\u529B\u4E0D\u53EF\u7528\u3002\");\n const id = await app.forkSession(selection.pointId, selection.mode);\n terminal.write(sanitizeTerminalText(`\\nSession \u5206\u652F\u5DF2\u521B\u5EFA\uFF1A${id}\\n`));\n }\n break;\n }\n case \"changes.selection.requested\":\n await runChangesPicker(terminal, result.diff, app);\n break;\n case \"worktrees.display\":\n terminal.write(sanitizeTerminalText(`\\n${result.worktrees.length ? result.worktrees.map(item => `${item.id}\\n${item.path}\\n${item.branch} \u00B7 ${item.status} \u00B7 ${item.commit.slice(0, 12)}`).join(\"\\n\\n\") : \"\u6CA1\u6709\u5DF2\u767B\u8BB0\u7684 worktree\u3002\"}\\n`));\n break;\n case \"session.resumed\":\n terminal.write(`\\nResumed session ${result.sessionId}\\n`);\n break;\n case \"model.selection.requested\": {\n let models = result.models;\n while (true) {\n const selection = await runModelPicker({\n controller: app,\n terminal,\n models,\n question: (prompt) => question(prompt, { history: false }),\n });\n if (selection.type === \"empty\") {\n terminal.write(\"\\nNo model profiles are configured.\\n\");\n break;\n }\n if (selection.type === \"cancelled\") break;\n if (selection.type === \"select\") {\n await app.switchModel(selection.profile);\n break;\n }\n await app.setDefaultModel(selection.profile);\n models = await app.listModels();\n }\n break;\n }\n case \"model.switched\":\n break;\n case \"model.not-found\":\n terminal.write(\n `\\nNo model profile starts with: ` +\n `${sanitizeTerminalText(result.query)}\\n`,\n );\n break;\n case \"effort.selection.requested\": {\n if (result.state.status !== \"known\") {\n terminal.write(`\\n${renderReasoningEffortState(result.state)}\\n`);\n break;\n }\n const choices = [\"default\", ...result.state.efforts];\n terminal.write(`\\n${renderReasoningEffortState(result.state)}`);\n for (const [index, effort] of choices.entries()) {\n terminal.write(\n ` ${index + 1}. ${sanitizeTerminalText(effort)}\\n`,\n );\n }\n const answer = (await question(\n \"Select an effort number or name (Enter to cancel): \",\n { history: false },\n )).trim().toLowerCase();\n if (answer !== \"\") {\n const numeric = Number(answer);\n const selected = Number.isSafeInteger(numeric) && numeric > 0\n ? choices[numeric - 1]\n : choices.find((choice) => choice.startsWith(answer));\n if (selected === undefined) {\n terminal.write(\n `\\nNo reasoning effort starts with: ` +\n `${sanitizeTerminalText(answer)}\\n`,\n );\n } else {\n const state = await app.setReasoningEffort(\n selected === \"default\" ? undefined : selected,\n );\n terminal.write(`\\n${renderReasoningEffortChanged(state)}\\n`);\n }\n }\n break;\n }\n case \"effort.changed\":\n terminal.write(`\\n${renderReasoningEffortChanged(result.state)}\\n`);\n break;\n case \"effort.not-found\":\n terminal.write(\n `\\nNo reasoning effort starts with: ` +\n `${sanitizeTerminalText(result.query)}\\n`,\n );\n break;\n case \"usage\":\n terminal.write(`\\nUsage: ${sanitizeTerminalText(result.usage)}\\n`);\n break;\n case \"unknown\":\n terminal.write(\n `\\nUnknown command: ${sanitizeTerminalText(result.command)}. ` +\n \"Type /help.\\n\",\n );\n break;\n }\n return false;\n}\n\nfunction renderReasoningEffortState(\n state: MaybeCodeReasoningEffortState,\n): string {\n if (state.status === \"unknown\") {\n return \"Reasoning effort capability is unknown for the active model.\";\n }\n if (state.status === \"unsupported\") {\n return \"The active model does not support effort-based reasoning.\";\n }\n const current = sanitizeTerminalText(\n state.effectiveEffort ?? \"provider/model default\",\n );\n return `Reasoning effort (source: ${sanitizeTerminalText(state.source)}, ` +\n `current: ${current})\\n`;\n}\n\nfunction renderReasoningEffortChanged(\n state: MaybeCodeReasoningEffortState,\n): string {\n const effort = sanitizeTerminalText(\n state.effectiveEffort ?? \"provider/model default\",\n );\n return `Reasoning effort: ${effort}${state.overridden ? \" (runtime override)\" : \"\"}`;\n}\n\nfunction renderSlashCommandHelp(\n commands: readonly MaybeCodeSlashCommand[],\n): string {\n const entries = commands.map((command) => {\n const aliases = command.aliases === undefined\n ? \"\"\n : ` (alias ${command.aliases.join(\", \")})`;\n return ` ${command.usage}${aliases}\\n ${command.description}`;\n }).join(\"\\n\");\n return `Commands:\\n${entries}\\n` +\n \" Ctrl+C\\n Cancel the active operation, or exit while idle\\n\" +\n \" Multiline\\n End a line with \\\\ to continue on the next line\\n\";\n}\n\nfunction inputPrompt(yolo: boolean, continuation: boolean, gitLabel = \"\"): string {\n return `${continuation ? \"\" : \"\\n\"}${!continuation && gitLabel ? `[${gitLabel}] ` : \"\"}${yolo ? \"YOLO \u00B7 Auto-approve \" : \"\"}${continuation ? \"... \" : \"> \"}`;\n}\n\nasync function readInput(\n question: UIQuestion,\n suggestions: TerminalQuestionOptions[\"suggestions\"],\n yolo: () => boolean,\n gitLabel: () => string = () => \"\",\n): Promise<string> {\n const lines: string[] = [];\n while (true) {\n let line = await question(inputPrompt(yolo(), lines.length > 0, gitLabel()), {\n history: false,\n ...(lines.length === 0 && suggestions !== undefined\n ? { suggestions }\n : {}),\n });\n if (lines.length === 0 && suggestions !== undefined) {\n const candidates = await suggestions(line);\n line = candidates.length === 1 ? candidates[0]!.value : line;\n }\n const continuation = removeLineContinuation(line);\n lines.push(continuation.text);\n if (!continuation.continued) return lines.join(\"\\n\").trim();\n }\n}\n\nfunction removeLineContinuation(line: string): {\n readonly text: string;\n readonly continued: boolean;\n} {\n let backslashes = 0;\n for (let index = line.length - 1; index >= 0 && line[index] === \"\\\\\"; index--) {\n backslashes += 1;\n }\n if (backslashes % 2 === 0) return { text: line, continued: false };\n return { text: line.slice(0, -1), continued: true };\n}\n\nclass TerminalRenderer {\n private readonly images: TerminalImages;\n private textStarted = false;\n private reasoningStarted = false;\n private readonly changePreviews = new Map<string, ToolChangePreview>();\n private readonly delegationStatus = new Map<string, string>();\n private lastDelegationKey = \"\";\n private label = \"\";\n private readonly toolOutputState = new Map<\n string,\n { endsWithNewline: boolean; channel?: string }\n >();\n\n constructor(private readonly terminal: TerminalIO) {\n this.images = new TerminalImages(undefined, terminal.imageSupport?.protocol, { cellSize: () => terminal.imageSupport?.cellSize });\n }\n\n write(text: string): void {\n this.terminal.write(text);\n }\n\n private tagged(text: string): string {\n return this.label === \"\" ? text : `${this.label} ${text}`;\n }\n\n async runEvent(event: MayEvent): Promise<void> {\n switch (event.type) {\n case \"input.received\":\n this.endReasoning();\n for (const message of event.messages) {\n this.terminal.write(`\\nYou: ${sanitizeTerminalText(textFromContent(message.content))}\\n`);\n }\n break;\n case \"model.started\":\n this.textStarted = false;\n this.reasoningStarted = false;\n break;\n case \"model.reasoning.delta\":\n if (!this.reasoningStarted) {\n this.terminal.write(`\\n${this.dim(\"[thinking] \")}`);\n this.reasoningStarted = true;\n }\n this.terminal.write(this.dim(sanitizeTerminalText(event.delta)));\n break;\n case \"model.text.delta\":\n this.endReasoning();\n if (!this.textStarted) {\n this.terminal.write(this.label === \"\" ? \"\\nMaybeCode: \" : `\\n${this.label} Sub-agent: `);\n this.textStarted = true;\n }\n this.terminal.write(sanitizeTerminalText(event.delta));\n break;\n case \"model.retrying\":\n this.endReasoning();\n if (this.textStarted) this.terminal.write(\"\\n\");\n this.terminal.write(\n `\\nModel request failed: ${sanitizeTerminalText(event.error.message)}. ` +\n `Retrying in ${formatDelay(event.delayMs)} ` +\n `(attempt ${event.attempt}/${event.maxAttempts})...\\n`,\n );\n this.textStarted = false;\n this.reasoningStarted = false;\n break;\n case \"model.completed\": {\n this.endReasoning();\n if (event.message.content.some(part => part.type === \"image\")) {\n this.terminal.write(\"\\nMaybeCode \u00B7 \u5B8C\u6574\u56FE\u6587\u56DE\u590D\uFF1A\\n\");\n await this.renderContent(event.message.content);\n break;\n }\n const text = textFromContent(event.message.content);\n if (!this.textStarted && text !== \"\") {\n this.terminal.write(`\\nMaybeCode: ${sanitizeTerminalText(text)}`);\n this.textStarted = true;\n }\n if (this.textStarted) this.terminal.write(\"\\n\");\n break;\n }\n case \"tool.started\":\n this.terminal.write(\n `\\n${this.tagged(`\u2192 ${sanitizeTerminalText(event.call.name)}${toolInputSummary(\n event.call.name,\n event.call.input,\n )}`)}\\n`,\n );\n break;\n case \"tool.output.delta\": {\n const key = toolCallKey(event.runId, event.call.id);\n const previous = this.toolOutputState.get(key);\n if (\n previous !== undefined &&\n !previous.endsWithNewline &&\n previous.channel !== event.channel\n ) {\n this.terminal.write(\"\\n\");\n }\n if (previous === undefined || previous.endsWithNewline ||\n previous.channel !== event.channel) {\n this.terminal.write(\n event.channel === undefined\n ? \"\"\n : `[${sanitizeTerminalText(event.channel)}] `,\n );\n }\n this.terminal.write(sanitizeTerminalText(event.delta));\n this.toolOutputState.set(key, {\n endsWithNewline: event.delta.endsWith(\"\\n\"),\n ...(event.channel === undefined ? {} : { channel: event.channel }),\n });\n break;\n }\n case \"tool.progress\":\n this.endToolOutput(event.runId, event.call.id);\n this.terminal.write(\n `\u21B3 ${sanitizeTerminalText(event.call.name)}: ` +\n `${sanitizeTerminalText(event.message)}\\n`,\n );\n break;\n case \"tool.completed\":\n this.endToolOutput(event.runId, event.call.id);\n this.renderToolCompleted(event);\n if (event.content.some(part => part.type === \"image\")) await this.renderContent(event.content);\n break;\n case \"tool.failed\":\n this.endToolOutput(event.runId, event.call.id);\n this.changePreviews.delete(toolCallKey(event.runId, event.call.id));\n this.terminal.write(\n `\\n${this.tagged(`\u2717 ${sanitizeTerminalText(event.call.name)}: ` +\n `${sanitizeTerminalText(event.error.message)}`)}\\n`,\n );\n break;\n case \"run.completed\":\n case \"run.yielded\":\n this.clearRunPreviews(event.runId);\n break;\n case \"run.failed\":\n this.clearRunPreviews(event.runId);\n this.terminal.write(\n `\\n${this.tagged(`Run failed: ${sanitizeTerminalText(event.error.message)}`)}\\n`,\n );\n break;\n case \"run.cancelled\":\n this.clearRunPreviews(event.runId);\n this.terminal.write(\n `\\n${this.tagged(`Run cancelled${\n event.reason === undefined\n ? \"\"\n : `: ${sanitizeTerminalText(event.reason)}`\n }`)}\\n`,\n );\n break;\n }\n }\n\n private async renderContent(content: readonly ContentPart[]): Promise<void> {\n await this.images.prepare(content);\n for (const part of content) {\n if (part.type === \"text\") this.terminal.write(sanitizeTerminalText(part.text) + \"\\n\");\n if (part.type === \"image\") {\n const result = this.images.render(part.source, { width: process.stdout.columns || 80, height: 30 });\n const image = result.images?.[0];\n this.terminal.write(result.lines.slice(0, image?.y ?? result.lines.length).join(\"\\n\") + \"\\n\");\n if (image) {\n this.terminal.write(\"\\n\".repeat(image.rows) + `\\x1b[${image.rows}A\\x1b7` + encodeImage(image) + `\\x1b8\\x1b[${image.rows}B\\r`);\n }\n }\n }\n }\n\n changePreview(\n event: Extract<MaybeCodeEvent, { type: \"change.preview\" }>,\n ): void {\n this.changePreviews.set(\n toolCallKey(event.runId, event.toolCallId),\n event.preview,\n );\n if (event.preview.status === \"unavailable\") {\n this.terminal.write(\n `\\nDiff unavailable for ${event.preview.tool} ` +\n `${sanitizeTerminalText(event.preview.path)}: ` +\n `${sanitizeTerminalText(event.preview.reason)}\\n`,\n );\n return;\n }\n\n this.terminal.write(\n `\\nChange preview: ${sanitizeTerminalText(event.preview.path)} ` +\n `(${changeKindLabel(event.preview.kind)})\\n`,\n );\n this.terminal.write(\n event.preview.diff === \"\"\n ? \"(no content changes)\\n\"\n : `${sanitizeTerminalText(event.preview.diff)}\\n`,\n );\n }\n\n contextCompacted(\n event: Extract<MaybeCodeEvent, { type: \"context.compacted\" }>,\n ): void {\n const saved = Math.max(\n 0,\n event.before.estimatedTokens - event.after.estimatedTokens,\n );\n this.terminal.write(\n `\\nContext automatically compacted with ${event.strategy}: ` +\n `${event.before.messageCount} -> ${event.after.messageCount} messages, ` +\n `~${formatNumber(saved)} tokens saved.\\n`,\n );\n }\n\n contextCompactionFailed(\n event: Extract<MaybeCodeEvent, { type: \"context.compaction.failed\" }>,\n ): void {\n const next = event.continuing\n ? \" Trying the next strategy.\"\n : \" No fallback strategies remain.\";\n const message = sanitizeTerminalText(event.error.message)\n .replace(/[.!?]+$/u, \"\");\n this.terminal.write(\n `\\nAutomatic context compaction failed with ${event.strategy} at ` +\n `~${formatNumber(event.before.effectiveTokens)} tokens: ` +\n `${message}.${next}\\n`,\n );\n }\n\n permissionEvent(event: PermissionEvent): void {\n if (event.type === \"approval.resolved\") {\n this.terminal.write(`Permission: ${event.decision}\\n`);\n } else if (event.type === \"approval.cancelled\") {\n this.terminal.write(\"Permission request cancelled.\\n\");\n }\n }\n\n approvalRequest(request: ApprovalRequest): void {\n const preview = this.changePreviews.get(\n toolCallKey(request.context.runId, request.context.toolCallId),\n );\n if (preview !== undefined) {\n this.terminal.write(\n `\\nApproval required for ${sanitizeTerminalText(request.tool.name)}: ` +\n `${sanitizeTerminalText(preview.path)}\\n`,\n );\n return;\n }\n this.terminal.write(\n `\\nApproval required for ${sanitizeTerminalText(request.tool.name)}:\\n` +\n `${sanitizeTerminalText(truncate(stringify(request.input), 1200))}\\n`,\n );\n }\n\n async sessionChanged(\n event: Extract<MaybeCodeEvent, { type: \"session.changed\" }>,\n app: MaybeCodeController,\n ): Promise<void> {\n this.terminal.write(\n `\\nSession ${event.resumed ? \"resumed\" : \"started\"}: ${event.sessionId}\\n`,\n );\n if (!event.resumed) return;\n if (app.sessionId !== event.sessionId) return;\n const history = await app.history();\n const steering = new Map(history.flatMap(event => event.type === \"input.steering.queued\" ? [[event.input.inputId, event.input.message] as const] : []));\n for (const event of history) {\n if (event.type === \"assistant.completed\" && event.message.content.some(part => part.type === \"image\")) await this.renderContent(event.message.content);\n else renderHistory([event], this.terminal, steering);\n }\n }\n\n modelChanged(model: NonNullable<MaybeCodeController[\"modelInfo\"]>): void {\n const profile = model.profile === undefined\n ? \"\"\n : ` ${sanitizeTerminalText(model.profile)}`;\n this.terminal.write(\n `\\nModel switched to${profile}: ` +\n `${sanitizeTerminalText(model.provider)}/` +\n `${sanitizeTerminalText(model.model)}\\n`,\n );\n }\n\n defaultModelChanged(profile: string): void {\n this.terminal.write(\n `\\nDefault model set to ${sanitizeTerminalText(profile)}\\n`,\n );\n }\n\n /** \u5B50 Agent \u8BF7\u6C42\u7684\u5F00\u59CB\u4E0E\u7ED3\u675F\uFF0C\u5305\u542B\u6574\u68F5\u4EFB\u52A1\u6811\u3002 */\n delegationLifecycle(\n event: Extract<MaybeCodeEvent, { type: \"delegation.started\" | \"delegation.finished\" }>,\n enabled: boolean,\n ): void {\n if (event.type === \"delegation.started\") {\n this.delegationStatus.clear();\n this.lastDelegationKey = \"\";\n }\n if (!enabled) return;\n this.write(\n `\\n${event.type === \"delegation.started\" ? \"Sub-agent request\" : \"Sub-agent request finished\"} ` +\n `${sanitizeTerminalText(event.state.requestId)}\\n`,\n );\n for (const task of delegationOrder(event.state.tasks)) {\n this.write(`${sanitizeTerminalText(renderDelegationTask(task))}\\n`);\n }\n }\n\n /** \u5B50\u4EFB\u52A1\u8FD0\u884C\u671F\u95F4\u7684\u72B6\u6001\u53D8\u5316\uFF1B\u72B6\u6001\u672A\u53D8\u5316\u65F6\u4E0D\u91CD\u590D\u663E\u793A\u3002 */\n delegationState(state: MaybeCodeDelegationState, enabled: boolean): void {\n const key = `${state.tasks.map((task) => `${task.id}:${task.status}`).join(\"|\")}#${state.status}`;\n if (key === this.lastDelegationKey) return;\n this.lastDelegationKey = key;\n for (const task of delegationOrder(state.tasks)) {\n if (this.delegationStatus.get(task.id) === task.status) continue;\n this.delegationStatus.set(task.id, task.status);\n if (enabled) this.write(`${sanitizeTerminalText(renderDelegationTask(task))}\\n`);\n }\n }\n\n /** \u4E00\u4E2A\u5B50 Agent Run \u4E8B\u4EF6\uFF0C\u5E26\u4E0A\u4EFB\u52A1\u8EAB\u4EFD\u524D\u7F00\u3002 */\n async delegationEvent(\n event: Extract<MaybeCodeEvent, { type: \"delegation.event\" }>,\n ): Promise<void> {\n if (event.event.type !== \"run.event\") {\n this.endReasoning();\n this.write(`\\n[${event.taskId}] ${sanitizeTerminalText(describeApplicationEvent(event.event))}\\n`);\n return;\n }\n this.label = `[${event.taskId}]`;\n try {\n await this.runEvent(event.event.event);\n } finally {\n this.label = \"\";\n }\n }\n\n mcpEvent(\n event: Extract<MaybeCodeEvent, { type: `mcp.server.${string}` | `mcp.resource.${string}` }>,\n ): void {\n if (event.type === \"mcp.resource.updated\" || event.type === \"mcp.resource.watch-closed\") {\n this.terminal.write(`\\n${sanitizeTerminalText(`${event.type}: ${event.serverId} ${event.uri}${event.type === \"mcp.resource.watch-closed\" ? ` (${event.reason})` : \"\"}`)}\\n`);\n return;\n }\n if (event.type === \"mcp.server.catalog-updated\") {\n this.terminal.write(`\\nMCP catalog updated: ${sanitizeTerminalText(event.serverId)} (revision ${event.revision})\\n`);\n return;\n }\n if (event.type === \"mcp.server.connected\") {\n this.terminal.write(\n `\\nMCP server connected: ${sanitizeTerminalText(event.serverId)} ` +\n `(${event.toolNames.length} tools)\\n`,\n );\n return;\n }\n if (event.type === \"mcp.server.failed\") {\n this.terminal.write(\n `\\nMCP server failed: ${sanitizeTerminalText(event.serverId)}: ` +\n `${sanitizeTerminalText(event.diagnostic.message)}\\n`,\n );\n return;\n }\n this.terminal.write(\n `\\nMCP server disconnected: ${sanitizeTerminalText(event.serverId)}\\n`,\n );\n }\n\n private endReasoning(): void {\n if (!this.reasoningStarted) return;\n this.terminal.write(this.terminal.colors ? \"\\x1b[0m\\n\" : \"\\n\");\n this.reasoningStarted = false;\n }\n\n private dim(text: string): string {\n return this.terminal.colors ? `\\x1b[2m${text}\\x1b[0m` : text;\n }\n\n private renderToolCompleted(\n event: Extract<MayEvent, { type: \"tool.completed\" }>,\n ): void {\n const key = toolCallKey(event.runId, event.call.id);\n const preview = this.changePreviews.get(key);\n this.changePreviews.delete(key);\n if (preview?.status === \"ready\") {\n this.terminal.write(\n `${this.tagged(`\u2713 ${sanitizeTerminalText(event.call.name)}: ` +\n `${sanitizeTerminalText(preview.path)} ` +\n `(${changeKindLabel(preview.kind)}, ` +\n `+${preview.additions} -${preview.deletions})`)}\\n`,\n );\n return;\n }\n this.terminal.write(\n `${this.tagged(`${toolResultMarker(event.output)} ${sanitizeTerminalText(event.call.name)}${\n toolResultSummary(event.output)\n }`)}\\n`,\n );\n }\n\n private clearRunPreviews(runId: string): void {\n const prefix = `${runId}:`;\n for (const key of this.changePreviews.keys()) {\n if (key.startsWith(prefix)) this.changePreviews.delete(key);\n }\n for (const key of this.toolOutputState.keys()) {\n if (key.startsWith(prefix)) this.toolOutputState.delete(key);\n }\n }\n\n private endToolOutput(runId: string, toolCallId: string): void {\n const key = toolCallKey(runId, toolCallId);\n const state = this.toolOutputState.get(key);\n this.toolOutputState.delete(key);\n if (state?.endsWithNewline === false) this.terminal.write(\"\\n\");\n }\n}\n\nfunction renderHistory(\n history: readonly SessionEvent[],\n terminal: TerminalIO,\n steering: ReadonlyMap<string, UserMessage>,\n): void {\n for (const event of history) {\n if (event.type === \"input.submitted\") {\n const text = textFromContent(event.message.content);\n if (text !== \"\") terminal.write(`You: ${sanitizeTerminalText(text)}\\n`);\n } else if (event.type === \"input.steering.delivered\") {\n for (const inputId of event.inputIds) {\n const message = steering.get(inputId);\n if (!message) throw new Error(`Missing steering input: ${inputId}`);\n const text = textFromContent(message.content);\n if (text !== \"\") terminal.write(`You: ${sanitizeTerminalText(text)}\\n`);\n }\n } else if (event.type === \"assistant.completed\") {\n const text = textFromContent(event.message.content);\n if (text !== \"\") {\n terminal.write(`MaybeCode: ${sanitizeTerminalText(text)}\\n`);\n }\n } else if (event.type === \"tool.completed\") {\n terminal.write(\n `${toolResultMarker(event.output)} ${sanitizeTerminalText(event.call.name)}${\n toolResultSummary(event.output)\n }\\n`,\n );\n } else if (event.type === \"tool.failed\") {\n terminal.write(\n `\u2717 ${sanitizeTerminalText(event.call.name)}: ` +\n `${sanitizeTerminalText(event.error.message)}\\n`,\n );\n }\n }\n}\n\nfunction textFromContent(content: readonly ContentPart[]): string {\n return content\n .filter((part) => part.type === \"text\")\n .map((part) => part.text)\n .join(\"\");\n}\n\nfunction toolResultSummary(output: unknown): string {\n if (typeof output !== \"object\" || output === null) return \"\";\n if (\"path\" in output && typeof output.path === \"string\") {\n return `: ${sanitizeTerminalText(output.path)}`;\n }\n if (\"exitCode\" in output && typeof output.exitCode === \"number\") {\n return `: exit ${output.exitCode}`;\n }\n return \"\";\n}\n\nfunction toolResultMarker(output: unknown): \"\u2713\" | \"\u2717\" {\n if (\n typeof output === \"object\" &&\n output !== null &&\n \"exitCode\" in output &&\n typeof output.exitCode === \"number\" &&\n output.exitCode !== 0\n ) {\n return \"\u2717\";\n }\n return \"\u2713\";\n}\n\nfunction permissionChoices(toolName: string): string {\n const scope = toolName === \"shell\" || toolName === \"bash\"\n ? \"same command\"\n : toolName === \"edit\" || toolName === \"write\"\n ? \"same path\"\n : \"same operation\";\n return `[a]llow once / allow ${scope} for [s]ession / [d]eny`;\n}\n\nfunction toolInputSummary(toolName: string, input: unknown): string {\n if (\n (toolName === \"edit\" || toolName === \"write\") &&\n typeof input === \"object\" &&\n input !== null &&\n \"path\" in input &&\n typeof input.path === \"string\"\n ) {\n return `: ${sanitizeTerminalText(input.path)}`;\n }\n return ` ${sanitizeTerminalText(truncate(stringify(input), 800))}`;\n}\n\nfunction toolCallKey(runId: string, toolCallId: string): string {\n return `${runId}:${toolCallId}`;\n}\n\nfunction delegationOrder(\n tasks: readonly MaybeCodeDelegationTask[],\n): readonly MaybeCodeDelegationTask[] {\n return [...tasks].sort((left, right) => left.depth - right.depth || left.id.localeCompare(right.id));\n}\n\nfunction describeApplicationEvent(event: AgentApplicationEvent): string {\n if (event.type === \"context.compacted\") {\n return `context compacted with ${event.strategy}: ${event.before.messageCount} -> ${event.after.messageCount} messages`;\n }\n if (event.type === \"context.compaction.failed\") {\n return `context compaction failed with ${event.strategy}: ${event.error.message}`;\n }\n if (event.type === \"tool.presentation\") return `tool presentation recorded`;\n return \"session event\";\n}\n\nfunction renderInstructionSources(app: MaybeCodeController): string {\n const system = app.instructions.system.source;\n const runtime = app.instructions.runtime?.source;\n const projects = app.instructions.projects;\n return `Instructions:\\n system: ${instructionSourceLabel(system)}\\n` +\n ` runtime: ${\n runtime === undefined ? \"none\" : instructionSourceLabel(runtime)\n }\\n` +\n ` project: ${\n projects.length === 0 ? \"none\" : projects.map(project => instructionSourceLabel(project.source)).join(\"\\n \")\n }\\n`;\n}\n\nfunction renderStatus(\n app: MaybeCodeController,\n inspection: ContextInspection | undefined,\n): string {\n let output = `Status:\\n` +\n ` model: ${modelLabel(app)}\\n` +\n ` session: ${sanitizeTerminalText(app.sessionId)}\\n` +\n ` workspace: ${sanitizeTerminalText(app.workspace)}\\n` +\n ` permissions: ${app.permissionMode === \"yolo\" ? \"YOLO \u00B7 Auto-approve\" : \"Default\"}\\n`;\n if (inspection === undefined) return `${output} context: unavailable\\n`;\n output += ` context: ~${formatNumber(inspection.effectiveTokens)}`;\n if (inspection.contextWindowTokens !== undefined) {\n output += ` / ${formatNumber(inspection.contextWindowTokens)} tokens ` +\n `(${((inspection.usageRatio ?? 0) * 100).toFixed(1)}%)`;\n } else {\n output += ` tokens (${inspection.measurementMethod})`;\n }\n return `${output}\\n`;\n}\n\nfunction modelLabel(app: MaybeCodeController): string {\n if (app.modelInfo === undefined) return \"custom\";\n const endpoint = `${sanitizeTerminalText(app.modelInfo.provider)}/` +\n sanitizeTerminalText(app.modelInfo.model);\n return app.modelInfo.profile === undefined\n ? endpoint\n : `${sanitizeTerminalText(app.modelInfo.profile)} (${endpoint})`;\n}\n\nfunction renderContextInspection(inspection: ContextInspection): string {\n const roles = inspection.messagesByRole;\n let output = `Context:\\n` +\n ` messages: ${inspection.messageCount} ` +\n `(system ${roles.system}, user ${roles.user}, ` +\n `assistant ${roles.assistant}, tool ${roles.tool})\\n` +\n ` instructions: ${formatBytes(inspection.instructionsBytes)}\\n` +\n ` message data: ${formatBytes(inspection.messageBytes)}\\n` +\n ` total: ${formatBytes(inspection.totalBytes)}\\n` +\n ` estimated tokens: ~${inspection.estimatedTokens} ` +\n `(${inspection.tokenEstimateMethod})\\n`;\n if (inspection.contextWindowTokens === undefined) {\n output += ` effective usage: ~${formatNumber(inspection.effectiveTokens)} ` +\n `(${inspection.measurementMethod})\\n`;\n } else {\n output += ` effective usage: ~${formatNumber(inspection.effectiveTokens)} / ` +\n `${formatNumber(inspection.contextWindowTokens)} ` +\n `(${((inspection.usageRatio ?? 0) * 100).toFixed(1)}%)\\n`;\n }\n if (inspection.measurementMethod === \"measured+estimated\") {\n output += ` measurement: ${formatNumber(\n inspection.measuredInputTokens ?? 0,\n )} measured + ~${formatNumber(\n inspection.estimatedTailTokens ?? 0,\n )} estimated tail\\n`;\n } else {\n output += \" measurement: estimated only\\n\";\n }\n if (inspection.remainingTokens !== undefined) {\n output += ` remaining: ${formatNumber(inspection.remainingTokens)} tokens\\n`;\n }\n if (inspection.inputBudgetTokens !== undefined) {\n output += ` input budget: ${formatNumber(inspection.inputBudgetTokens)} tokens`;\n if ((inspection.reservedTokens ?? 0) > 0) {\n output += ` (${formatNumber(inspection.reservedTokens ?? 0)} reserved)`;\n }\n output += \"\\n\";\n }\n if (inspection.compactTriggerTokens !== undefined) {\n output += ` compaction threshold: ${formatNumber(\n inspection.compactTriggerTokens,\n )} tokens (${inspection.shouldCompact === true ? \"reached\" : \"not reached\"})\\n`;\n }\n return output;\n}\n\nfunction renderCompactionResult(\n result: Awaited<ReturnType<MaybeCodeController[\"compactContext\"]>>,\n): string {\n if (!result.changed) {\n return `No context changes were eligible for ${result.strategy}.\\n`;\n }\n const saved = Math.max(\n 0,\n result.before.estimatedTokens - result.after.estimatedTokens,\n );\n const ratio = result.before.estimatedTokens === 0\n ? 0\n : saved / result.before.estimatedTokens * 100;\n return `Context compacted with ${result.strategy}:\\n` +\n ` messages: ${result.before.messageCount} -> ${result.after.messageCount}\\n` +\n ` estimated tokens: ~${formatNumber(result.before.estimatedTokens)} -> ` +\n `~${formatNumber(result.after.estimatedTokens)}\\n` +\n ` saved: ~${formatNumber(saved)} tokens (${ratio.toFixed(1)}%)\\n`;\n}\n\nfunction formatNumber(value: number): string {\n return value.toLocaleString(\"en-US\");\n}\n\nfunction formatDelay(milliseconds: number): string {\n return milliseconds < 1000\n ? `${milliseconds}ms`\n : `${(milliseconds / 1000).toFixed(milliseconds % 1000 === 0 ? 0 : 1)}s`;\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n return `${(bytes / 1024).toFixed(1)} KiB`;\n}\n\nfunction instructionSourceLabel(\n source: MaybeCodeController[\"instructions\"][\"system\"][\"source\"],\n): string {\n return source.type === \"file\" ? source.path : source.type;\n}\n\nfunction changeKindLabel(kind: FileChangeKind): string {\n switch (kind) {\n case \"create\":\n return \"created\";\n case \"update\":\n return \"updated\";\n case \"no-change\":\n return \"unchanged\";\n }\n}\n\nfunction stringify(value: unknown): string {\n try {\n return JSON.stringify(value, undefined, 2);\n } catch {\n return String(value);\n }\n}\n\nfunction truncate(text: string, limit: number): string {\n return text.length <= limit ? text : `${text.slice(0, limit)}\u2026`;\n}\n\nfunction isAbortError(error: unknown): boolean {\n return error instanceof Error && error.name === \"AbortError\";\n}\n\nfunction isCancellation(error: unknown): boolean {\n return error instanceof Error && error.name === \"RunCancelledError\";\n}\n\nfunction errorMessage(error: unknown): string {\n if (error instanceof Error) return error.message;\n return typeof error === \"string\" ? error : \"Unknown error\";\n}\n", "import type { KeyStroke } from \"@sortedyuan/keybindings\";\nimport { sanitizeTerminalText } from \"@sortedyuan/tui\";\nimport {\n ListSelectionModel,\n resolveListInput,\n type ListNavigationAction,\n} from \"@sortedyuan/tui/list-selection\";\n\nimport type {\n MaybeCodeController,\n MaybeCodeModelProfile,\n} from \"./controller.js\";\nimport { createMaybeCodeKeymap, type MaybeCodeKeyAction } from \"./keymap.js\";\nimport type { TerminalIO } from \"@sortedyuan/tui/node-terminal\";\n\nexport type ModelPickerResult =\n | { readonly type: \"cancelled\" }\n | { readonly type: \"empty\" }\n | { readonly type: \"select\"; readonly profile: string }\n | { readonly type: \"set-default\"; readonly profile: string };\n\nexport interface ModelPickerOptions {\n readonly controller: MaybeCodeController;\n readonly terminal: TerminalIO;\n readonly models: readonly MaybeCodeModelProfile[];\n readonly question: (prompt: string) => Promise<string>;\n}\n\nexport async function runModelPicker(\n options: ModelPickerOptions,\n): Promise<ModelPickerResult> {\n if (options.models.length === 0) return { type: \"empty\" };\n if (\n options.terminal.interactive !== true ||\n options.terminal.readKey === undefined ||\n options.terminal.renderView === undefined ||\n options.terminal.closeView === undefined\n ) {\n return runLineModelPicker(options);\n }\n\n const keymap = createMaybeCodeKeymap();\n const selection = new ListSelectionModel(options.models, {\n initialIndex: Math.max(\n 0,\n options.models.findIndex((model) =>\n model.name === options.controller.modelInfo?.profile\n ),\n ),\n pageSize: 10,\n });\n try {\n while (true) {\n options.terminal.renderView(sanitizeTerminalText(renderModelPicker(\n options.models,\n selection.selectedIndex,\n options.controller.modelInfo?.profile,\n )));\n const action = resolvePickerAction(\n keymap,\n await options.terminal.readKey(),\n );\n if (action === \"app.interrupt\" || action === \"list.cancel\") {\n return { type: \"cancelled\" };\n }\n if (action === \"list.accept\") {\n return { type: \"select\", profile: selection.selected!.name };\n }\n if (action === \"model.default.set\") {\n return {\n type: \"set-default\",\n profile: selection.selected!.name,\n };\n }\n const navigation = navigationAction(action);\n if (navigation !== undefined) selection.move(navigation);\n }\n } finally {\n options.terminal.closeView();\n }\n}\n\nasync function runLineModelPicker(\n options: ModelPickerOptions,\n): Promise<ModelPickerResult> {\n options.terminal.write(sanitizeTerminalText(`\\n${renderLineModelList(\n options.models,\n options.controller.modelInfo?.profile,\n )}`));\n const answer = (await options.question(\n \"Select a model number/name, or d <selection> to set default (Enter to cancel): \",\n )).trim();\n if (answer === \"\") return { type: \"cancelled\" };\n const defaultMatch = /^d\\s+(.+)$/iu.exec(answer);\n const selection = defaultMatch?.[1] ?? answer;\n const selected = resolveListInput(options.models, selection, (model) => model.name);\n if (selected === undefined) {\n throw new Error(`Unknown model selection: ${selection}`);\n }\n return {\n type: defaultMatch === null ? \"select\" : \"set-default\",\n profile: selected.name,\n };\n}\n\nfunction resolvePickerAction(\n keymap: ReturnType<typeof createMaybeCodeKeymap>,\n stroke: KeyStroke,\n): MaybeCodeKeyAction | undefined {\n const result = keymap.resolve(stroke, [\"global\", \"modelPicker\", \"select\"]);\n return result.type === \"action\"\n ? result.action as MaybeCodeKeyAction\n : undefined;\n}\n\nfunction navigationAction(\n action: MaybeCodeKeyAction | undefined,\n): ListNavigationAction | undefined {\n switch (action) {\n case \"list.up\":\n return \"up\";\n case \"list.down\":\n return \"down\";\n case \"list.pageUp\":\n return \"page-up\";\n case \"list.pageDown\":\n return \"page-down\";\n case \"list.home\":\n return \"home\";\n case \"list.end\":\n return \"end\";\n default:\n return undefined;\n }\n}\n\nfunction renderModelPicker(\n models: readonly MaybeCodeModelProfile[],\n selectedIndex: number,\n currentProfile: string | undefined,\n): string {\n const pageSize = 10;\n const start = Math.floor(selectedIndex / pageSize) * pageSize;\n let output = \"MaybeCode \u2014 Select model\\n\\n\";\n for (const [offset, model] of models.slice(start, start + pageSize).entries()) {\n const index = start + offset;\n const selected = index === selectedIndex ? \">\" : \" \";\n const current = model.name === currentProfile ? \" [current]\" : \"\";\n const defaultModel = model.isDefault ? \" [default]\" : \"\";\n output += `${selected} ${model.name}${current}${defaultModel}\\n` +\n ` ${model.provider}/${model.model} \u00B7 ${model.adapter}\\n`;\n }\n return output + \"\\n\u2191\u2193 move \u00B7 Enter select \u00B7 D set default \u00B7 Esc close\\n\";\n}\n\nfunction renderLineModelList(\n models: readonly MaybeCodeModelProfile[],\n currentProfile: string | undefined,\n): string {\n const lines = models.map((model, index) => {\n const current = model.name === currentProfile ? \" [current]\" : \"\";\n const defaultModel = model.isDefault ? \" [default]\" : \"\";\n return ` ${index + 1}. ${model.name}${current}${defaultModel}\\n` +\n ` ${model.provider}/${model.model} \u00B7 ${model.adapter}`;\n });\n return `Models:\\n${lines.join(\"\\n\")}\\n`;\n}\n", "import type { KeyStroke } from \"@sortedyuan/keybindings\";\nimport { sanitizeTerminalText } from \"@sortedyuan/tui\";\nimport {\n ListSelectionModel,\n printableKeyText,\n removeLastCodePoint,\n resolveListInput,\n type ListNavigationAction,\n} from \"@sortedyuan/tui/list-selection\";\n\nimport type { SessionSummary } from \"@sortedyuan/session/catalog\";\nimport type { MaybeCodeController } from \"./controller.js\";\nimport { createMaybeCodeKeymap, type MaybeCodeKeyAction } from \"./keymap.js\";\nimport type { TerminalIO } from \"@sortedyuan/tui/node-terminal\";\n\ntype PickerMode = \"browse\" | \"search\" | \"rename\" | \"delete\";\n\nexport type SessionPickerResult =\n | { readonly type: \"cancelled\" }\n | { readonly type: \"empty\" }\n | { readonly type: \"resume\"; readonly sessionId: string };\n\nexport interface SessionPickerOptions {\n readonly controller: MaybeCodeController;\n readonly terminal: TerminalIO;\n readonly sessions: readonly SessionSummary[];\n readonly question: (prompt: string) => Promise<string>;\n}\n\nexport async function runSessionPicker(\n options: SessionPickerOptions,\n): Promise<SessionPickerResult> {\n if (options.sessions.length === 0) return { type: \"empty\" };\n if (\n options.terminal.interactive !== true ||\n options.terminal.readKey === undefined ||\n options.terminal.renderView === undefined ||\n options.terminal.closeView === undefined\n ) {\n return runLineSessionPicker(options);\n }\n\n const keymap = createMaybeCodeKeymap();\n const selection = new ListSelectionModel(options.sessions, {\n pageSize: 10,\n filter: sessionMatches,\n });\n let mode: PickerMode = \"browse\";\n let renameText = \"\";\n let preview = false;\n let notice: string | undefined;\n\n try {\n while (true) {\n const visible = selection.items;\n const selected = selection.selected;\n options.terminal.renderView(sanitizeTerminalText(renderSessionPicker({\n sessions: visible,\n selectedIndex: selection.selectedIndex,\n currentSessionId: options.controller.sessionId,\n mode,\n query: selection.query,\n renameText,\n preview,\n ...(notice === undefined ? {} : { notice }),\n })));\n notice = undefined;\n\n const stroke = await options.terminal.readKey();\n const action = resolvePickerAction(keymap, stroke, mode);\n if (action === undefined) {\n const text = printableKeyText(stroke);\n if (text !== undefined && mode === \"search\") {\n selection.appendQuery(text);\n } else if (text !== undefined && mode === \"rename\") {\n renameText += text;\n }\n continue;\n }\n\n if (action === \"app.interrupt\") return { type: \"cancelled\" };\n if (mode === \"delete\") {\n if (action === \"session.delete.cancel\") {\n mode = \"browse\";\n keymap.reset();\n } else if (action === \"session.delete.accept\" && selected !== undefined) {\n try {\n const removed = await options.controller.deleteSession(selected.id);\n selection.setItems(await options.controller.listSessions());\n notice = removed\n ? `Deleted ${sessionLabel(selected)}`\n : `Session ${selected.id} no longer exists`;\n } catch (error) {\n notice = errorMessage(error);\n }\n mode = \"browse\";\n keymap.reset();\n }\n continue;\n }\n\n if (mode === \"rename\") {\n if (action === \"list.cancel\") {\n mode = \"browse\";\n renameText = \"\";\n keymap.reset();\n } else if (action === \"text.backspace\") {\n renameText = removeLastCodePoint(renameText);\n } else if (action === \"text.clear\") {\n renameText = \"\";\n } else if (\n action === \"session.rename.accept\" && selected !== undefined\n ) {\n try {\n await options.controller.renameSession(selected.id, renameText);\n selection.setItems(await options.controller.listSessions());\n notice = `Renamed session to ${renameText.trim()}`;\n mode = \"browse\";\n renameText = \"\";\n } catch (error) {\n notice = errorMessage(error);\n }\n keymap.reset();\n }\n continue;\n }\n\n if (mode === \"search\") {\n if (action === \"list.cancel\") {\n selection.clearQuery();\n mode = \"browse\";\n keymap.reset();\n } else if (action === \"search.finish\") {\n mode = \"browse\";\n keymap.reset();\n } else if (action === \"text.backspace\") {\n selection.backspaceQuery();\n } else if (action === \"text.clear\") {\n selection.clearQuery();\n } else {\n const navigation = navigationAction(action);\n if (navigation !== undefined) selection.move(navigation);\n }\n continue;\n }\n\n switch (action) {\n case \"list.cancel\":\n return { type: \"cancelled\" };\n case \"list.accept\":\n if (selected !== undefined) {\n return { type: \"resume\", sessionId: selected.id };\n }\n break;\n case \"preview.toggle\":\n preview = !preview;\n break;\n case \"search.start\":\n mode = \"search\";\n keymap.reset();\n break;\n case \"session.rename.start\":\n if (selected !== undefined) {\n mode = \"rename\";\n renameText = selected.title ?? \"\";\n keymap.reset();\n }\n break;\n case \"session.delete.request\":\n if (selected?.id === options.controller.sessionId) {\n notice = \"The active session cannot be deleted\";\n } else if (selected !== undefined) {\n mode = \"delete\";\n keymap.reset();\n }\n break;\n default:\n {\n const navigation = navigationAction(action);\n if (navigation !== undefined) selection.move(navigation);\n }\n }\n }\n } finally {\n options.terminal.closeView();\n }\n}\n\nasync function runLineSessionPicker(\n options: SessionPickerOptions,\n): Promise<SessionPickerResult> {\n options.terminal.write(sanitizeTerminalText(`\\n${renderLineSessionList(\n options.sessions,\n options.controller.sessionId,\n )}`));\n const answer = (await options.question(\n \"Select a session number or ID (Enter to cancel): \",\n )).trim();\n if (answer === \"\") return { type: \"cancelled\" };\n const selected = resolveListInput(options.sessions, answer, (session) => session.id);\n if (selected === undefined) {\n throw new Error(`Unknown session selection: ${answer}`);\n }\n return { type: \"resume\", sessionId: selected.id };\n}\n\nfunction resolvePickerAction(\n keymap: ReturnType<typeof createMaybeCodeKeymap>,\n stroke: KeyStroke,\n mode: PickerMode,\n): MaybeCodeKeyAction | undefined {\n const contexts = mode === \"browse\"\n ? [\"global\", \"select\", \"sessionPicker\"]\n : mode === \"search\"\n ? [\"global\", \"select\", \"sessionSearch\"]\n : mode === \"rename\"\n ? [\"global\", \"sessionRename\"]\n : [\"global\", \"sessionDelete\"];\n const result = keymap.resolve(stroke, contexts);\n return result.type === \"action\"\n ? result.action as MaybeCodeKeyAction\n : undefined;\n}\n\nfunction navigationAction(\n action: MaybeCodeKeyAction,\n): ListNavigationAction | undefined {\n switch (action) {\n case \"list.up\":\n return \"up\";\n case \"list.down\":\n return \"down\";\n case \"list.pageUp\":\n return \"page-up\";\n case \"list.pageDown\":\n return \"page-down\";\n case \"list.home\":\n return \"home\";\n case \"list.end\":\n return \"end\";\n default:\n return undefined;\n }\n}\n\ninterface RenderState {\n readonly sessions: readonly SessionSummary[];\n readonly selectedIndex: number;\n readonly currentSessionId: string;\n readonly mode: PickerMode;\n readonly query: string;\n readonly renameText: string;\n readonly preview: boolean;\n readonly notice?: string;\n}\n\nfunction renderSessionPicker(state: RenderState): string {\n const pageSize = 10;\n const start = Math.floor(state.selectedIndex / pageSize) * pageSize;\n const page = state.sessions.slice(start, start + pageSize);\n let output = \"MaybeCode \u2014 Resume session\\n\\n\";\n output += state.query === \"\"\n ? \"\"\n : `Filter: ${state.query}${state.mode === \"search\" ? \"\u258C\" : \"\"}\\n\\n`;\n if (page.length === 0) {\n output += \" No matching sessions.\\n\";\n } else {\n for (const [offset, session] of page.entries()) {\n const index = start + offset;\n const selected = index === state.selectedIndex ? \">\" : \" \";\n const current = session.id === state.currentSessionId ? \" [current]\" : \"\";\n output += `${selected} ${sessionLabel(session)}${current}\\n`;\n output += ` ${relativeTime(session.lastUsedAt)} \u00B7 ` +\n `${session.turnCount ?? 0} turns \u00B7 ${session.id}\\n`;\n }\n }\n\n const selected = state.sessions[state.selectedIndex];\n if (state.preview && selected !== undefined) {\n output += \"\\nPreview\\n\" +\n ` created: ${new Date(selected.createdAt).toLocaleString()}\\n` +\n ` last used: ${new Date(selected.lastUsedAt).toLocaleString()}\\n` +\n ` ${selected.preview ?? \"No message preview available.\"}\\n`;\n }\n if (state.mode === \"rename\") {\n output += `\\nRename session\\n ${state.renameText}\u258C\\n` +\n \" Enter save \u00B7 Esc cancel \u00B7 Ctrl+U clear\\n\";\n } else if (state.mode === \"delete\" && selected !== undefined) {\n output += `\\nDelete \u201C${sessionLabel(selected)}\u201D? ` +\n \"This also removes its durable history.\\n Y delete \u00B7 N/Esc cancel\\n\";\n } else if (state.mode === \"search\") {\n output += \"\\nType to filter \u00B7 Enter finish \u00B7 Esc close and clear search\\n\";\n } else {\n output += \"\\n\u2191\u2193 move \u00B7 Enter resume \u00B7 / search \u00B7 Space preview \u00B7 \" +\n \"R rename \u00B7 D delete \u00B7 Esc close\\n\";\n }\n if (state.notice !== undefined) output += `\\n${state.notice}\\n`;\n return output;\n}\n\nfunction renderLineSessionList(\n sessions: readonly SessionSummary[],\n currentSessionId: string,\n): string {\n const lines = sessions.map((session, index) => {\n const current = session.id === currentSessionId ? \" [current]\" : \"\";\n return ` ${index + 1}. ${sessionLabel(session)}${current}\\n` +\n ` ${relativeTime(session.lastUsedAt)} \u00B7 ${session.id}`;\n });\n return `Resume a session:\\n${lines.join(\"\\n\")}\\n`;\n}\n\nfunction sessionMatches(session: SessionSummary, normalizedQuery: string): boolean {\n return [session.id, sessionLabel(session), session.preview]\n .some((value) => value?.toLowerCase().includes(normalizedQuery) === true);\n}\n\nfunction sessionLabel(session: SessionSummary): string {\n return session.title ?? \"Untitled session\";\n}\n\nfunction relativeTime(timestamp: number): string {\n const elapsed = Math.max(0, Date.now() - timestamp);\n if (elapsed < 60_000) return \"just now\";\n if (elapsed < 3_600_000) return `${Math.floor(elapsed / 60_000)}m ago`;\n if (elapsed < 86_400_000) return `${Math.floor(elapsed / 3_600_000)}h ago`;\n return `${Math.floor(elapsed / 86_400_000)}d ago`;\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n", "import type { UiForkPoint, UiWorkspaceDiff } from \"@sortedyuan/ui-client\";\nimport { SessionForkPicker, WorkspaceDiffViewer, sanitizeTerminalText, type InteractiveComponent, type SessionForkSelection } from \"@sortedyuan/tui\";\nimport type { TerminalIO } from \"@sortedyuan/tui/node-terminal\";\nimport type { MaybeCodeController } from \"./controller.js\";\n\nexport async function runForkPicker(options: { readonly points: readonly UiForkPoint[]; readonly currentSessionId: string; readonly terminal: TerminalIO; readonly question: (prompt: string) => Promise<string> }): Promise<SessionForkSelection | undefined> {\n if (!options.points.length) { options.terminal.write(\"\\n\u6CA1\u6709\u53EF\u9009\u62E9\u7684\u5B8C\u6574\u56DE\u590D\u3002\\n\"); return undefined; }\n if (!options.terminal.interactive || !options.terminal.readKey || !options.terminal.renderView || !options.terminal.closeView) {\n for (const [index, point] of options.points.entries()) options.terminal.write(sanitizeTerminalText(`\\n${index + 1}. ${point.userPreview} \u00B7 ${point.commit?.slice(0, 12) ?? \"\u65E0\u6587\u4EF6\u7248\u672C\"}${point.available ? \"\" : ` \u00B7 ${point.reason ?? \"\u65E0\u6CD5\u6062\u590D\"}`}\\n`));\n const answer = (await options.question(\"\u9009\u62E9\u5386\u53F2\u4F4D\u7F6E\u7F16\u53F7\uFF0C\u76F4\u63A5\u56DE\u8F66\u53D6\u6D88\uFF1A\")).trim();\n if (!answer) return undefined;\n const point = options.points[Number(answer) - 1];\n if (!point?.available) throw new Error(point?.reason ?? \"\u5386\u53F2\u4F4D\u7F6E\u4E0D\u53EF\u7528\u3002\");\n const mode = (await options.question(\"\u9009\u62E9\u5DE5\u4F5C\u533A\uFF1A1 \u5F53\u524D\u5DE5\u4F5C\u533A\uFF1B2 \u65B0\u5EFA worktree\uFF1B\u76F4\u63A5\u56DE\u8F66\u53D6\u6D88\uFF1A\")).trim();\n if (!mode) return undefined;\n if (mode !== \"1\" && mode !== \"2\") throw new Error(\"\u5DE5\u4F5C\u533A\u9009\u62E9\u65E0\u6548\u3002\");\n if (mode === \"2\" && !point.worktreeAvailable) throw new Error(\"\u5386\u53F2\u6587\u4EF6\u7248\u672C\u4E0D\u53EF\u7528\u4E8E\u521B\u5EFA worktree\u3002\");\n return { pointId: point.id, mode: mode === \"1\" ? \"current\" : \"worktree\" };\n }\n let result: SessionForkSelection | undefined, complete = false;\n const picker = new SessionForkPicker(options.points, { currentSessionId: options.currentSessionId, onComplete: selection => { result = selection; complete = true; } });\n await runView(options.terminal, picker, () => complete);\n return result;\n}\n\nexport async function runChangesPicker(terminal: TerminalIO, diff: UiWorkspaceDiff, app?: MaybeCodeController): Promise<void> {\n if (!terminal.interactive || !terminal.readKey || !terminal.renderView || !terminal.closeView) {\n terminal.write(sanitizeTerminalText(`\\n${diff.title}\\n${diff.uncommitted ? \"\u5F53\u524D\u672A\u63D0\u4EA4\u53D8\u5316\" : `${diff.from ?? \"\"} \u2192 ${diff.to ?? \"\"}`}\\n`));\n for (const file of diff.files) terminal.write(sanitizeTerminalText(`\\n${file.path} \u00B7 ${file.status} \u00B7 ${file.binary ? \"\u4E8C\u8FDB\u5236\u6587\u4EF6\" : `+${file.additions} -${file.deletions}\\n${file.patch}`}\\n`));\n return;\n }\n let complete = false;\n const viewer = new WorkspaceDiffViewer(diff, { onClose: () => { complete = true; },\n ...(diff.runId && app?.previewRestore ? { onRestore: async (path: string) => (await app.previewRestore!(diff.runId!, [path])).diff } : {}),\n ...(app?.restoreFiles ? { onApply: (previewId: string) => app.restoreFiles!(previewId) } : {}),\n });\n try { while (!complete) { terminal.renderView!(viewer.render({ width: 100, height: 30 }).lines.join(\"\\n\")); viewer.handleKey(await terminal.readKey!()); await viewer.waitForPending(); } }\n finally { terminal.closeView!(); }\n}\n\nasync function runView(terminal: TerminalIO, view: InteractiveComponent, complete: () => boolean) {\n try { while (!complete()) { terminal.renderView!(view.render({ width: 100, height: 30 }).lines.join(\"\\n\")); view.handleKey(await terminal.readKey!()); } }\n finally { terminal.closeView!(); }\n}\n"],
5
- "mappings": "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",
6
- "names": ["resolvePickerAction", "navigationAction", "selected", "point", "errorMessage", "signal", "event"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../packages/ui/client/src/server.ts", "../../../../packages/ui/client/src/browser-login.ts", "../../src/web-server.ts"],
4
- "sourcesContent": ["import { timingSafeEqual } from \"node:crypto\";\nimport { BrowserLogin } from \"./browser-login.js\";\nexport { BrowserLogin } from \"./browser-login.js\";\nimport { createServer, type IncomingMessage, type ServerResponse } from \"node:http\";\nimport type { AddressInfo } from \"node:net\";\nimport { UiError, type UiCommand, type UiHost, type UiReceipt, type UiField } from \"./protocol.js\";\n\nexport type UiAssets = ReadonlyMap<string, { readonly type: string; readonly body: string }>;\n\n/** Mount behind the host's authentication/origin checks. GET assets contain no secrets. */\nexport function createUiRouter(host: UiHost, exit?: () => void) {\n const receipts = new Map<string, { key: string; result: Promise<UiReceipt> }>();\n const streams = new Set<ServerResponse>();\n let closed = false;\n return {\n async route(req: IncomingMessage, res: ServerResponse): Promise<boolean> {\n const url = new URL(req.url ?? \"/\", \"http://localhost\");\n if (!url.pathname.startsWith(\"/api/ui/\")) return false;\n try {\n if (closed) throw new UiError(503, \"\u5BBF\u4E3B\u6B63\u5728\u5173\u95ED\u3002\");\n if (req.method === \"GET\" && url.pathname === \"/api/ui/media\" && host.media) {\n const selected = url.searchParams.get(\"selected\") ?? \"\", id = url.searchParams.get(\"id\") ?? \"\";\n if (url.searchParams.get(\"hostId\") !== host.hostId) throw new UiError(409, \"\u5BBF\u4E3B\u5DF2\u6539\u53D8\u3002\");\n if (!selected || selected.length > 256 || !/^[a-f0-9]{64}$/.test(id)) throw new UiError(400, \"\u56FE\u7247\u53C2\u6570\u65E0\u6548\u3002\");\n const media = await host.media(selected, id);\n res.writeHead(200, { \"content-type\": media.mediaType, \"content-length\": media.data.byteLength, \"content-disposition\": `inline; filename=\"${id}.${media.mediaType.slice(6)}\"` });\n res.end(media.data);\n } else if (req.method === \"GET\" && url.pathname === \"/api/ui/snapshot\") {\n const selected = url.searchParams.get(\"selected\") ?? undefined;\n if (selected && selected.length > 256) throw new UiError(400, \"\u65E0\u6548\u7684\u8D44\u6E90 ID\u3002\");\n sendJson(res, 200, await host.snapshot(selected));\n } else if (req.method === \"GET\" && url.pathname === \"/api/ui/complete\" && host.complete) {\n const selected = url.searchParams.get(\"selected\") ?? \"\", text = url.searchParams.get(\"text\") ?? \"\";\n if (url.searchParams.get(\"hostId\") !== host.hostId || !selected || selected.length > 256 || text.length > 16_384) throw new UiError(400, \"\u547D\u4EE4\u8865\u5168\u53C2\u6570\u65E0\u6548\u3002\");\n sendJson(res, 200, await host.complete(selected, text));\n } else if (req.method === \"GET\" && [\"/api/ui/resources\", \"/api/ui/history\", \"/api/ui/field\"].includes(url.pathname)) {\n if (url.searchParams.get(\"hostId\") !== host.hostId) throw new UiError(409, \"\u5BBF\u4E3B\u5DF2\u6539\u53D8\uFF0C\u8BF7\u5237\u65B0\u540E\u91CD\u8BFB\u3002\");\n const selected = url.searchParams.get(\"selected\"), query = url.searchParams.get(\"query\") ?? \"\", cursor = url.searchParams.get(\"cursor\");\n if (query.length > 256 || (cursor?.length ?? 0) > 4096 || (selected?.length ?? 0) > 256) throw new UiError(400, \"\u8BFB\u53D6\u53C2\u6570\u8FC7\u957F\u3002\");\n const request = { query, ...(cursor ? { cursor } : {}) };\n if (url.pathname.endsWith(\"/resources\") && host.resources) sendJson(res, 200, await host.resources(request));\n else if (url.pathname.endsWith(\"/history\") && selected && host.history) sendJson(res, 200, await host.history(selected, request));\n else if (url.pathname.endsWith(\"/field\") && selected && host.field) {\n const blockId = url.searchParams.get(\"block\") ?? \"\", field = url.searchParams.get(\"field\") as UiField;\n const offset = Number(url.searchParams.get(\"offset\") ?? 0), version = url.searchParams.get(\"version\");\n if (!blockId || blockId.length > 512 || ![\"input\", \"text\", \"reasoning\", \"diagnostic\", \"presentation\"].includes(field) || !Number.isSafeInteger(offset) || offset < 0 || (version?.length ?? 0) > 128) throw new UiError(400, \"\u8BE6\u60C5\u53C2\u6570\u4E0D\u6B63\u786E\u3002\");\n sendJson(res, 200, await host.field(selected, { blockId, field, offset, ...(version ? { version } : {}) }));\n } else throw new UiError(400, \"\u5BBF\u4E3B\u4E0D\u652F\u6301\u6B64\u8BFB\u53D6\u6216\u672A\u6307\u5B9A\u8D44\u6E90\u3002\");\n } else if (req.method === \"GET\" && url.pathname === \"/api/ui/events\") {\n if (streams.size >= 16) throw new UiError(429, \"\u8FDE\u63A5\u7A97\u53E3\u8FC7\u591A\u3002\");\n streams.add(res);\n res.writeHead(200, { \"content-type\": \"text/event-stream; charset=utf-8\", \"cache-control\": \"no-store\", \"x-accel-buffering\": \"no\" });\n res.write(\"event: invalidate\\ndata: {}\\n\\n\");\n let pending: ReturnType<typeof setTimeout> | undefined;\n const invalidate = () => {\n if (pending || res.destroyed) return;\n pending = setTimeout(() => {\n pending = undefined;\n if (!res.write(\"event: invalidate\\ndata: {}\\n\\n\")) res.destroy();\n }, 120);\n };\n const unsubscribe = host.subscribe(invalidate);\n // Repairs missed invalidations and observes changes from CLI/channel owners too.\n const heartbeat = setInterval(invalidate, 2000);\n res.once(\"close\", () => { if (pending) clearTimeout(pending); clearInterval(heartbeat); unsubscribe(); streams.delete(res); });\n } else if (req.method === \"POST\" && url.pathname === \"/api/ui/commands\") {\n const command = validateCommand(await readJson(req));\n if (command.hostId !== host.hostId) throw new UiError(409, \"\u5BBF\u4E3B\u5DF2\u91CD\u542F\u3002\u8BF7\u68C0\u67E5\u6700\u65B0\u72B6\u6001\u540E\u91CD\u65B0\u64CD\u4F5C\u3002\");\n const key = JSON.stringify({ ...command, args: Object.fromEntries(Object.entries(command.args).sort(([a], [b]) => a.localeCompare(b))) });\n let receipt = receipts.get(command.requestId);\n if (receipt && receipt.key !== key) throw new UiError(409, \"\u8BF7\u6C42 ID \u5DF2\u88AB\u5176\u5B83\u547D\u4EE4\u4F7F\u7528\u3002\");\n if (!receipt) {\n // Do not silently evict a receipt and later repeat a side effect.\n if (receipts.size >= 4096) throw new UiError(429, \"\u672C\u6B21\u5BBF\u4E3B\u7684\u547D\u4EE4\u51ED\u636E\u5DF2\u6EE1\uFF0C\u8BF7\u5728\u7A7A\u95F2\u65F6\u91CD\u542F\u670D\u52A1\u3002\");\n receipt = { key, result: Promise.resolve().then(() => host.execute(command)) };\n receipts.set(command.requestId, receipt);\n }\n const result = await receipt.result;\n if (result.disconnect && exit) res.once(\"finish\", exit);\n sendJson(res, 200, result);\n } else throw new UiError(404, \"\u63A5\u53E3\u4E0D\u5B58\u5728\u3002\");\n } catch (error) {\n if (!res.headersSent) sendJson(res, error instanceof UiError ? error.status : 400, { error: error instanceof UiError ? error.message : \"\u64CD\u4F5C\u5931\u8D25\u3002\u8BF7\u68C0\u67E5\u5BBF\u4E3B\u65E5\u5FD7\u3001\u914D\u7F6E\u6216\u5F53\u524D\u72B6\u6001\u3002\" });\n else res.destroy();\n }\n return true;\n },\n close() { closed = true; for (const stream of streams) stream.destroy(); streams.clear(); },\n };\n}\n\nexport async function startUiServer(options: { host: UiHost; assets: UiAssets; token: string; port?: number; browserLogin?: boolean; close?: () => Promise<void>; exit?: () => void }) {\n validateToken(options.token);\n const port = options.port ?? 3940;\n if (!Number.isSafeInteger(port) || port < 0 || port > 65535) throw new Error(\"Invalid port\");\n const router = createUiRouter(options.host, () => { if (options.exit) options.exit(); else void close(); });\n const login = options.browserLogin ? new BrowserLogin(options.token) : undefined;\n let origin = \"\";\n const requests = new Set<Promise<void>>();\n const server = createServer((req, res) => {\n const work = (async () => {\n secureHeaders(res);\n if (!trustedRequest(req, origin)) { sendJson(res, 403, { error: \"Untrusted origin or host\" }); return; }\n if (login && req.method === \"POST\" && req.url === \"/api/ui/connect\") {\n try {\n const body = await readJson(req);\n if (!body || typeof body !== \"object\" || Array.isArray(body) || Object.keys(body).length !== 1 || !(\"ticket\" in body)) throw new UiError(400, \"\u8FDE\u63A5\u8BF7\u6C42\u65E0\u6548\u3002\");\n sendJson(res, 200, { token: login.redeem(body.ticket) });\n } catch (error) {\n if (!(error instanceof UiError)) throw error;\n sendJson(res, error.status, { error: error.message });\n }\n return;\n }\n const asset = options.assets.get(req.url ?? \"/\");\n if (req.method === \"GET\" && asset) { res.writeHead(200, { \"content-type\": asset.type }); res.end(asset.body); return; }\n if (!authorized(req, options.token)) { sendJson(res, 401, { error: \"\u8BF7\u8F93\u5165\u63A7\u5236\u4EE4\u724C\u3002\" }); return; }\n if (!await router.route(req, res)) sendJson(res, 404, { error: \"Not found\" });\n })().catch(() => { if (!res.headersSent) sendJson(res, 500, { error: \"Host unavailable\" }); else res.destroy(); }).finally(() => requests.delete(work));\n requests.add(work);\n });\n server.requestTimeout = 15_000; server.headersTimeout = 10_000; server.keepAliveTimeout = 3000; server.maxConnections = 64;\n await new Promise<void>((resolve, reject) => {\n server.once(\"error\", reject); server.listen(port, \"127.0.0.1\", () => { server.removeListener(\"error\", reject); resolve(); });\n });\n origin = `http://127.0.0.1:${(server.address() as AddressInfo).port}`;\n let closing: Promise<void> | undefined;\n const closed = new Promise<void>(resolve => server.once(\"close\", resolve));\n const close = () => closing ??= (async () => {\n login?.clear();\n router.close();\n const stopped = new Promise<void>((resolve, reject) => server.close(error => error ? reject(error) : resolve()));\n server.closeAllConnections();\n await options.close?.();\n await Promise.allSettled([...requests]); await stopped;\n })();\n return { url: origin, closed, createLoginUrl: () => {\n if (!login || closing) throw new Error(\"\u5F53\u524D\u670D\u52A1\u4E0D\u63A5\u53D7\u6D4F\u89C8\u5668\u8FDE\u63A5\u51ED\u636E\u3002\");\n return `${origin}/#may-connect=${login.issue()}`;\n }, close };\n}\n\nexport function secureHeaders(res: ServerResponse): void {\n res.setHeader(\"cache-control\", \"no-store\"); res.setHeader(\"x-content-type-options\", \"nosniff\"); res.setHeader(\"referrer-policy\", \"no-referrer\");\n res.setHeader(\"content-security-policy\", \"default-src 'none'; script-src 'self'; style-src 'self'; connect-src 'self'; img-src 'self' blob: https: http:; base-uri 'none'; frame-ancestors 'none'; form-action 'self'\");\n}\nexport function validateToken(token: string): void { if (!/^[\\x21-\\x7e]{32,256}$/.test(token)) throw new Error(\"Control token must be 32..256 printable non-space ASCII characters\"); }\nexport function trustedRequest(req: IncomingMessage, origin: string): boolean {\n return Boolean(origin) && req.headers.host === new URL(origin).host && (req.headers.origin === undefined || req.headers.origin === origin);\n}\nexport function authorized(req: IncomingMessage, token: string): boolean {\n const supplied = req.headers.authorization ?? \"\", expected = `Bearer ${token}`;\n return Buffer.byteLength(supplied) === Buffer.byteLength(expected) && timingSafeEqual(Buffer.from(supplied), Buffer.from(expected));\n}\nexport function sendJson(res: ServerResponse, status: number, data: unknown): void { res.writeHead(status, { \"content-type\": \"application/json; charset=utf-8\" }); res.end(JSON.stringify(data)); }\nasync function readJson(req: IncomingMessage): Promise<unknown> {\n if (req.headers[\"content-type\"]?.split(\";\")[0]?.trim() !== \"application/json\") throw new UiError(400, \"\u9700\u8981 JSON\u3002\");\n let size = 0; const chunks: Buffer[] = [];\n for await (const chunk of req) { const bytes = Buffer.from(chunk as Uint8Array); size += bytes.length; if (size > 256 * 1024) throw new UiError(413, \"\u8BF7\u6C42\u8FC7\u5927\u3002\"); chunks.push(bytes); }\n return JSON.parse(Buffer.concat(chunks).toString(\"utf8\"));\n}\nfunction validateCommand(value: unknown): UiCommand {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) throw new UiError(400, \"\u65E0\u6548\u7684\u547D\u4EE4\u3002\");\n const c = value as UiCommand;\n if (Object.keys(c).some(key => ![\"version\", \"hostId\", \"requestId\", \"name\", \"targetId\", \"expectedActiveId\", \"args\"].includes(key)) || c.version !== 1 || typeof c.hostId !== \"string\" || c.hostId.length > 128 || typeof c.requestId !== \"string\" || !/^[a-zA-Z0-9._:-]{1,100}$/.test(c.requestId)\n || (c.expectedActiveId !== undefined && (typeof c.expectedActiveId !== \"string\" || !c.expectedActiveId || c.expectedActiveId.length > 256))\n || typeof c.name !== \"string\" || !/^[a-z][a-z0-9.-]{1,80}$/.test(c.name) || !(c.targetId === null || typeof c.targetId === \"string\" && c.targetId.length <= 256)\n || !c.args || typeof c.args !== \"object\" || Array.isArray(c.args) || Object.keys(c.args).length > 12 || Object.values(c.args).some(v => typeof v !== \"string\" || v.length > 64 * 1024)) throw new UiError(400, \"\u65E0\u6548\u7684\u547D\u4EE4\u3002\");\n return c;\n}\n", "import { randomBytes } from \"node:crypto\";\nimport { UiError } from \"./protocol.js\";\n\nexport class BrowserLogin {\n private readonly tickets = new Map<string, number>();\n\n constructor(private readonly token: string, private readonly lifetimeMs = 60_000) {\n if (!Number.isSafeInteger(lifetimeMs) || lifetimeMs <= 0) throw new Error(\"\u8FDE\u63A5\u51ED\u636E\u6709\u6548\u671F\u5FC5\u987B\u4E3A\u6B63\u6574\u6570\u3002\");\n }\n\n issue(): string {\n const now = Date.now();\n for (const [ticket, expiresAt] of this.tickets) if (expiresAt <= now) this.tickets.delete(ticket);\n if (this.tickets.size >= 8) throw new UiError(429, \"\u5F85\u8FDE\u63A5\u9875\u9762\u8FC7\u591A\uFF0C\u8BF7\u7A0D\u540E\u91CD\u65B0\u6253\u5F00\u3002\");\n const ticket = randomBytes(32).toString(\"base64url\");\n this.tickets.set(ticket, now + this.lifetimeMs);\n return ticket;\n }\n\n redeem(ticket: unknown): string {\n if (typeof ticket !== \"string\") throw new UiError(401, \"\u8FDE\u63A5\u51ED\u636E\u65E0\u6548\u3002\");\n const expiresAt = this.tickets.get(ticket);\n this.tickets.delete(ticket);\n if (expiresAt === undefined || expiresAt <= Date.now()) throw new UiError(401, \"\u8FDE\u63A5\u5DF2\u5931\u6548\uFF0C\u8BF7\u4ECE\u542F\u52A8\u7A0B\u5E8F\u91CD\u65B0\u6253\u5F00\u9875\u9762\u3002\");\n return this.token;\n }\n\n clear(): void { this.tickets.clear(); }\n}\n", "import type { ApplicationUiHost } from \"@sortedyuan/ui-client/application\";\nimport { startUiServer } from \"@sortedyuan/ui-client/server\";\nimport { webUiAssets } from \"@sortedyuan/web-ui/assets\";\nimport { readFile } from \"node:fs/promises\";\n\nexport async function startMaybeCodeWebServer(host: ApplicationUiHost, options: { token: string; port?: number; browserLogin?: boolean; exit?: () => void }) {\n const extensionModule = await readFile(new URL(\"./web-extension.js\", import.meta.resolve(\"@sortedyuan/maybecode\")), \"utf8\");\n const diffBundle = await readFile(new URL(\"./dist/diff.js\", import.meta.resolve(\"diff/package.json\")), \"utf8\");\n const diffEsm = `${diffBundle}\\nexport const { parsePatch } = globalThis.Diff;\\n`;\n const assets = new Map(await webUiAssets(\"MaybeCode\", \"session\", { extensionModule, ...(options.browserLogin === undefined ? {} : { browserLogin: options.browserLogin }) }));\n assets.set(\"/vendor-diff.js\", { type: \"text/javascript; charset=utf-8\", body: diffEsm });\n return startUiServer({ host, assets, ...options, close: () => host.close() });\n}\n"],
5
- "mappings": "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",
6
- "names": ["ticket"]
7
- }
@@ -1,2 +0,0 @@
1
- export * from "@sortedyuan/plugin-delegation/types";
2
- //# sourceMappingURL=delegation.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"delegation.d.ts","sourceRoot":"","sources":["../src/delegation.ts"],"names":[],"mappings":"AAAA,cAAc,qCAAqC,CAAC"}
@@ -1,2 +0,0 @@
1
- export * from "@sortedyuan/plugin-delegation/types";
2
- //# sourceMappingURL=delegation.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"delegation.js","sourceRoot":"","sources":["../src/delegation.ts"],"names":[],"mappings":"AAAA,cAAc,qCAAqC,CAAC"}
@@ -1,2 +0,0 @@
1
- export { HistoryReferenceMemory } from "@sortedyuan/plugin-history-memory";
2
- //# sourceMappingURL=history-memory.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"history-memory.d.ts","sourceRoot":"","sources":["../src/history-memory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC"}
@@ -1,2 +0,0 @@
1
- export { HistoryReferenceMemory } from "@sortedyuan/plugin-history-memory";
2
- //# sourceMappingURL=history-memory.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"history-memory.js","sourceRoot":"","sources":["../src/history-memory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC"}
@@ -1,2 +0,0 @@
1
- export * from "@sortedyuan/plugin-delegation/budget";
2
- //# sourceMappingURL=subagent-budget.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"subagent-budget.d.ts","sourceRoot":"","sources":["../src/subagent-budget.ts"],"names":[],"mappings":"AAAA,cAAc,sCAAsC,CAAC"}
@@ -1,2 +0,0 @@
1
- export * from "@sortedyuan/plugin-delegation/budget";
2
- //# sourceMappingURL=subagent-budget.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"subagent-budget.js","sourceRoot":"","sources":["../src/subagent-budget.ts"],"names":[],"mappings":"AAAA,cAAc,sCAAsC,CAAC"}
@@ -1,2 +0,0 @@
1
- export * from "@sortedyuan/plugin-delegation/files";
2
- //# sourceMappingURL=subagent-files.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"subagent-files.d.ts","sourceRoot":"","sources":["../src/subagent-files.ts"],"names":[],"mappings":"AAAA,cAAc,qCAAqC,CAAC"}
@@ -1,2 +0,0 @@
1
- export * from "@sortedyuan/plugin-delegation/files";
2
- //# sourceMappingURL=subagent-files.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"subagent-files.js","sourceRoot":"","sources":["../src/subagent-files.ts"],"names":[],"mappings":"AAAA,cAAc,qCAAqC,CAAC"}
@@ -1,2 +0,0 @@
1
- export * from "@sortedyuan/plugin-delegation/host";
2
- //# sourceMappingURL=subagent-host.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"subagent-host.d.ts","sourceRoot":"","sources":["../src/subagent-host.ts"],"names":[],"mappings":"AAAA,cAAc,oCAAoC,CAAC"}
@@ -1,2 +0,0 @@
1
- export * from "@sortedyuan/plugin-delegation/host";
2
- //# sourceMappingURL=subagent-host.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"subagent-host.js","sourceRoot":"","sources":["../src/subagent-host.ts"],"names":[],"mappings":"AAAA,cAAc,oCAAoC,CAAC"}
@@ -1,2 +0,0 @@
1
- export * from "@sortedyuan/plugin-delegation/instructions";
2
- //# sourceMappingURL=subagent-instructions.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"subagent-instructions.d.ts","sourceRoot":"","sources":["../src/subagent-instructions.ts"],"names":[],"mappings":"AAAA,cAAc,4CAA4C,CAAC"}
@@ -1,2 +0,0 @@
1
- export * from "@sortedyuan/plugin-delegation/instructions";
2
- //# sourceMappingURL=subagent-instructions.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"subagent-instructions.js","sourceRoot":"","sources":["../src/subagent-instructions.ts"],"names":[],"mappings":"AAAA,cAAc,4CAA4C,CAAC"}
@@ -1,2 +0,0 @@
1
- export * from "@sortedyuan/plugin-delegation/configuration";
2
- //# sourceMappingURL=subagents.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"subagents.d.ts","sourceRoot":"","sources":["../src/subagents.ts"],"names":[],"mappings":"AAAA,cAAc,6CAA6C,CAAC"}
package/dist/subagents.js DELETED
@@ -1,2 +0,0 @@
1
- export * from "@sortedyuan/plugin-delegation/configuration";
2
- //# sourceMappingURL=subagents.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"subagents.js","sourceRoot":"","sources":["../src/subagents.ts"],"names":[],"mappings":"AAAA,cAAc,6CAA6C,CAAC"}
@@ -1,2 +0,0 @@
1
- export { createModelContextSummarizer } from "@sortedyuan/plugin-history-memory";
2
- //# sourceMappingURL=summarizer.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"summarizer.d.ts","sourceRoot":"","sources":["../src/summarizer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,4BAA4B,EAAE,MAAM,mCAAmC,CAAC"}
@@ -1,2 +0,0 @@
1
- export { createModelContextSummarizer } from "@sortedyuan/plugin-history-memory";
2
- //# sourceMappingURL=summarizer.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"summarizer.js","sourceRoot":"","sources":["../src/summarizer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,4BAA4B,EAAE,MAAM,mCAAmC,CAAC"}
package/dist/tui.d.ts DELETED
@@ -1,7 +0,0 @@
1
- import type { TerminalIO } from "@sortedyuan/tui/node-terminal";
2
- import type { MaybeCodeController } from "./controller.js";
3
- export interface RunTerminalUIOptions {
4
- readonly terminal?: TerminalIO;
5
- }
6
- export declare function runTerminalUI(app: MaybeCodeController, options?: RunTerminalUIOptions): Promise<void>;
7
- //# sourceMappingURL=tui.d.ts.map
package/dist/tui.d.ts.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"tui.d.ts","sourceRoot":"","sources":["../src/tui.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EACV,UAAU,EAEX,MAAM,+BAA+B,CAAC;AAEvC,OAAO,KAAK,EACV,mBAAmB,EAEpB,MAAM,iBAAiB,CAAC;AAczB,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,QAAQ,CAAC,EAAE,UAAU,CAAC;CAChC;AAED,wBAAsB,aAAa,CACjC,GAAG,EAAE,mBAAmB,EACxB,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,IAAI,CAAC,CAyJf"}