soraacode 0.2.0 → 0.2.2

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 (353) hide show
  1. package/LICENSE +21 -0
  2. package/bin/soraacode.exe +10 -0
  3. package/package.json +17 -25
  4. package/{script/postinstall.mjs → postinstall.mjs} +5 -5
  5. package/AGENTS.md +0 -131
  6. package/Dockerfile +0 -18
  7. package/README.md +0 -15
  8. package/bin/opencode +0 -199
  9. package/bin/soraacode +0 -199
  10. package/bunfig.toml +0 -7
  11. package/git +0 -0
  12. package/migration/20260511173437_session-metadata/migration.sql +0 -1
  13. package/migration/20260511173437_session-metadata/snapshot.json +0 -1500
  14. package/parsers-config.ts +0 -1
  15. package/script/bench-search.ts +0 -94
  16. package/script/bench-test-suite.ts +0 -52
  17. package/script/build-headless.ts +0 -51
  18. package/script/build.ts +0 -245
  19. package/script/generate.ts +0 -14
  20. package/script/httpapi-exercise.ts +0 -1
  21. package/script/profile-test-files.ts +0 -42
  22. package/script/publish.ts +0 -213
  23. package/script/run-workspace-server +0 -106
  24. package/script/schema.ts +0 -77
  25. package/script/time.ts +0 -6
  26. package/script/trace-imports.ts +0 -153
  27. package/soraacode-0.1.7.tgz +0 -0
  28. package/specs/effect/error-boundaries-plan.md +0 -235
  29. package/specs/effect/errors.md +0 -207
  30. package/specs/effect/facades.md +0 -218
  31. package/specs/effect/guide.md +0 -247
  32. package/specs/effect/instance-context.md +0 -13
  33. package/specs/effect/loose-ends.md +0 -30
  34. package/specs/effect/migration.md +0 -62
  35. package/specs/effect/routes.md +0 -61
  36. package/specs/effect/schema.md +0 -88
  37. package/specs/effect/server-package.md +0 -58
  38. package/specs/effect/todo.md +0 -241
  39. package/specs/effect/tools.md +0 -88
  40. package/specs/openapi-translation-cleanup.md +0 -204
  41. package/specs/tui-plugins.md +0 -544
  42. package/specs/v2/api.ts +0 -67
  43. package/specs/v2/message-shape.md +0 -136
  44. package/specs/v2/notifications.md +0 -13
  45. package/specs/v2/tui-command-shim.md +0 -67
  46. package/src/account/account.ts +0 -481
  47. package/src/account/repo.ts +0 -171
  48. package/src/account/schema.ts +0 -99
  49. package/src/account/url.ts +0 -8
  50. package/src/acp/agent.ts +0 -95
  51. package/src/acp/config-option.ts +0 -206
  52. package/src/acp/content.ts +0 -269
  53. package/src/acp/directory.ts +0 -212
  54. package/src/acp/error.ts +0 -97
  55. package/src/acp/event.ts +0 -421
  56. package/src/acp/permission.ts +0 -254
  57. package/src/acp/profile.ts +0 -42
  58. package/src/acp/service.ts +0 -1226
  59. package/src/acp/session.ts +0 -232
  60. package/src/acp/tool.ts +0 -364
  61. package/src/acp/usage.ts +0 -243
  62. package/src/agent/agent.ts +0 -450
  63. package/src/agent/generate.txt +0 -75
  64. package/src/agent/prompt/compaction.txt +0 -5
  65. package/src/agent/prompt/explore.txt +0 -18
  66. package/src/agent/prompt/summary.txt +0 -11
  67. package/src/agent/prompt/title.txt +0 -44
  68. package/src/agent/subagent-permissions.ts +0 -27
  69. package/src/audio.d.ts +0 -14
  70. package/src/auth/index.ts +0 -97
  71. package/src/background/job.ts +0 -37
  72. package/src/bus/global.ts +0 -22
  73. package/src/cli/bootstrap.ts +0 -11
  74. package/src/cli/cmd/cmd.ts +0 -7
  75. package/src/cli/cmd/serve.ts +0 -24
  76. package/src/cli/effect/prompt.ts +0 -37
  77. package/src/cli/effect-cmd.ts +0 -96
  78. package/src/cli/error.ts +0 -130
  79. package/src/cli/heap.ts +0 -45
  80. package/src/cli/logo.ts +0 -2
  81. package/src/cli/network.ts +0 -80
  82. package/src/cli/ui.ts +0 -132
  83. package/src/command/index.ts +0 -177
  84. package/src/command/template/initialize.txt +0 -66
  85. package/src/command/template/review.txt +0 -101
  86. package/src/config/agent.ts +0 -59
  87. package/src/config/command.ts +0 -39
  88. package/src/config/config.ts +0 -707
  89. package/src/config/entry-name.ts +0 -19
  90. package/src/config/managed.ts +0 -69
  91. package/src/config/markdown.ts +0 -36
  92. package/src/config/parse.ts +0 -61
  93. package/src/config/paths.ts +0 -45
  94. package/src/config/plugin.ts +0 -79
  95. package/src/config/v2-compat.ts +0 -449
  96. package/src/config/variable.ts +0 -91
  97. package/src/control-plane/adapters/index.ts +0 -41
  98. package/src/control-plane/adapters/worktree.ts +0 -96
  99. package/src/control-plane/dev/README.md +0 -19
  100. package/src/control-plane/dev/debug-workspace-plugin.ts +0 -73
  101. package/src/control-plane/types.ts +0 -59
  102. package/src/control-plane/util.ts +0 -39
  103. package/src/control-plane/workspace-adapter-runtime.ts +0 -51
  104. package/src/control-plane/workspace-context.ts +0 -26
  105. package/src/control-plane/workspace.ts +0 -966
  106. package/src/effect/app-node-builder-v1.ts +0 -12
  107. package/src/effect/app-runtime.ts +0 -135
  108. package/src/effect/bootstrap-runtime.ts +0 -19
  109. package/src/effect/bridge.ts +0 -84
  110. package/src/effect/config-service.ts +0 -67
  111. package/src/effect/instance-ref.ts +0 -11
  112. package/src/effect/instance-registry.ts +0 -12
  113. package/src/effect/instance-state.ts +0 -69
  114. package/src/effect/promise.ts +0 -17
  115. package/src/effect/run-service.ts +0 -47
  116. package/src/effect/runner.ts +0 -217
  117. package/src/effect/runtime-flags.ts +0 -78
  118. package/src/env/index.ts +0 -41
  119. package/src/event-manifest.ts +0 -3
  120. package/src/event-v2-bridge.ts +0 -71
  121. package/src/format/formatter.ts +0 -404
  122. package/src/format/index.ts +0 -203
  123. package/src/git/index.ts +0 -348
  124. package/src/id/id.ts +0 -80
  125. package/src/ide/index.ts +0 -54
  126. package/src/image/image.ts +0 -172
  127. package/src/index-headless.ts +0 -89
  128. package/src/index.ts +0 -93
  129. package/src/installation/index.ts +0 -336
  130. package/src/lsp/client.ts +0 -650
  131. package/src/lsp/diagnostic.ts +0 -29
  132. package/src/lsp/language.ts +0 -121
  133. package/src/lsp/launch.ts +0 -21
  134. package/src/lsp/lsp.ts +0 -507
  135. package/src/lsp/server.ts +0 -1983
  136. package/src/markdown.d.ts +0 -4
  137. package/src/mcp/auth.ts +0 -163
  138. package/src/mcp/browser.ts +0 -37
  139. package/src/mcp/catalog.ts +0 -170
  140. package/src/mcp/index.ts +0 -1004
  141. package/src/mcp/oauth-callback.ts +0 -194
  142. package/src/mcp/oauth-provider.ts +0 -259
  143. package/src/node.ts +0 -4
  144. package/src/patch/index.ts +0 -686
  145. package/src/permission/arity.ts +0 -163
  146. package/src/permission/evaluate.ts +0 -1
  147. package/src/permission/index.ts +0 -223
  148. package/src/plugin/github-copilot/copilot.ts +0 -415
  149. package/src/plugin/github-copilot/models.ts +0 -261
  150. package/src/plugin/index.ts +0 -298
  151. package/src/plugin/install.ts +0 -439
  152. package/src/plugin/loader.ts +0 -237
  153. package/src/plugin/meta.ts +0 -188
  154. package/src/plugin/openai/README.md +0 -31
  155. package/src/plugin/openai/codex.ts +0 -575
  156. package/src/plugin/openai/ws-pool.ts +0 -271
  157. package/src/plugin/openai/ws.ts +0 -383
  158. package/src/plugin/pty-environment.ts +0 -24
  159. package/src/plugin/shared.ts +0 -323
  160. package/src/project/bootstrap-service.ts +0 -9
  161. package/src/project/bootstrap.ts +0 -58
  162. package/src/project/instance-context.ts +0 -24
  163. package/src/project/instance-runtime.ts +0 -16
  164. package/src/project/instance-store.ts +0 -213
  165. package/src/project/project.ts +0 -483
  166. package/src/project/vcs.ts +0 -423
  167. package/src/provider/auth.ts +0 -229
  168. package/src/provider/error.ts +0 -195
  169. package/src/provider/model-status.ts +0 -8
  170. package/src/provider/provider.ts +0 -1955
  171. package/src/provider/transform.ts +0 -1923
  172. package/src/question/index.ts +0 -161
  173. package/src/question/schema.ts +0 -4
  174. package/src/server/auth.ts +0 -48
  175. package/src/server/event.ts +0 -10
  176. package/src/server/global-lifecycle.ts +0 -28
  177. package/src/server/mdns.ts +0 -47
  178. package/src/server/proxy-util.ts +0 -48
  179. package/src/server/routes/instance/httpapi/AGENTS.md +0 -39
  180. package/src/server/routes/instance/httpapi/api.ts +0 -97
  181. package/src/server/routes/instance/httpapi/errors.ts +0 -193
  182. package/src/server/routes/instance/httpapi/groups/config.ts +0 -65
  183. package/src/server/routes/instance/httpapi/groups/control-plane.ts +0 -35
  184. package/src/server/routes/instance/httpapi/groups/control.ts +0 -76
  185. package/src/server/routes/instance/httpapi/groups/event.ts +0 -29
  186. package/src/server/routes/instance/httpapi/groups/experimental.ts +0 -275
  187. package/src/server/routes/instance/httpapi/groups/file.ts +0 -185
  188. package/src/server/routes/instance/httpapi/groups/global.ts +0 -139
  189. package/src/server/routes/instance/httpapi/groups/instance.ts +0 -206
  190. package/src/server/routes/instance/httpapi/groups/mcp.ts +0 -156
  191. package/src/server/routes/instance/httpapi/groups/metadata.ts +0 -18
  192. package/src/server/routes/instance/httpapi/groups/permission.ts +0 -61
  193. package/src/server/routes/instance/httpapi/groups/project-copy.ts +0 -32
  194. package/src/server/routes/instance/httpapi/groups/project.ts +0 -93
  195. package/src/server/routes/instance/httpapi/groups/provider.ts +0 -101
  196. package/src/server/routes/instance/httpapi/groups/pty.ts +0 -172
  197. package/src/server/routes/instance/httpapi/groups/query.ts +0 -12
  198. package/src/server/routes/instance/httpapi/groups/question.ts +0 -74
  199. package/src/server/routes/instance/httpapi/groups/session.ts +0 -462
  200. package/src/server/routes/instance/httpapi/groups/sync.ts +0 -113
  201. package/src/server/routes/instance/httpapi/groups/tui.ts +0 -208
  202. package/src/server/routes/instance/httpapi/groups/workspace.ts +0 -141
  203. package/src/server/routes/instance/httpapi/handlers/config.ts +0 -34
  204. package/src/server/routes/instance/httpapi/handlers/control-plane.ts +0 -37
  205. package/src/server/routes/instance/httpapi/handlers/control.ts +0 -43
  206. package/src/server/routes/instance/httpapi/handlers/event.ts +0 -99
  207. package/src/server/routes/instance/httpapi/handlers/experimental.ts +0 -193
  208. package/src/server/routes/instance/httpapi/handlers/file.ts +0 -139
  209. package/src/server/routes/instance/httpapi/handlers/global.ts +0 -126
  210. package/src/server/routes/instance/httpapi/handlers/instance.ts +0 -110
  211. package/src/server/routes/instance/httpapi/handlers/mcp.ts +0 -111
  212. package/src/server/routes/instance/httpapi/handlers/permission.ts +0 -41
  213. package/src/server/routes/instance/httpapi/handlers/project-copy.ts +0 -83
  214. package/src/server/routes/instance/httpapi/handlers/project.ts +0 -63
  215. package/src/server/routes/instance/httpapi/handlers/provider.ts +0 -116
  216. package/src/server/routes/instance/httpapi/handlers/pty.ts +0 -273
  217. package/src/server/routes/instance/httpapi/handlers/question.ts +0 -54
  218. package/src/server/routes/instance/httpapi/handlers/session-errors.ts +0 -21
  219. package/src/server/routes/instance/httpapi/handlers/session.ts +0 -442
  220. package/src/server/routes/instance/httpapi/handlers/sync.ts +0 -89
  221. package/src/server/routes/instance/httpapi/handlers/tui.ts +0 -131
  222. package/src/server/routes/instance/httpapi/handlers/workspace.ts +0 -102
  223. package/src/server/routes/instance/httpapi/lifecycle.ts +0 -54
  224. package/src/server/routes/instance/httpapi/middleware/authorization.ts +0 -150
  225. package/src/server/routes/instance/httpapi/middleware/compression.ts +0 -64
  226. package/src/server/routes/instance/httpapi/middleware/cors-vary.ts +0 -29
  227. package/src/server/routes/instance/httpapi/middleware/error.ts +0 -44
  228. package/src/server/routes/instance/httpapi/middleware/fence.ts +0 -25
  229. package/src/server/routes/instance/httpapi/middleware/instance-context.ts +0 -43
  230. package/src/server/routes/instance/httpapi/middleware/proxy.ts +0 -131
  231. package/src/server/routes/instance/httpapi/middleware/schema-error.ts +0 -41
  232. package/src/server/routes/instance/httpapi/middleware/workspace-routing.ts +0 -250
  233. package/src/server/routes/instance/httpapi/public.ts +0 -537
  234. package/src/server/routes/instance/httpapi/server.ts +0 -325
  235. package/src/server/routes/instance/httpapi/websocket-tracker.ts +0 -60
  236. package/src/server/server.ts +0 -224
  237. package/src/server/shared/fence.ts +0 -60
  238. package/src/server/shared/pty-ticket.ts +0 -15
  239. package/src/server/shared/public-ui.ts +0 -12
  240. package/src/server/shared/tui-control.ts +0 -28
  241. package/src/server/shared/ui.ts +0 -108
  242. package/src/server/shared/workspace-routing.ts +0 -45
  243. package/src/server/tui-event.ts +0 -1
  244. package/src/session/compaction.ts +0 -608
  245. package/src/session/instruction.ts +0 -237
  246. package/src/session/llm/AGENTS.md +0 -90
  247. package/src/session/llm/ai-sdk.ts +0 -291
  248. package/src/session/llm/native-request.ts +0 -196
  249. package/src/session/llm/native-runtime.ts +0 -195
  250. package/src/session/llm/request.ts +0 -226
  251. package/src/session/llm.ts +0 -390
  252. package/src/session/message-error.ts +0 -14
  253. package/src/session/message-v2.ts +0 -742
  254. package/src/session/message.ts +0 -148
  255. package/src/session/overflow.ts +0 -34
  256. package/src/session/processor.ts +0 -732
  257. package/src/session/prompt/build-switch.txt +0 -5
  258. package/src/session/prompt/default.txt +0 -35
  259. package/src/session/prompt/plan-mode.txt +0 -70
  260. package/src/session/prompt/plan.txt +0 -26
  261. package/src/session/prompt.ts +0 -1631
  262. package/src/session/reminders.ts +0 -92
  263. package/src/session/retry.ts +0 -209
  264. package/src/session/revert.ts +0 -136
  265. package/src/session/run-state.ts +0 -151
  266. package/src/session/schema.ts +0 -26
  267. package/src/session/session.ts +0 -1016
  268. package/src/session/status.ts +0 -56
  269. package/src/session/summary.ts +0 -160
  270. package/src/session/system.ts +0 -123
  271. package/src/session/todo.ts +0 -74
  272. package/src/session/tools.ts +0 -590
  273. package/src/share/session.ts +0 -58
  274. package/src/share/share-next.ts +0 -371
  275. package/src/skill/discovery.ts +0 -140
  276. package/src/skill/index.ts +0 -354
  277. package/src/snapshot/index.ts +0 -807
  278. package/src/sql.d.ts +0 -4
  279. package/src/storage/schema.ts +0 -5
  280. package/src/storage/storage.ts +0 -327
  281. package/src/sync/README.md +0 -179
  282. package/src/sync/schema.ts +0 -11
  283. package/src/temporary.ts +0 -31
  284. package/src/tool/apply_patch.ts +0 -313
  285. package/src/tool/apply_patch.txt +0 -14
  286. package/src/tool/code-mode.ts +0 -310
  287. package/src/tool/edit.ts +0 -737
  288. package/src/tool/edit.txt +0 -13
  289. package/src/tool/external-directory.ts +0 -49
  290. package/src/tool/glob.ts +0 -76
  291. package/src/tool/glob.txt +0 -7
  292. package/src/tool/grep.ts +0 -115
  293. package/src/tool/grep.txt +0 -7
  294. package/src/tool/invalid.ts +0 -21
  295. package/src/tool/json-schema.ts +0 -164
  296. package/src/tool/lsp.ts +0 -113
  297. package/src/tool/lsp.txt +0 -1
  298. package/src/tool/mcp-websearch.ts +0 -96
  299. package/src/tool/plan-enter.txt +0 -1
  300. package/src/tool/plan-exit.txt +0 -1
  301. package/src/tool/plan.ts +0 -79
  302. package/src/tool/question.ts +0 -44
  303. package/src/tool/question.txt +0 -1
  304. package/src/tool/read.ts +0 -386
  305. package/src/tool/read.txt +0 -13
  306. package/src/tool/registry.ts +0 -455
  307. package/src/tool/schema.ts +0 -14
  308. package/src/tool/shell/id.ts +0 -19
  309. package/src/tool/shell/prompt.ts +0 -293
  310. package/src/tool/shell/shell.txt +0 -21
  311. package/src/tool/shell.ts +0 -645
  312. package/src/tool/skill.ts +0 -70
  313. package/src/tool/skill.txt +0 -1
  314. package/src/tool/task.ts +0 -371
  315. package/src/tool/task.txt +0 -11
  316. package/src/tool/todo.ts +0 -46
  317. package/src/tool/todowrite.txt +0 -11
  318. package/src/tool/tool.ts +0 -183
  319. package/src/tool/truncate.ts +0 -156
  320. package/src/tool/truncation-dir.ts +0 -4
  321. package/src/tool/webfetch.ts +0 -192
  322. package/src/tool/webfetch.txt +0 -9
  323. package/src/tool/websearch.ts +0 -143
  324. package/src/tool/websearch.txt +0 -9
  325. package/src/tool/write.ts +0 -104
  326. package/src/tool/write.txt +0 -11
  327. package/src/util/archive.ts +0 -17
  328. package/src/util/bom.ts +0 -27
  329. package/src/util/data-url.ts +0 -9
  330. package/src/util/defer.ts +0 -10
  331. package/src/util/effect-http-client.ts +0 -11
  332. package/src/util/error.ts +0 -16
  333. package/src/util/filesystem.ts +0 -251
  334. package/src/util/html.ts +0 -8
  335. package/src/util/iife.ts +0 -3
  336. package/src/util/lazy.ts +0 -20
  337. package/src/util/local-context.ts +0 -25
  338. package/src/util/locale.ts +0 -4
  339. package/src/util/media.ts +0 -26
  340. package/src/util/process.ts +0 -177
  341. package/src/util/proxy-env.ts +0 -72
  342. package/src/util/queue.ts +0 -32
  343. package/src/util/record.ts +0 -3
  344. package/src/util/repository.ts +0 -232
  345. package/src/util/rpc.ts +0 -66
  346. package/src/util/signal.ts +0 -12
  347. package/src/util/timeout.ts +0 -13
  348. package/src/util/token.ts +0 -1
  349. package/src/util/wildcard.ts +0 -59
  350. package/src/worktree/index.ts +0 -623
  351. package/sst-env.d.ts +0 -10
  352. package/tsconfig.headless.json +0 -13
  353. package/tsconfig.json +0 -16
package/parsers-config.ts DELETED
@@ -1 +0,0 @@
1
- export { default } from "@soraacode/tui/parsers-config"
@@ -1,94 +0,0 @@
1
- import { Effect } from "effect"
2
- import { Fff } from "@soraacode/core/filesystem/fff.bun"
3
- import { AppRuntime } from "@/effect/app-runtime"
4
- import { FileSystem } from "@soraacode/core/filesystem"
5
- import { AbsolutePath } from "@soraacode/core/schema"
6
- import { InstanceStore } from "@/project/instance-store"
7
-
8
- const dir = AbsolutePath.make(process.cwd())
9
-
10
- const FILE_QUERIES = ["fff", "package.json", "tools/ experiment"]
11
- const GREP_QUERIES = ["FileFinder", "import", "grep", "autocomplete"]
12
- const GLOB_QUERIES = ["**/*.test.ts"]
13
-
14
- const FILE_LIMIT = 100
15
- const GREP_LIMIT = 50
16
- const GLOB_LIMIT = 50
17
-
18
- const run = <A, R>(effect: Effect.Effect<A, unknown, R>) =>
19
- AppRuntime.runPromise(
20
- InstanceStore.Service.use((store) => store.provide({ directory: dir }, effect as never)),
21
- ) as Promise<A>
22
-
23
- // --- raw Fff picker ---
24
- const t0 = performance.now()
25
- const made = Fff.create({ basePath: dir, aiMode: true })
26
- if (!made.ok) {
27
- console.error("Fff.create failed:", made.error)
28
- process.exit(1)
29
- }
30
- const picker = made.value
31
- console.log(`picker create: ${(performance.now() - t0).toFixed(1)}ms`)
32
-
33
- const tw = performance.now()
34
- await picker.waitForScan(2_500)
35
- console.log(`wait for scan: ${(performance.now() - tw).toFixed(1)}ms`)
36
-
37
- // warmup grep to let the content index build
38
- const tWarmup = performance.now()
39
- picker.grep("_warmup_", { mode: "regex", maxMatchesPerFile: 1, timeBudgetMs: 1_500 })
40
- console.log(`grep warmup: ${(performance.now() - tWarmup).toFixed(1)}ms`)
41
-
42
- console.log()
43
- console.log("--- raw picker (warm) ---")
44
-
45
- for (const q of FILE_QUERIES) {
46
- const t = performance.now()
47
- const r = picker.fileSearch(q, { pageSize: Math.max(FILE_LIMIT, 100) })
48
- const count = r.ok ? r.value.items.length : "err"
49
- console.log(`[picker] fileSearch "${q}": ${(performance.now() - t).toFixed(1)}ms (${count} results)`)
50
- }
51
-
52
- for (const q of GREP_QUERIES) {
53
- const t = performance.now()
54
- const r = picker.grep(q, { mode: "regex", pageSize: GREP_LIMIT, timeBudgetMs: 1_500 })
55
- const count = r.ok ? r.value.items.length : "err"
56
- console.log(`[picker] grep "${q}": ${(performance.now() - t).toFixed(1)}ms (${count} matches)`)
57
- }
58
-
59
- picker.destroy()
60
-
61
- // --- Search service: init breakdown ---
62
- console.log()
63
-
64
- // 1) runtime + InstanceState + picker create + scan poll
65
- const tRuntime = performance.now()
66
- console.log(`[Search] init file (runtime + picker + scan): ${(performance.now() - tRuntime).toFixed(1)}ms`)
67
-
68
- // 2) grep warmup (content index cold-start inside the Search service picker)
69
- const tGrepWarmup = performance.now()
70
- await run(FileSystem.Service.use((svc) => svc.grep({ pattern: "_warmup_grep_", limit: 1 })))
71
- console.log(`[Search] init grep (content index warmup): ${(performance.now() - tGrepWarmup).toFixed(1)}ms`)
72
-
73
- console.log()
74
- console.log("--- Search service (warm) ---")
75
-
76
- for (const q of FILE_QUERIES) {
77
- const t = performance.now()
78
- const r = await run(FileSystem.Service.use((svc) => svc.find({ query: q, limit: FILE_LIMIT })))
79
- console.log(`[Search.find] "${q}": ${(performance.now() - t).toFixed(1)}ms (${r.length} results)`)
80
- }
81
-
82
- for (const q of GREP_QUERIES) {
83
- const t = performance.now()
84
- const r = await run(FileSystem.Service.use((svc) => svc.grep({ pattern: q, limit: GREP_LIMIT })))
85
- console.log(`[Search.grep] "${q}": ${(performance.now() - t).toFixed(1)}ms (${r.length} matches)`)
86
- }
87
-
88
- for (const q of GLOB_QUERIES) {
89
- const t = performance.now()
90
- const r = await run(FileSystem.Service.use((svc) => svc.glob({ pattern: q, limit: GLOB_LIMIT })))
91
- console.log(`[Search.glob] "${q}": ${(performance.now() - t).toFixed(1)}ms (${r.length} files)`)
92
- }
93
-
94
- process.exit(0)
@@ -1,52 +0,0 @@
1
- // Full-suite timing harness for the test-speed research in ../../perf/test-suite.md.
2
- // Use this for periodic sanity checks; use profile-test-files.ts for discovery.
3
- // Env: BENCH_WARMUPS=0 BENCH_RUNS=1 bun run bench:test
4
- const warmups = Number(Bun.env.BENCH_WARMUPS ?? 0)
5
- const runs = Number(Bun.env.BENCH_RUNS ?? 1)
6
- const timings: number[] = []
7
-
8
- if (!Number.isInteger(warmups) || warmups < 0) {
9
- console.error("BENCH_WARMUPS must be a non-negative integer")
10
- process.exit(1)
11
- }
12
- if (!Number.isInteger(runs) || runs < 1) {
13
- console.error("BENCH_RUNS must be a positive integer")
14
- process.exit(1)
15
- }
16
-
17
- for (const index of Array.from({ length: warmups + runs }, (_, index) => index)) {
18
- const measured = index >= warmups
19
- const label = measured ? `run ${index - warmups + 1}/${runs}` : `warmup ${index + 1}/${warmups}`
20
- const start = performance.now()
21
- console.log(`bench:test ${label}`)
22
-
23
- const proc = Bun.spawn(["bun", "test", "--timeout", "30000"], {
24
- cwd: import.meta.dir + "/..",
25
- stdout: "inherit",
26
- stderr: "inherit",
27
- env: Bun.env,
28
- })
29
-
30
- const exitCode = await proc.exited
31
- if (exitCode !== 0) {
32
- console.error(`bench:test failed during ${label} with exit code ${exitCode}`)
33
- process.exit(exitCode)
34
- }
35
-
36
- const seconds = (performance.now() - start) / 1000
37
- console.log(`bench:test ${label} ${seconds.toFixed(3)}s`)
38
- if (measured) timings.push(seconds)
39
- }
40
-
41
- const sorted = timings.toSorted((a, b) => a - b)
42
- const median = sorted[Math.floor(sorted.length / 2)]
43
- const mean = timings.reduce((sum, timing) => sum + timing, 0) / timings.length
44
- const best = sorted[0] ?? median
45
- const worst = sorted.at(-1) ?? median
46
-
47
- console.log(
48
- `bench:test median=${median.toFixed(3)}s mean=${mean.toFixed(3)}s best=${best.toFixed(3)}s worst=${worst.toFixed(3)}s`,
49
- )
50
- console.log(`METRIC test_suite_seconds=${median.toFixed(3)}`)
51
- console.log(`METRIC test_suite_best_seconds=${best.toFixed(3)}`)
52
- console.log(`METRIC test_suite_worst_seconds=${worst.toFixed(3)}`)
@@ -1,51 +0,0 @@
1
- #!/usr/bin/env bun
2
- import { $ } from "bun"
3
- import path from "path"
4
- import { fileURLToPath } from "url"
5
-
6
- const dir = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..")
7
- process.chdir(dir)
8
-
9
- const pkg = await import("../package.json")
10
-
11
- console.log(`building soraacode-linux-x64`)
12
- await $`mkdir -p dist/soraacode-linux-x64/bin`
13
-
14
- await Bun.build({
15
- conditions: ["bun", "node"],
16
- tsconfig: "./tsconfig.headless.json",
17
- external: ["node-gyp"],
18
- format: "esm",
19
- minify: true,
20
- sourcemap: "none",
21
- splitting: true,
22
- compile: {
23
- autoloadBunfig: false,
24
- autoloadDotenv: false,
25
- autoloadTsconfig: true,
26
- autoloadPackageJson: true,
27
- target: "bun-linux-x64",
28
- outfile: "dist/soraacode-linux-x64/bin/soraacode",
29
- execArgv: ["--user-agent=soraacode/0.2.0", "--use-system-ca", "--"],
30
- windows: {},
31
- },
32
- define: {
33
- OPENCODE_VERSION: "'0.2.0'",
34
- OPENCODE_MODELS_DEV: "null",
35
- OPENCODE_CHANNEL: "'stable'",
36
- OPENCODE_LIBC: "'glibc'",
37
- },
38
- entrypoints: ["./src/index-headless.ts"],
39
- })
40
-
41
- const binaryPath = "dist/soraacode-linux-x64/bin/soraacode"
42
- console.log(`smoke test: ${binaryPath} --version`)
43
- try {
44
- const v = await $`${binaryPath} --version`.text()
45
- console.log(`OK: ${v.trim()}`)
46
- } catch (e) {
47
- console.error("smoke test failed:", e)
48
- process.exit(1)
49
- }
50
-
51
- console.log("done")
package/script/build.ts DELETED
@@ -1,245 +0,0 @@
1
- #!/usr/bin/env bun
2
-
3
- import { $ } from "bun"
4
- import path from "path"
5
- import { fileURLToPath } from "url"
6
-
7
- const __filename = fileURLToPath(import.meta.url)
8
- const __dirname = path.dirname(__filename)
9
- const dir = path.resolve(__dirname, "..")
10
-
11
- process.chdir(dir)
12
-
13
- const generated = await import("./generate.ts")
14
-
15
- import { Script } from "@soraacode/script"
16
- import pkg from "../package.json"
17
-
18
- const singleFlag = process.argv.includes("--single")
19
- const baselineFlag = process.argv.includes("--baseline")
20
- const skipInstall = process.argv.includes("--skip-install")
21
- const sourcemapsFlag = process.argv.includes("--sourcemaps")
22
- const skipTui = process.argv.includes("--skip-tui")
23
- const skipEmbedWebUi = process.argv.includes("--skip-embed-web-ui")
24
-
25
- const createEmbeddedWebUIBundle = async () => {
26
- console.log(`Building Web UI to embed in the binary`)
27
- const appDir = path.join(import.meta.dirname, "../../app")
28
- const dist = path.join(appDir, "dist")
29
- await $`OPENCODE_CHANNEL=${Script.channel} bun run --cwd ${appDir} build`
30
- const files = (await Array.fromAsync(new Bun.Glob("**/*").scan({ cwd: dist })))
31
- .map((file) => file.replaceAll("\\", "/"))
32
- .filter((file) => !file.endsWith(".map"))
33
- .sort()
34
- const imports = files.map((file, i) => {
35
- const spec = path.relative(dir, path.join(dist, file)).replaceAll("\\", "/")
36
- return `import file_${i} from ${JSON.stringify(spec.startsWith(".") ? spec : `./${spec}`)} with { type: "file" };`
37
- })
38
- const entries = files.map((file, i) => ` ${JSON.stringify(file)}: file_${i},`)
39
- return [
40
- `// Import all files as file_$i with type: "file"`,
41
- ...imports,
42
- `// Export with original mappings`,
43
- `export default {`,
44
- ...entries,
45
- `}`,
46
- ].join("\n")
47
- }
48
-
49
- const embeddedFileMap = skipEmbedWebUi ? null : await createEmbeddedWebUIBundle()
50
- const treeSitterWorker = await Bun.file(fileURLToPath(import.meta.resolve("@opentui/core/parser.worker"))).text()
51
-
52
- const allTargets: {
53
- os: string
54
- arch: "arm64" | "x64"
55
- abi?: "musl"
56
- avx2?: false
57
- }[] = [
58
- {
59
- os: "linux",
60
- arch: "arm64",
61
- },
62
- {
63
- os: "linux",
64
- arch: "x64",
65
- },
66
- {
67
- os: "linux",
68
- arch: "x64",
69
- avx2: false,
70
- },
71
- {
72
- os: "linux",
73
- arch: "arm64",
74
- abi: "musl",
75
- },
76
- {
77
- os: "linux",
78
- arch: "x64",
79
- abi: "musl",
80
- },
81
- {
82
- os: "linux",
83
- arch: "x64",
84
- abi: "musl",
85
- avx2: false,
86
- },
87
- {
88
- os: "darwin",
89
- arch: "arm64",
90
- },
91
- {
92
- os: "darwin",
93
- arch: "x64",
94
- },
95
- {
96
- os: "darwin",
97
- arch: "x64",
98
- avx2: false,
99
- },
100
- {
101
- os: "win32",
102
- arch: "arm64",
103
- },
104
- {
105
- os: "win32",
106
- arch: "x64",
107
- },
108
- {
109
- os: "win32",
110
- arch: "x64",
111
- avx2: false,
112
- },
113
- ]
114
-
115
- const targets = singleFlag
116
- ? allTargets.filter((item) => {
117
- if (item.os !== process.platform || item.arch !== process.arch) {
118
- return false
119
- }
120
-
121
- // When building for the current platform, prefer a single native binary by default.
122
- // Baseline binaries require additional Bun artifacts and can be flaky to download.
123
- if (item.avx2 === false) {
124
- return baselineFlag
125
- }
126
-
127
- // also skip abi-specific builds for the same reason
128
- if (item.abi !== undefined) {
129
- return false
130
- }
131
-
132
- return true
133
- })
134
- : allTargets
135
-
136
- await $`rm -rf dist`
137
-
138
- const binaries: Record<string, string> = {}
139
- if (!skipInstall) {
140
- await $`bun install --os="*" --cpu="*" @opentui/core@${pkg.dependencies["@opentui/core"]}`
141
- await $`bun install --os="*" --cpu="*" @parcel/watcher@${pkg.dependencies["@parcel/watcher"]}`
142
- await $`bun install --os="*" --cpu="*" @ff-labs/fff-bun@${pkg.dependencies["@ff-labs/fff-bun"]}`
143
- }
144
- for (const item of targets) {
145
- const name = [
146
- pkg.name,
147
- // changing to win32 flags npm for some reason
148
- item.os === "win32" ? "windows" : item.os,
149
- item.arch,
150
- item.avx2 === false ? "baseline" : undefined,
151
- item.abi === undefined ? undefined : item.abi,
152
- ]
153
- .filter(Boolean)
154
- .join("-")
155
- console.log(`building ${name}`)
156
- await $`mkdir -p dist/${name}/bin`
157
-
158
- const workerPath = "./src/cli/tui/worker.ts"
159
- const treeSitterWorkerPath = "opentui-tree-sitter-worker.js"
160
- const bunfsRoot = item.os === "win32" ? "B:/~BUN/root/" : "/$bunfs/root/"
161
-
162
- await Bun.build({
163
- conditions: ["bun", "node"],
164
- tsconfig: "./tsconfig.json",
165
- plugins: skipTui ? [] : [plugin],
166
- external: ["node-gyp"],
167
- format: "esm",
168
- minify: true,
169
- sourcemap: sourcemapsFlag ? "linked" : "none",
170
- splitting: true,
171
- compile: {
172
- autoloadBunfig: false,
173
- autoloadDotenv: false,
174
- autoloadTsconfig: true,
175
- autoloadPackageJson: true,
176
- target: name.replace(pkg.name, "bun") as any,
177
- outfile: `dist/${name}/bin/opencode`,
178
- execArgv: [`--user-agent=opencode/${Script.version}`, "--use-system-ca", "--"],
179
- windows: {},
180
- },
181
- files: {
182
- [treeSitterWorkerPath]: treeSitterWorker,
183
- ...(embeddedFileMap ? { "opencode-web-ui.gen.ts": embeddedFileMap } : {}),
184
- },
185
- entrypoints: [
186
- "./src/index.ts",
187
- workerPath,
188
- treeSitterWorkerPath,
189
- ...(embeddedFileMap ? ["opencode-web-ui.gen.ts"] : []),
190
- ],
191
- define: {
192
- FFF_LIBC: JSON.stringify(item.abi === "musl" ? "musl" : "gnu"),
193
- OPENCODE_VERSION: `'${Script.version}'`,
194
- OPENCODE_MODELS_DEV: generated.modelsData,
195
- OTUI_TREE_SITTER_WORKER_PATH: bunfsRoot + treeSitterWorkerPath,
196
- OPENCODE_WORKER_PATH: workerPath,
197
- OPENCODE_CHANNEL: `'${Script.channel}'`,
198
- OPENCODE_LIBC: item.os === "linux" ? `'${item.abi ?? "glibc"}'` : "",
199
- ...(item.os === "linux" ? { "process.env.OPENTUI_LIBC": JSON.stringify(item.abi ?? "glibc") } : {}),
200
- },
201
- })
202
-
203
- // Smoke test: only run if binary is for current platform
204
- if (item.os === process.platform && item.arch === process.arch && !item.abi) {
205
- const binaryPath = `dist/${name}/bin/opencode`
206
- console.log(`Running smoke test: ${binaryPath} --version`)
207
- try {
208
- const versionOutput = await $`${binaryPath} --version`.text()
209
- console.log(`Smoke test passed: ${versionOutput.trim()}`)
210
- } catch (e) {
211
- console.error(`Smoke test failed for ${name}:`, e)
212
- process.exit(1)
213
- }
214
- }
215
-
216
- await $`rm -rf ./dist/${name}/bin/tui`
217
- await Bun.file(`dist/${name}/package.json`).write(
218
- JSON.stringify(
219
- {
220
- name,
221
- version: Script.version,
222
- preferUnplugged: true,
223
- os: [item.os],
224
- cpu: [item.arch],
225
- ...(item.abi ? { libc: [item.abi] } : {}),
226
- },
227
- null,
228
- 2,
229
- ),
230
- )
231
- binaries[name] = Script.version
232
- }
233
-
234
- if (Script.release) {
235
- for (const key of Object.keys(binaries)) {
236
- if (key.includes("linux")) {
237
- await $`tar -czf ../../${key}.tar.gz *`.cwd(`dist/${key}/bin`)
238
- } else {
239
- await $`zip -r ../../${key}.zip *`.cwd(`dist/${key}/bin`)
240
- }
241
- }
242
- await $`gh release upload v${Script.version} ./dist/*.zip ./dist/*.tar.gz --clobber --repo ${process.env.GH_REPO}`
243
- }
244
-
245
- export { binaries }
@@ -1,14 +0,0 @@
1
- import path from "path"
2
- import { fileURLToPath } from "url"
3
-
4
- const __filename = fileURLToPath(import.meta.url)
5
- const __dirname = path.dirname(__filename)
6
- const dir = path.resolve(__dirname, "..")
7
-
8
- process.chdir(dir)
9
-
10
- const modelsUrl = process.env.OPENCODE_MODELS_URL || "https://models.dev"
11
- export const modelsData = process.env.MODELS_DEV_API_JSON
12
- ? await Bun.file(process.env.MODELS_DEV_API_JSON).text()
13
- : await fetch(`${modelsUrl}/api.json`).then((x) => x.text())
14
- console.log("Loaded models.dev snapshot")
@@ -1 +0,0 @@
1
- await import("../test/server/httpapi-exercise/index")
@@ -1,42 +0,0 @@
1
- // Per-file profiler for finding candidate test-speed work; see ../../perf/test-suite.md
2
- // for the benchmark notes, kept wins, and discarded experiments.
3
- // Example: TEST_PROFILE_GLOB='test/server/**/*.test.ts' TEST_PROFILE_TOP=15 bun run profile:test
4
- const pattern = Bun.env.TEST_PROFILE_GLOB ?? "test/**/*.test.{ts,tsx}"
5
- const limit = Number(Bun.env.TEST_PROFILE_LIMIT ?? 0)
6
- const timeout = Bun.env.TEST_PROFILE_TIMEOUT ?? "30000"
7
- const files = Array.fromAsync(new Bun.Glob(pattern).scan({ cwd: import.meta.dir + "/..", onlyFiles: true }))
8
- .then((files) => files.toSorted())
9
- .then((files) => (limit > 0 ? files.slice(0, limit) : files))
10
-
11
- const results = []
12
- for (const file of await files) {
13
- const start = performance.now()
14
- const proc = Bun.spawn(["bun", "test", "--timeout", timeout, file], {
15
- cwd: import.meta.dir + "/..",
16
- stdout: "pipe",
17
- stderr: "pipe",
18
- env: Bun.env,
19
- })
20
- const [output, error, exitCode] = await Promise.all([
21
- new Response(proc.stdout).text(),
22
- new Response(proc.stderr).text(),
23
- proc.exited,
24
- ])
25
- const seconds = (performance.now() - start) / 1000
26
- results.push({ file, seconds, exitCode })
27
- console.log(`${exitCode === 0 ? "PASS" : "FAIL"} ${seconds.toFixed(3)}s ${file}`)
28
- if (exitCode !== 0) console.log((output + error).trim())
29
- }
30
-
31
- const sorted = results.toSorted((a, b) => b.seconds - a.seconds)
32
- console.log("\nSlowest test files:")
33
- for (const result of sorted.slice(0, Number(Bun.env.TEST_PROFILE_TOP ?? 20))) {
34
- console.log(`${result.seconds.toFixed(3)}s ${result.exitCode === 0 ? "PASS" : "FAIL"} ${result.file}`)
35
- }
36
-
37
- if (sorted[0]) {
38
- console.log(`METRIC slowest_test_file_seconds=${sorted[0].seconds.toFixed(3)}`)
39
- console.log(`METRIC profiled_test_files=${results.length}`)
40
- }
41
-
42
- if (results.some((result) => result.exitCode !== 0)) process.exit(1)