dfcode 1.0.0 → 1.0.1

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 (344) hide show
  1. package/bin/dfcode +0 -0
  2. package/package.json +24 -101
  3. package/LICENSE +0 -21
  4. package/packages/dfcode/README.md +0 -15
  5. package/packages/dfcode/bin/dfcode +0 -84
  6. package/packages/dfcode/package.json +0 -115
  7. package/packages/dfcode/src/acp/README.md +0 -164
  8. package/packages/dfcode/src/acp/agent.ts +0 -1437
  9. package/packages/dfcode/src/acp/session.ts +0 -105
  10. package/packages/dfcode/src/acp/types.ts +0 -22
  11. package/packages/dfcode/src/agent/agent.ts +0 -332
  12. package/packages/dfcode/src/agent/generate.txt +0 -75
  13. package/packages/dfcode/src/agent/prompt/compaction.txt +0 -12
  14. package/packages/dfcode/src/agent/prompt/explore.txt +0 -18
  15. package/packages/dfcode/src/agent/prompt/summary.txt +0 -11
  16. package/packages/dfcode/src/agent/prompt/title.txt +0 -44
  17. package/packages/dfcode/src/auth/index.ts +0 -73
  18. package/packages/dfcode/src/bun/index.ts +0 -134
  19. package/packages/dfcode/src/bus/bus-event.ts +0 -43
  20. package/packages/dfcode/src/bus/global.ts +0 -10
  21. package/packages/dfcode/src/bus/index.ts +0 -105
  22. package/packages/dfcode/src/cli/bootstrap.ts +0 -17
  23. package/packages/dfcode/src/cli/cmd/acp.ts +0 -69
  24. package/packages/dfcode/src/cli/cmd/agent.ts +0 -257
  25. package/packages/dfcode/src/cli/cmd/auth.ts +0 -400
  26. package/packages/dfcode/src/cli/cmd/cmd.ts +0 -7
  27. package/packages/dfcode/src/cli/cmd/debug/agent.ts +0 -166
  28. package/packages/dfcode/src/cli/cmd/debug/config.ts +0 -16
  29. package/packages/dfcode/src/cli/cmd/debug/file.ts +0 -97
  30. package/packages/dfcode/src/cli/cmd/debug/index.ts +0 -48
  31. package/packages/dfcode/src/cli/cmd/debug/lsp.ts +0 -52
  32. package/packages/dfcode/src/cli/cmd/debug/ripgrep.ts +0 -87
  33. package/packages/dfcode/src/cli/cmd/debug/scrap.ts +0 -16
  34. package/packages/dfcode/src/cli/cmd/debug/skill.ts +0 -16
  35. package/packages/dfcode/src/cli/cmd/debug/snapshot.ts +0 -52
  36. package/packages/dfcode/src/cli/cmd/export.ts +0 -88
  37. package/packages/dfcode/src/cli/cmd/generate.ts +0 -38
  38. package/packages/dfcode/src/cli/cmd/github.ts +0 -1548
  39. package/packages/dfcode/src/cli/cmd/import.ts +0 -98
  40. package/packages/dfcode/src/cli/cmd/mcp.ts +0 -755
  41. package/packages/dfcode/src/cli/cmd/models.ts +0 -77
  42. package/packages/dfcode/src/cli/cmd/pr.ts +0 -112
  43. package/packages/dfcode/src/cli/cmd/run.ts +0 -395
  44. package/packages/dfcode/src/cli/cmd/serve.ts +0 -20
  45. package/packages/dfcode/src/cli/cmd/session.ts +0 -135
  46. package/packages/dfcode/src/cli/cmd/stats.ts +0 -402
  47. package/packages/dfcode/src/cli/cmd/tui/app.tsx +0 -750
  48. package/packages/dfcode/src/cli/cmd/tui/attach.ts +0 -39
  49. package/packages/dfcode/src/cli/cmd/tui/component/border.tsx +0 -21
  50. package/packages/dfcode/src/cli/cmd/tui/component/dialog-agent.tsx +0 -31
  51. package/packages/dfcode/src/cli/cmd/tui/component/dialog-command.tsx +0 -148
  52. package/packages/dfcode/src/cli/cmd/tui/component/dialog-mcp.tsx +0 -86
  53. package/packages/dfcode/src/cli/cmd/tui/component/dialog-model.tsx +0 -234
  54. package/packages/dfcode/src/cli/cmd/tui/component/dialog-provider.tsx +0 -256
  55. package/packages/dfcode/src/cli/cmd/tui/component/dialog-session-list.tsx +0 -114
  56. package/packages/dfcode/src/cli/cmd/tui/component/dialog-session-rename.tsx +0 -31
  57. package/packages/dfcode/src/cli/cmd/tui/component/dialog-stash.tsx +0 -87
  58. package/packages/dfcode/src/cli/cmd/tui/component/dialog-status.tsx +0 -164
  59. package/packages/dfcode/src/cli/cmd/tui/component/dialog-tag.tsx +0 -44
  60. package/packages/dfcode/src/cli/cmd/tui/component/dialog-theme-list.tsx +0 -50
  61. package/packages/dfcode/src/cli/cmd/tui/component/logo.tsx +0 -88
  62. package/packages/dfcode/src/cli/cmd/tui/component/prompt/autocomplete.tsx +0 -653
  63. package/packages/dfcode/src/cli/cmd/tui/component/prompt/frecency.tsx +0 -89
  64. package/packages/dfcode/src/cli/cmd/tui/component/prompt/history.tsx +0 -108
  65. package/packages/dfcode/src/cli/cmd/tui/component/prompt/index.tsx +0 -1102
  66. package/packages/dfcode/src/cli/cmd/tui/component/prompt/stash.tsx +0 -101
  67. package/packages/dfcode/src/cli/cmd/tui/component/textarea-keybindings.ts +0 -73
  68. package/packages/dfcode/src/cli/cmd/tui/component/tips.tsx +0 -153
  69. package/packages/dfcode/src/cli/cmd/tui/component/todo-item.tsx +0 -32
  70. package/packages/dfcode/src/cli/cmd/tui/context/args.tsx +0 -14
  71. package/packages/dfcode/src/cli/cmd/tui/context/directory.ts +0 -13
  72. package/packages/dfcode/src/cli/cmd/tui/context/exit.tsx +0 -23
  73. package/packages/dfcode/src/cli/cmd/tui/context/helper.tsx +0 -25
  74. package/packages/dfcode/src/cli/cmd/tui/context/keybind.tsx +0 -101
  75. package/packages/dfcode/src/cli/cmd/tui/context/kv.tsx +0 -52
  76. package/packages/dfcode/src/cli/cmd/tui/context/local.tsx +0 -402
  77. package/packages/dfcode/src/cli/cmd/tui/context/prompt.tsx +0 -18
  78. package/packages/dfcode/src/cli/cmd/tui/context/route.tsx +0 -46
  79. package/packages/dfcode/src/cli/cmd/tui/context/sdk.tsx +0 -94
  80. package/packages/dfcode/src/cli/cmd/tui/context/sync.tsx +0 -445
  81. package/packages/dfcode/src/cli/cmd/tui/context/theme/aura.json +0 -69
  82. package/packages/dfcode/src/cli/cmd/tui/context/theme/ayu.json +0 -80
  83. package/packages/dfcode/src/cli/cmd/tui/context/theme/carbonfox.json +0 -248
  84. package/packages/dfcode/src/cli/cmd/tui/context/theme/catppuccin-frappe.json +0 -233
  85. package/packages/dfcode/src/cli/cmd/tui/context/theme/catppuccin-macchiato.json +0 -233
  86. package/packages/dfcode/src/cli/cmd/tui/context/theme/catppuccin.json +0 -112
  87. package/packages/dfcode/src/cli/cmd/tui/context/theme/cobalt2.json +0 -228
  88. package/packages/dfcode/src/cli/cmd/tui/context/theme/cursor.json +0 -249
  89. package/packages/dfcode/src/cli/cmd/tui/context/theme/dfcode.json +0 -245
  90. package/packages/dfcode/src/cli/cmd/tui/context/theme/dracula.json +0 -219
  91. package/packages/dfcode/src/cli/cmd/tui/context/theme/everforest.json +0 -241
  92. package/packages/dfcode/src/cli/cmd/tui/context/theme/flexoki.json +0 -237
  93. package/packages/dfcode/src/cli/cmd/tui/context/theme/github.json +0 -233
  94. package/packages/dfcode/src/cli/cmd/tui/context/theme/gruvbox.json +0 -242
  95. package/packages/dfcode/src/cli/cmd/tui/context/theme/kanagawa.json +0 -77
  96. package/packages/dfcode/src/cli/cmd/tui/context/theme/lucent-orng.json +0 -237
  97. package/packages/dfcode/src/cli/cmd/tui/context/theme/material.json +0 -235
  98. package/packages/dfcode/src/cli/cmd/tui/context/theme/matrix.json +0 -77
  99. package/packages/dfcode/src/cli/cmd/tui/context/theme/mercury.json +0 -252
  100. package/packages/dfcode/src/cli/cmd/tui/context/theme/monokai.json +0 -221
  101. package/packages/dfcode/src/cli/cmd/tui/context/theme/nightowl.json +0 -221
  102. package/packages/dfcode/src/cli/cmd/tui/context/theme/nord.json +0 -223
  103. package/packages/dfcode/src/cli/cmd/tui/context/theme/one-dark.json +0 -84
  104. package/packages/dfcode/src/cli/cmd/tui/context/theme/orng.json +0 -249
  105. package/packages/dfcode/src/cli/cmd/tui/context/theme/osaka-jade.json +0 -93
  106. package/packages/dfcode/src/cli/cmd/tui/context/theme/palenight.json +0 -222
  107. package/packages/dfcode/src/cli/cmd/tui/context/theme/rosepine.json +0 -234
  108. package/packages/dfcode/src/cli/cmd/tui/context/theme/solarized.json +0 -223
  109. package/packages/dfcode/src/cli/cmd/tui/context/theme/synthwave84.json +0 -226
  110. package/packages/dfcode/src/cli/cmd/tui/context/theme/tokyonight.json +0 -243
  111. package/packages/dfcode/src/cli/cmd/tui/context/theme/vercel.json +0 -245
  112. package/packages/dfcode/src/cli/cmd/tui/context/theme/vesper.json +0 -218
  113. package/packages/dfcode/src/cli/cmd/tui/context/theme/zenburn.json +0 -223
  114. package/packages/dfcode/src/cli/cmd/tui/context/theme.tsx +0 -1152
  115. package/packages/dfcode/src/cli/cmd/tui/event.ts +0 -48
  116. package/packages/dfcode/src/cli/cmd/tui/routes/home.tsx +0 -140
  117. package/packages/dfcode/src/cli/cmd/tui/routes/session/dialog-fork-from-timeline.tsx +0 -64
  118. package/packages/dfcode/src/cli/cmd/tui/routes/session/dialog-message.tsx +0 -109
  119. package/packages/dfcode/src/cli/cmd/tui/routes/session/dialog-subagent.tsx +0 -26
  120. package/packages/dfcode/src/cli/cmd/tui/routes/session/dialog-timeline.tsx +0 -47
  121. package/packages/dfcode/src/cli/cmd/tui/routes/session/footer.tsx +0 -91
  122. package/packages/dfcode/src/cli/cmd/tui/routes/session/header.tsx +0 -142
  123. package/packages/dfcode/src/cli/cmd/tui/routes/session/index.tsx +0 -2050
  124. package/packages/dfcode/src/cli/cmd/tui/routes/session/permission.tsx +0 -508
  125. package/packages/dfcode/src/cli/cmd/tui/routes/session/question.tsx +0 -453
  126. package/packages/dfcode/src/cli/cmd/tui/routes/session/sidebar.tsx +0 -313
  127. package/packages/dfcode/src/cli/cmd/tui/thread.ts +0 -165
  128. package/packages/dfcode/src/cli/cmd/tui/ui/dialog-alert.tsx +0 -57
  129. package/packages/dfcode/src/cli/cmd/tui/ui/dialog-confirm.tsx +0 -83
  130. package/packages/dfcode/src/cli/cmd/tui/ui/dialog-export-options.tsx +0 -204
  131. package/packages/dfcode/src/cli/cmd/tui/ui/dialog-help.tsx +0 -43
  132. package/packages/dfcode/src/cli/cmd/tui/ui/dialog-prompt.tsx +0 -77
  133. package/packages/dfcode/src/cli/cmd/tui/ui/dialog-select.tsx +0 -384
  134. package/packages/dfcode/src/cli/cmd/tui/ui/dialog.tsx +0 -167
  135. package/packages/dfcode/src/cli/cmd/tui/ui/link.tsx +0 -28
  136. package/packages/dfcode/src/cli/cmd/tui/ui/spinner.ts +0 -368
  137. package/packages/dfcode/src/cli/cmd/tui/ui/toast.tsx +0 -100
  138. package/packages/dfcode/src/cli/cmd/tui/util/clipboard.ts +0 -160
  139. package/packages/dfcode/src/cli/cmd/tui/util/editor.ts +0 -32
  140. package/packages/dfcode/src/cli/cmd/tui/util/signal.ts +0 -7
  141. package/packages/dfcode/src/cli/cmd/tui/util/terminal.ts +0 -114
  142. package/packages/dfcode/src/cli/cmd/tui/util/transcript.ts +0 -98
  143. package/packages/dfcode/src/cli/cmd/tui/worker.ts +0 -152
  144. package/packages/dfcode/src/cli/cmd/uninstall.ts +0 -357
  145. package/packages/dfcode/src/cli/cmd/upgrade.ts +0 -73
  146. package/packages/dfcode/src/cli/cmd/web.ts +0 -81
  147. package/packages/dfcode/src/cli/error.ts +0 -57
  148. package/packages/dfcode/src/cli/network.ts +0 -53
  149. package/packages/dfcode/src/cli/ui.ts +0 -83
  150. package/packages/dfcode/src/cli/upgrade.ts +0 -25
  151. package/packages/dfcode/src/command/index.ts +0 -131
  152. package/packages/dfcode/src/command/template/initialize.txt +0 -10
  153. package/packages/dfcode/src/command/template/review.txt +0 -99
  154. package/packages/dfcode/src/config/config.ts +0 -1367
  155. package/packages/dfcode/src/config/markdown.ts +0 -93
  156. package/packages/dfcode/src/env/index.ts +0 -26
  157. package/packages/dfcode/src/file/ignore.ts +0 -83
  158. package/packages/dfcode/src/file/index.ts +0 -411
  159. package/packages/dfcode/src/file/ripgrep.ts +0 -407
  160. package/packages/dfcode/src/file/time.ts +0 -69
  161. package/packages/dfcode/src/file/watcher.ts +0 -127
  162. package/packages/dfcode/src/flag/flag.ts +0 -79
  163. package/packages/dfcode/src/format/formatter.ts +0 -357
  164. package/packages/dfcode/src/format/index.ts +0 -137
  165. package/packages/dfcode/src/global/index.ts +0 -55
  166. package/packages/dfcode/src/id/id.ts +0 -83
  167. package/packages/dfcode/src/ide/index.ts +0 -76
  168. package/packages/dfcode/src/index.ts +0 -159
  169. package/packages/dfcode/src/installation/index.ts +0 -246
  170. package/packages/dfcode/src/lsp/client.ts +0 -252
  171. package/packages/dfcode/src/lsp/index.ts +0 -485
  172. package/packages/dfcode/src/lsp/language.ts +0 -119
  173. package/packages/dfcode/src/lsp/server.ts +0 -2046
  174. package/packages/dfcode/src/mcp/auth.ts +0 -135
  175. package/packages/dfcode/src/mcp/index.ts +0 -934
  176. package/packages/dfcode/src/mcp/oauth-callback.ts +0 -200
  177. package/packages/dfcode/src/mcp/oauth-provider.ts +0 -154
  178. package/packages/dfcode/src/patch/index.ts +0 -680
  179. package/packages/dfcode/src/permission/arity.ts +0 -163
  180. package/packages/dfcode/src/permission/index.ts +0 -210
  181. package/packages/dfcode/src/permission/next.ts +0 -280
  182. package/packages/dfcode/src/plugin/codex.ts +0 -506
  183. package/packages/dfcode/src/plugin/copilot.ts +0 -283
  184. package/packages/dfcode/src/plugin/index.ts +0 -135
  185. package/packages/dfcode/src/project/bootstrap.ts +0 -35
  186. package/packages/dfcode/src/project/instance.ts +0 -91
  187. package/packages/dfcode/src/project/project.ts +0 -371
  188. package/packages/dfcode/src/project/state.ts +0 -66
  189. package/packages/dfcode/src/project/vcs.ts +0 -76
  190. package/packages/dfcode/src/provider/auth.ts +0 -147
  191. package/packages/dfcode/src/provider/models.ts +0 -136
  192. package/packages/dfcode/src/provider/provider.ts +0 -1219
  193. package/packages/dfcode/src/provider/sdk/openai-compatible/src/README.md +0 -5
  194. package/packages/dfcode/src/provider/sdk/openai-compatible/src/index.ts +0 -2
  195. package/packages/dfcode/src/provider/sdk/openai-compatible/src/openai-compatible-provider.ts +0 -100
  196. package/packages/dfcode/src/provider/sdk/openai-compatible/src/responses/convert-to-openai-responses-input.ts +0 -303
  197. package/packages/dfcode/src/provider/sdk/openai-compatible/src/responses/map-openai-responses-finish-reason.ts +0 -22
  198. package/packages/dfcode/src/provider/sdk/openai-compatible/src/responses/openai-config.ts +0 -18
  199. package/packages/dfcode/src/provider/sdk/openai-compatible/src/responses/openai-error.ts +0 -22
  200. package/packages/dfcode/src/provider/sdk/openai-compatible/src/responses/openai-responses-api-types.ts +0 -207
  201. package/packages/dfcode/src/provider/sdk/openai-compatible/src/responses/openai-responses-language-model.ts +0 -1732
  202. package/packages/dfcode/src/provider/sdk/openai-compatible/src/responses/openai-responses-prepare-tools.ts +0 -177
  203. package/packages/dfcode/src/provider/sdk/openai-compatible/src/responses/openai-responses-settings.ts +0 -1
  204. package/packages/dfcode/src/provider/sdk/openai-compatible/src/responses/tool/code-interpreter.ts +0 -88
  205. package/packages/dfcode/src/provider/sdk/openai-compatible/src/responses/tool/file-search.ts +0 -128
  206. package/packages/dfcode/src/provider/sdk/openai-compatible/src/responses/tool/image-generation.ts +0 -115
  207. package/packages/dfcode/src/provider/sdk/openai-compatible/src/responses/tool/local-shell.ts +0 -65
  208. package/packages/dfcode/src/provider/sdk/openai-compatible/src/responses/tool/web-search-preview.ts +0 -104
  209. package/packages/dfcode/src/provider/sdk/openai-compatible/src/responses/tool/web-search.ts +0 -103
  210. package/packages/dfcode/src/provider/transform.ts +0 -741
  211. package/packages/dfcode/src/pty/index.ts +0 -241
  212. package/packages/dfcode/src/question/index.ts +0 -171
  213. package/packages/dfcode/src/scheduler/index.ts +0 -61
  214. package/packages/dfcode/src/server/error.ts +0 -36
  215. package/packages/dfcode/src/server/event.ts +0 -7
  216. package/packages/dfcode/src/server/mdns.ts +0 -59
  217. package/packages/dfcode/src/server/routes/config.ts +0 -92
  218. package/packages/dfcode/src/server/routes/experimental.ts +0 -208
  219. package/packages/dfcode/src/server/routes/file.ts +0 -197
  220. package/packages/dfcode/src/server/routes/global.ts +0 -135
  221. package/packages/dfcode/src/server/routes/mcp.ts +0 -225
  222. package/packages/dfcode/src/server/routes/permission.ts +0 -68
  223. package/packages/dfcode/src/server/routes/project.ts +0 -82
  224. package/packages/dfcode/src/server/routes/provider.ts +0 -165
  225. package/packages/dfcode/src/server/routes/pty.ts +0 -169
  226. package/packages/dfcode/src/server/routes/question.ts +0 -98
  227. package/packages/dfcode/src/server/routes/session.ts +0 -939
  228. package/packages/dfcode/src/server/routes/tui.ts +0 -379
  229. package/packages/dfcode/src/server/server.ts +0 -574
  230. package/packages/dfcode/src/session/compaction.ts +0 -225
  231. package/packages/dfcode/src/session/index.ts +0 -498
  232. package/packages/dfcode/src/session/llm.ts +0 -288
  233. package/packages/dfcode/src/session/message-v2.ts +0 -740
  234. package/packages/dfcode/src/session/message.ts +0 -189
  235. package/packages/dfcode/src/session/processor.ts +0 -406
  236. package/packages/dfcode/src/session/prompt/anthropic-20250930.txt +0 -164
  237. package/packages/dfcode/src/session/prompt/anthropic.txt +0 -102
  238. package/packages/dfcode/src/session/prompt/anthropic_spoof.txt +0 -1
  239. package/packages/dfcode/src/session/prompt/beast.txt +0 -147
  240. package/packages/dfcode/src/session/prompt/build-switch.txt +0 -5
  241. package/packages/dfcode/src/session/prompt/codex_header.txt +0 -79
  242. package/packages/dfcode/src/session/prompt/copilot-gpt-5.txt +0 -143
  243. package/packages/dfcode/src/session/prompt/gemini.txt +0 -155
  244. package/packages/dfcode/src/session/prompt/max-steps.txt +0 -16
  245. package/packages/dfcode/src/session/prompt/plan-reminder-anthropic.txt +0 -67
  246. package/packages/dfcode/src/session/prompt/plan.txt +0 -26
  247. package/packages/dfcode/src/session/prompt/qwen.txt +0 -107
  248. package/packages/dfcode/src/session/prompt.ts +0 -1815
  249. package/packages/dfcode/src/session/retry.ts +0 -90
  250. package/packages/dfcode/src/session/revert.ts +0 -121
  251. package/packages/dfcode/src/session/status.ts +0 -76
  252. package/packages/dfcode/src/session/summary.ts +0 -150
  253. package/packages/dfcode/src/session/system.ts +0 -157
  254. package/packages/dfcode/src/session/todo.ts +0 -37
  255. package/packages/dfcode/src/share/share-next.ts +0 -200
  256. package/packages/dfcode/src/share/share.ts +0 -92
  257. package/packages/dfcode/src/shell/shell.ts +0 -67
  258. package/packages/dfcode/src/skill/index.ts +0 -1
  259. package/packages/dfcode/src/skill/skill.ts +0 -135
  260. package/packages/dfcode/src/snapshot/index.ts +0 -236
  261. package/packages/dfcode/src/storage/storage.ts +0 -227
  262. package/packages/dfcode/src/tool/apply_patch.ts +0 -280
  263. package/packages/dfcode/src/tool/apply_patch.txt +0 -33
  264. package/packages/dfcode/src/tool/bash.ts +0 -258
  265. package/packages/dfcode/src/tool/bash.txt +0 -115
  266. package/packages/dfcode/src/tool/batch.ts +0 -175
  267. package/packages/dfcode/src/tool/batch.txt +0 -24
  268. package/packages/dfcode/src/tool/codesearch.ts +0 -132
  269. package/packages/dfcode/src/tool/codesearch.txt +0 -12
  270. package/packages/dfcode/src/tool/edit.ts +0 -645
  271. package/packages/dfcode/src/tool/edit.txt +0 -10
  272. package/packages/dfcode/src/tool/external-directory.ts +0 -32
  273. package/packages/dfcode/src/tool/glob.ts +0 -77
  274. package/packages/dfcode/src/tool/glob.txt +0 -6
  275. package/packages/dfcode/src/tool/grep.ts +0 -154
  276. package/packages/dfcode/src/tool/grep.txt +0 -8
  277. package/packages/dfcode/src/tool/invalid.ts +0 -17
  278. package/packages/dfcode/src/tool/ls.ts +0 -121
  279. package/packages/dfcode/src/tool/ls.txt +0 -1
  280. package/packages/dfcode/src/tool/lsp.ts +0 -96
  281. package/packages/dfcode/src/tool/lsp.txt +0 -19
  282. package/packages/dfcode/src/tool/multiedit.ts +0 -46
  283. package/packages/dfcode/src/tool/multiedit.txt +0 -41
  284. package/packages/dfcode/src/tool/plan-enter.txt +0 -14
  285. package/packages/dfcode/src/tool/plan-exit.txt +0 -13
  286. package/packages/dfcode/src/tool/plan.ts +0 -130
  287. package/packages/dfcode/src/tool/question.ts +0 -33
  288. package/packages/dfcode/src/tool/question.txt +0 -10
  289. package/packages/dfcode/src/tool/read.ts +0 -202
  290. package/packages/dfcode/src/tool/read.txt +0 -12
  291. package/packages/dfcode/src/tool/registry.ts +0 -158
  292. package/packages/dfcode/src/tool/skill.ts +0 -82
  293. package/packages/dfcode/src/tool/task.ts +0 -191
  294. package/packages/dfcode/src/tool/task.txt +0 -60
  295. package/packages/dfcode/src/tool/todo.ts +0 -53
  296. package/packages/dfcode/src/tool/todoread.txt +0 -14
  297. package/packages/dfcode/src/tool/todowrite.txt +0 -167
  298. package/packages/dfcode/src/tool/tool.ts +0 -88
  299. package/packages/dfcode/src/tool/truncation.ts +0 -106
  300. package/packages/dfcode/src/tool/webfetch.ts +0 -188
  301. package/packages/dfcode/src/tool/webfetch.txt +0 -13
  302. package/packages/dfcode/src/tool/websearch.ts +0 -150
  303. package/packages/dfcode/src/tool/websearch.txt +0 -14
  304. package/packages/dfcode/src/tool/write.ts +0 -80
  305. package/packages/dfcode/src/tool/write.txt +0 -8
  306. package/packages/dfcode/src/util/archive.ts +0 -16
  307. package/packages/dfcode/src/util/color.ts +0 -19
  308. package/packages/dfcode/src/util/context.ts +0 -25
  309. package/packages/dfcode/src/util/defer.ts +0 -12
  310. package/packages/dfcode/src/util/eventloop.ts +0 -20
  311. package/packages/dfcode/src/util/filesystem.ts +0 -93
  312. package/packages/dfcode/src/util/fn.ts +0 -11
  313. package/packages/dfcode/src/util/format.ts +0 -20
  314. package/packages/dfcode/src/util/iife.ts +0 -3
  315. package/packages/dfcode/src/util/keybind.ts +0 -103
  316. package/packages/dfcode/src/util/lazy.ts +0 -18
  317. package/packages/dfcode/src/util/locale.ts +0 -81
  318. package/packages/dfcode/src/util/lock.ts +0 -98
  319. package/packages/dfcode/src/util/log.ts +0 -180
  320. package/packages/dfcode/src/util/queue.ts +0 -32
  321. package/packages/dfcode/src/util/rpc.ts +0 -66
  322. package/packages/dfcode/src/util/scrap.ts +0 -10
  323. package/packages/dfcode/src/util/signal.ts +0 -12
  324. package/packages/dfcode/src/util/timeout.ts +0 -14
  325. package/packages/dfcode/src/util/token.ts +0 -7
  326. package/packages/dfcode/src/util/wildcard.ts +0 -56
  327. package/packages/dfcode/src/worktree/index.ts +0 -524
  328. package/packages/plugin/package.json +0 -28
  329. package/packages/plugin/src/example.ts +0 -18
  330. package/packages/plugin/src/index.ts +0 -226
  331. package/packages/plugin/src/shell.ts +0 -136
  332. package/packages/plugin/src/tool.ts +0 -28
  333. package/packages/util/package.json +0 -20
  334. package/packages/util/src/array.ts +0 -10
  335. package/packages/util/src/binary.ts +0 -41
  336. package/packages/util/src/encode.ts +0 -30
  337. package/packages/util/src/error.ts +0 -54
  338. package/packages/util/src/fn.ts +0 -11
  339. package/packages/util/src/identifier.ts +0 -48
  340. package/packages/util/src/iife.ts +0 -3
  341. package/packages/util/src/lazy.ts +0 -11
  342. package/packages/util/src/path.ts +0 -37
  343. package/packages/util/src/retry.ts +0 -41
  344. package/packages/util/src/slug.ts +0 -74
@@ -1,750 +0,0 @@
1
- import { render, useKeyboard, useRenderer, useTerminalDimensions } from "@opentui/solid"
2
- import { Clipboard } from "@tui/util/clipboard"
3
- import { TextAttributes } from "@opentui/core"
4
- import { RouteProvider, useRoute } from "@tui/context/route"
5
- import { Switch, Match, createEffect, untrack, ErrorBoundary, createSignal, onMount, batch, Show, on } from "solid-js"
6
- import { Installation } from "@/installation"
7
- import { Flag } from "@/flag/flag"
8
- import { DialogProvider, useDialog } from "@tui/ui/dialog"
9
- import { DialogProvider as DialogProviderList } from "@tui/component/dialog-provider"
10
- import { SDKProvider, useSDK } from "@tui/context/sdk"
11
- import { SyncProvider, useSync } from "@tui/context/sync"
12
- import { LocalProvider, useLocal } from "@tui/context/local"
13
- import { DialogModel, useConnected } from "@tui/component/dialog-model"
14
- import { DialogMcp } from "@tui/component/dialog-mcp"
15
- import { DialogStatus } from "@tui/component/dialog-status"
16
- import { DialogThemeList } from "@tui/component/dialog-theme-list"
17
- import { DialogHelp } from "./ui/dialog-help"
18
- import { CommandProvider, useCommandDialog } from "@tui/component/dialog-command"
19
- import { DialogAgent } from "@tui/component/dialog-agent"
20
- import { DialogSessionList } from "@tui/component/dialog-session-list"
21
- import { KeybindProvider } from "@tui/context/keybind"
22
- import { ThemeProvider, useTheme } from "@tui/context/theme"
23
- import { Home } from "@tui/routes/home"
24
- import { Session } from "@tui/routes/session"
25
- import { PromptHistoryProvider } from "./component/prompt/history"
26
- import { FrecencyProvider } from "./component/prompt/frecency"
27
- import { PromptStashProvider } from "./component/prompt/stash"
28
- import { DialogAlert } from "./ui/dialog-alert"
29
- import { ToastProvider, useToast } from "./ui/toast"
30
- import { ExitProvider, useExit } from "./context/exit"
31
- import { Session as SessionApi } from "@/session"
32
- import { TuiEvent } from "./event"
33
- import { KVProvider, useKV } from "./context/kv"
34
- import { Provider } from "@/provider/provider"
35
- import { ArgsProvider, useArgs, type Args } from "./context/args"
36
- import open from "open"
37
- import { writeHeapSnapshot } from "v8"
38
- import { PromptRefProvider, usePromptRef } from "./context/prompt"
39
-
40
- async function getTerminalBackgroundColor(): Promise<"dark" | "light"> {
41
- // can't set raw mode if not a TTY
42
- if (!process.stdin.isTTY) return "dark"
43
-
44
- return new Promise((resolve) => {
45
- let timeout: NodeJS.Timeout
46
-
47
- const cleanup = () => {
48
- process.stdin.setRawMode(false)
49
- process.stdin.removeListener("data", handler)
50
- clearTimeout(timeout)
51
- }
52
-
53
- const handler = (data: Buffer) => {
54
- const str = data.toString()
55
- const match = str.match(/\x1b]11;([^\x07\x1b]+)/)
56
- if (match) {
57
- cleanup()
58
- const color = match[1]
59
- // Parse RGB values from color string
60
- // Formats: rgb:RR/GG/BB or #RRGGBB or rgb(R,G,B)
61
- let r = 0,
62
- g = 0,
63
- b = 0
64
-
65
- if (color.startsWith("rgb:")) {
66
- const parts = color.substring(4).split("/")
67
- r = parseInt(parts[0], 16) >> 8 // Convert 16-bit to 8-bit
68
- g = parseInt(parts[1], 16) >> 8 // Convert 16-bit to 8-bit
69
- b = parseInt(parts[2], 16) >> 8 // Convert 16-bit to 8-bit
70
- } else if (color.startsWith("#")) {
71
- r = parseInt(color.substring(1, 3), 16)
72
- g = parseInt(color.substring(3, 5), 16)
73
- b = parseInt(color.substring(5, 7), 16)
74
- } else if (color.startsWith("rgb(")) {
75
- const parts = color.substring(4, color.length - 1).split(",")
76
- r = parseInt(parts[0])
77
- g = parseInt(parts[1])
78
- b = parseInt(parts[2])
79
- }
80
-
81
- // Calculate luminance using relative luminance formula
82
- const luminance = (0.299 * r + 0.587 * g + 0.114 * b) / 255
83
-
84
- // Determine if dark or light based on luminance threshold
85
- resolve(luminance > 0.5 ? "light" : "dark")
86
- }
87
- }
88
-
89
- process.stdin.setRawMode(true)
90
- process.stdin.on("data", handler)
91
- process.stdout.write("\x1b]11;?\x07")
92
-
93
- timeout = setTimeout(() => {
94
- cleanup()
95
- resolve("dark")
96
- }, 1000)
97
- })
98
- }
99
-
100
- import type { EventSource } from "./context/sdk"
101
-
102
- export function tui(input: {
103
- url: string
104
- args: Args
105
- directory?: string
106
- fetch?: typeof fetch
107
- events?: EventSource
108
- onExit?: () => Promise<void>
109
- }) {
110
- // promise to prevent immediate exit
111
- return new Promise<void>(async (resolve) => {
112
- const mode = await getTerminalBackgroundColor()
113
- const onExit = async () => {
114
- await input.onExit?.()
115
- resolve()
116
- }
117
-
118
- render(
119
- () => {
120
- return (
121
- <ErrorBoundary
122
- fallback={(error, reset) => <ErrorComponent error={error} reset={reset} onExit={onExit} mode={mode} />}
123
- >
124
- <ArgsProvider {...input.args}>
125
- <ExitProvider onExit={onExit}>
126
- <KVProvider>
127
- <ToastProvider>
128
- <RouteProvider>
129
- <SDKProvider
130
- url={input.url}
131
- directory={input.directory}
132
- fetch={input.fetch}
133
- events={input.events}
134
- >
135
- <SyncProvider>
136
- <ThemeProvider mode={mode}>
137
- <LocalProvider>
138
- <KeybindProvider>
139
- <PromptStashProvider>
140
- <DialogProvider>
141
- <CommandProvider>
142
- <FrecencyProvider>
143
- <PromptHistoryProvider>
144
- <PromptRefProvider>
145
- <App />
146
- </PromptRefProvider>
147
- </PromptHistoryProvider>
148
- </FrecencyProvider>
149
- </CommandProvider>
150
- </DialogProvider>
151
- </PromptStashProvider>
152
- </KeybindProvider>
153
- </LocalProvider>
154
- </ThemeProvider>
155
- </SyncProvider>
156
- </SDKProvider>
157
- </RouteProvider>
158
- </ToastProvider>
159
- </KVProvider>
160
- </ExitProvider>
161
- </ArgsProvider>
162
- </ErrorBoundary>
163
- )
164
- },
165
- {
166
- targetFps: 60,
167
- gatherStats: false,
168
- exitOnCtrlC: false,
169
- useKittyKeyboard: {},
170
- consoleOptions: {
171
- keyBindings: [{ name: "y", ctrl: true, action: "copy-selection" }],
172
- onCopySelection: (text) => {
173
- Clipboard.copy(text).catch((error) => {
174
- console.error(`Failed to copy console selection to clipboard: ${error}`)
175
- })
176
- },
177
- },
178
- },
179
- )
180
- })
181
- }
182
-
183
- function App() {
184
- const route = useRoute()
185
- const dimensions = useTerminalDimensions()
186
- const renderer = useRenderer()
187
- renderer.disableStdoutInterception()
188
- const dialog = useDialog()
189
- const local = useLocal()
190
- const kv = useKV()
191
- const command = useCommandDialog()
192
- const sdk = useSDK()
193
- const toast = useToast()
194
- const { theme, mode, setMode } = useTheme()
195
- const sync = useSync()
196
- const exit = useExit()
197
- const promptRef = usePromptRef()
198
-
199
- // Wire up console copy-to-clipboard via opentui's onCopySelection callback
200
- renderer.console.onCopySelection = async (text: string) => {
201
- if (!text || text.length === 0) return
202
-
203
- await Clipboard.copy(text)
204
- .then(() => toast.show({ message: "Copied to clipboard", variant: "info" }))
205
- .catch(toast.error)
206
- renderer.clearSelection()
207
- }
208
- const [terminalTitleEnabled, setTerminalTitleEnabled] = createSignal(kv.get("terminal_title_enabled", true))
209
-
210
- createEffect(() => {
211
- console.log(JSON.stringify(route.data))
212
- })
213
-
214
- // Update terminal window title based on current route and session
215
- createEffect(() => {
216
- if (!terminalTitleEnabled() || Flag.DFCODE_DISABLE_TERMINAL_TITLE) return
217
-
218
- if (route.data.type === "home") {
219
- renderer.setTerminalTitle("DFCode")
220
- return
221
- }
222
-
223
- if (route.data.type === "session") {
224
- const session = sync.session.get(route.data.sessionID)
225
- if (!session || SessionApi.isDefaultTitle(session.title)) {
226
- renderer.setTerminalTitle("DFCode")
227
- return
228
- }
229
-
230
- // Truncate title to 40 chars max
231
- const title = session.title.length > 40 ? session.title.slice(0, 37) + "..." : session.title
232
- renderer.setTerminalTitle(`OC | ${title}`)
233
- }
234
- })
235
-
236
- const args = useArgs()
237
- onMount(() => {
238
- batch(() => {
239
- if (args.agent) local.agent.set(args.agent)
240
- if (args.model) {
241
- const { providerID, modelID } = Provider.parseModel(args.model)
242
- if (!providerID || !modelID)
243
- return toast.show({
244
- variant: "warning",
245
- message: `Invalid model format: ${args.model}`,
246
- duration: 3000,
247
- })
248
- local.model.set({ providerID, modelID }, { recent: true })
249
- }
250
- if (args.sessionID) {
251
- route.navigate({
252
- type: "session",
253
- sessionID: args.sessionID,
254
- })
255
- }
256
- })
257
- })
258
-
259
- let continued = false
260
- createEffect(() => {
261
- // When using -c, session list is loaded in blocking phase, so we can navigate at "partial"
262
- if (continued || sync.status === "loading" || !args.continue) return
263
- const match = sync.data.session
264
- .toSorted((a, b) => b.time.updated - a.time.updated)
265
- .find((x) => x.parentID === undefined)?.id
266
- if (match) {
267
- continued = true
268
- route.navigate({ type: "session", sessionID: match })
269
- }
270
- })
271
-
272
- createEffect(
273
- on(
274
- () => sync.status === "complete" && sync.data.provider.length === 0,
275
- (isEmpty, wasEmpty) => {
276
- // only trigger when we transition into an empty-provider state
277
- if (!isEmpty || wasEmpty) return
278
- dialog.replace(() => <DialogProviderList />)
279
- },
280
- ),
281
- )
282
-
283
- const connected = useConnected()
284
- command.register(() => [
285
- {
286
- title: "Switch session",
287
- value: "session.list",
288
- keybind: "session_list",
289
- category: "Session",
290
- suggested: sync.data.session.length > 0,
291
- slash: {
292
- name: "sessions",
293
- aliases: ["resume", "continue"],
294
- },
295
- onSelect: () => {
296
- dialog.replace(() => <DialogSessionList />)
297
- },
298
- },
299
- {
300
- title: "New session",
301
- suggested: route.data.type === "session",
302
- value: "session.new",
303
- keybind: "session_new",
304
- category: "Session",
305
- slash: {
306
- name: "new",
307
- aliases: ["clear"],
308
- },
309
- onSelect: () => {
310
- const current = promptRef.current
311
- // Don't require focus - if there's any text, preserve it
312
- const currentPrompt = current?.current?.input ? current.current : undefined
313
- route.navigate({
314
- type: "home",
315
- initialPrompt: currentPrompt,
316
- })
317
- dialog.clear()
318
- },
319
- },
320
- {
321
- title: "Switch model",
322
- value: "model.list",
323
- keybind: "model_list",
324
- suggested: true,
325
- category: "Agent",
326
- slash: {
327
- name: "models",
328
- },
329
- onSelect: () => {
330
- dialog.replace(() => <DialogModel />)
331
- },
332
- },
333
- {
334
- title: "Model cycle",
335
- value: "model.cycle_recent",
336
- keybind: "model_cycle_recent",
337
- category: "Agent",
338
- hidden: true,
339
- onSelect: () => {
340
- local.model.cycle(1)
341
- },
342
- },
343
- {
344
- title: "Model cycle reverse",
345
- value: "model.cycle_recent_reverse",
346
- keybind: "model_cycle_recent_reverse",
347
- category: "Agent",
348
- hidden: true,
349
- onSelect: () => {
350
- local.model.cycle(-1)
351
- },
352
- },
353
- {
354
- title: "Favorite cycle",
355
- value: "model.cycle_favorite",
356
- keybind: "model_cycle_favorite",
357
- category: "Agent",
358
- hidden: true,
359
- onSelect: () => {
360
- local.model.cycleFavorite(1)
361
- },
362
- },
363
- {
364
- title: "Favorite cycle reverse",
365
- value: "model.cycle_favorite_reverse",
366
- keybind: "model_cycle_favorite_reverse",
367
- category: "Agent",
368
- hidden: true,
369
- onSelect: () => {
370
- local.model.cycleFavorite(-1)
371
- },
372
- },
373
- {
374
- title: "Switch agent",
375
- value: "agent.list",
376
- keybind: "agent_list",
377
- category: "Agent",
378
- slash: {
379
- name: "agents",
380
- },
381
- onSelect: () => {
382
- dialog.replace(() => <DialogAgent />)
383
- },
384
- },
385
- {
386
- title: "Toggle MCPs",
387
- value: "mcp.list",
388
- category: "Agent",
389
- slash: {
390
- name: "mcps",
391
- },
392
- onSelect: () => {
393
- dialog.replace(() => <DialogMcp />)
394
- },
395
- },
396
- {
397
- title: "Agent cycle",
398
- value: "agent.cycle",
399
- keybind: "agent_cycle",
400
- category: "Agent",
401
- hidden: true,
402
- onSelect: () => {
403
- local.agent.move(1)
404
- },
405
- },
406
- {
407
- title: "Variant cycle",
408
- value: "variant.cycle",
409
- keybind: "variant_cycle",
410
- category: "Agent",
411
- hidden: true,
412
- onSelect: () => {
413
- local.model.variant.cycle()
414
- },
415
- },
416
- {
417
- title: "Agent cycle reverse",
418
- value: "agent.cycle.reverse",
419
- keybind: "agent_cycle_reverse",
420
- category: "Agent",
421
- hidden: true,
422
- onSelect: () => {
423
- local.agent.move(-1)
424
- },
425
- },
426
- {
427
- title: "Connect provider",
428
- value: "provider.connect",
429
- suggested: !connected(),
430
- slash: {
431
- name: "connect",
432
- },
433
- onSelect: () => {
434
- dialog.replace(() => <DialogProviderList />)
435
- },
436
- category: "Provider",
437
- },
438
- {
439
- title: "View status",
440
- keybind: "status_view",
441
- value: "dfcode.status",
442
- slash: {
443
- name: "status",
444
- },
445
- onSelect: () => {
446
- dialog.replace(() => <DialogStatus />)
447
- },
448
- category: "System",
449
- },
450
- {
451
- title: "Switch theme",
452
- value: "theme.switch",
453
- keybind: "theme_list",
454
- slash: {
455
- name: "themes",
456
- },
457
- onSelect: () => {
458
- dialog.replace(() => <DialogThemeList />)
459
- },
460
- category: "System",
461
- },
462
- {
463
- title: "Toggle appearance",
464
- value: "theme.switch_mode",
465
- onSelect: (dialog) => {
466
- setMode(mode() === "dark" ? "light" : "dark")
467
- dialog.clear()
468
- },
469
- category: "System",
470
- },
471
- {
472
- title: "Help",
473
- value: "help.show",
474
- slash: {
475
- name: "help",
476
- },
477
- onSelect: () => {
478
- dialog.replace(() => <DialogHelp />)
479
- },
480
- category: "System",
481
- },
482
- {
483
- title: "Open docs",
484
- value: "docs.open",
485
- onSelect: () => {
486
- open("https://dfcode.ai/docs").catch(() => {})
487
- dialog.clear()
488
- },
489
- category: "System",
490
- },
491
- {
492
- title: "Open WebUI",
493
- value: "webui.open",
494
- onSelect: () => {
495
- open(sdk.url).catch(() => {})
496
- dialog.clear()
497
- },
498
- category: "System",
499
- },
500
- {
501
- title: "Exit the app",
502
- value: "app.exit",
503
- slash: {
504
- name: "exit",
505
- aliases: ["quit", "q"],
506
- },
507
- onSelect: () => exit(),
508
- category: "System",
509
- },
510
- {
511
- title: "Toggle debug panel",
512
- category: "System",
513
- value: "app.debug",
514
- onSelect: (dialog) => {
515
- renderer.toggleDebugOverlay()
516
- dialog.clear()
517
- },
518
- },
519
- {
520
- title: "Toggle console",
521
- category: "System",
522
- value: "app.console",
523
- onSelect: (dialog) => {
524
- renderer.console.toggle()
525
- dialog.clear()
526
- },
527
- },
528
- {
529
- title: "Write heap snapshot",
530
- category: "System",
531
- value: "app.heap_snapshot",
532
- onSelect: (dialog) => {
533
- const path = writeHeapSnapshot()
534
- toast.show({
535
- variant: "info",
536
- message: `Heap snapshot written to ${path}`,
537
- duration: 5000,
538
- })
539
- dialog.clear()
540
- },
541
- },
542
- {
543
- title: "Suspend terminal",
544
- value: "terminal.suspend",
545
- keybind: "terminal_suspend",
546
- category: "System",
547
- hidden: true,
548
- onSelect: () => {
549
- process.once("SIGCONT", () => {
550
- renderer.resume()
551
- })
552
-
553
- renderer.suspend()
554
- // pid=0 means send the signal to all processes in the process group
555
- process.kill(0, "SIGTSTP")
556
- },
557
- },
558
- {
559
- title: terminalTitleEnabled() ? "Disable terminal title" : "Enable terminal title",
560
- value: "terminal.title.toggle",
561
- keybind: "terminal_title_toggle",
562
- category: "System",
563
- onSelect: (dialog) => {
564
- setTerminalTitleEnabled((prev) => {
565
- const next = !prev
566
- kv.set("terminal_title_enabled", next)
567
- if (!next) renderer.setTerminalTitle("")
568
- return next
569
- })
570
- dialog.clear()
571
- },
572
- },
573
- ])
574
-
575
- createEffect(() => {
576
- const currentModel = local.model.current()
577
- if (!currentModel) return
578
- if (currentModel.providerID === "openrouter" && !kv.get("openrouter_warning", false)) {
579
- untrack(() => {
580
- DialogAlert.show(
581
- dialog,
582
- "Warning",
583
- "While openrouter is a convenient way to access LLMs your request will often be routed to subpar providers that do not work well in our testing.\n\nFor reliable access to models check out DFCode Zen\nhttps://dfcode.ai/zen",
584
- ).then(() => kv.set("openrouter_warning", true))
585
- })
586
- }
587
- })
588
-
589
- sdk.event.on(TuiEvent.CommandExecute.type, (evt) => {
590
- command.trigger(evt.properties.command)
591
- })
592
-
593
- sdk.event.on(TuiEvent.ToastShow.type, (evt) => {
594
- toast.show({
595
- title: evt.properties.title,
596
- message: evt.properties.message,
597
- variant: evt.properties.variant,
598
- duration: evt.properties.duration,
599
- })
600
- })
601
-
602
- sdk.event.on(TuiEvent.SessionSelect.type, (evt) => {
603
- route.navigate({
604
- type: "session",
605
- sessionID: evt.properties.sessionID,
606
- })
607
- })
608
-
609
- sdk.event.on(SessionApi.Event.Deleted.type, (evt) => {
610
- if (route.data.type === "session" && route.data.sessionID === evt.properties.info.id) {
611
- route.navigate({ type: "home" })
612
- toast.show({
613
- variant: "info",
614
- message: "The current session was deleted",
615
- })
616
- }
617
- })
618
-
619
- sdk.event.on(SessionApi.Event.Error.type, (evt) => {
620
- const error = evt.properties.error
621
- if (error && typeof error === "object" && error.name === "MessageAbortedError") return
622
- const message = (() => {
623
- if (!error) return "An error occurred"
624
-
625
- if (typeof error === "object") {
626
- const data = error.data
627
- if ("message" in data && typeof data.message === "string") {
628
- return data.message
629
- }
630
- }
631
- return String(error)
632
- })()
633
-
634
- toast.show({
635
- variant: "error",
636
- message,
637
- duration: 5000,
638
- })
639
- })
640
-
641
- sdk.event.on(Installation.Event.UpdateAvailable.type, (evt) => {
642
- toast.show({
643
- variant: "info",
644
- title: "Update Available",
645
- message: `DFCode v${evt.properties.version} is available. Run 'dfcode upgrade' to update manually.`,
646
- duration: 10000,
647
- })
648
- })
649
-
650
- return (
651
- <box
652
- width={dimensions().width}
653
- height={dimensions().height}
654
- backgroundColor={theme.background}
655
- onMouseUp={async () => {
656
- if (Flag.DFCODE_EXPERIMENTAL_DISABLE_COPY_ON_SELECT) {
657
- renderer.clearSelection()
658
- return
659
- }
660
- const text = renderer.getSelection()?.getSelectedText()
661
- if (text && text.length > 0) {
662
- await Clipboard.copy(text)
663
- .then(() => toast.show({ message: "Copied to clipboard", variant: "info" }))
664
- .catch(toast.error)
665
- renderer.clearSelection()
666
- }
667
- }}
668
- >
669
- <Switch>
670
- <Match when={route.data.type === "home"}>
671
- <Home />
672
- </Match>
673
- <Match when={route.data.type === "session"}>
674
- <Session />
675
- </Match>
676
- </Switch>
677
- </box>
678
- )
679
- }
680
-
681
- function ErrorComponent(props: {
682
- error: Error
683
- reset: () => void
684
- onExit: () => Promise<void>
685
- mode?: "dark" | "light"
686
- }) {
687
- const term = useTerminalDimensions()
688
- const renderer = useRenderer()
689
-
690
- const handleExit = async () => {
691
- renderer.setTerminalTitle("")
692
- renderer.destroy()
693
- props.onExit()
694
- }
695
-
696
- useKeyboard((evt) => {
697
- if (evt.ctrl && evt.name === "c") {
698
- handleExit()
699
- }
700
- })
701
- const [copied, setCopied] = createSignal(false)
702
-
703
- const wechatID = "Wbzzz123123"
704
-
705
- // Choose safe fallback colors per mode since theme context may not be available
706
- const isLight = props.mode === "light"
707
- const colors = {
708
- bg: isLight ? "#ffffff" : "#0a0a0a",
709
- text: isLight ? "#1a1a1a" : "#eeeeee",
710
- muted: isLight ? "#8a8a8a" : "#808080",
711
- primary: isLight ? "#3b7dd8" : "#58a6ff",
712
- }
713
-
714
- const errorInfo = `DFCode ${Installation.VERSION}\n${props.error.message || ""}\n${props.error.stack || ""}`
715
-
716
- const copyErrorInfo = () => {
717
- Clipboard.copy(errorInfo).then(() => {
718
- setCopied(true)
719
- })
720
- }
721
-
722
- return (
723
- <box flexDirection="column" gap={1} backgroundColor={colors.bg}>
724
- <box flexDirection="row" gap={1} alignItems="center">
725
- <text attributes={TextAttributes.BOLD} fg={colors.text}>
726
- 如需反馈请添加微信: {wechatID}
727
- </text>
728
- <box onMouseUp={copyErrorInfo} backgroundColor={colors.primary} padding={1}>
729
- <text attributes={TextAttributes.BOLD} fg={colors.bg}>
730
- 复制错误信息
731
- </text>
732
- </box>
733
- {copied() && <text fg={colors.muted}>已复制</text>}
734
- </box>
735
- <box flexDirection="row" gap={2} alignItems="center">
736
- <text fg={colors.text}>A fatal error occurred!</text>
737
- <box onMouseUp={props.reset} backgroundColor={colors.primary} padding={1}>
738
- <text fg={colors.bg}>Reset TUI</text>
739
- </box>
740
- <box onMouseUp={handleExit} backgroundColor={colors.primary} padding={1}>
741
- <text fg={colors.bg}>Exit</text>
742
- </box>
743
- </box>
744
- <scrollbox height={Math.floor(term().height * 0.7)}>
745
- <text fg={colors.muted}>{props.error.stack}</text>
746
- </scrollbox>
747
- <text fg={colors.text}>{props.error.message}</text>
748
- </box>
749
- )
750
- }