rird 2.1.231 → 2.3.0

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 (381) hide show
  1. package/AGENTS.md +86 -0
  2. package/COMPLETED_TEST_SUITE.txt +280 -0
  3. package/Dockerfile +18 -0
  4. package/README.md +397 -6
  5. package/RIRD_ERROR_HANDLING_SUMMARY.md +307 -0
  6. package/TESTING.md +512 -0
  7. package/TEST_IMPLEMENTATION_REPORT.md +463 -0
  8. package/TEST_SUITE.md +307 -0
  9. package/TEST_SUMMARY.txt +380 -0
  10. package/bin/rird-perf.js +37 -0
  11. package/bin/rird.js +43 -8
  12. package/bunfig.toml +4 -0
  13. package/create-wrapper.ps1 +51 -0
  14. package/docs/ARCHITECTURE.md +768 -0
  15. package/docs/CLI_REFERENCE.md +681 -0
  16. package/docs/DOCUMENTATION_MANIFEST.md +392 -0
  17. package/docs/INDEX.md +295 -0
  18. package/docs/PRODUCTION_SETUP.md +633 -0
  19. package/docs/TROUBLESHOOTING.md +914 -0
  20. package/facebook_ads_library.png +0 -0
  21. package/nul +0 -0
  22. package/nul`nif +0 -0
  23. package/package.json +104 -15
  24. package/parsers-config.ts +239 -0
  25. package/rird-1.0.199.tgz +0 -0
  26. package/rird-1.0.205.tgz +0 -0
  27. package/script/build-windows.ts +56 -0
  28. package/script/build.ts +165 -0
  29. package/{postinstall.mjs → script/postinstall.mjs} +47 -68
  30. package/script/publish-registries.ts +187 -0
  31. package/script/publish.ts +85 -0
  32. package/script/schema.ts +47 -0
  33. package/src/acp/README.md +164 -0
  34. package/src/acp/agent.ts +1063 -0
  35. package/src/acp/session.ts +101 -0
  36. package/src/acp/types.ts +22 -0
  37. package/src/agent/agent.ts +367 -0
  38. package/src/agent/generate.txt +75 -0
  39. package/src/agent/prompt/compaction.txt +12 -0
  40. package/src/agent/prompt/explore.txt +18 -0
  41. package/src/agent/prompt/summary.txt +10 -0
  42. package/src/agent/prompt/title.txt +36 -0
  43. package/src/auth/index.ts +70 -0
  44. package/src/bun/index.ts +114 -0
  45. package/src/bus/bus-event.ts +43 -0
  46. package/src/bus/global.ts +10 -0
  47. package/src/bus/index.ts +105 -0
  48. package/src/cli/bootstrap.ts +17 -0
  49. package/src/cli/cmd/acp.ts +104 -0
  50. package/src/cli/cmd/activate.ts +50 -0
  51. package/src/cli/cmd/agent.ts +256 -0
  52. package/src/cli/cmd/auth.ts +412 -0
  53. package/src/cli/cmd/cmd.ts +7 -0
  54. package/src/cli/cmd/debug/config.ts +15 -0
  55. package/src/cli/cmd/debug/file.ts +91 -0
  56. package/src/cli/cmd/debug/index.ts +43 -0
  57. package/src/cli/cmd/debug/lsp.ts +48 -0
  58. package/src/cli/cmd/debug/ripgrep.ts +83 -0
  59. package/src/cli/cmd/debug/scrap.ts +15 -0
  60. package/src/cli/cmd/debug/skill.ts +15 -0
  61. package/src/cli/cmd/debug/snapshot.ts +48 -0
  62. package/src/cli/cmd/export.ts +88 -0
  63. package/src/cli/cmd/generate.ts +38 -0
  64. package/src/cli/cmd/github.ts +1400 -0
  65. package/src/cli/cmd/import.ts +98 -0
  66. package/src/cli/cmd/mcp.ts +654 -0
  67. package/src/cli/cmd/models.ts +68 -0
  68. package/src/cli/cmd/pr.ts +112 -0
  69. package/src/cli/cmd/run.ts +434 -0
  70. package/src/cli/cmd/serve.ts +31 -0
  71. package/src/cli/cmd/session.ts +106 -0
  72. package/src/cli/cmd/stats.ts +298 -0
  73. package/src/cli/cmd/tui/app.tsx +694 -0
  74. package/src/cli/cmd/tui/attach.ts +30 -0
  75. package/src/cli/cmd/tui/component/border.tsx +21 -0
  76. package/src/cli/cmd/tui/component/dialog-agent.tsx +31 -0
  77. package/src/cli/cmd/tui/component/dialog-command.tsx +124 -0
  78. package/src/cli/cmd/tui/component/dialog-mcp.tsx +86 -0
  79. package/src/cli/cmd/tui/component/dialog-model.tsx +236 -0
  80. package/src/cli/cmd/tui/component/dialog-provider.tsx +240 -0
  81. package/src/cli/cmd/tui/component/dialog-session-list.tsx +102 -0
  82. package/src/cli/cmd/tui/component/dialog-session-rename.tsx +31 -0
  83. package/src/cli/cmd/tui/component/dialog-stash.tsx +86 -0
  84. package/src/cli/cmd/tui/component/dialog-status.tsx +162 -0
  85. package/src/cli/cmd/tui/component/dialog-tag.tsx +44 -0
  86. package/src/cli/cmd/tui/component/dialog-theme-list.tsx +50 -0
  87. package/src/cli/cmd/tui/component/did-you-know.tsx +85 -0
  88. package/src/cli/cmd/tui/component/logo.tsx +48 -0
  89. package/src/cli/cmd/tui/component/prompt/autocomplete.tsx +574 -0
  90. package/src/cli/cmd/tui/component/prompt/history.tsx +108 -0
  91. package/src/cli/cmd/tui/component/prompt/index.tsx +1087 -0
  92. package/src/cli/cmd/tui/component/prompt/stash.tsx +101 -0
  93. package/src/cli/cmd/tui/component/tips.ts +27 -0
  94. package/src/cli/cmd/tui/component/todo-item.tsx +32 -0
  95. package/src/cli/cmd/tui/context/args.tsx +14 -0
  96. package/src/cli/cmd/tui/context/directory.ts +13 -0
  97. package/src/cli/cmd/tui/context/exit.tsx +23 -0
  98. package/src/cli/cmd/tui/context/helper.tsx +25 -0
  99. package/src/cli/cmd/tui/context/keybind.tsx +101 -0
  100. package/src/cli/cmd/tui/context/kv.tsx +49 -0
  101. package/src/cli/cmd/tui/context/local.tsx +345 -0
  102. package/src/cli/cmd/tui/context/prompt.tsx +18 -0
  103. package/src/cli/cmd/tui/context/route.tsx +46 -0
  104. package/src/cli/cmd/tui/context/sdk.tsx +74 -0
  105. package/src/cli/cmd/tui/context/sync.tsx +372 -0
  106. package/src/cli/cmd/tui/context/theme/aura.json +69 -0
  107. package/src/cli/cmd/tui/context/theme/ayu.json +80 -0
  108. package/src/cli/cmd/tui/context/theme/catppuccin-frappe.json +233 -0
  109. package/src/cli/cmd/tui/context/theme/catppuccin-macchiato.json +233 -0
  110. package/src/cli/cmd/tui/context/theme/catppuccin.json +112 -0
  111. package/src/cli/cmd/tui/context/theme/cobalt2.json +228 -0
  112. package/src/cli/cmd/tui/context/theme/cursor.json +249 -0
  113. package/src/cli/cmd/tui/context/theme/dracula.json +219 -0
  114. package/src/cli/cmd/tui/context/theme/everforest.json +241 -0
  115. package/src/cli/cmd/tui/context/theme/flexoki.json +237 -0
  116. package/src/cli/cmd/tui/context/theme/github.json +233 -0
  117. package/src/cli/cmd/tui/context/theme/gruvbox.json +95 -0
  118. package/src/cli/cmd/tui/context/theme/kanagawa.json +77 -0
  119. package/src/cli/cmd/tui/context/theme/lucent-orng.json +227 -0
  120. package/src/cli/cmd/tui/context/theme/material.json +235 -0
  121. package/src/cli/cmd/tui/context/theme/matrix.json +77 -0
  122. package/src/cli/cmd/tui/context/theme/mercury.json +252 -0
  123. package/src/cli/cmd/tui/context/theme/monokai.json +221 -0
  124. package/src/cli/cmd/tui/context/theme/nightowl.json +221 -0
  125. package/src/cli/cmd/tui/context/theme/nord.json +223 -0
  126. package/src/cli/cmd/tui/context/theme/one-dark.json +84 -0
  127. package/src/cli/cmd/tui/context/theme/orng.json +245 -0
  128. package/src/cli/cmd/tui/context/theme/palenight.json +222 -0
  129. package/src/cli/cmd/tui/context/theme/rird.json +245 -0
  130. package/src/cli/cmd/tui/context/theme/rosepine.json +234 -0
  131. package/src/cli/cmd/tui/context/theme/solarized.json +223 -0
  132. package/src/cli/cmd/tui/context/theme/synthwave84.json +226 -0
  133. package/src/cli/cmd/tui/context/theme/tokyonight.json +243 -0
  134. package/src/cli/cmd/tui/context/theme/vercel.json +245 -0
  135. package/src/cli/cmd/tui/context/theme/vesper.json +218 -0
  136. package/src/cli/cmd/tui/context/theme/zenburn.json +223 -0
  137. package/src/cli/cmd/tui/context/theme.tsx +1109 -0
  138. package/src/cli/cmd/tui/event.ts +40 -0
  139. package/src/cli/cmd/tui/hooks/use-safe-terminal-dimensions.ts +12 -0
  140. package/src/cli/cmd/tui/routes/home.tsx +138 -0
  141. package/src/cli/cmd/tui/routes/session/dialog-fork-from-timeline.tsx +64 -0
  142. package/src/cli/cmd/tui/routes/session/dialog-message.tsx +109 -0
  143. package/src/cli/cmd/tui/routes/session/dialog-subagent.tsx +26 -0
  144. package/src/cli/cmd/tui/routes/session/dialog-timeline.tsx +47 -0
  145. package/src/cli/cmd/tui/routes/session/footer.tsx +88 -0
  146. package/src/cli/cmd/tui/routes/session/header.tsx +125 -0
  147. package/src/cli/cmd/tui/routes/session/index.tsx +1876 -0
  148. package/src/cli/cmd/tui/routes/session/sidebar.tsx +320 -0
  149. package/src/cli/cmd/tui/spawn.ts +60 -0
  150. package/src/cli/cmd/tui/thread.ts +142 -0
  151. package/src/cli/cmd/tui/ui/dialog-alert.tsx +57 -0
  152. package/src/cli/cmd/tui/ui/dialog-confirm.tsx +83 -0
  153. package/src/cli/cmd/tui/ui/dialog-help.tsx +38 -0
  154. package/src/cli/cmd/tui/ui/dialog-prompt.tsx +77 -0
  155. package/src/cli/cmd/tui/ui/dialog-select.tsx +333 -0
  156. package/src/cli/cmd/tui/ui/dialog.tsx +171 -0
  157. package/src/cli/cmd/tui/ui/spinner.ts +368 -0
  158. package/src/cli/cmd/tui/ui/toast.tsx +100 -0
  159. package/src/cli/cmd/tui/util/clipboard.ts +127 -0
  160. package/src/cli/cmd/tui/util/editor.ts +32 -0
  161. package/src/cli/cmd/tui/util/terminal.ts +146 -0
  162. package/src/cli/cmd/tui/worker.ts +63 -0
  163. package/src/cli/cmd/uninstall.ts +344 -0
  164. package/src/cli/cmd/upgrade.ts +127 -0
  165. package/src/cli/cmd/web.ts +84 -0
  166. package/src/cli/error.ts +69 -0
  167. package/src/cli/ui.ts +101 -0
  168. package/src/cli/upgrade.ts +28 -0
  169. package/src/command/index.ts +80 -0
  170. package/src/command/template/initialize.txt +10 -0
  171. package/src/command/template/review.txt +97 -0
  172. package/src/config/config.ts +994 -0
  173. package/src/config/markdown.ts +41 -0
  174. package/src/env/index.ts +26 -0
  175. package/src/file/ignore.ts +83 -0
  176. package/src/file/index.ts +328 -0
  177. package/src/file/ripgrep.ts +393 -0
  178. package/src/file/time.ts +64 -0
  179. package/src/file/watcher.ts +103 -0
  180. package/src/flag/flag.ts +84 -0
  181. package/src/format/formatter.ts +315 -0
  182. package/src/format/index.ts +137 -0
  183. package/src/global/index.ts +101 -0
  184. package/src/id/id.ts +73 -0
  185. package/src/ide/index.ts +76 -0
  186. package/src/index.ts +297 -0
  187. package/src/index.ts.backup +271 -0
  188. package/src/installation/index.ts +258 -0
  189. package/src/lib/IMPLEMENTATION_NOTES.md +345 -0
  190. package/src/lib/error-handler.ts +225 -0
  191. package/src/lib/error-testing-guide.md +258 -0
  192. package/src/lib/errors.ts +285 -0
  193. package/src/lib/performance.ts +70 -0
  194. package/src/lib/telemetry.ts +282 -0
  195. package/src/lsp/client.ts +229 -0
  196. package/src/lsp/index.ts +485 -0
  197. package/src/lsp/language.ts +116 -0
  198. package/src/lsp/server.ts +1895 -0
  199. package/src/mcp/auth.ts +135 -0
  200. package/src/mcp/index.ts +1117 -0
  201. package/src/mcp/intent-analyzer.ts +376 -0
  202. package/src/mcp/oauth-callback.ts +200 -0
  203. package/src/mcp/oauth-provider.ts +154 -0
  204. package/src/patch/index.ts +632 -0
  205. package/src/permission/index.ts +199 -0
  206. package/src/plugin/index.ts +91 -0
  207. package/src/project/bootstrap.ts +33 -0
  208. package/src/project/instance.ts +78 -0
  209. package/src/project/project.ts +236 -0
  210. package/src/project/state.ts +65 -0
  211. package/src/project/vcs.ts +76 -0
  212. package/src/provider/auth.ts +143 -0
  213. package/src/provider/models-macro.ts +55 -0
  214. package/src/provider/models.ts +161 -0
  215. package/src/provider/provider.ts +1109 -0
  216. package/src/provider/sdk/openai-compatible/src/README.md +5 -0
  217. package/src/provider/sdk/openai-compatible/src/index.ts +2 -0
  218. package/src/provider/sdk/openai-compatible/src/openai-compatible-provider.ts +100 -0
  219. package/src/provider/sdk/openai-compatible/src/responses/convert-to-openai-responses-input.ts +303 -0
  220. package/src/provider/sdk/openai-compatible/src/responses/map-openai-responses-finish-reason.ts +22 -0
  221. package/src/provider/sdk/openai-compatible/src/responses/openai-config.ts +18 -0
  222. package/src/provider/sdk/openai-compatible/src/responses/openai-error.ts +22 -0
  223. package/src/provider/sdk/openai-compatible/src/responses/openai-responses-api-types.ts +207 -0
  224. package/src/provider/sdk/openai-compatible/src/responses/openai-responses-language-model.ts +1713 -0
  225. package/src/provider/sdk/openai-compatible/src/responses/openai-responses-prepare-tools.ts +177 -0
  226. package/src/provider/sdk/openai-compatible/src/responses/openai-responses-settings.ts +1 -0
  227. package/src/provider/sdk/openai-compatible/src/responses/tool/code-interpreter.ts +88 -0
  228. package/src/provider/sdk/openai-compatible/src/responses/tool/file-search.ts +128 -0
  229. package/src/provider/sdk/openai-compatible/src/responses/tool/image-generation.ts +115 -0
  230. package/src/provider/sdk/openai-compatible/src/responses/tool/local-shell.ts +65 -0
  231. package/src/provider/sdk/openai-compatible/src/responses/tool/web-search-preview.ts +104 -0
  232. package/src/provider/sdk/openai-compatible/src/responses/tool/web-search.ts +103 -0
  233. package/src/provider/transform.ts +455 -0
  234. package/src/pty/index.ts +231 -0
  235. package/src/security/guardrails.test.ts +341 -0
  236. package/src/security/guardrails.ts +570 -0
  237. package/src/security/index.ts +19 -0
  238. package/src/server/error.ts +36 -0
  239. package/src/server/project.ts +79 -0
  240. package/src/server/server.ts +2641 -0
  241. package/src/server/tui.ts +71 -0
  242. package/src/session/compaction.ts +228 -0
  243. package/src/session/index.ts +464 -0
  244. package/src/session/llm.ts +201 -0
  245. package/src/session/message-v2.ts +695 -0
  246. package/src/session/message.ts +189 -0
  247. package/src/session/processor.ts +409 -0
  248. package/src/session/prompt/act-switch.txt +5 -0
  249. package/src/session/prompt/anthropic-20250930.txt +166 -0
  250. package/src/session/prompt/anthropic.txt +63 -0
  251. package/src/session/prompt/anthropic_spoof.txt +1 -0
  252. package/src/session/prompt/beast.txt +76 -0
  253. package/src/session/prompt/codex.txt +304 -0
  254. package/src/session/prompt/copilot-gpt-5.txt +137 -0
  255. package/src/session/prompt/gemini.txt +62 -0
  256. package/src/session/prompt/max-steps.txt +16 -0
  257. package/src/session/prompt/plan-reminder-anthropic.txt +35 -0
  258. package/src/session/prompt/plan.txt +24 -0
  259. package/src/session/prompt/polaris.txt +88 -0
  260. package/src/session/prompt/qwen.txt +59 -0
  261. package/src/session/prompt.ts +1552 -0
  262. package/src/session/retry.ts +86 -0
  263. package/src/session/revert.ts +108 -0
  264. package/src/session/sensitive-filter.test.ts +327 -0
  265. package/src/session/sensitive-filter.ts +466 -0
  266. package/src/session/status.ts +76 -0
  267. package/src/session/summary.ts +209 -0
  268. package/src/session/system.ts +122 -0
  269. package/src/session/todo.ts +37 -0
  270. package/src/share/share-next.ts +222 -0
  271. package/src/share/share.ts +87 -0
  272. package/src/shell/shell.ts +67 -0
  273. package/src/skill/index.ts +1 -0
  274. package/src/skill/skill.ts +83 -0
  275. package/src/snapshot/index.ts +197 -0
  276. package/src/storage/storage.ts +226 -0
  277. package/src/tests/agent.test.ts +308 -0
  278. package/src/tests/build-guards.test.ts +267 -0
  279. package/src/tests/config.test.ts +664 -0
  280. package/src/tests/tool-registry.test.ts +589 -0
  281. package/src/tool/bash.ts +314 -0
  282. package/src/tool/bash.txt +158 -0
  283. package/src/tool/batch.ts +175 -0
  284. package/src/tool/batch.txt +24 -0
  285. package/src/tool/codesearch.ts +184 -0
  286. package/src/tool/codesearch.txt +12 -0
  287. package/src/tool/edit.ts +675 -0
  288. package/src/tool/edit.txt +10 -0
  289. package/src/tool/glob.ts +65 -0
  290. package/src/tool/glob.txt +6 -0
  291. package/src/tool/grep.ts +121 -0
  292. package/src/tool/grep.txt +8 -0
  293. package/src/tool/invalid.ts +17 -0
  294. package/src/tool/ls.ts +110 -0
  295. package/src/tool/ls.txt +1 -0
  296. package/src/tool/lsp-diagnostics.ts +26 -0
  297. package/src/tool/lsp-diagnostics.txt +1 -0
  298. package/src/tool/lsp-hover.ts +31 -0
  299. package/src/tool/lsp-hover.txt +1 -0
  300. package/src/tool/lsp.ts +87 -0
  301. package/src/tool/lsp.txt +19 -0
  302. package/src/tool/multiedit.ts +46 -0
  303. package/src/tool/multiedit.txt +41 -0
  304. package/src/tool/patch.ts +233 -0
  305. package/src/tool/patch.txt +1 -0
  306. package/src/tool/read.ts +219 -0
  307. package/src/tool/read.txt +12 -0
  308. package/src/tool/registry.ts +162 -0
  309. package/src/tool/skill.ts +100 -0
  310. package/src/tool/task.ts +136 -0
  311. package/src/tool/task.txt +51 -0
  312. package/src/tool/todo.ts +39 -0
  313. package/src/tool/todoread.txt +14 -0
  314. package/src/tool/todowrite.txt +167 -0
  315. package/src/tool/tool.ts +71 -0
  316. package/src/tool/webfetch.ts +198 -0
  317. package/src/tool/webfetch.txt +13 -0
  318. package/src/tool/websearch.ts +268 -0
  319. package/src/tool/websearch.txt +13 -0
  320. package/src/tool/write.ts +110 -0
  321. package/src/tool/write.txt +8 -0
  322. package/src/util/archive.ts +16 -0
  323. package/src/util/color.ts +19 -0
  324. package/src/util/context.ts +25 -0
  325. package/src/util/defer.ts +12 -0
  326. package/src/util/eventloop.ts +20 -0
  327. package/src/util/filesystem.ts +83 -0
  328. package/src/util/fn.ts +11 -0
  329. package/src/util/iife.ts +3 -0
  330. package/src/util/keybind.ts +102 -0
  331. package/src/util/lazy.ts +11 -0
  332. package/src/util/license.ts +362 -0
  333. package/src/util/locale.ts +81 -0
  334. package/src/util/lock.ts +98 -0
  335. package/src/util/log.ts +180 -0
  336. package/src/util/queue.ts +32 -0
  337. package/src/util/rpc.ts +42 -0
  338. package/src/util/scrap.ts +10 -0
  339. package/src/util/signal.ts +12 -0
  340. package/src/util/timeout.ts +14 -0
  341. package/src/util/token.ts +7 -0
  342. package/src/util/wildcard.ts +54 -0
  343. package/sst-env.d.ts +9 -0
  344. package/test/agent/agent.test.ts +146 -0
  345. package/test/bun.test.ts +53 -0
  346. package/test/cli/cmd/acp.test.ts +144 -0
  347. package/test/cli/cmd/run.test.ts +250 -0
  348. package/test/cli/github-remote.test.ts +80 -0
  349. package/test/config/agent-color.test.ts +66 -0
  350. package/test/config/config.test.ts +536 -0
  351. package/test/config/markdown.test.ts +89 -0
  352. package/test/file/ignore.test.ts +10 -0
  353. package/test/fixture/fixture.ts +37 -0
  354. package/test/fixture/lsp/fake-lsp-server.js +77 -0
  355. package/test/helpers.ts +172 -0
  356. package/test/ide/ide.test.ts +82 -0
  357. package/test/installation/installation.test.ts +143 -0
  358. package/test/keybind.test.ts +421 -0
  359. package/test/lsp/client.test.ts +95 -0
  360. package/test/mcp/headers.test.ts +153 -0
  361. package/test/patch/patch.test.ts +348 -0
  362. package/test/preload.ts +57 -0
  363. package/test/project/project.test.ts +74 -0
  364. package/test/provider/provider.test.ts +74 -0
  365. package/test/provider/transform.test.ts +411 -0
  366. package/test/session/retry.test.ts +111 -0
  367. package/test/session/session.test.ts +71 -0
  368. package/test/skill/skill.test.ts +131 -0
  369. package/test/snapshot/snapshot.test.ts +940 -0
  370. package/test/tool/__snapshots__/tool.test.ts.snap +9 -0
  371. package/test/tool/bash.test.ts +434 -0
  372. package/test/tool/grep.test.ts +108 -0
  373. package/test/tool/patch.test.ts +259 -0
  374. package/test/tool/read.test.ts +42 -0
  375. package/test/util/iife.test.ts +36 -0
  376. package/test/util/lazy.test.ts +50 -0
  377. package/test/util/license.test.ts +235 -0
  378. package/test/util/timeout.test.ts +21 -0
  379. package/test/util/wildcard.test.ts +55 -0
  380. package/tsconfig.json +16 -0
  381. package/update-versions.ps1 +65 -0
@@ -19,7 +19,7 @@ const RIRD_HOME = process.env.RIRD_HOME || path.join(os.homedir(), ".rird")
19
19
  const BIN_DIR = path.join(RIRD_HOME, "bin")
20
20
  const ENGINE_DIR = path.join(RIRD_HOME, "engine")
21
21
  const VENV_DIR = path.join(RIRD_HOME, "venv")
22
- const MCP_DIR = path.join(ENGINE_DIR, "stealth-browser-mcp")
22
+ const MCP_DIR = path.join(ENGINE_DIR, "chrome-browser-mcp")
23
23
 
24
24
  // Installation mode: A = Browser + Files, B = Full Computer Use
25
25
  const INSTALL_MODE = process.env.RIRD_MODE || "A"
@@ -96,20 +96,20 @@ function installPythonDeps(pipCmd) {
96
96
  execSafe(`${pipCmd} install --user ${deps.join(" ")}`, { stdio: "inherit" })
97
97
  }
98
98
 
99
- // Clone stealth-browser-mcp
100
- function cloneStealthBrowserMcp() {
99
+ // Clone browser MCP (Chrome)
100
+ function cloneChromeBrowserMcp() {
101
101
  if (fs.existsSync(MCP_DIR)) {
102
- log("stealth-browser-mcp already installed")
102
+ log("Chrome browser integration already installed")
103
103
  return true
104
104
  }
105
105
 
106
- log("Cloning stealth-browser-mcp...")
106
+ log("Installing Chrome browser integration...")
107
107
 
108
108
  // Try git clone
109
109
  if (execSafe("git --version")) {
110
110
  const result = execSafe(`git clone --depth 1 https://github.com/vibheksoni/stealth-browser-mcp "${MCP_DIR}"`, { stdio: "inherit" })
111
111
  if (result !== null || fs.existsSync(MCP_DIR)) {
112
- log("stealth-browser-mcp cloned successfully")
112
+ log("Chrome browser integration installed")
113
113
  return true
114
114
  }
115
115
  }
@@ -119,8 +119,8 @@ function cloneStealthBrowserMcp() {
119
119
  // Create placeholder for now
120
120
  fs.mkdirSync(path.join(MCP_DIR, "src"), { recursive: true })
121
121
  fs.writeFileSync(path.join(MCP_DIR, "src", "server.py"), `#!/usr/bin/env python3
122
- # Placeholder - run: git clone https://github.com/vibheksoni/stealth-browser-mcp ~/.rird/engine/stealth-browser-mcp
123
- print("stealth-browser-mcp not installed. Clone manually.")
122
+ # Placeholder - install the Chrome browser integration repo into ~/.rird/engine/chrome-browser-mcp
123
+ print("Chrome browser integration not installed. Install Git and re-run setup.")
124
124
  `)
125
125
  return false
126
126
  }
@@ -254,7 +254,7 @@ function createConfig(pythonCmd) {
254
254
  log(`Creating config (Mode ${INSTALL_MODE})...`)
255
255
 
256
256
  const mcpConfig = {
257
- "stealth-browser": {
257
+ "chrome-browser": {
258
258
  type: "local",
259
259
  command: [pythonCmd, path.join(MCP_DIR, "src", "server.py"), "--minimal"],
260
260
  environment: {
@@ -311,28 +311,18 @@ function createConfig(pythonCmd) {
311
311
  "",
312
312
  "=== RESEARCH STRATEGY ===",
313
313
  "For ANY task that asks to 'find URLs', 'output URLs', 'list profiles', or 'get X items':",
314
- "1. ALWAYS START with websearch - it is instant and bypasses detection.",
315
- "2. Only fall back to browser automation if websearch fails or task requires interaction (login, forms).",
314
+ "1. ALWAYS START with web search - it is instant.",
315
+ "2. Only fall back to Chrome if search fails or task requires interaction (login, forms).",
316
316
  "",
317
317
  "=== TOOL PRIORITY ===",
318
- "1. websearch: Use for finding URLs, profiles, and public info.",
319
- "2. Browser (stealth-browser): Use for interaction, scrolling, and map searching.",
320
- "3. Computer Use: Use for desktop applications when enabled.",
318
+ "1. Web search: Use for finding URLs, profiles, and public info.",
319
+ "2. Chrome browser: Use for interaction, scrolling, and map searching.",
320
+ "3. Desktop control: Use for desktop applications when enabled.",
321
321
  "",
322
322
  "=== HOW I WORK ===",
323
- "1. WEB SEARCH:",
324
- " - Finding URLs, quick facts, lists of companies or profiles",
325
- " - Fast lookups that don't require visiting a page",
326
- "",
327
- "2. BROWSER AUTOMATION:",
328
- " - Navigating to websites and interacting with them",
329
- " - Logging into accounts and filling forms",
330
- " - Extracting content from web pages",
331
- "",
332
- "3. COMPUTER CONTROL:",
333
- " - Desktop applications and system tasks",
334
- " - Mouse and keyboard automation",
335
- " - File and folder operations"
323
+ "1. WEB SEARCH: Finding URLs, quick facts, lists of companies or profiles",
324
+ "2. CHROME BROWSER: Navigating, logging in, filling forms, extracting content",
325
+ "3. DESKTOP CONTROL: Applications, mouse/keyboard automation, file operations"
336
326
  ]
337
327
  : [
338
328
  "=== RIRD AI - rird.ai ===",
@@ -346,76 +336,65 @@ function createConfig(pythonCmd) {
346
336
  "",
347
337
  "=== RESEARCH STRATEGY ===",
348
338
  "For ANY task that asks to 'find URLs', 'output URLs', 'list profiles', or 'get X items':",
349
- "1. ALWAYS START with websearch - it is instant and bypasses detection.",
350
- "2. Only fall back to browser automation if websearch fails or task requires interaction (login, forms).",
339
+ "1. ALWAYS START with web search - it is instant.",
340
+ "2. Only fall back to Chrome if search fails or task requires interaction (login, forms).",
351
341
  "",
352
342
  "=== TOOL PRIORITY ===",
353
- "1. websearch: Use for finding URLs, profiles, and public info.",
354
- "2. Browser (stealth-browser): Use for interaction, scrolling, and map searching.",
343
+ "1. Web search: Use for finding URLs, profiles, and public info.",
344
+ "2. Chrome browser: Use for interaction, scrolling, and map searching.",
355
345
  "",
356
346
  "=== HOW I WORK ===",
357
- "1. WEB SEARCH:",
358
- " - Finding URLs, quick facts, lists of companies or profiles",
359
- " - Fast lookups that don't require visiting a page",
360
- "",
361
- "2. BROWSER AUTOMATION:",
362
- " - Navigating to websites and interacting with them",
363
- " - Logging into accounts and filling forms",
364
- " - Extracting content from web pages"
347
+ "1. WEB SEARCH: Finding URLs, quick facts, lists of companies or profiles",
348
+ "2. CHROME BROWSER: Navigating, logging in, filling forms, extracting content"
365
349
  ]
366
350
 
367
351
  const config = {
368
- model: "deepseek/deepseek-reasoner",
369
- small_model: "siliconflow/Qwen/Qwen3-8B",
370
- visionModel: "siliconflow/Qwen/Qwen2.5-VL-7B-Instruct",
352
+ model: "rird/qwen3:8b",
353
+ small_model: "rird/deepseek-reasoner",
354
+ visionModel: "rird/qwen2.5-vl-7b",
371
355
  agent: {
372
- plan: { model: "deepseek/deepseek-reasoner" },
373
- build: { model: "deepseek/deepseek-reasoner" }
356
+ plan: { model: "rird/deepseek-reasoner" },
357
+ build: { model: "rird/qwen3:8b" }
374
358
  },
375
359
  provider: {
376
- deepseek: {
360
+ rird: {
377
361
  models: {
378
362
  "deepseek-reasoner": {
379
363
  id: "deepseek-reasoner",
380
- name: "DeepSeek Reasoner",
381
- release_date: "2024-12-26",
364
+ name: "Planner",
365
+ release_date: "2025-01-01",
382
366
  attachment: true,
383
367
  reasoning: true,
384
368
  temperature: true,
385
369
  tool_call: true,
386
- limit: { context: 64000, output: 8000 },
370
+ limit: { context: 32768, output: 8192 },
387
371
  options: {}
388
- }
389
- },
390
- options: { apiKey: "" }
391
- },
392
- siliconflow: {
393
- models: {
394
- "Qwen/Qwen3-8B": {
395
- id: "Qwen/Qwen3-8B",
396
- name: "Qwen 3 8B",
397
- release_date: "2024-12-26",
372
+ },
373
+ "qwen3:8b": {
374
+ id: "qwen3:8b",
375
+ name: "Actor",
376
+ release_date: "2025-01-01",
398
377
  attachment: true,
399
378
  reasoning: false,
400
379
  temperature: true,
401
380
  tool_call: true,
402
- limit: { context: 32000, output: 4000 },
381
+ limit: { context: 32768, output: 8192 },
403
382
  options: {}
404
383
  },
405
- "Qwen/Qwen2.5-VL-7B-Instruct": {
406
- id: "Qwen/Qwen2.5-VL-7B-Instruct",
407
- name: "Qwen 2.5 VL 7B",
408
- release_date: "2024-12-26",
384
+ "qwen2.5-vl-7b": {
385
+ id: "qwen2.5-vl-7b",
386
+ name: "Vision",
387
+ release_date: "2025-01-01",
409
388
  attachment: true,
410
389
  reasoning: false,
411
390
  temperature: true,
412
391
  tool_call: true,
413
- limit: { context: 32000, output: 4000 },
392
+ limit: { context: 32768, output: 8192 },
414
393
  modalities: { input: ["text", "image"], output: ["text"] },
415
394
  options: {}
416
395
  }
417
396
  },
418
- options: { apiKey: "", baseUrl: "https://api.siliconflow.com/v1" }
397
+ options: { baseURL: "https://rird.ai/api/llm/v1" }
419
398
  }
420
399
  },
421
400
  instructions,
@@ -471,7 +450,7 @@ function installComputerUseMcp() {
471
450
  function findBinary() {
472
451
  const { platform, arch } = detectPlatformAndArch()
473
452
  const packageName = `rird-${platform}-${arch}`
474
- const binaryName = platform === "windows" ? "opencode.exe" : "opencode"
453
+ const binaryName = platform === "windows" ? "rird.exe" : "rird"
475
454
 
476
455
  try {
477
456
  const packageJsonPath = require.resolve(`${packageName}/package.json`)
@@ -524,8 +503,8 @@ async function main() {
524
503
  }
525
504
  }
526
505
 
527
- // Clone stealth-browser-mcp
528
- cloneStealthBrowserMcp()
506
+ // Install browser MCP (Chrome)
507
+ cloneChromeBrowserMcp()
529
508
 
530
509
  // Create license validator
531
510
  createLicenseValidator()
@@ -0,0 +1,187 @@
1
+ #!/usr/bin/env bun
2
+ import { $ } from "bun"
3
+ import { Script } from "@opencode-ai/script"
4
+
5
+ if (!Script.preview) {
6
+ // Calculate SHA values
7
+ const arm64Sha = await $`sha256sum ./dist/opencode-linux-arm64.tar.gz | cut -d' ' -f1`.text().then((x) => x.trim())
8
+ const x64Sha = await $`sha256sum ./dist/opencode-linux-x64.tar.gz | cut -d' ' -f1`.text().then((x) => x.trim())
9
+ const macX64Sha = await $`sha256sum ./dist/opencode-darwin-x64.zip | cut -d' ' -f1`.text().then((x) => x.trim())
10
+ const macArm64Sha = await $`sha256sum ./dist/opencode-darwin-arm64.zip | cut -d' ' -f1`.text().then((x) => x.trim())
11
+
12
+ const [pkgver, _subver = ""] = Script.version.split(/(-.*)/, 2)
13
+
14
+ // arch
15
+ const binaryPkgbuild = [
16
+ "# Maintainer: dax",
17
+ "# Maintainer: adam",
18
+ "",
19
+ "pkgname='opencode-bin'",
20
+ `pkgver=${pkgver}`,
21
+ `_subver=${_subver}`,
22
+ "options=('!debug' '!strip')",
23
+ "pkgrel=1",
24
+ "pkgdesc='The AI Browser Agent built for the terminal.'",
25
+ "url='https://github.com/sst/opencode'",
26
+ "arch=('aarch64' 'x86_64')",
27
+ "license=('MIT')",
28
+ "provides=('opencode')",
29
+ "conflicts=('opencode')",
30
+ "depends=('ripgrep')",
31
+ "",
32
+ `source_aarch64=("\${pkgname}_\${pkgver}_aarch64.tar.gz::https://github.com/sst/opencode/releases/download/v\${pkgver}\${_subver}/opencode-linux-arm64.tar.gz")`,
33
+ `sha256sums_aarch64=('${arm64Sha}')`,
34
+
35
+ `source_x86_64=("\${pkgname}_\${pkgver}_x86_64.tar.gz::https://github.com/sst/opencode/releases/download/v\${pkgver}\${_subver}/opencode-linux-x64.tar.gz")`,
36
+ `sha256sums_x86_64=('${x64Sha}')`,
37
+ "",
38
+ "package() {",
39
+ ' install -Dm755 ./opencode "${pkgdir}/usr/bin/opencode"',
40
+ "}",
41
+ "",
42
+ ].join("\n")
43
+
44
+ // Source-based PKGBUILD for opencode
45
+ const sourcePkgbuild = [
46
+ "# Maintainer: dax",
47
+ "# Maintainer: adam",
48
+ "",
49
+ "pkgname='opencode'",
50
+ `pkgver=${pkgver}`,
51
+ `_subver=${_subver}`,
52
+ "options=('!debug' '!strip')",
53
+ "pkgrel=1",
54
+ "pkgdesc='The AI Browser Agent built for the terminal.'",
55
+ "url='https://github.com/sst/opencode'",
56
+ "arch=('aarch64' 'x86_64')",
57
+ "license=('MIT')",
58
+ "provides=('opencode')",
59
+ "conflicts=('opencode-bin')",
60
+ "depends=('ripgrep')",
61
+ "makedepends=('git' 'bun-bin' 'go')",
62
+ "",
63
+ `source=("opencode-\${pkgver}.tar.gz::https://github.com/sst/opencode/archive/v\${pkgver}\${_subver}.tar.gz")`,
64
+ `sha256sums=('SKIP')`,
65
+ "",
66
+ "build() {",
67
+ ` cd "opencode-\${pkgver}"`,
68
+ ` bun install`,
69
+ " cd ./packages/opencode",
70
+ ` OPENCODE_CHANNEL=latest OPENCODE_VERSION=${pkgver} bun run ./script/build.ts --single`,
71
+ "}",
72
+ "",
73
+ "package() {",
74
+ ` cd "opencode-\${pkgver}/packages/opencode"`,
75
+ ' mkdir -p "${pkgdir}/usr/bin"',
76
+ ' target_arch="x64"',
77
+ ' case "$CARCH" in',
78
+ ' x86_64) target_arch="x64" ;;',
79
+ ' aarch64) target_arch="arm64" ;;',
80
+ ' *) printf "unsupported architecture: %s\\n" "$CARCH" >&2 ; return 1 ;;',
81
+ " esac",
82
+ ' libc=""',
83
+ " if command -v ldd >/dev/null 2>&1; then",
84
+ " if ldd --version 2>&1 | grep -qi musl; then",
85
+ ' libc="-musl"',
86
+ " fi",
87
+ " fi",
88
+ ' if [ -z "$libc" ] && ls /lib/ld-musl-* >/dev/null 2>&1; then',
89
+ ' libc="-musl"',
90
+ " fi",
91
+ ' base=""',
92
+ ' if [ "$target_arch" = "x64" ]; then',
93
+ " if ! grep -qi avx2 /proc/cpuinfo 2>/dev/null; then",
94
+ ' base="-baseline"',
95
+ " fi",
96
+ " fi",
97
+ ' bin="dist/opencode-linux-${target_arch}${base}${libc}/bin/opencode"',
98
+ ' if [ ! -f "$bin" ]; then',
99
+ ' printf "unable to find binary for %s%s%s\\n" "$target_arch" "$base" "$libc" >&2',
100
+ " return 1",
101
+ " fi",
102
+ ' install -Dm755 "$bin" "${pkgdir}/usr/bin/opencode"',
103
+ "}",
104
+ "",
105
+ ].join("\n")
106
+
107
+ for (const [pkg, pkgbuild] of [
108
+ ["opencode-bin", binaryPkgbuild],
109
+ ["opencode", sourcePkgbuild],
110
+ ]) {
111
+ for (let i = 0; i < 30; i++) {
112
+ try {
113
+ await $`rm -rf ./dist/aur-${pkg}`
114
+ await $`git clone ssh://aur@aur.archlinux.org/${pkg}.git ./dist/aur-${pkg}`
115
+ await $`cd ./dist/aur-${pkg} && git checkout master`
116
+ await Bun.file(`./dist/aur-${pkg}/PKGBUILD`).write(pkgbuild)
117
+ await $`cd ./dist/aur-${pkg} && makepkg --printsrcinfo > .SRCINFO`
118
+ await $`cd ./dist/aur-${pkg} && git add PKGBUILD .SRCINFO`
119
+ await $`cd ./dist/aur-${pkg} && git commit -m "Update to v${Script.version}"`
120
+ await $`cd ./dist/aur-${pkg} && git push`
121
+ break
122
+ } catch (e) {
123
+ continue
124
+ }
125
+ }
126
+ }
127
+
128
+ // Homebrew formula
129
+ const homebrewFormula = [
130
+ "# typed: false",
131
+ "# frozen_string_literal: true",
132
+ "",
133
+ "# This file was generated by GoReleaser. DO NOT EDIT.",
134
+ "class Opencode < Formula",
135
+ ` desc "The AI Browser Agent built for the terminal."`,
136
+ ` homepage "https://github.com/sst/opencode"`,
137
+ ` version "${Script.version.split("-")[0]}"`,
138
+ "",
139
+ ` depends_on "ripgrep"`,
140
+ "",
141
+ " on_macos do",
142
+ " if Hardware::CPU.intel?",
143
+ ` url "https://github.com/sst/opencode/releases/download/v${Script.version}/opencode-darwin-x64.zip"`,
144
+ ` sha256 "${macX64Sha}"`,
145
+ "",
146
+ " def install",
147
+ ' bin.install "opencode"',
148
+ " end",
149
+ " end",
150
+ " if Hardware::CPU.arm?",
151
+ ` url "https://github.com/sst/opencode/releases/download/v${Script.version}/opencode-darwin-arm64.zip"`,
152
+ ` sha256 "${macArm64Sha}"`,
153
+ "",
154
+ " def install",
155
+ ' bin.install "opencode"',
156
+ " end",
157
+ " end",
158
+ " end",
159
+ "",
160
+ " on_linux do",
161
+ " if Hardware::CPU.intel? and Hardware::CPU.is_64_bit?",
162
+ ` url "https://github.com/sst/opencode/releases/download/v${Script.version}/opencode-linux-x64.tar.gz"`,
163
+ ` sha256 "${x64Sha}"`,
164
+ " def install",
165
+ ' bin.install "opencode"',
166
+ " end",
167
+ " end",
168
+ " if Hardware::CPU.arm? and Hardware::CPU.is_64_bit?",
169
+ ` url "https://github.com/sst/opencode/releases/download/v${Script.version}/opencode-linux-arm64.tar.gz"`,
170
+ ` sha256 "${arm64Sha}"`,
171
+ " def install",
172
+ ' bin.install "opencode"',
173
+ " end",
174
+ " end",
175
+ " end",
176
+ "end",
177
+ "",
178
+ "",
179
+ ].join("\n")
180
+
181
+ await $`rm -rf ./dist/homebrew-tap`
182
+ await $`git clone https://${process.env["GITHUB_TOKEN"]}@github.com/sst/homebrew-tap.git ./dist/homebrew-tap`
183
+ await Bun.file("./dist/homebrew-tap/opencode.rb").write(homebrewFormula)
184
+ await $`cd ./dist/homebrew-tap && git add opencode.rb`
185
+ await $`cd ./dist/homebrew-tap && git commit -m "Update to v${Script.version}"`
186
+ await $`cd ./dist/homebrew-tap && git push`
187
+ }
@@ -0,0 +1,85 @@
1
+ #!/usr/bin/env bun
2
+ import { $ } from "bun"
3
+ import pkg from "../package.json"
4
+ import { Script } from "@opencode-ai/script"
5
+ import { fileURLToPath } from "url"
6
+ import fs from "fs"
7
+ import path from "path"
8
+
9
+ const dir = fileURLToPath(new URL("..", import.meta.url))
10
+ process.chdir(dir)
11
+
12
+ const { binaries } = await import("./build.ts")
13
+ {
14
+ const platform = process.platform === "win32" ? "windows" : process.platform
15
+ const name = `${pkg.name}-${platform}-${process.arch}`
16
+ const binary = process.platform === "win32" ? "rird.exe" : "rird"
17
+ console.log(`smoke test: running dist/${name}/bin/${binary} --version`)
18
+ await $`./dist/${name}/bin/${binary} --version`
19
+ }
20
+
21
+ fs.mkdirSync(path.join(dir, `./dist/${pkg.name}`), { recursive: true })
22
+ fs.cpSync("./bin", `./dist/${pkg.name}/bin`, { recursive: true })
23
+ // Rename bin/rird.js to bin/rird so the npm bin config works
24
+ const targetName = pkg.name
25
+ fs.renameSync(
26
+ path.join(dir, `./dist/${pkg.name}/bin/rird.js`),
27
+ path.join(dir, `./dist/${pkg.name}/bin/${targetName}`)
28
+ )
29
+ fs.copyFileSync("./script/postinstall.mjs", `./dist/${pkg.name}/postinstall.mjs`)
30
+
31
+ await Bun.file(`./dist/${pkg.name}/package.json`).write(
32
+ JSON.stringify(
33
+ {
34
+ name: pkg.name + "-ai",
35
+ bin: {
36
+ [pkg.name]: `./bin/${targetName}`,
37
+ },
38
+ scripts: {
39
+ postinstall: "bun ./postinstall.mjs || node ./postinstall.mjs",
40
+ },
41
+ version: pkg.version,
42
+ optionalDependencies: binaries,
43
+ },
44
+ null,
45
+ 2,
46
+ ),
47
+ )
48
+
49
+ const tags = [Script.channel]
50
+
51
+ const tasks = Object.entries(binaries).map(async ([name]) => {
52
+ if (process.platform !== "win32") {
53
+ await $`chmod -R 755 .`.cwd(`./dist/${name}`)
54
+ }
55
+ // Force correct version in individual package.json files
56
+ const pkgJson = await Bun.file(`./dist/${name}/package.json`).json()
57
+ pkgJson.version = pkg.version
58
+ await Bun.file(`./dist/${name}/package.json`).write(JSON.stringify(pkgJson, null, 2))
59
+
60
+ await $`bun pm pack`.cwd(`./dist/${name}`)
61
+ for (const tag of tags) {
62
+ await $`npm publish *.tgz --access public --tag ${tag}`.cwd(`./dist/${name}`)
63
+ }
64
+ })
65
+ await Promise.all(tasks)
66
+ for (const tag of tags) {
67
+ await $`cd ./dist/${pkg.name} && bun pm pack && npm publish *.tgz --access public --tag ${tag}`
68
+ }
69
+
70
+ if (!Script.preview) {
71
+ // Create archives for GitHub release
72
+ for (const key of Object.keys(binaries)) {
73
+ if (key.includes("linux")) {
74
+ await $`tar -czf ../../${key}.tar.gz *`.cwd(`dist/${key}/bin`)
75
+ } else {
76
+ await $`zip -r ../../${key}.zip *`.cwd(`dist/${key}/bin`)
77
+ }
78
+ }
79
+
80
+ const image = "ghcr.io/sst/opencode"
81
+ const platforms = "linux/amd64,linux/arm64"
82
+ const tags = [`${image}:${Script.version}`, `${image}:latest`]
83
+ const tagFlags = tags.flatMap((t) => ["-t", t])
84
+ await $`docker buildx build --platform ${platforms} ${tagFlags} --push .`
85
+ }
@@ -0,0 +1,47 @@
1
+ #!/usr/bin/env bun
2
+
3
+ import { z } from "zod"
4
+ import { Config } from "../src/config/config"
5
+
6
+ const file = process.argv[2]
7
+ console.log(file)
8
+
9
+ const result = z.toJSONSchema(Config.Info, {
10
+ io: "input", // Generate input shape (treats optional().default() as not required)
11
+ /**
12
+ * We'll use the `default` values of the field as the only value in `examples`.
13
+ * This will ensure no docs are needed to be read, as the configuration is
14
+ * self-documenting.
15
+ *
16
+ * See https://json-schema.org/draft/2020-12/draft-bhutton-json-schema-validation-00#rfc.section.9.5
17
+ */
18
+ override(ctx) {
19
+ const schema = ctx.jsonSchema
20
+
21
+ // Preserve strictness: set additionalProperties: false for objects
22
+ if (schema && typeof schema === "object" && schema.type === "object" && schema.additionalProperties === undefined) {
23
+ schema.additionalProperties = false
24
+ }
25
+
26
+ // Add examples and default descriptions for string fields with defaults
27
+ if (schema && typeof schema === "object" && "type" in schema && schema.type === "string" && schema?.default) {
28
+ if (!schema.examples) {
29
+ schema.examples = [schema.default]
30
+ }
31
+
32
+ schema.description = [schema.description || "", `default: \`${schema.default}\``]
33
+ .filter(Boolean)
34
+ .join("\n\n")
35
+ .trim()
36
+ }
37
+ },
38
+ }) as Record<string, unknown> & {
39
+ allowComments?: boolean
40
+ allowTrailingCommas?: boolean
41
+ }
42
+
43
+ // used for json lsps since config supports jsonc
44
+ result.allowComments = true
45
+ result.allowTrailingCommas = true
46
+
47
+ await Bun.write(file, JSON.stringify(result, null, 2))