cerebras-cli 1.0.1 → 1.0.4

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 (314) hide show
  1. package/README.md +3 -5
  2. package/cerebras-cli-1.0.0.tgz +0 -0
  3. package/package.json +7 -88
  4. package/AGENTS.md +0 -27
  5. package/Dockerfile +0 -10
  6. package/bunfig.toml +0 -4
  7. package/parsers-config.ts +0 -239
  8. package/script/build.ts +0 -151
  9. package/script/postinstall.mjs +0 -122
  10. package/script/publish.ts +0 -256
  11. package/script/schema.ts +0 -47
  12. package/src/acp/README.md +0 -164
  13. package/src/acp/agent.ts +0 -812
  14. package/src/acp/session.ts +0 -70
  15. package/src/acp/types.ts +0 -22
  16. package/src/agent/agent.ts +0 -310
  17. package/src/agent/generate.txt +0 -75
  18. package/src/auth/index.ts +0 -70
  19. package/src/bun/index.ts +0 -152
  20. package/src/bus/global.ts +0 -10
  21. package/src/bus/index.ts +0 -142
  22. package/src/cli/bootstrap.ts +0 -17
  23. package/src/cli/cmd/acp.ts +0 -88
  24. package/src/cli/cmd/agent.ts +0 -165
  25. package/src/cli/cmd/auth.ts +0 -369
  26. package/src/cli/cmd/cmd.ts +0 -7
  27. package/src/cli/cmd/debug/config.ts +0 -15
  28. package/src/cli/cmd/debug/file.ts +0 -91
  29. package/src/cli/cmd/debug/index.ts +0 -41
  30. package/src/cli/cmd/debug/lsp.ts +0 -47
  31. package/src/cli/cmd/debug/ripgrep.ts +0 -83
  32. package/src/cli/cmd/debug/scrap.ts +0 -15
  33. package/src/cli/cmd/debug/snapshot.ts +0 -48
  34. package/src/cli/cmd/export.ts +0 -88
  35. package/src/cli/cmd/generate.ts +0 -38
  36. package/src/cli/cmd/github.ts +0 -1200
  37. package/src/cli/cmd/import.ts +0 -98
  38. package/src/cli/cmd/mcp.ts +0 -400
  39. package/src/cli/cmd/models.ts +0 -77
  40. package/src/cli/cmd/pr.ts +0 -112
  41. package/src/cli/cmd/run.ts +0 -342
  42. package/src/cli/cmd/serve.ts +0 -31
  43. package/src/cli/cmd/session.ts +0 -106
  44. package/src/cli/cmd/stats.ts +0 -298
  45. package/src/cli/cmd/tui/app.tsx +0 -732
  46. package/src/cli/cmd/tui/attach.ts +0 -25
  47. package/src/cli/cmd/tui/component/border.tsx +0 -21
  48. package/src/cli/cmd/tui/component/dialog-agent.tsx +0 -31
  49. package/src/cli/cmd/tui/component/dialog-command.tsx +0 -124
  50. package/src/cli/cmd/tui/component/dialog-feedback.tsx +0 -160
  51. package/src/cli/cmd/tui/component/dialog-mcp.tsx +0 -86
  52. package/src/cli/cmd/tui/component/dialog-model.tsx +0 -223
  53. package/src/cli/cmd/tui/component/dialog-notification.tsx +0 -78
  54. package/src/cli/cmd/tui/component/dialog-provider.tsx +0 -222
  55. package/src/cli/cmd/tui/component/dialog-session-list.tsx +0 -97
  56. package/src/cli/cmd/tui/component/dialog-session-rename.tsx +0 -31
  57. package/src/cli/cmd/tui/component/dialog-status.tsx +0 -114
  58. package/src/cli/cmd/tui/component/dialog-tag.tsx +0 -44
  59. package/src/cli/cmd/tui/component/dialog-theme-list.tsx +0 -50
  60. package/src/cli/cmd/tui/component/logo.tsx +0 -37
  61. package/src/cli/cmd/tui/component/notification-banner.tsx +0 -58
  62. package/src/cli/cmd/tui/component/prompt/autocomplete.tsx +0 -530
  63. package/src/cli/cmd/tui/component/prompt/history.tsx +0 -107
  64. package/src/cli/cmd/tui/component/prompt/index.tsx +0 -931
  65. package/src/cli/cmd/tui/context/args.tsx +0 -14
  66. package/src/cli/cmd/tui/context/directory.ts +0 -12
  67. package/src/cli/cmd/tui/context/exit.tsx +0 -23
  68. package/src/cli/cmd/tui/context/helper.tsx +0 -25
  69. package/src/cli/cmd/tui/context/keybind.tsx +0 -111
  70. package/src/cli/cmd/tui/context/kv.tsx +0 -49
  71. package/src/cli/cmd/tui/context/local.tsx +0 -339
  72. package/src/cli/cmd/tui/context/prompt.tsx +0 -18
  73. package/src/cli/cmd/tui/context/route.tsx +0 -45
  74. package/src/cli/cmd/tui/context/sdk.tsx +0 -75
  75. package/src/cli/cmd/tui/context/sync.tsx +0 -374
  76. package/src/cli/cmd/tui/context/theme/aura.json +0 -69
  77. package/src/cli/cmd/tui/context/theme/ayu.json +0 -80
  78. package/src/cli/cmd/tui/context/theme/catppuccin-macchiato.json +0 -233
  79. package/src/cli/cmd/tui/context/theme/catppuccin.json +0 -112
  80. package/src/cli/cmd/tui/context/theme/cobalt2.json +0 -228
  81. package/src/cli/cmd/tui/context/theme/dracula.json +0 -219
  82. package/src/cli/cmd/tui/context/theme/everforest.json +0 -241
  83. package/src/cli/cmd/tui/context/theme/flexoki.json +0 -237
  84. package/src/cli/cmd/tui/context/theme/github.json +0 -233
  85. package/src/cli/cmd/tui/context/theme/gruvbox.json +0 -95
  86. package/src/cli/cmd/tui/context/theme/kanagawa.json +0 -77
  87. package/src/cli/cmd/tui/context/theme/material.json +0 -235
  88. package/src/cli/cmd/tui/context/theme/matrix.json +0 -77
  89. package/src/cli/cmd/tui/context/theme/mercury.json +0 -252
  90. package/src/cli/cmd/tui/context/theme/monokai.json +0 -221
  91. package/src/cli/cmd/tui/context/theme/nightowl.json +0 -221
  92. package/src/cli/cmd/tui/context/theme/nord.json +0 -223
  93. package/src/cli/cmd/tui/context/theme/one-dark.json +0 -84
  94. package/src/cli/cmd/tui/context/theme/orng.json +0 -245
  95. package/src/cli/cmd/tui/context/theme/palenight.json +0 -222
  96. package/src/cli/cmd/tui/context/theme/rosepine.json +0 -234
  97. package/src/cli/cmd/tui/context/theme/solarized.json +0 -223
  98. package/src/cli/cmd/tui/context/theme/synthwave84.json +0 -226
  99. package/src/cli/cmd/tui/context/theme/tokyonight.json +0 -243
  100. package/src/cli/cmd/tui/context/theme/vercel.json +0 -245
  101. package/src/cli/cmd/tui/context/theme/vesper.json +0 -218
  102. package/src/cli/cmd/tui/context/theme/zenburn.json +0 -223
  103. package/src/cli/cmd/tui/context/theme.tsx +0 -1077
  104. package/src/cli/cmd/tui/event.ts +0 -39
  105. package/src/cli/cmd/tui/routes/home.tsx +0 -104
  106. package/src/cli/cmd/tui/routes/session/dialog-message.tsx +0 -93
  107. package/src/cli/cmd/tui/routes/session/dialog-timeline.tsx +0 -37
  108. package/src/cli/cmd/tui/routes/session/footer.tsx +0 -76
  109. package/src/cli/cmd/tui/routes/session/header.tsx +0 -183
  110. package/src/cli/cmd/tui/routes/session/index.tsx +0 -1703
  111. package/src/cli/cmd/tui/routes/session/sidebar.tsx +0 -586
  112. package/src/cli/cmd/tui/spawn.ts +0 -60
  113. package/src/cli/cmd/tui/thread.ts +0 -120
  114. package/src/cli/cmd/tui/ui/dialog-alert.tsx +0 -55
  115. package/src/cli/cmd/tui/ui/dialog-confirm.tsx +0 -81
  116. package/src/cli/cmd/tui/ui/dialog-help.tsx +0 -36
  117. package/src/cli/cmd/tui/ui/dialog-prompt.tsx +0 -75
  118. package/src/cli/cmd/tui/ui/dialog-select.tsx +0 -317
  119. package/src/cli/cmd/tui/ui/dialog.tsx +0 -170
  120. package/src/cli/cmd/tui/ui/spinner.ts +0 -368
  121. package/src/cli/cmd/tui/ui/toast.tsx +0 -100
  122. package/src/cli/cmd/tui/util/clipboard.ts +0 -127
  123. package/src/cli/cmd/tui/util/editor.ts +0 -32
  124. package/src/cli/cmd/tui/util/terminal.ts +0 -114
  125. package/src/cli/cmd/tui/worker.ts +0 -63
  126. package/src/cli/cmd/uninstall.ts +0 -344
  127. package/src/cli/cmd/upgrade.ts +0 -67
  128. package/src/cli/cmd/web.ts +0 -84
  129. package/src/cli/error.ts +0 -55
  130. package/src/cli/ui.ts +0 -84
  131. package/src/cli/upgrade.ts +0 -25
  132. package/src/command/index.ts +0 -79
  133. package/src/command/template/initialize.txt +0 -10
  134. package/src/command/template/review.txt +0 -73
  135. package/src/config/config.ts +0 -886
  136. package/src/config/markdown.ts +0 -41
  137. package/src/env/index.ts +0 -26
  138. package/src/file/fzf.ts +0 -124
  139. package/src/file/ignore.ts +0 -83
  140. package/src/file/index.ts +0 -326
  141. package/src/file/ripgrep.ts +0 -391
  142. package/src/file/time.ts +0 -38
  143. package/src/file/watcher.ts +0 -89
  144. package/src/flag/flag.ts +0 -28
  145. package/src/format/formatter.ts +0 -277
  146. package/src/format/index.ts +0 -137
  147. package/src/global/index.ts +0 -52
  148. package/src/id/id.ts +0 -73
  149. package/src/ide/index.ts +0 -75
  150. package/src/index.ts +0 -158
  151. package/src/installation/index.ts +0 -194
  152. package/src/lsp/client.ts +0 -215
  153. package/src/lsp/index.ts +0 -370
  154. package/src/lsp/language.ts +0 -111
  155. package/src/lsp/server.ts +0 -1327
  156. package/src/mcp/auth.ts +0 -82
  157. package/src/mcp/index.ts +0 -576
  158. package/src/mcp/oauth-callback.ts +0 -203
  159. package/src/mcp/oauth-provider.ts +0 -132
  160. package/src/notification/index.ts +0 -101
  161. package/src/patch/index.ts +0 -622
  162. package/src/permission/index.ts +0 -198
  163. package/src/plugin/index.ts +0 -95
  164. package/src/project/bootstrap.ts +0 -31
  165. package/src/project/instance.ts +0 -68
  166. package/src/project/project.ts +0 -133
  167. package/src/project/state.ts +0 -65
  168. package/src/project/vcs.ts +0 -77
  169. package/src/provider/auth.ts +0 -143
  170. package/src/provider/models-macro.ts +0 -11
  171. package/src/provider/models.ts +0 -93
  172. package/src/provider/provider.ts +0 -996
  173. package/src/provider/sdk/openai-compatible/src/README.md +0 -5
  174. package/src/provider/sdk/openai-compatible/src/index.ts +0 -2
  175. package/src/provider/sdk/openai-compatible/src/openai-compatible-provider.ts +0 -100
  176. package/src/provider/sdk/openai-compatible/src/responses/convert-to-openai-responses-input.ts +0 -303
  177. package/src/provider/sdk/openai-compatible/src/responses/map-openai-responses-finish-reason.ts +0 -27
  178. package/src/provider/sdk/openai-compatible/src/responses/openai-config.ts +0 -18
  179. package/src/provider/sdk/openai-compatible/src/responses/openai-error.ts +0 -22
  180. package/src/provider/sdk/openai-compatible/src/responses/openai-responses-api-types.ts +0 -207
  181. package/src/provider/sdk/openai-compatible/src/responses/openai-responses-language-model.ts +0 -1713
  182. package/src/provider/sdk/openai-compatible/src/responses/openai-responses-prepare-tools.ts +0 -177
  183. package/src/provider/sdk/openai-compatible/src/responses/openai-responses-settings.ts +0 -1
  184. package/src/provider/sdk/openai-compatible/src/responses/tool/code-interpreter.ts +0 -88
  185. package/src/provider/sdk/openai-compatible/src/responses/tool/file-search.ts +0 -128
  186. package/src/provider/sdk/openai-compatible/src/responses/tool/image-generation.ts +0 -115
  187. package/src/provider/sdk/openai-compatible/src/responses/tool/local-shell.ts +0 -65
  188. package/src/provider/sdk/openai-compatible/src/responses/tool/web-search-preview.ts +0 -104
  189. package/src/provider/sdk/openai-compatible/src/responses/tool/web-search.ts +0 -103
  190. package/src/provider/transform.ts +0 -406
  191. package/src/pty/index.ts +0 -226
  192. package/src/ratelimit/index.ts +0 -185
  193. package/src/server/error.ts +0 -36
  194. package/src/server/project.ts +0 -50
  195. package/src/server/server.ts +0 -2463
  196. package/src/server/tui.ts +0 -71
  197. package/src/session/compaction.ts +0 -257
  198. package/src/session/index.ts +0 -470
  199. package/src/session/message-v2.ts +0 -641
  200. package/src/session/message.ts +0 -189
  201. package/src/session/processor.ts +0 -443
  202. package/src/session/prompt/anthropic-20250930.txt +0 -166
  203. package/src/session/prompt/anthropic.txt +0 -105
  204. package/src/session/prompt/anthropic_spoof.txt +0 -1
  205. package/src/session/prompt/beast.txt +0 -147
  206. package/src/session/prompt/build-switch.txt +0 -5
  207. package/src/session/prompt/codex.txt +0 -318
  208. package/src/session/prompt/compaction.txt +0 -12
  209. package/src/session/prompt/copilot-gpt-5.txt +0 -143
  210. package/src/session/prompt/gemini.txt +0 -155
  211. package/src/session/prompt/max-steps.txt +0 -16
  212. package/src/session/prompt/plan-reminder-anthropic.txt +0 -67
  213. package/src/session/prompt/plan.txt +0 -26
  214. package/src/session/prompt/polaris.txt +0 -107
  215. package/src/session/prompt/qwen.txt +0 -109
  216. package/src/session/prompt/summarize.txt +0 -4
  217. package/src/session/prompt/title.txt +0 -36
  218. package/src/session/prompt.ts +0 -1541
  219. package/src/session/retry.ts +0 -82
  220. package/src/session/revert.ts +0 -108
  221. package/src/session/status.ts +0 -75
  222. package/src/session/summary.ts +0 -203
  223. package/src/session/system.ts +0 -148
  224. package/src/session/todo.ts +0 -36
  225. package/src/share/share-next.ts +0 -195
  226. package/src/share/share.ts +0 -87
  227. package/src/snapshot/index.ts +0 -197
  228. package/src/storage/storage.ts +0 -226
  229. package/src/telemetry/index.ts +0 -232
  230. package/src/tool/bash.ts +0 -365
  231. package/src/tool/bash.txt +0 -128
  232. package/src/tool/batch.ts +0 -173
  233. package/src/tool/batch.txt +0 -28
  234. package/src/tool/codesearch.ts +0 -138
  235. package/src/tool/codesearch.txt +0 -12
  236. package/src/tool/edit.ts +0 -674
  237. package/src/tool/edit.txt +0 -10
  238. package/src/tool/glob.ts +0 -65
  239. package/src/tool/glob.txt +0 -6
  240. package/src/tool/grep.ts +0 -120
  241. package/src/tool/grep.txt +0 -8
  242. package/src/tool/invalid.ts +0 -17
  243. package/src/tool/ls.ts +0 -110
  244. package/src/tool/ls.txt +0 -1
  245. package/src/tool/lsp-diagnostics.ts +0 -26
  246. package/src/tool/lsp-diagnostics.txt +0 -1
  247. package/src/tool/lsp-hover.ts +0 -31
  248. package/src/tool/lsp-hover.txt +0 -1
  249. package/src/tool/multiedit.ts +0 -46
  250. package/src/tool/multiedit.txt +0 -41
  251. package/src/tool/patch.ts +0 -233
  252. package/src/tool/patch.txt +0 -1
  253. package/src/tool/read.ts +0 -217
  254. package/src/tool/read.txt +0 -12
  255. package/src/tool/registry.ts +0 -148
  256. package/src/tool/task.ts +0 -135
  257. package/src/tool/task.txt +0 -60
  258. package/src/tool/todo.ts +0 -39
  259. package/src/tool/todoread.txt +0 -14
  260. package/src/tool/todowrite.txt +0 -167
  261. package/src/tool/tool.ts +0 -66
  262. package/src/tool/webfetch.ts +0 -187
  263. package/src/tool/webfetch.txt +0 -14
  264. package/src/tool/websearch.ts +0 -150
  265. package/src/tool/websearch.txt +0 -11
  266. package/src/tool/write.ts +0 -99
  267. package/src/tool/write.txt +0 -8
  268. package/src/types/shims.d.ts +0 -3
  269. package/src/util/color.ts +0 -19
  270. package/src/util/context.ts +0 -25
  271. package/src/util/defer.ts +0 -12
  272. package/src/util/eventloop.ts +0 -20
  273. package/src/util/filesystem.ts +0 -69
  274. package/src/util/fn.ts +0 -11
  275. package/src/util/iife.ts +0 -3
  276. package/src/util/keybind.ts +0 -79
  277. package/src/util/lazy.ts +0 -11
  278. package/src/util/locale.ts +0 -81
  279. package/src/util/lock.ts +0 -98
  280. package/src/util/log.ts +0 -177
  281. package/src/util/queue.ts +0 -32
  282. package/src/util/rpc.ts +0 -42
  283. package/src/util/scrap.ts +0 -10
  284. package/src/util/signal.ts +0 -12
  285. package/src/util/timeout.ts +0 -14
  286. package/src/util/token.ts +0 -7
  287. package/src/util/wildcard.ts +0 -54
  288. package/sst-env.d.ts +0 -9
  289. package/test/bun.test.ts +0 -53
  290. package/test/config/agent-color.test.ts +0 -66
  291. package/test/config/config.test.ts +0 -503
  292. package/test/config/markdown.test.ts +0 -89
  293. package/test/file/ignore.test.ts +0 -10
  294. package/test/fixture/fixture.ts +0 -28
  295. package/test/fixture/lsp/fake-lsp-server.js +0 -77
  296. package/test/ide/ide.test.ts +0 -82
  297. package/test/keybind.test.ts +0 -317
  298. package/test/lsp/client.test.ts +0 -95
  299. package/test/patch/patch.test.ts +0 -348
  300. package/test/preload.ts +0 -38
  301. package/test/project/project.test.ts +0 -42
  302. package/test/provider/provider.test.ts +0 -1809
  303. package/test/provider/transform.test.ts +0 -305
  304. package/test/session/retry.test.ts +0 -61
  305. package/test/session/session.test.ts +0 -71
  306. package/test/snapshot/snapshot.test.ts +0 -939
  307. package/test/tool/__snapshots__/tool.test.ts.snap +0 -9
  308. package/test/tool/bash.test.ts +0 -55
  309. package/test/tool/patch.test.ts +0 -259
  310. package/test/util/iife.test.ts +0 -36
  311. package/test/util/lazy.test.ts +0 -50
  312. package/test/util/timeout.test.ts +0 -21
  313. package/test/util/wildcard.test.ts +0 -55
  314. package/tsconfig.json +0 -17
@@ -1,170 +0,0 @@
1
- import { useKeyboard, useRenderer, useTerminalDimensions } from "@opentui/solid"
2
- import { batch, createContext, Show, useContext, type JSX, type ParentProps } from "solid-js"
3
- import { useTheme } from "@tui/context/theme"
4
- import { Renderable, RGBA } from "@opentui/core"
5
- import { createStore } from "solid-js/store"
6
- import { Clipboard } from "@tui/util/clipboard"
7
- import { useToast } from "./toast"
8
-
9
- export function Dialog(
10
- props: ParentProps<{
11
- size?: "medium" | "large"
12
- onClose: () => void
13
- }>,
14
- ) {
15
- const dimensions = useTerminalDimensions()
16
- const { theme } = useTheme()
17
- const renderer = useRenderer()
18
-
19
- return (
20
- <box
21
- onMouseUp={async () => {
22
- if (renderer.getSelection()) return
23
- props.onClose?.()
24
- }}
25
- width={dimensions().width}
26
- height={dimensions().height}
27
- alignItems="center"
28
- position="absolute"
29
- paddingTop={dimensions().height / 4}
30
- left={0}
31
- top={0}
32
- backgroundColor={RGBA.fromInts(0, 0, 0, 150)}
33
- >
34
- <box
35
- onMouseUp={async (e) => {
36
- if (renderer.getSelection()) return
37
- e.stopPropagation()
38
- }}
39
- width={props.size === "large" ? 80 : 60}
40
- maxWidth={dimensions().width - 2}
41
- backgroundColor={theme.backgroundPanel}
42
- paddingTop={1}
43
- >
44
- {props.children}
45
- </box>
46
- </box>
47
- )
48
- }
49
-
50
- function init() {
51
- const [store, setStore] = createStore({
52
- stack: [] as {
53
- element: JSX.Element
54
- onClose?: () => void
55
- }[],
56
- size: "medium" as "medium" | "large",
57
- })
58
-
59
- useKeyboard((evt) => {
60
- if (evt.name === "escape" && store.stack.length > 0) {
61
- const current = store.stack.at(-1)!
62
- current.onClose?.()
63
- setStore("stack", store.stack.slice(0, -1))
64
- evt.preventDefault()
65
- refocus()
66
- }
67
- })
68
-
69
- const renderer = useRenderer()
70
- let focus: Renderable | null
71
- function refocus() {
72
- setTimeout(() => {
73
- if (!focus) return
74
- if (focus.isDestroyed) return
75
- function find(item: Renderable) {
76
- for (const child of item.getChildren()) {
77
- if (child === focus) return true
78
- if (find(child)) return true
79
- }
80
- return false
81
- }
82
- const found = find(renderer.root)
83
- if (!found) return
84
- focus.focus()
85
- }, 1)
86
- }
87
-
88
- return {
89
- clear() {
90
- for (const item of store.stack) {
91
- if (item.onClose) item.onClose()
92
- }
93
- batch(() => {
94
- setStore("size", "medium")
95
- setStore("stack", [])
96
- })
97
- refocus()
98
- },
99
- replace(input: any, onClose?: () => void) {
100
- if (store.stack.length === 0) {
101
- focus = renderer.currentFocusedRenderable
102
- }
103
- for (const item of store.stack) {
104
- if (item.onClose) item.onClose()
105
- }
106
- setStore("size", "medium")
107
- setStore("stack", [
108
- {
109
- element: input,
110
- onClose,
111
- },
112
- ])
113
- },
114
- get stack() {
115
- return store.stack
116
- },
117
- get size() {
118
- return store.size
119
- },
120
- setSize(size: "medium" | "large") {
121
- setStore("size", size)
122
- },
123
- }
124
- }
125
-
126
- export type DialogContext = ReturnType<typeof init>
127
-
128
- const ctx = createContext<DialogContext>()
129
-
130
- export function DialogProvider(props: ParentProps) {
131
- const value = init()
132
- const renderer = useRenderer()
133
- const toast = useToast()
134
- return (
135
- <ctx.Provider value={value}>
136
- {props.children}
137
- <box
138
- position="absolute"
139
- onMouseUp={async () => {
140
- const text = renderer.getSelection()?.getSelectedText()
141
- if (text && text.length > 0) {
142
- const base64 = Buffer.from(text).toString("base64")
143
- const osc52 = `\x1b]52;c;${base64}\x07`
144
- const finalOsc52 = process.env["TMUX"] ? `\x1bPtmux;\x1b${osc52}\x1b\\` : osc52
145
- /* @ts-expect-error */
146
- renderer.writeOut(finalOsc52)
147
- await Clipboard.copy(text)
148
- .then(() => toast.show({ message: "Copied to clipboard", variant: "info" }))
149
- .catch(toast.error)
150
- renderer.clearSelection()
151
- }
152
- }}
153
- >
154
- <Show when={value.stack.length}>
155
- <Dialog onClose={() => value.clear()} size={value.size}>
156
- {value.stack.at(-1)!.element}
157
- </Dialog>
158
- </Show>
159
- </box>
160
- </ctx.Provider>
161
- )
162
- }
163
-
164
- export function useDialog() {
165
- const value = useContext(ctx)
166
- if (!value) {
167
- throw new Error("useDialog must be used within a DialogProvider")
168
- }
169
- return value
170
- }
@@ -1,368 +0,0 @@
1
- import type { ColorInput } from "@opentui/core"
2
- import { RGBA } from "@opentui/core"
3
- import type { ColorGenerator } from "opentui-spinner"
4
-
5
- interface AdvancedGradientOptions {
6
- colors: ColorInput[]
7
- trailLength: number
8
- defaultColor?: ColorInput
9
- direction?: "forward" | "backward" | "bidirectional"
10
- holdFrames?: { start?: number; end?: number }
11
- enableFading?: boolean
12
- minAlpha?: number
13
- }
14
-
15
- interface ScannerState {
16
- activePosition: number
17
- isHolding: boolean
18
- holdProgress: number
19
- holdTotal: number
20
- movementProgress: number
21
- movementTotal: number
22
- isMovingForward: boolean
23
- }
24
-
25
- function getScannerState(
26
- frameIndex: number,
27
- totalChars: number,
28
- options: Pick<AdvancedGradientOptions, "direction" | "holdFrames">,
29
- ): ScannerState {
30
- const { direction = "forward", holdFrames = {} } = options
31
-
32
- if (direction === "bidirectional") {
33
- const forwardFrames = totalChars
34
- const holdEndFrames = holdFrames.end ?? 0
35
- const backwardFrames = totalChars - 1
36
-
37
- if (frameIndex < forwardFrames) {
38
- // Moving forward
39
- return {
40
- activePosition: frameIndex,
41
- isHolding: false,
42
- holdProgress: 0,
43
- holdTotal: 0,
44
- movementProgress: frameIndex,
45
- movementTotal: forwardFrames,
46
- isMovingForward: true,
47
- }
48
- } else if (frameIndex < forwardFrames + holdEndFrames) {
49
- // Holding at end
50
- return {
51
- activePosition: totalChars - 1,
52
- isHolding: true,
53
- holdProgress: frameIndex - forwardFrames,
54
- holdTotal: holdEndFrames,
55
- movementProgress: 0,
56
- movementTotal: 0,
57
- isMovingForward: true,
58
- }
59
- } else if (frameIndex < forwardFrames + holdEndFrames + backwardFrames) {
60
- // Moving backward
61
- const backwardIndex = frameIndex - forwardFrames - holdEndFrames
62
- return {
63
- activePosition: totalChars - 2 - backwardIndex,
64
- isHolding: false,
65
- holdProgress: 0,
66
- holdTotal: 0,
67
- movementProgress: backwardIndex,
68
- movementTotal: backwardFrames,
69
- isMovingForward: false,
70
- }
71
- } else {
72
- // Holding at start
73
- return {
74
- activePosition: 0,
75
- isHolding: true,
76
- holdProgress: frameIndex - forwardFrames - holdEndFrames - backwardFrames,
77
- holdTotal: holdFrames.start ?? 0,
78
- movementProgress: 0,
79
- movementTotal: 0,
80
- isMovingForward: false,
81
- }
82
- }
83
- } else if (direction === "backward") {
84
- return {
85
- activePosition: totalChars - 1 - (frameIndex % totalChars),
86
- isHolding: false,
87
- holdProgress: 0,
88
- holdTotal: 0,
89
- movementProgress: frameIndex % totalChars,
90
- movementTotal: totalChars,
91
- isMovingForward: false,
92
- }
93
- } else {
94
- return {
95
- activePosition: frameIndex % totalChars,
96
- isHolding: false,
97
- holdProgress: 0,
98
- holdTotal: 0,
99
- movementProgress: frameIndex % totalChars,
100
- movementTotal: totalChars,
101
- isMovingForward: true,
102
- }
103
- }
104
- }
105
-
106
- function calculateColorIndex(
107
- frameIndex: number,
108
- charIndex: number,
109
- totalChars: number,
110
- options: Pick<AdvancedGradientOptions, "direction" | "holdFrames" | "trailLength">,
111
- state?: ScannerState,
112
- ): number {
113
- const { trailLength } = options
114
- const { activePosition, isHolding, holdProgress, isMovingForward } =
115
- state ?? getScannerState(frameIndex, totalChars, options)
116
-
117
- // Calculate directional distance (positive means trailing behind)
118
- const directionalDistance = isMovingForward
119
- ? activePosition - charIndex // For forward: trail is to the left (lower indices)
120
- : charIndex - activePosition // For backward: trail is to the right (higher indices)
121
-
122
- // Handle hold frame fading: keep the lead bright, fade the trail
123
- if (isHolding) {
124
- // Shift the color index by how long we've been holding
125
- return directionalDistance + holdProgress
126
- }
127
-
128
- // Normal movement - show gradient trail only behind the movement direction
129
- if (directionalDistance > 0 && directionalDistance < trailLength) {
130
- return directionalDistance
131
- }
132
-
133
- // At the active position, show the brightest color
134
- if (directionalDistance === 0) {
135
- return 0
136
- }
137
-
138
- return -1
139
- }
140
-
141
- function createKnightRiderTrail(options: AdvancedGradientOptions): ColorGenerator {
142
- const { colors, defaultColor, enableFading = true, minAlpha = 0 } = options
143
-
144
- // Use the provided defaultColor if it's an RGBA instance, otherwise convert/default
145
- // We use RGBA.fromHex for the fallback to ensure we have an RGBA object.
146
- // Note: If defaultColor is a string, we convert it once here.
147
- const defaultRgba = defaultColor instanceof RGBA ? defaultColor : RGBA.fromHex((defaultColor as string) || "#000000")
148
-
149
- // Store the base alpha from the inactive factor
150
- const baseInactiveAlpha = defaultRgba.a
151
-
152
- let cachedFrameIndex = -1
153
- let cachedState: ScannerState | null = null
154
-
155
- return (frameIndex: number, charIndex: number, _totalFrames: number, totalChars: number) => {
156
- if (frameIndex !== cachedFrameIndex) {
157
- cachedFrameIndex = frameIndex
158
- cachedState = getScannerState(frameIndex, totalChars, options)
159
- }
160
-
161
- const state = cachedState!
162
-
163
- const index = calculateColorIndex(frameIndex, charIndex, totalChars, options, state)
164
-
165
- // Calculate global fade for inactive dots during hold or movement
166
- const { isHolding, holdProgress, holdTotal, movementProgress, movementTotal } = state
167
-
168
- let fadeFactor = 1.0
169
- if (enableFading) {
170
- if (isHolding && holdTotal > 0) {
171
- // Fade out linearly to minAlpha
172
- const progress = Math.min(holdProgress / holdTotal, 1)
173
- fadeFactor = Math.max(minAlpha, 1 - progress * (1 - minAlpha))
174
- } else if (!isHolding && movementTotal > 0) {
175
- // Fade in linearly from minAlpha during movement
176
- const progress = Math.min(movementProgress / Math.max(1, movementTotal - 1), 1)
177
- fadeFactor = minAlpha + progress * (1 - minAlpha)
178
- }
179
- }
180
-
181
- // Combine base inactive alpha with the fade factor
182
- // This ensures inactiveFactor is respected while still allowing fading animation
183
- defaultRgba.a = baseInactiveAlpha * fadeFactor
184
-
185
- if (index === -1) {
186
- return defaultRgba
187
- }
188
-
189
- return colors[index] ?? defaultRgba
190
- }
191
- }
192
-
193
- /**
194
- * Derives a gradient of tail colors from a single bright color using alpha falloff
195
- * @param brightColor The brightest color (center/head of the scanner)
196
- * @param steps Number of gradient steps (default: 6)
197
- * @returns Array of RGBA colors with alpha-based trail fade (background-independent)
198
- */
199
- export function deriveTrailColors(brightColor: ColorInput, steps: number = 6): RGBA[] {
200
- const baseRgba = brightColor instanceof RGBA ? brightColor : RGBA.fromHex(brightColor as string)
201
-
202
- const colors: RGBA[] = []
203
-
204
- for (let i = 0; i < steps; i++) {
205
- // Alpha-based falloff with optional bloom effect
206
- let alpha: number
207
- let brightnessFactor: number
208
-
209
- if (i === 0) {
210
- // Lead position: full brightness and opacity
211
- alpha = 1.0
212
- brightnessFactor = 1.0
213
- } else if (i === 1) {
214
- // Slight bloom/glare effect: brighten color but reduce opacity slightly
215
- alpha = 0.9
216
- brightnessFactor = 1.15
217
- } else {
218
- // Exponential alpha decay for natural-looking trail fade
219
- alpha = Math.pow(0.65, i - 1)
220
- brightnessFactor = 1.0
221
- }
222
-
223
- const r = Math.min(1.0, baseRgba.r * brightnessFactor)
224
- const g = Math.min(1.0, baseRgba.g * brightnessFactor)
225
- const b = Math.min(1.0, baseRgba.b * brightnessFactor)
226
-
227
- colors.push(RGBA.fromValues(r, g, b, alpha))
228
- }
229
-
230
- return colors
231
- }
232
-
233
- /**
234
- * Derives the inactive/default color from a bright color using alpha
235
- * @param brightColor The brightest color (center/head of the scanner)
236
- * @param factor Alpha factor for inactive color (default: 0.2, range: 0-1)
237
- * @returns The same color with reduced alpha for background-independent dimming
238
- */
239
- export function deriveInactiveColor(brightColor: ColorInput, factor: number = 0.2): RGBA {
240
- const baseRgba = brightColor instanceof RGBA ? brightColor : RGBA.fromHex(brightColor as string)
241
-
242
- // Use the full color brightness but adjust alpha for background-independent dimming
243
- return RGBA.fromValues(baseRgba.r, baseRgba.g, baseRgba.b, factor)
244
- }
245
-
246
- export type KnightRiderStyle = "blocks" | "diamonds"
247
-
248
- export interface KnightRiderOptions {
249
- width?: number
250
- style?: KnightRiderStyle
251
- holdStart?: number
252
- holdEnd?: number
253
- colors?: ColorInput[]
254
- /** Single color to derive trail from (alternative to providing colors array) */
255
- color?: ColorInput
256
- /** Number of trail steps when using single color (default: 6) */
257
- trailSteps?: number
258
- defaultColor?: ColorInput
259
- /** Alpha factor for inactive color when using single color (default: 0.2, range: 0-1) */
260
- inactiveFactor?: number
261
- /** Enable fading of inactive dots during hold and movement (default: true) */
262
- enableFading?: boolean
263
- /** Minimum alpha value when fading (default: 0, range: 0-1) */
264
- minAlpha?: number
265
- }
266
-
267
- /**
268
- * Creates frame strings for a Knight Rider style scanner animation
269
- * @param options Configuration options for the Knight Rider effect
270
- * @returns Array of frame strings
271
- */
272
- export function createFrames(options: KnightRiderOptions = {}): string[] {
273
- const width = options.width ?? 8
274
- const style = options.style ?? "diamonds"
275
- const holdStart = options.holdStart ?? 30
276
- const holdEnd = options.holdEnd ?? 9
277
-
278
- const colors =
279
- options.colors ??
280
- (options.color
281
- ? deriveTrailColors(options.color, options.trailSteps)
282
- : [
283
- RGBA.fromHex("#ff0000"), // Brightest Red (Center)
284
- RGBA.fromHex("#ff5555"), // Glare/Bloom
285
- RGBA.fromHex("#dd0000"), // Trail 1
286
- RGBA.fromHex("#aa0000"), // Trail 2
287
- RGBA.fromHex("#770000"), // Trail 3
288
- RGBA.fromHex("#440000"), // Trail 4
289
- ])
290
-
291
- const defaultColor =
292
- options.defaultColor ??
293
- (options.color ? deriveInactiveColor(options.color, options.inactiveFactor) : RGBA.fromHex("#330000"))
294
-
295
- const trailOptions = {
296
- colors,
297
- trailLength: colors.length,
298
- defaultColor,
299
- direction: "bidirectional" as const,
300
- holdFrames: { start: holdStart, end: holdEnd },
301
- enableFading: options.enableFading,
302
- minAlpha: options.minAlpha,
303
- }
304
-
305
- // Bidirectional cycle: Forward (width) + Hold End + Backward (width-1) + Hold Start
306
- const totalFrames = width + holdEnd + (width - 1) + holdStart
307
-
308
- // Generate dynamic frames where inactive pixels are dots and active ones are blocks
309
- const frames = Array.from({ length: totalFrames }, (_, frameIndex) => {
310
- return Array.from({ length: width }, (_, charIndex) => {
311
- const index = calculateColorIndex(frameIndex, charIndex, width, trailOptions)
312
-
313
- if (style === "diamonds") {
314
- const shapes = ["⬥", "◆", "⬩", "⬪"]
315
- if (index >= 0 && index < trailOptions.colors.length) {
316
- return shapes[Math.min(index, shapes.length - 1)]
317
- }
318
- return "·"
319
- }
320
-
321
- // Default to blocks
322
- // It's active if we have a valid color index that is within our colors array
323
- const isActive = index >= 0 && index < trailOptions.colors.length
324
- return isActive ? "■" : "⬝"
325
- }).join("")
326
- })
327
-
328
- return frames
329
- }
330
-
331
- /**
332
- * Creates a color generator function for Knight Rider style scanner animation
333
- * @param options Configuration options for the Knight Rider effect
334
- * @returns ColorGenerator function
335
- */
336
- export function createColors(options: KnightRiderOptions = {}): ColorGenerator {
337
- const holdStart = options.holdStart ?? 30
338
- const holdEnd = options.holdEnd ?? 9
339
-
340
- const colors =
341
- options.colors ??
342
- (options.color
343
- ? deriveTrailColors(options.color, options.trailSteps)
344
- : [
345
- RGBA.fromHex("#ff0000"), // Brightest Red (Center)
346
- RGBA.fromHex("#ff5555"), // Glare/Bloom
347
- RGBA.fromHex("#dd0000"), // Trail 1
348
- RGBA.fromHex("#aa0000"), // Trail 2
349
- RGBA.fromHex("#770000"), // Trail 3
350
- RGBA.fromHex("#440000"), // Trail 4
351
- ])
352
-
353
- const defaultColor =
354
- options.defaultColor ??
355
- (options.color ? deriveInactiveColor(options.color, options.inactiveFactor) : RGBA.fromHex("#330000"))
356
-
357
- const trailOptions = {
358
- colors,
359
- trailLength: colors.length,
360
- defaultColor,
361
- direction: "bidirectional" as const,
362
- holdFrames: { start: holdStart, end: holdEnd },
363
- enableFading: options.enableFading,
364
- minAlpha: options.minAlpha,
365
- }
366
-
367
- return createKnightRiderTrail(trailOptions)
368
- }
@@ -1,100 +0,0 @@
1
- import { createContext, useContext, type ParentProps, Show } from "solid-js"
2
- import { createStore } from "solid-js/store"
3
- import { useTheme } from "@tui/context/theme"
4
- import { useTerminalDimensions } from "@opentui/solid"
5
- import { SplitBorder } from "../component/border"
6
- import { TextAttributes } from "@opentui/core"
7
- import z from "zod"
8
- import { TuiEvent } from "../event"
9
-
10
- export type ToastOptions = z.infer<typeof TuiEvent.ToastShow.properties>
11
-
12
- export function Toast() {
13
- const toast = useToast()
14
- const { theme } = useTheme()
15
- const dimensions = useTerminalDimensions()
16
-
17
- return (
18
- <Show when={toast.currentToast}>
19
- {(current) => (
20
- <box
21
- position="absolute"
22
- justifyContent="center"
23
- alignItems="flex-start"
24
- top={2}
25
- right={2}
26
- maxWidth={Math.min(60, dimensions().width - 6)}
27
- paddingLeft={2}
28
- paddingRight={2}
29
- paddingTop={1}
30
- paddingBottom={1}
31
- backgroundColor={theme.backgroundPanel}
32
- borderColor={theme[current().variant]}
33
- border={["left", "right"]}
34
- customBorderChars={SplitBorder.customBorderChars}
35
- >
36
- <Show when={current().title}>
37
- <text attributes={TextAttributes.BOLD} marginBottom={1} fg={theme.text}>
38
- {current().title}
39
- </text>
40
- </Show>
41
- <text fg={theme.text} wrapMode="word" width="100%">
42
- {current().message}
43
- </text>
44
- </box>
45
- )}
46
- </Show>
47
- )
48
- }
49
-
50
- function init() {
51
- const [store, setStore] = createStore({
52
- currentToast: null as ToastOptions | null,
53
- })
54
-
55
- let timeoutHandle: NodeJS.Timeout | null = null
56
-
57
- const toast = {
58
- show(options: ToastOptions) {
59
- const parsedOptions = TuiEvent.ToastShow.properties.parse(options)
60
- const { duration, ...currentToast } = parsedOptions
61
- setStore("currentToast", currentToast)
62
- if (timeoutHandle) clearTimeout(timeoutHandle)
63
- timeoutHandle = setTimeout(() => {
64
- setStore("currentToast", null)
65
- }, duration).unref()
66
- },
67
- error: (err: any) => {
68
- if (err instanceof Error)
69
- return toast.show({
70
- variant: "error",
71
- message: err.message,
72
- })
73
- toast.show({
74
- variant: "error",
75
- message: "An unknown error has occurred",
76
- })
77
- },
78
- get currentToast(): ToastOptions | null {
79
- return store.currentToast
80
- },
81
- }
82
- return toast
83
- }
84
-
85
- export type ToastContext = ReturnType<typeof init>
86
-
87
- const ctx = createContext<ToastContext>()
88
-
89
- export function ToastProvider(props: ParentProps) {
90
- const value = init()
91
- return <ctx.Provider value={value}>{props.children}</ctx.Provider>
92
- }
93
-
94
- export function useToast() {
95
- const value = useContext(ctx)
96
- if (!value) {
97
- throw new Error("useToast must be used within a ToastProvider")
98
- }
99
- return value
100
- }