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,41 +0,0 @@
1
- import { NamedError } from "@opencode-ai/util/error"
2
- import matter from "gray-matter"
3
- import { z } from "zod"
4
-
5
- export namespace ConfigMarkdown {
6
- export const FILE_REGEX = /(?<![\w`])@(\.?[^\s`,.]*(?:\.[^\s`,.]+)*)/g
7
- export const SHELL_REGEX = /!`([^`]+)`/g
8
-
9
- export function files(template: string) {
10
- return Array.from(template.matchAll(FILE_REGEX))
11
- }
12
-
13
- export function shell(template: string) {
14
- return Array.from(template.matchAll(SHELL_REGEX))
15
- }
16
-
17
- export async function parse(filePath: string) {
18
- const template = await Bun.file(filePath).text()
19
-
20
- try {
21
- const md = matter(template)
22
- return md
23
- } catch (err) {
24
- throw new FrontmatterError(
25
- {
26
- path: filePath,
27
- message: `Failed to parse YAML frontmatter: ${err instanceof Error ? err.message : String(err)}`,
28
- },
29
- { cause: err },
30
- )
31
- }
32
- }
33
-
34
- export const FrontmatterError = NamedError.create(
35
- "ConfigFrontmatterError",
36
- z.object({
37
- path: z.string(),
38
- message: z.string(),
39
- }),
40
- )
41
- }
package/src/env/index.ts DELETED
@@ -1,26 +0,0 @@
1
- import { Instance } from "../project/instance"
2
-
3
- export namespace Env {
4
- const state = Instance.state(() => {
5
- return process.env as Record<string, string | undefined>
6
- })
7
-
8
- export function get(key: string) {
9
- const env = state()
10
- return env[key]
11
- }
12
-
13
- export function all() {
14
- return state()
15
- }
16
-
17
- export function set(key: string, value: string) {
18
- const env = state()
19
- env[key] = value
20
- }
21
-
22
- export function remove(key: string) {
23
- const env = state()
24
- delete env[key]
25
- }
26
- }
package/src/file/fzf.ts DELETED
@@ -1,124 +0,0 @@
1
- import path from "path"
2
- import { Global } from "../global"
3
- import fs from "fs/promises"
4
- import z from "zod"
5
- import { NamedError } from "@opencode-ai/util/error"
6
- import { lazy } from "../util/lazy"
7
- import { Log } from "../util/log"
8
- import { ZipReader, BlobReader, BlobWriter } from "@zip.js/zip.js"
9
-
10
- export namespace Fzf {
11
- const log = Log.create({ service: "fzf" })
12
-
13
- const VERSION = "0.62.0"
14
- const PLATFORM = {
15
- darwin: { extension: "tar.gz" },
16
- linux: { extension: "tar.gz" },
17
- win32: { extension: "zip" },
18
- } as const
19
-
20
- export const ExtractionFailedError = NamedError.create(
21
- "FzfExtractionFailedError",
22
- z.object({
23
- filepath: z.string(),
24
- stderr: z.string(),
25
- }),
26
- )
27
-
28
- export const UnsupportedPlatformError = NamedError.create(
29
- "FzfUnsupportedPlatformError",
30
- z.object({
31
- platform: z.string(),
32
- }),
33
- )
34
-
35
- export const DownloadFailedError = NamedError.create(
36
- "FzfDownloadFailedError",
37
- z.object({
38
- url: z.string(),
39
- status: z.number(),
40
- }),
41
- )
42
-
43
- const state = lazy(async () => {
44
- let filepath = Bun.which("fzf")
45
- if (filepath) {
46
- log.info("found", { filepath })
47
- return { filepath }
48
- }
49
- filepath = path.join(Global.Path.bin, "fzf" + (process.platform === "win32" ? ".exe" : ""))
50
-
51
- const file = Bun.file(filepath)
52
- if (!(await file.exists())) {
53
- const archMap = { x64: "amd64", arm64: "arm64" } as const
54
- const arch = archMap[process.arch as keyof typeof archMap] ?? "amd64"
55
-
56
- const config = PLATFORM[process.platform as keyof typeof PLATFORM]
57
- if (!config) throw new UnsupportedPlatformError({ platform: process.platform })
58
-
59
- const version = VERSION
60
- const platformName = process.platform === "win32" ? "windows" : process.platform
61
- const filename = `fzf-${version}-${platformName}_${arch}.${config.extension}`
62
- const url = `https://github.com/junegunn/fzf/releases/download/v${version}/${filename}`
63
-
64
- const response = await fetch(url)
65
- if (!response.ok) throw new DownloadFailedError({ url, status: response.status })
66
-
67
- const buffer = await response.arrayBuffer()
68
- const archivePath = path.join(Global.Path.bin, filename)
69
- await Bun.write(archivePath, buffer)
70
- if (config.extension === "tar.gz") {
71
- const proc = Bun.spawn(["tar", "-xzf", archivePath, "fzf"], {
72
- cwd: Global.Path.bin,
73
- stderr: "pipe",
74
- stdout: "pipe",
75
- })
76
- await proc.exited
77
- if (proc.exitCode !== 0)
78
- throw new ExtractionFailedError({
79
- filepath,
80
- stderr: await Bun.readableStreamToText(proc.stderr),
81
- })
82
- }
83
- if (config.extension === "zip") {
84
- const zipFileReader = new ZipReader(new BlobReader(new Blob([await Bun.file(archivePath).arrayBuffer()])))
85
- const entries = await zipFileReader.getEntries()
86
- let fzfEntry: any
87
- for (const entry of entries) {
88
- if (entry.filename === "fzf.exe") {
89
- fzfEntry = entry
90
- break
91
- }
92
- }
93
-
94
- if (!fzfEntry) {
95
- throw new ExtractionFailedError({
96
- filepath: archivePath,
97
- stderr: "fzf.exe not found in zip archive",
98
- })
99
- }
100
-
101
- const fzfBlob = await fzfEntry.getData(new BlobWriter())
102
- if (!fzfBlob) {
103
- throw new ExtractionFailedError({
104
- filepath: archivePath,
105
- stderr: "Failed to extract fzf.exe from zip archive",
106
- })
107
- }
108
- await Bun.write(filepath, await fzfBlob.arrayBuffer())
109
- await zipFileReader.close()
110
- }
111
- await fs.unlink(archivePath)
112
- if (process.platform !== "win32") await fs.chmod(filepath, 0o755)
113
- }
114
-
115
- return {
116
- filepath,
117
- }
118
- })
119
-
120
- export async function filepath() {
121
- const { filepath } = await state()
122
- return filepath
123
- }
124
- }
@@ -1,83 +0,0 @@
1
- import { sep } from "node:path"
2
-
3
- export namespace FileIgnore {
4
- const FOLDERS = new Set([
5
- "node_modules",
6
- "bower_components",
7
- ".pnpm-store",
8
- "vendor",
9
- ".npm",
10
- "dist",
11
- "build",
12
- "out",
13
- ".next",
14
- "target",
15
- "bin",
16
- "obj",
17
- ".git",
18
- ".svn",
19
- ".hg",
20
- ".vscode",
21
- ".idea",
22
- ".turbo",
23
- ".output",
24
- "desktop",
25
- ".sst",
26
- ".cache",
27
- ".webkit-cache",
28
- "__pycache__",
29
- ".pytest_cache",
30
- "mypy_cache",
31
- ".history",
32
- ".gradle",
33
- ])
34
-
35
- const FILES = [
36
- "**/*.swp",
37
- "**/*.swo",
38
-
39
- "**/*.pyc",
40
-
41
- // OS
42
- "**/.DS_Store",
43
- "**/Thumbs.db",
44
-
45
- // Logs & temp
46
- "**/logs/**",
47
- "**/tmp/**",
48
- "**/temp/**",
49
- "**/*.log",
50
-
51
- // Coverage/test outputs
52
- "**/coverage/**",
53
- "**/.nyc_output/**",
54
- ]
55
-
56
- const FILE_GLOBS = FILES.map((p) => new Bun.Glob(p))
57
-
58
- export const PATTERNS = [...FILES, ...FOLDERS]
59
-
60
- export function match(
61
- filepath: string,
62
- opts?: {
63
- extra?: Bun.Glob[]
64
- whitelist?: Bun.Glob[]
65
- },
66
- ) {
67
- for (const glob of opts?.whitelist || []) {
68
- if (glob.match(filepath)) return false
69
- }
70
-
71
- const parts = filepath.split(sep)
72
- for (let i = 0; i < parts.length; i++) {
73
- if (FOLDERS.has(parts[i])) return true
74
- }
75
-
76
- const extra = opts?.extra || []
77
- for (const glob of [...FILE_GLOBS, ...extra]) {
78
- if (glob.match(filepath)) return true
79
- }
80
-
81
- return false
82
- }
83
- }
package/src/file/index.ts DELETED
@@ -1,326 +0,0 @@
1
- import z from "zod"
2
- import { Bus } from "../bus"
3
- import { $ } from "bun"
4
- import type { BunFile } from "bun"
5
- import { formatPatch, structuredPatch } from "diff"
6
- import path from "path"
7
- import fs from "fs"
8
- import ignore from "ignore"
9
- import { Log } from "../util/log"
10
- import { Instance } from "../project/instance"
11
- import { Ripgrep } from "./ripgrep"
12
- import fuzzysort from "fuzzysort"
13
-
14
- export namespace File {
15
- const log = Log.create({ service: "file" })
16
-
17
- export const Info = z
18
- .object({
19
- path: z.string(),
20
- added: z.number().int(),
21
- removed: z.number().int(),
22
- status: z.enum(["added", "deleted", "modified"]),
23
- })
24
- .meta({
25
- ref: "File",
26
- })
27
-
28
- export type Info = z.infer<typeof Info>
29
-
30
- export const Node = z
31
- .object({
32
- name: z.string(),
33
- path: z.string(),
34
- absolute: z.string(),
35
- type: z.enum(["file", "directory"]),
36
- ignored: z.boolean(),
37
- })
38
- .meta({
39
- ref: "FileNode",
40
- })
41
- export type Node = z.infer<typeof Node>
42
-
43
- export const Content = z
44
- .object({
45
- type: z.literal("text"),
46
- content: z.string(),
47
- diff: z.string().optional(),
48
- patch: z
49
- .object({
50
- oldFileName: z.string(),
51
- newFileName: z.string(),
52
- oldHeader: z.string().optional(),
53
- newHeader: z.string().optional(),
54
- hunks: z.array(
55
- z.object({
56
- oldStart: z.number(),
57
- oldLines: z.number(),
58
- newStart: z.number(),
59
- newLines: z.number(),
60
- lines: z.array(z.string()),
61
- }),
62
- ),
63
- index: z.string().optional(),
64
- })
65
- .optional(),
66
- encoding: z.literal("base64").optional(),
67
- mimeType: z.string().optional(),
68
- })
69
- .meta({
70
- ref: "FileContent",
71
- })
72
- export type Content = z.infer<typeof Content>
73
-
74
- async function shouldEncode(file: BunFile): Promise<boolean> {
75
- const type = file.type?.toLowerCase()
76
- if (!type) return false
77
-
78
- if (type.startsWith("text/")) return false
79
- if (type.includes("charset=")) return false
80
-
81
- const parts = type.split("/", 2)
82
- const top = parts[0]
83
- const rest = parts[1] ?? ""
84
- const sub = rest.split(";", 1)[0]
85
-
86
- const tops = ["image", "audio", "video", "font", "model", "multipart"]
87
- if (tops.includes(top)) return true
88
-
89
- if (type === "application/octet-stream") return true
90
-
91
- const bins = [
92
- "zip",
93
- "gzip",
94
- "bzip",
95
- "compressed",
96
- "binary",
97
- "stream",
98
- "pdf",
99
- "msword",
100
- "powerpoint",
101
- "excel",
102
- "ogg",
103
- "exe",
104
- "dmg",
105
- "iso",
106
- "rar",
107
- ]
108
- if (bins.some((mark) => sub.includes(mark))) return true
109
-
110
- return false
111
- }
112
-
113
- export const Event = {
114
- Edited: Bus.event(
115
- "file.edited",
116
- z.object({
117
- file: z.string(),
118
- }),
119
- ),
120
- }
121
-
122
- const state = Instance.state(async () => {
123
- type Entry = { files: string[]; dirs: string[] }
124
- let cache: Entry = { files: [], dirs: [] }
125
- let fetching = false
126
- const fn = async (result: Entry) => {
127
- fetching = true
128
- const set = new Set<string>()
129
- for await (const file of Ripgrep.files({ cwd: Instance.directory })) {
130
- result.files.push(file)
131
- let current = file
132
- while (true) {
133
- const dir = path.dirname(current)
134
- if (dir === ".") break
135
- if (dir === current) break
136
- current = dir
137
- if (set.has(dir)) continue
138
- set.add(dir)
139
- result.dirs.push(dir + "/")
140
- }
141
- }
142
- cache = result
143
- fetching = false
144
- }
145
- fn(cache)
146
-
147
- return {
148
- async files() {
149
- if (!fetching) {
150
- fn({
151
- files: [],
152
- dirs: [],
153
- })
154
- }
155
- return cache
156
- },
157
- }
158
- })
159
-
160
- export function init() {
161
- state()
162
- }
163
-
164
- export async function status() {
165
- const project = Instance.project
166
- if (project.vcs !== "git") return []
167
-
168
- const diffOutput = await $`git diff --numstat HEAD`.cwd(Instance.directory).quiet().nothrow().text()
169
-
170
- const changedFiles: Info[] = []
171
-
172
- if (diffOutput.trim()) {
173
- const lines = diffOutput.trim().split("\n")
174
- for (const line of lines) {
175
- const [added, removed, filepath] = line.split("\t")
176
- changedFiles.push({
177
- path: filepath,
178
- added: added === "-" ? 0 : parseInt(added, 10),
179
- removed: removed === "-" ? 0 : parseInt(removed, 10),
180
- status: "modified",
181
- })
182
- }
183
- }
184
-
185
- const untrackedOutput = await $`git ls-files --others --exclude-standard`
186
- .cwd(Instance.directory)
187
- .quiet()
188
- .nothrow()
189
- .text()
190
-
191
- if (untrackedOutput.trim()) {
192
- const untrackedFiles = untrackedOutput.trim().split("\n")
193
- for (const filepath of untrackedFiles) {
194
- try {
195
- const content = await Bun.file(path.join(Instance.directory, filepath)).text()
196
- const lines = content.split("\n").length
197
- changedFiles.push({
198
- path: filepath,
199
- added: lines,
200
- removed: 0,
201
- status: "added",
202
- })
203
- } catch {
204
- continue
205
- }
206
- }
207
- }
208
-
209
- // Get deleted files
210
- const deletedOutput = await $`git diff --name-only --diff-filter=D HEAD`
211
- .cwd(Instance.directory)
212
- .quiet()
213
- .nothrow()
214
- .text()
215
-
216
- if (deletedOutput.trim()) {
217
- const deletedFiles = deletedOutput.trim().split("\n")
218
- for (const filepath of deletedFiles) {
219
- changedFiles.push({
220
- path: filepath,
221
- added: 0,
222
- removed: 0, // Could get original line count but would require another git command
223
- status: "deleted",
224
- })
225
- }
226
- }
227
-
228
- return changedFiles.map((x) => ({
229
- ...x,
230
- path: path.relative(Instance.directory, x.path),
231
- }))
232
- }
233
-
234
- export async function read(file: string): Promise<Content> {
235
- using _ = log.time("read", { file })
236
- const project = Instance.project
237
- const full = path.join(Instance.directory, file)
238
- const bunFile = Bun.file(full)
239
-
240
- if (!(await bunFile.exists())) {
241
- return { type: "text", content: "" }
242
- }
243
-
244
- const encode = await shouldEncode(bunFile)
245
-
246
- if (encode) {
247
- const buffer = await bunFile.arrayBuffer().catch(() => new ArrayBuffer(0))
248
- const content = Buffer.from(buffer).toString("base64")
249
- const mimeType = bunFile.type || "application/octet-stream"
250
- return { type: "text", content, mimeType, encoding: "base64" }
251
- }
252
-
253
- const content = await bunFile
254
- .text()
255
- .catch(() => "")
256
- .then((x) => x.trim())
257
-
258
- if (project.vcs === "git") {
259
- let diff = await $`git diff ${file}`.cwd(Instance.directory).quiet().nothrow().text()
260
- if (!diff.trim()) diff = await $`git diff --staged ${file}`.cwd(Instance.directory).quiet().nothrow().text()
261
- if (diff.trim()) {
262
- const original = await $`git show HEAD:${file}`.cwd(Instance.directory).quiet().nothrow().text()
263
- const patch = structuredPatch(file, file, original, content, "old", "new", {
264
- context: Infinity,
265
- ignoreWhitespace: true,
266
- })
267
- const diff = formatPatch(patch)
268
- return { type: "text", content, patch, diff }
269
- }
270
- }
271
- return { type: "text", content }
272
- }
273
-
274
- export async function list(dir?: string) {
275
- const exclude = [".git", ".DS_Store"]
276
- const project = Instance.project
277
- let ignored = (_: string) => false
278
- if (project.vcs === "git") {
279
- const ig = ignore()
280
- const gitignore = Bun.file(path.join(Instance.worktree, ".gitignore"))
281
- if (await gitignore.exists()) {
282
- ig.add(await gitignore.text())
283
- }
284
- const ignoreFile = Bun.file(path.join(Instance.worktree, ".ignore"))
285
- if (await ignoreFile.exists()) {
286
- ig.add(await ignoreFile.text())
287
- }
288
- ignored = ig.ignores.bind(ig)
289
- }
290
- const resolved = dir ? path.join(Instance.directory, dir) : Instance.directory
291
- const nodes: Node[] = []
292
- for (const entry of await fs.promises.readdir(resolved, {
293
- withFileTypes: true,
294
- })) {
295
- if (exclude.includes(entry.name)) continue
296
- const fullPath = path.join(resolved, entry.name)
297
- const relativePath = path.relative(Instance.directory, fullPath)
298
- const type = entry.isDirectory() ? "directory" : "file"
299
- nodes.push({
300
- name: entry.name,
301
- path: relativePath,
302
- absolute: fullPath,
303
- type,
304
- ignored: ignored(type === "directory" ? relativePath + "/" : relativePath),
305
- })
306
- }
307
- return nodes.sort((a, b) => {
308
- if (a.type !== b.type) {
309
- return a.type === "directory" ? -1 : 1
310
- }
311
- return a.name.localeCompare(b.name)
312
- })
313
- }
314
-
315
- export async function search(input: { query: string; limit?: number; dirs?: boolean }) {
316
- log.info("search", { query: input.query })
317
- const limit = input.limit ?? 100
318
- const result = await state().then((x) => x.files())
319
- if (!input.query)
320
- return input.dirs !== false ? result.dirs.toSorted().slice(0, limit) : result.files.slice(0, limit)
321
- const items = input.dirs !== false ? [...result.files, ...result.dirs] : result.files
322
- const sorted = fuzzysort.go(input.query, items, { limit: limit }).map((r) => r.target)
323
- log.info("search", { query: input.query, results: sorted.length })
324
- return sorted
325
- }
326
- }