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,391 +0,0 @@
1
- // Ripgrep utility functions
2
- import path from "path"
3
- import { Global } from "../global"
4
- import fs from "fs/promises"
5
- import z from "zod"
6
- import { NamedError } from "@opencode-ai/util/error"
7
- import { lazy } from "../util/lazy"
8
- import { $ } from "bun"
9
-
10
- import { ZipReader, BlobReader, BlobWriter } from "@zip.js/zip.js"
11
- import { Log } from "@/util/log"
12
-
13
- export namespace Ripgrep {
14
- const log = Log.create({ service: "ripgrep" })
15
- const Stats = z.object({
16
- elapsed: z.object({
17
- secs: z.number(),
18
- nanos: z.number(),
19
- human: z.string(),
20
- }),
21
- searches: z.number(),
22
- searches_with_match: z.number(),
23
- bytes_searched: z.number(),
24
- bytes_printed: z.number(),
25
- matched_lines: z.number(),
26
- matches: z.number(),
27
- })
28
-
29
- const Begin = z.object({
30
- type: z.literal("begin"),
31
- data: z.object({
32
- path: z.object({
33
- text: z.string(),
34
- }),
35
- }),
36
- })
37
-
38
- export const Match = z.object({
39
- type: z.literal("match"),
40
- data: z.object({
41
- path: z.object({
42
- text: z.string(),
43
- }),
44
- lines: z.object({
45
- text: z.string(),
46
- }),
47
- line_number: z.number(),
48
- absolute_offset: z.number(),
49
- submatches: z.array(
50
- z.object({
51
- match: z.object({
52
- text: z.string(),
53
- }),
54
- start: z.number(),
55
- end: z.number(),
56
- }),
57
- ),
58
- }),
59
- })
60
-
61
- const End = z.object({
62
- type: z.literal("end"),
63
- data: z.object({
64
- path: z.object({
65
- text: z.string(),
66
- }),
67
- binary_offset: z.number().nullable(),
68
- stats: Stats,
69
- }),
70
- })
71
-
72
- const Summary = z.object({
73
- type: z.literal("summary"),
74
- data: z.object({
75
- elapsed_total: z.object({
76
- human: z.string(),
77
- nanos: z.number(),
78
- secs: z.number(),
79
- }),
80
- stats: Stats,
81
- }),
82
- })
83
-
84
- const Result = z.union([Begin, Match, End, Summary])
85
-
86
- export type Result = z.infer<typeof Result>
87
- export type Match = z.infer<typeof Match>
88
- export type Begin = z.infer<typeof Begin>
89
- export type End = z.infer<typeof End>
90
- export type Summary = z.infer<typeof Summary>
91
- const PLATFORM = {
92
- "arm64-darwin": { platform: "aarch64-apple-darwin", extension: "tar.gz" },
93
- "arm64-linux": {
94
- platform: "aarch64-unknown-linux-gnu",
95
- extension: "tar.gz",
96
- },
97
- "x64-darwin": { platform: "x86_64-apple-darwin", extension: "tar.gz" },
98
- "x64-linux": { platform: "x86_64-unknown-linux-musl", extension: "tar.gz" },
99
- "x64-win32": { platform: "x86_64-pc-windows-msvc", extension: "zip" },
100
- } as const
101
-
102
- export const ExtractionFailedError = NamedError.create(
103
- "RipgrepExtractionFailedError",
104
- z.object({
105
- filepath: z.string(),
106
- stderr: z.string(),
107
- }),
108
- )
109
-
110
- export const UnsupportedPlatformError = NamedError.create(
111
- "RipgrepUnsupportedPlatformError",
112
- z.object({
113
- platform: z.string(),
114
- }),
115
- )
116
-
117
- export const DownloadFailedError = NamedError.create(
118
- "RipgrepDownloadFailedError",
119
- z.object({
120
- url: z.string(),
121
- status: z.number(),
122
- }),
123
- )
124
-
125
- const state = lazy(async () => {
126
- let filepath = Bun.which("rg")
127
- if (filepath) return { filepath }
128
- filepath = path.join(Global.Path.bin, "rg" + (process.platform === "win32" ? ".exe" : ""))
129
-
130
- const file = Bun.file(filepath)
131
- if (!(await file.exists())) {
132
- const platformKey = `${process.arch}-${process.platform}` as keyof typeof PLATFORM
133
- const config = PLATFORM[platformKey]
134
- if (!config) throw new UnsupportedPlatformError({ platform: platformKey })
135
-
136
- const version = "14.1.1"
137
- const filename = `ripgrep-${version}-${config.platform}.${config.extension}`
138
- const url = `https://github.com/BurntSushi/ripgrep/releases/download/${version}/${filename}`
139
-
140
- const response = await fetch(url)
141
- if (!response.ok) throw new DownloadFailedError({ url, status: response.status })
142
-
143
- const buffer = await response.arrayBuffer()
144
- const archivePath = path.join(Global.Path.bin, filename)
145
- await Bun.write(archivePath, buffer)
146
- if (config.extension === "tar.gz") {
147
- const args = ["tar", "-xzf", archivePath, "--strip-components=1"]
148
-
149
- if (platformKey.endsWith("-darwin")) args.push("--include=*/rg")
150
- if (platformKey.endsWith("-linux")) args.push("--wildcards", "*/rg")
151
-
152
- const proc = Bun.spawn(args, {
153
- cwd: Global.Path.bin,
154
- stderr: "pipe",
155
- stdout: "pipe",
156
- })
157
- await proc.exited
158
- if (proc.exitCode !== 0)
159
- throw new ExtractionFailedError({
160
- filepath,
161
- stderr: await Bun.readableStreamToText(proc.stderr),
162
- })
163
- }
164
- if (config.extension === "zip") {
165
- if (config.extension === "zip") {
166
- const zipFileReader = new ZipReader(new BlobReader(new Blob([await Bun.file(archivePath).arrayBuffer()])))
167
- const entries = await zipFileReader.getEntries()
168
- let rgEntry: any
169
- for (const entry of entries) {
170
- if (entry.filename.endsWith("rg.exe")) {
171
- rgEntry = entry
172
- break
173
- }
174
- }
175
-
176
- if (!rgEntry) {
177
- throw new ExtractionFailedError({
178
- filepath: archivePath,
179
- stderr: "rg.exe not found in zip archive",
180
- })
181
- }
182
-
183
- const rgBlob = await rgEntry.getData(new BlobWriter())
184
- if (!rgBlob) {
185
- throw new ExtractionFailedError({
186
- filepath: archivePath,
187
- stderr: "Failed to extract rg.exe from zip archive",
188
- })
189
- }
190
- await Bun.write(filepath, await rgBlob.arrayBuffer())
191
- await zipFileReader.close()
192
- }
193
- }
194
- await fs.unlink(archivePath)
195
- if (!platformKey.endsWith("-win32")) await fs.chmod(filepath, 0o755)
196
- }
197
-
198
- return {
199
- filepath,
200
- }
201
- })
202
-
203
- export async function filepath() {
204
- const { filepath } = await state()
205
- return filepath
206
- }
207
-
208
- export async function* files(input: { cwd: string; glob?: string[] }) {
209
- const args = [await filepath(), "--files", "--follow", "--hidden", "--glob=!.git/*"]
210
- if (input.glob) {
211
- for (const g of input.glob) {
212
- args.push(`--glob=${g}`)
213
- }
214
- }
215
-
216
- // Bun.spawn should throw this, but it incorrectly reports that the executable does not exist.
217
- // See https://github.com/oven-sh/bun/issues/24012
218
- if (!(await fs.stat(input.cwd).catch(() => undefined))?.isDirectory()) {
219
- throw Object.assign(new Error(`No such file or directory: '${input.cwd}'`), {
220
- code: "ENOENT",
221
- errno: -2,
222
- path: input.cwd,
223
- })
224
- }
225
-
226
- const proc = Bun.spawn(args, {
227
- cwd: input.cwd,
228
- stdout: "pipe",
229
- stderr: "ignore",
230
- maxBuffer: 1024 * 1024 * 20,
231
- })
232
-
233
- const reader = proc.stdout.getReader()
234
- const decoder = new TextDecoder()
235
- let buffer = ""
236
-
237
- try {
238
- while (true) {
239
- const { done, value } = await reader.read()
240
- if (done) break
241
-
242
- buffer += decoder.decode(value, { stream: true })
243
- const lines = buffer.split("\n")
244
- buffer = lines.pop() || ""
245
-
246
- for (const line of lines) {
247
- if (line) yield line
248
- }
249
- }
250
-
251
- if (buffer) yield buffer
252
- } finally {
253
- reader.releaseLock()
254
- await proc.exited
255
- }
256
- }
257
-
258
- export async function tree(input: { cwd: string; limit?: number }) {
259
- log.info("tree", input)
260
- const files = await Array.fromAsync(Ripgrep.files({ cwd: input.cwd }))
261
- interface Node {
262
- path: string[]
263
- children: Node[]
264
- }
265
-
266
- function getPath(node: Node, parts: string[], create: boolean) {
267
- if (parts.length === 0) return node
268
- let current = node
269
- for (const part of parts) {
270
- let existing = current.children.find((x) => x.path.at(-1) === part)
271
- if (!existing) {
272
- if (!create) return
273
- existing = {
274
- path: current.path.concat(part),
275
- children: [],
276
- }
277
- current.children.push(existing)
278
- }
279
- current = existing
280
- }
281
- return current
282
- }
283
-
284
- const root: Node = {
285
- path: [],
286
- children: [],
287
- }
288
- for (const file of files) {
289
- if (file.includes(".opencode")) continue
290
- const parts = file.split(path.sep)
291
- getPath(root, parts, true)
292
- }
293
-
294
- function sort(node: Node) {
295
- node.children.sort((a, b) => {
296
- if (!a.children.length && b.children.length) return 1
297
- if (!b.children.length && a.children.length) return -1
298
- return a.path.at(-1)!.localeCompare(b.path.at(-1)!)
299
- })
300
- for (const child of node.children) {
301
- sort(child)
302
- }
303
- }
304
- sort(root)
305
-
306
- let current = [root]
307
- const result: Node = {
308
- path: [],
309
- children: [],
310
- }
311
-
312
- let processed = 0
313
- const limit = input.limit ?? 50
314
- while (current.length > 0) {
315
- const next = []
316
- for (const node of current) {
317
- if (node.children.length) next.push(...node.children)
318
- }
319
- const max = Math.max(...current.map((x) => x.children.length))
320
- for (let i = 0; i < max && processed < limit; i++) {
321
- for (const node of current) {
322
- const child = node.children[i]
323
- if (!child) continue
324
- getPath(result, child.path, true)
325
- processed++
326
- if (processed >= limit) break
327
- }
328
- }
329
- if (processed >= limit) {
330
- for (const node of [...current, ...next]) {
331
- const compare = getPath(result, node.path, false)
332
- if (!compare) continue
333
- if (compare?.children.length !== node.children.length) {
334
- const diff = node.children.length - compare.children.length
335
- compare.children.push({
336
- path: compare.path.concat(`[${diff} truncated]`),
337
- children: [],
338
- })
339
- }
340
- }
341
- break
342
- }
343
- current = next
344
- }
345
-
346
- const lines: string[] = []
347
-
348
- function render(node: Node, depth: number) {
349
- const indent = "\t".repeat(depth)
350
- lines.push(indent + node.path.at(-1) + (node.children.length ? "/" : ""))
351
- for (const child of node.children) {
352
- render(child, depth + 1)
353
- }
354
- }
355
- result.children.map((x) => render(x, 0))
356
-
357
- return lines.join("\n")
358
- }
359
-
360
- export async function search(input: { cwd: string; pattern: string; glob?: string[]; limit?: number }) {
361
- const args = [`${await filepath()}`, "--json", "--hidden", "--glob='!.git/*'"]
362
-
363
- if (input.glob) {
364
- for (const g of input.glob) {
365
- args.push(`--glob=${g}`)
366
- }
367
- }
368
-
369
- if (input.limit) {
370
- args.push(`--max-count=${input.limit}`)
371
- }
372
-
373
- args.push("--")
374
- args.push(input.pattern)
375
-
376
- const command = args.join(" ")
377
- const result = await $`${{ raw: command }}`.cwd(input.cwd).quiet().nothrow()
378
- if (result.exitCode !== 0) {
379
- return []
380
- }
381
-
382
- const lines = result.text().trim().split("\n").filter(Boolean)
383
- // Parse JSON lines from ripgrep output
384
-
385
- return lines
386
- .map((line) => JSON.parse(line))
387
- .map((parsed) => Result.parse(parsed))
388
- .filter((r) => r.type === "match")
389
- .map((r) => r.data)
390
- }
391
- }
package/src/file/time.ts DELETED
@@ -1,38 +0,0 @@
1
- import { Instance } from "../project/instance"
2
- import { Log } from "../util/log"
3
-
4
- export namespace FileTime {
5
- const log = Log.create({ service: "file.time" })
6
- export const state = Instance.state(() => {
7
- const read: {
8
- [sessionID: string]: {
9
- [path: string]: Date | undefined
10
- }
11
- } = {}
12
- return {
13
- read,
14
- }
15
- })
16
-
17
- export function read(sessionID: string, file: string) {
18
- log.info("read", { sessionID, file })
19
- const { read } = state()
20
- read[sessionID] = read[sessionID] || {}
21
- read[sessionID][file] = new Date()
22
- }
23
-
24
- export function get(sessionID: string, file: string) {
25
- return state().read[sessionID]?.[file]
26
- }
27
-
28
- export async function assert(sessionID: string, filepath: string) {
29
- const time = get(sessionID, filepath)
30
- if (!time) throw new Error(`You must read the file ${filepath} before overwriting it. Use the Read tool first`)
31
- const stats = await Bun.file(filepath).stat()
32
- if (stats.mtime.getTime() > time.getTime()) {
33
- throw new Error(
34
- `File ${filepath} has been modified since it was last read.\nLast modification: ${stats.mtime.toISOString()}\nLast read: ${time.toISOString()}\n\nPlease read the file again before modifying it.`,
35
- )
36
- }
37
- }
38
- }
@@ -1,89 +0,0 @@
1
- import z from "zod"
2
- import { Bus } from "../bus"
3
- import { Instance } from "../project/instance"
4
- import { Log } from "../util/log"
5
- import { FileIgnore } from "./ignore"
6
- import { Config } from "../config/config"
7
- // @ts-ignore
8
- import { createWrapper } from "@parcel/watcher/wrapper"
9
- import { lazy } from "@/util/lazy"
10
- import type ParcelWatcher from "@parcel/watcher"
11
-
12
- declare const OPENCODE_LIBC: string | undefined
13
-
14
- export namespace FileWatcher {
15
- const log = Log.create({ service: "file.watcher" })
16
-
17
- export const Event = {
18
- Updated: Bus.event(
19
- "file.watcher.updated",
20
- z.object({
21
- file: z.string(),
22
- event: z.union([z.literal("add"), z.literal("change"), z.literal("unlink")]),
23
- }),
24
- ),
25
- }
26
-
27
- const watcher = lazy(() => {
28
- const binding = require(
29
- `@parcel/watcher-${process.platform}-${process.arch}${process.platform === "linux" ? `-${OPENCODE_LIBC || "glibc"}` : ""}`,
30
- )
31
- return createWrapper(binding) as typeof import("@parcel/watcher")
32
- })
33
-
34
- const state = Instance.state(
35
- async () => {
36
- if (Instance.project.vcs !== "git") return {}
37
- log.info("init")
38
- const cfg = await Config.get()
39
- const backend = (() => {
40
- if (process.platform === "win32") return "windows"
41
- if (process.platform === "darwin") return "fs-events"
42
- if (process.platform === "linux") return "inotify"
43
- })()
44
- if (!backend) {
45
- log.error("watcher backend not supported", { platform: process.platform })
46
- return {}
47
- }
48
- log.info("watcher backend", { platform: process.platform, backend })
49
- const subscribe: ParcelWatcher.SubscribeCallback = (err, evts) => {
50
- if (err) return
51
- for (const evt of evts) {
52
- if (evt.type === "create") Bus.publish(Event.Updated, { file: evt.path, event: "add" })
53
- if (evt.type === "update") Bus.publish(Event.Updated, { file: evt.path, event: "change" })
54
- if (evt.type === "delete") Bus.publish(Event.Updated, { file: evt.path, event: "unlink" })
55
- }
56
- }
57
-
58
- const subs = []
59
- const cfgIgnores = cfg.watcher?.ignore ?? []
60
-
61
- subs.push(
62
- await watcher().subscribe(Instance.directory, subscribe, {
63
- ignore: [...FileIgnore.PATTERNS, ...cfgIgnores],
64
- backend,
65
- }),
66
- )
67
-
68
- const vcsDir = Instance.project.vcsDir
69
- if (vcsDir && !cfgIgnores.includes(".git") && !cfgIgnores.includes(vcsDir)) {
70
- subs.push(
71
- await watcher().subscribe(vcsDir, subscribe, {
72
- ignore: ["hooks", "info", "logs", "objects", "refs", "worktrees", "modules", "lfs"],
73
- backend,
74
- }),
75
- )
76
- }
77
-
78
- return { subs }
79
- },
80
- async (state) => {
81
- if (!state.subs) return
82
- await Promise.all(state.subs.map((sub) => sub?.unsubscribe()))
83
- },
84
- )
85
-
86
- export function init() {
87
- state()
88
- }
89
- }
package/src/flag/flag.ts DELETED
@@ -1,28 +0,0 @@
1
- export namespace Flag {
2
- export const OPENCODE_AUTO_SHARE = truthy("OPENCODE_AUTO_SHARE")
3
- export const OPENCODE_CONFIG = process.env["OPENCODE_CONFIG"]
4
- export const OPENCODE_CONFIG_DIR = process.env["OPENCODE_CONFIG_DIR"]
5
- export const OPENCODE_CONFIG_CONTENT = process.env["OPENCODE_CONFIG_CONTENT"]
6
- export const OPENCODE_DISABLE_AUTOUPDATE = truthy("OPENCODE_DISABLE_AUTOUPDATE")
7
- export const OPENCODE_DISABLE_PRUNE = truthy("OPENCODE_DISABLE_PRUNE")
8
- export const OPENCODE_PERMISSION = process.env["OPENCODE_PERMISSION"]
9
- export const OPENCODE_DISABLE_DEFAULT_PLUGINS = truthy("OPENCODE_DISABLE_DEFAULT_PLUGINS")
10
- export const OPENCODE_DISABLE_LSP_DOWNLOAD = truthy("OPENCODE_DISABLE_LSP_DOWNLOAD")
11
- export const OPENCODE_ENABLE_EXPERIMENTAL_MODELS = truthy("OPENCODE_ENABLE_EXPERIMENTAL_MODELS")
12
- export const OPENCODE_DISABLE_AUTOCOMPACT = truthy("OPENCODE_DISABLE_AUTOCOMPACT")
13
- export const OPENCODE_FAKE_VCS = process.env["OPENCODE_FAKE_VCS"]
14
- export const OPENCODE_EXPERIMENTAL_BASH_MAX_OUTPUT_LENGTH =
15
- process.env["OPENCODE_EXPERIMENTAL_BASH_MAX_OUTPUT_LENGTH"]
16
-
17
- // Experimental
18
- export const OPENCODE_EXPERIMENTAL = truthy("OPENCODE_EXPERIMENTAL")
19
- export const OPENCODE_EXPERIMENTAL_WATCHER = OPENCODE_EXPERIMENTAL || truthy("OPENCODE_EXPERIMENTAL_WATCHER")
20
- export const OPENCODE_EXPERIMENTAL_DISABLE_COPY_ON_SELECT = truthy("OPENCODE_EXPERIMENTAL_DISABLE_COPY_ON_SELECT")
21
- export const OPENCODE_ENABLE_EXA =
22
- truthy("OPENCODE_ENABLE_EXA") || OPENCODE_EXPERIMENTAL || truthy("OPENCODE_EXPERIMENTAL_EXA")
23
-
24
- function truthy(key: string) {
25
- const value = process.env[key]?.toLowerCase()
26
- return value === "true" || value === "1"
27
- }
28
- }