cerebras-cli 1.0.1 → 1.0.3

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 (313) hide show
  1. package/cerebras-cli-1.0.0.tgz +0 -0
  2. package/package.json +7 -88
  3. package/AGENTS.md +0 -27
  4. package/Dockerfile +0 -10
  5. package/bunfig.toml +0 -4
  6. package/parsers-config.ts +0 -239
  7. package/script/build.ts +0 -151
  8. package/script/postinstall.mjs +0 -122
  9. package/script/publish.ts +0 -256
  10. package/script/schema.ts +0 -47
  11. package/src/acp/README.md +0 -164
  12. package/src/acp/agent.ts +0 -812
  13. package/src/acp/session.ts +0 -70
  14. package/src/acp/types.ts +0 -22
  15. package/src/agent/agent.ts +0 -310
  16. package/src/agent/generate.txt +0 -75
  17. package/src/auth/index.ts +0 -70
  18. package/src/bun/index.ts +0 -152
  19. package/src/bus/global.ts +0 -10
  20. package/src/bus/index.ts +0 -142
  21. package/src/cli/bootstrap.ts +0 -17
  22. package/src/cli/cmd/acp.ts +0 -88
  23. package/src/cli/cmd/agent.ts +0 -165
  24. package/src/cli/cmd/auth.ts +0 -369
  25. package/src/cli/cmd/cmd.ts +0 -7
  26. package/src/cli/cmd/debug/config.ts +0 -15
  27. package/src/cli/cmd/debug/file.ts +0 -91
  28. package/src/cli/cmd/debug/index.ts +0 -41
  29. package/src/cli/cmd/debug/lsp.ts +0 -47
  30. package/src/cli/cmd/debug/ripgrep.ts +0 -83
  31. package/src/cli/cmd/debug/scrap.ts +0 -15
  32. package/src/cli/cmd/debug/snapshot.ts +0 -48
  33. package/src/cli/cmd/export.ts +0 -88
  34. package/src/cli/cmd/generate.ts +0 -38
  35. package/src/cli/cmd/github.ts +0 -1200
  36. package/src/cli/cmd/import.ts +0 -98
  37. package/src/cli/cmd/mcp.ts +0 -400
  38. package/src/cli/cmd/models.ts +0 -77
  39. package/src/cli/cmd/pr.ts +0 -112
  40. package/src/cli/cmd/run.ts +0 -342
  41. package/src/cli/cmd/serve.ts +0 -31
  42. package/src/cli/cmd/session.ts +0 -106
  43. package/src/cli/cmd/stats.ts +0 -298
  44. package/src/cli/cmd/tui/app.tsx +0 -732
  45. package/src/cli/cmd/tui/attach.ts +0 -25
  46. package/src/cli/cmd/tui/component/border.tsx +0 -21
  47. package/src/cli/cmd/tui/component/dialog-agent.tsx +0 -31
  48. package/src/cli/cmd/tui/component/dialog-command.tsx +0 -124
  49. package/src/cli/cmd/tui/component/dialog-feedback.tsx +0 -160
  50. package/src/cli/cmd/tui/component/dialog-mcp.tsx +0 -86
  51. package/src/cli/cmd/tui/component/dialog-model.tsx +0 -223
  52. package/src/cli/cmd/tui/component/dialog-notification.tsx +0 -78
  53. package/src/cli/cmd/tui/component/dialog-provider.tsx +0 -222
  54. package/src/cli/cmd/tui/component/dialog-session-list.tsx +0 -97
  55. package/src/cli/cmd/tui/component/dialog-session-rename.tsx +0 -31
  56. package/src/cli/cmd/tui/component/dialog-status.tsx +0 -114
  57. package/src/cli/cmd/tui/component/dialog-tag.tsx +0 -44
  58. package/src/cli/cmd/tui/component/dialog-theme-list.tsx +0 -50
  59. package/src/cli/cmd/tui/component/logo.tsx +0 -37
  60. package/src/cli/cmd/tui/component/notification-banner.tsx +0 -58
  61. package/src/cli/cmd/tui/component/prompt/autocomplete.tsx +0 -530
  62. package/src/cli/cmd/tui/component/prompt/history.tsx +0 -107
  63. package/src/cli/cmd/tui/component/prompt/index.tsx +0 -931
  64. package/src/cli/cmd/tui/context/args.tsx +0 -14
  65. package/src/cli/cmd/tui/context/directory.ts +0 -12
  66. package/src/cli/cmd/tui/context/exit.tsx +0 -23
  67. package/src/cli/cmd/tui/context/helper.tsx +0 -25
  68. package/src/cli/cmd/tui/context/keybind.tsx +0 -111
  69. package/src/cli/cmd/tui/context/kv.tsx +0 -49
  70. package/src/cli/cmd/tui/context/local.tsx +0 -339
  71. package/src/cli/cmd/tui/context/prompt.tsx +0 -18
  72. package/src/cli/cmd/tui/context/route.tsx +0 -45
  73. package/src/cli/cmd/tui/context/sdk.tsx +0 -75
  74. package/src/cli/cmd/tui/context/sync.tsx +0 -374
  75. package/src/cli/cmd/tui/context/theme/aura.json +0 -69
  76. package/src/cli/cmd/tui/context/theme/ayu.json +0 -80
  77. package/src/cli/cmd/tui/context/theme/catppuccin-macchiato.json +0 -233
  78. package/src/cli/cmd/tui/context/theme/catppuccin.json +0 -112
  79. package/src/cli/cmd/tui/context/theme/cobalt2.json +0 -228
  80. package/src/cli/cmd/tui/context/theme/dracula.json +0 -219
  81. package/src/cli/cmd/tui/context/theme/everforest.json +0 -241
  82. package/src/cli/cmd/tui/context/theme/flexoki.json +0 -237
  83. package/src/cli/cmd/tui/context/theme/github.json +0 -233
  84. package/src/cli/cmd/tui/context/theme/gruvbox.json +0 -95
  85. package/src/cli/cmd/tui/context/theme/kanagawa.json +0 -77
  86. package/src/cli/cmd/tui/context/theme/material.json +0 -235
  87. package/src/cli/cmd/tui/context/theme/matrix.json +0 -77
  88. package/src/cli/cmd/tui/context/theme/mercury.json +0 -252
  89. package/src/cli/cmd/tui/context/theme/monokai.json +0 -221
  90. package/src/cli/cmd/tui/context/theme/nightowl.json +0 -221
  91. package/src/cli/cmd/tui/context/theme/nord.json +0 -223
  92. package/src/cli/cmd/tui/context/theme/one-dark.json +0 -84
  93. package/src/cli/cmd/tui/context/theme/orng.json +0 -245
  94. package/src/cli/cmd/tui/context/theme/palenight.json +0 -222
  95. package/src/cli/cmd/tui/context/theme/rosepine.json +0 -234
  96. package/src/cli/cmd/tui/context/theme/solarized.json +0 -223
  97. package/src/cli/cmd/tui/context/theme/synthwave84.json +0 -226
  98. package/src/cli/cmd/tui/context/theme/tokyonight.json +0 -243
  99. package/src/cli/cmd/tui/context/theme/vercel.json +0 -245
  100. package/src/cli/cmd/tui/context/theme/vesper.json +0 -218
  101. package/src/cli/cmd/tui/context/theme/zenburn.json +0 -223
  102. package/src/cli/cmd/tui/context/theme.tsx +0 -1077
  103. package/src/cli/cmd/tui/event.ts +0 -39
  104. package/src/cli/cmd/tui/routes/home.tsx +0 -104
  105. package/src/cli/cmd/tui/routes/session/dialog-message.tsx +0 -93
  106. package/src/cli/cmd/tui/routes/session/dialog-timeline.tsx +0 -37
  107. package/src/cli/cmd/tui/routes/session/footer.tsx +0 -76
  108. package/src/cli/cmd/tui/routes/session/header.tsx +0 -183
  109. package/src/cli/cmd/tui/routes/session/index.tsx +0 -1703
  110. package/src/cli/cmd/tui/routes/session/sidebar.tsx +0 -586
  111. package/src/cli/cmd/tui/spawn.ts +0 -60
  112. package/src/cli/cmd/tui/thread.ts +0 -120
  113. package/src/cli/cmd/tui/ui/dialog-alert.tsx +0 -55
  114. package/src/cli/cmd/tui/ui/dialog-confirm.tsx +0 -81
  115. package/src/cli/cmd/tui/ui/dialog-help.tsx +0 -36
  116. package/src/cli/cmd/tui/ui/dialog-prompt.tsx +0 -75
  117. package/src/cli/cmd/tui/ui/dialog-select.tsx +0 -317
  118. package/src/cli/cmd/tui/ui/dialog.tsx +0 -170
  119. package/src/cli/cmd/tui/ui/spinner.ts +0 -368
  120. package/src/cli/cmd/tui/ui/toast.tsx +0 -100
  121. package/src/cli/cmd/tui/util/clipboard.ts +0 -127
  122. package/src/cli/cmd/tui/util/editor.ts +0 -32
  123. package/src/cli/cmd/tui/util/terminal.ts +0 -114
  124. package/src/cli/cmd/tui/worker.ts +0 -63
  125. package/src/cli/cmd/uninstall.ts +0 -344
  126. package/src/cli/cmd/upgrade.ts +0 -67
  127. package/src/cli/cmd/web.ts +0 -84
  128. package/src/cli/error.ts +0 -55
  129. package/src/cli/ui.ts +0 -84
  130. package/src/cli/upgrade.ts +0 -25
  131. package/src/command/index.ts +0 -79
  132. package/src/command/template/initialize.txt +0 -10
  133. package/src/command/template/review.txt +0 -73
  134. package/src/config/config.ts +0 -886
  135. package/src/config/markdown.ts +0 -41
  136. package/src/env/index.ts +0 -26
  137. package/src/file/fzf.ts +0 -124
  138. package/src/file/ignore.ts +0 -83
  139. package/src/file/index.ts +0 -326
  140. package/src/file/ripgrep.ts +0 -391
  141. package/src/file/time.ts +0 -38
  142. package/src/file/watcher.ts +0 -89
  143. package/src/flag/flag.ts +0 -28
  144. package/src/format/formatter.ts +0 -277
  145. package/src/format/index.ts +0 -137
  146. package/src/global/index.ts +0 -52
  147. package/src/id/id.ts +0 -73
  148. package/src/ide/index.ts +0 -75
  149. package/src/index.ts +0 -158
  150. package/src/installation/index.ts +0 -194
  151. package/src/lsp/client.ts +0 -215
  152. package/src/lsp/index.ts +0 -370
  153. package/src/lsp/language.ts +0 -111
  154. package/src/lsp/server.ts +0 -1327
  155. package/src/mcp/auth.ts +0 -82
  156. package/src/mcp/index.ts +0 -576
  157. package/src/mcp/oauth-callback.ts +0 -203
  158. package/src/mcp/oauth-provider.ts +0 -132
  159. package/src/notification/index.ts +0 -101
  160. package/src/patch/index.ts +0 -622
  161. package/src/permission/index.ts +0 -198
  162. package/src/plugin/index.ts +0 -95
  163. package/src/project/bootstrap.ts +0 -31
  164. package/src/project/instance.ts +0 -68
  165. package/src/project/project.ts +0 -133
  166. package/src/project/state.ts +0 -65
  167. package/src/project/vcs.ts +0 -77
  168. package/src/provider/auth.ts +0 -143
  169. package/src/provider/models-macro.ts +0 -11
  170. package/src/provider/models.ts +0 -93
  171. package/src/provider/provider.ts +0 -996
  172. package/src/provider/sdk/openai-compatible/src/README.md +0 -5
  173. package/src/provider/sdk/openai-compatible/src/index.ts +0 -2
  174. package/src/provider/sdk/openai-compatible/src/openai-compatible-provider.ts +0 -100
  175. package/src/provider/sdk/openai-compatible/src/responses/convert-to-openai-responses-input.ts +0 -303
  176. package/src/provider/sdk/openai-compatible/src/responses/map-openai-responses-finish-reason.ts +0 -27
  177. package/src/provider/sdk/openai-compatible/src/responses/openai-config.ts +0 -18
  178. package/src/provider/sdk/openai-compatible/src/responses/openai-error.ts +0 -22
  179. package/src/provider/sdk/openai-compatible/src/responses/openai-responses-api-types.ts +0 -207
  180. package/src/provider/sdk/openai-compatible/src/responses/openai-responses-language-model.ts +0 -1713
  181. package/src/provider/sdk/openai-compatible/src/responses/openai-responses-prepare-tools.ts +0 -177
  182. package/src/provider/sdk/openai-compatible/src/responses/openai-responses-settings.ts +0 -1
  183. package/src/provider/sdk/openai-compatible/src/responses/tool/code-interpreter.ts +0 -88
  184. package/src/provider/sdk/openai-compatible/src/responses/tool/file-search.ts +0 -128
  185. package/src/provider/sdk/openai-compatible/src/responses/tool/image-generation.ts +0 -115
  186. package/src/provider/sdk/openai-compatible/src/responses/tool/local-shell.ts +0 -65
  187. package/src/provider/sdk/openai-compatible/src/responses/tool/web-search-preview.ts +0 -104
  188. package/src/provider/sdk/openai-compatible/src/responses/tool/web-search.ts +0 -103
  189. package/src/provider/transform.ts +0 -406
  190. package/src/pty/index.ts +0 -226
  191. package/src/ratelimit/index.ts +0 -185
  192. package/src/server/error.ts +0 -36
  193. package/src/server/project.ts +0 -50
  194. package/src/server/server.ts +0 -2463
  195. package/src/server/tui.ts +0 -71
  196. package/src/session/compaction.ts +0 -257
  197. package/src/session/index.ts +0 -470
  198. package/src/session/message-v2.ts +0 -641
  199. package/src/session/message.ts +0 -189
  200. package/src/session/processor.ts +0 -443
  201. package/src/session/prompt/anthropic-20250930.txt +0 -166
  202. package/src/session/prompt/anthropic.txt +0 -105
  203. package/src/session/prompt/anthropic_spoof.txt +0 -1
  204. package/src/session/prompt/beast.txt +0 -147
  205. package/src/session/prompt/build-switch.txt +0 -5
  206. package/src/session/prompt/codex.txt +0 -318
  207. package/src/session/prompt/compaction.txt +0 -12
  208. package/src/session/prompt/copilot-gpt-5.txt +0 -143
  209. package/src/session/prompt/gemini.txt +0 -155
  210. package/src/session/prompt/max-steps.txt +0 -16
  211. package/src/session/prompt/plan-reminder-anthropic.txt +0 -67
  212. package/src/session/prompt/plan.txt +0 -26
  213. package/src/session/prompt/polaris.txt +0 -107
  214. package/src/session/prompt/qwen.txt +0 -109
  215. package/src/session/prompt/summarize.txt +0 -4
  216. package/src/session/prompt/title.txt +0 -36
  217. package/src/session/prompt.ts +0 -1541
  218. package/src/session/retry.ts +0 -82
  219. package/src/session/revert.ts +0 -108
  220. package/src/session/status.ts +0 -75
  221. package/src/session/summary.ts +0 -203
  222. package/src/session/system.ts +0 -148
  223. package/src/session/todo.ts +0 -36
  224. package/src/share/share-next.ts +0 -195
  225. package/src/share/share.ts +0 -87
  226. package/src/snapshot/index.ts +0 -197
  227. package/src/storage/storage.ts +0 -226
  228. package/src/telemetry/index.ts +0 -232
  229. package/src/tool/bash.ts +0 -365
  230. package/src/tool/bash.txt +0 -128
  231. package/src/tool/batch.ts +0 -173
  232. package/src/tool/batch.txt +0 -28
  233. package/src/tool/codesearch.ts +0 -138
  234. package/src/tool/codesearch.txt +0 -12
  235. package/src/tool/edit.ts +0 -674
  236. package/src/tool/edit.txt +0 -10
  237. package/src/tool/glob.ts +0 -65
  238. package/src/tool/glob.txt +0 -6
  239. package/src/tool/grep.ts +0 -120
  240. package/src/tool/grep.txt +0 -8
  241. package/src/tool/invalid.ts +0 -17
  242. package/src/tool/ls.ts +0 -110
  243. package/src/tool/ls.txt +0 -1
  244. package/src/tool/lsp-diagnostics.ts +0 -26
  245. package/src/tool/lsp-diagnostics.txt +0 -1
  246. package/src/tool/lsp-hover.ts +0 -31
  247. package/src/tool/lsp-hover.txt +0 -1
  248. package/src/tool/multiedit.ts +0 -46
  249. package/src/tool/multiedit.txt +0 -41
  250. package/src/tool/patch.ts +0 -233
  251. package/src/tool/patch.txt +0 -1
  252. package/src/tool/read.ts +0 -217
  253. package/src/tool/read.txt +0 -12
  254. package/src/tool/registry.ts +0 -148
  255. package/src/tool/task.ts +0 -135
  256. package/src/tool/task.txt +0 -60
  257. package/src/tool/todo.ts +0 -39
  258. package/src/tool/todoread.txt +0 -14
  259. package/src/tool/todowrite.txt +0 -167
  260. package/src/tool/tool.ts +0 -66
  261. package/src/tool/webfetch.ts +0 -187
  262. package/src/tool/webfetch.txt +0 -14
  263. package/src/tool/websearch.ts +0 -150
  264. package/src/tool/websearch.txt +0 -11
  265. package/src/tool/write.ts +0 -99
  266. package/src/tool/write.txt +0 -8
  267. package/src/types/shims.d.ts +0 -3
  268. package/src/util/color.ts +0 -19
  269. package/src/util/context.ts +0 -25
  270. package/src/util/defer.ts +0 -12
  271. package/src/util/eventloop.ts +0 -20
  272. package/src/util/filesystem.ts +0 -69
  273. package/src/util/fn.ts +0 -11
  274. package/src/util/iife.ts +0 -3
  275. package/src/util/keybind.ts +0 -79
  276. package/src/util/lazy.ts +0 -11
  277. package/src/util/locale.ts +0 -81
  278. package/src/util/lock.ts +0 -98
  279. package/src/util/log.ts +0 -177
  280. package/src/util/queue.ts +0 -32
  281. package/src/util/rpc.ts +0 -42
  282. package/src/util/scrap.ts +0 -10
  283. package/src/util/signal.ts +0 -12
  284. package/src/util/timeout.ts +0 -14
  285. package/src/util/token.ts +0 -7
  286. package/src/util/wildcard.ts +0 -54
  287. package/sst-env.d.ts +0 -9
  288. package/test/bun.test.ts +0 -53
  289. package/test/config/agent-color.test.ts +0 -66
  290. package/test/config/config.test.ts +0 -503
  291. package/test/config/markdown.test.ts +0 -89
  292. package/test/file/ignore.test.ts +0 -10
  293. package/test/fixture/fixture.ts +0 -28
  294. package/test/fixture/lsp/fake-lsp-server.js +0 -77
  295. package/test/ide/ide.test.ts +0 -82
  296. package/test/keybind.test.ts +0 -317
  297. package/test/lsp/client.test.ts +0 -95
  298. package/test/patch/patch.test.ts +0 -348
  299. package/test/preload.ts +0 -38
  300. package/test/project/project.test.ts +0 -42
  301. package/test/provider/provider.test.ts +0 -1809
  302. package/test/provider/transform.test.ts +0 -305
  303. package/test/session/retry.test.ts +0 -61
  304. package/test/session/session.test.ts +0 -71
  305. package/test/snapshot/snapshot.test.ts +0 -939
  306. package/test/tool/__snapshots__/tool.test.ts.snap +0 -9
  307. package/test/tool/bash.test.ts +0 -55
  308. package/test/tool/patch.test.ts +0 -259
  309. package/test/util/iife.test.ts +0 -36
  310. package/test/util/lazy.test.ts +0 -50
  311. package/test/util/timeout.test.ts +0 -21
  312. package/test/util/wildcard.test.ts +0 -55
  313. 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
- }