soraacode 0.2.0 → 0.2.1

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
@@ -1,390 +0,0 @@
1
- import { LayerNode } from "@soraacode/core/effect/layer-node"
2
- import { llmClient } from "@soraacode/core/effect/app-node-platform"
3
- import { PermissionV1 } from "@soraacode/core/v1/permission"
4
- import { Provider } from "@/provider/provider"
5
- import { SessionV1 } from "@soraacode/core/v1/session"
6
- import { serviceUse } from "@soraacode/core/effect/service-use"
7
- import { Context, Effect, Layer } from "effect"
8
- import * as Stream from "effect/Stream"
9
- import { streamText, wrapLanguageModel, type ModelMessage, type Tool } from "ai"
10
- import type { LLMEvent } from "@soraacode/llm"
11
- import { LLMClient } from "@soraacode/llm/route"
12
- import type { LLMClientService } from "@soraacode/llm/route"
13
- import { GitLabWorkflowLanguageModel } from "gitlab-ai-provider"
14
- import { ProviderTransform } from "@/provider/transform"
15
- import { Config } from "@/config/config"
16
- import type { Agent } from "@/agent/agent"
17
- import type { MessageV2 } from "./message-v2"
18
- import { Plugin } from "@/plugin"
19
- import { Permission } from "@/permission"
20
- import { EventV2Bridge } from "@/event-v2-bridge"
21
- import { EventV2 } from "@soraacode/core/event"
22
- import { Wildcard } from "@/util/wildcard"
23
- import { SessionID } from "@/session/schema"
24
- import { Auth } from "@/auth"
25
- import { EffectBridge } from "@/effect/bridge"
26
- import { RuntimeFlags } from "@/effect/runtime-flags"
27
- import * as Option from "effect/Option"
28
- import { LLMAISDK } from "./llm/ai-sdk"
29
- import { LLMNativeRuntime } from "./llm/native-runtime"
30
- import { LLMRequestPrep } from "./llm/request"
31
-
32
- export const OUTPUT_TOKEN_MAX = ProviderTransform.OUTPUT_TOKEN_MAX
33
-
34
- export type StreamInput = {
35
- user: SessionV1.User
36
- sessionID: string
37
- parentSessionID?: string
38
- model: Provider.Model
39
- agent: Agent.Info
40
- permission?: PermissionV1.Ruleset
41
- system: string[]
42
- messages: ModelMessage[]
43
- small?: boolean
44
- tools: Record<string, Tool>
45
- retries?: number
46
- toolChoice?: "auto" | "required" | "none"
47
- }
48
-
49
- export type StreamRequest = StreamInput & {
50
- abort: AbortSignal
51
- }
52
-
53
- export interface Interface {
54
- readonly stream: (input: StreamInput) => Stream.Stream<LLMEvent, unknown>
55
- }
56
-
57
- export class Service extends Context.Service<Service, Interface>()("@opencode/LLM") {}
58
-
59
- export const use = serviceUse(Service)
60
-
61
- const live: Layer.Layer<
62
- Service,
63
- never,
64
- | Auth.Service
65
- | Config.Service
66
- | Provider.Service
67
- | Plugin.Service
68
- | Permission.Service
69
- | EventV2Bridge.Service
70
- | LLMClientService
71
- | RuntimeFlags.Service
72
- > = Layer.effect(
73
- Service,
74
- Effect.gen(function* () {
75
- const auth = yield* Auth.Service
76
- const config = yield* Config.Service
77
- const provider = yield* Provider.Service
78
- const plugin = yield* Plugin.Service
79
- const perm = yield* Permission.Service
80
- const events = yield* EventV2Bridge.Service
81
- const llmClient = yield* LLMClient.Service
82
- const flags = yield* RuntimeFlags.Service
83
-
84
- const run = Effect.fn("LLM.run")(function* (input: StreamRequest) {
85
- yield* Effect.logInfo("stream", {
86
- providerID: input.model.providerID,
87
- modelID: input.model.id,
88
- "session.id": input.sessionID,
89
- small: (input.small ?? false).toString(),
90
- agent: input.agent.name,
91
- mode: input.agent.mode,
92
- })
93
-
94
- const [language, cfg, item, info] = yield* Effect.all(
95
- [
96
- provider.getLanguage(input.model),
97
- config.get(),
98
- provider.getProvider(input.model.providerID),
99
- auth.get(input.model.providerID),
100
- ],
101
- { concurrency: "unbounded" },
102
- )
103
-
104
- const isWorkflow = language instanceof GitLabWorkflowLanguageModel
105
- const prepared = yield* LLMRequestPrep.prepare({
106
- ...input,
107
- provider: item,
108
- auth: info,
109
- plugin,
110
- flags,
111
- isWorkflow,
112
- })
113
-
114
- // Wire up toolExecutor for DWS workflow models so that tool calls
115
- // from the workflow service are executed via opencode's tool system
116
- // and results sent back over the WebSocket.
117
- const bridge = yield* EffectBridge.make()
118
- if (language instanceof GitLabWorkflowLanguageModel) {
119
- const workflowModel = language as GitLabWorkflowLanguageModel & {
120
- sessionID?: string
121
- sessionPreapprovedTools?: string[]
122
- approvalHandler?: (approvalTools: { name: string; args: string }[]) => Promise<{ approved: boolean }>
123
- }
124
- workflowModel.sessionID = input.sessionID
125
- workflowModel.systemPrompt = prepared.system.join("\n")
126
- workflowModel.toolExecutor = async (toolName, argsJson, _requestID) => {
127
- const t = prepared.tools[toolName]
128
- if (!t || !t.execute) {
129
- return { result: "", error: `Unknown tool: ${toolName}` }
130
- }
131
- try {
132
- const result = await t.execute!(JSON.parse(argsJson), {
133
- toolCallId: _requestID,
134
- messages: input.messages,
135
- abortSignal: input.abort,
136
- })
137
- const output = typeof result === "string" ? result : (result?.output ?? JSON.stringify(result))
138
- return {
139
- result: output,
140
- metadata: typeof result === "object" ? result?.metadata : undefined,
141
- title: typeof result === "object" ? result?.title : undefined,
142
- }
143
- } catch (e: any) {
144
- return { result: "", error: e.message ?? String(e) }
145
- }
146
- }
147
-
148
- const ruleset = Permission.merge(input.agent.permission ?? [], input.permission ?? [])
149
- workflowModel.sessionPreapprovedTools = Object.keys(prepared.tools).filter((name) => {
150
- const match = ruleset.findLast((rule) => Wildcard.match(name, rule.permission))
151
- return !match || match.action !== "ask"
152
- })
153
-
154
- const approvedToolsForSession = new Set<string>()
155
- workflowModel.approvalHandler = bridge.bind(async (approvalTools) => {
156
- const uniqueNames = [...new Set(approvalTools.map((t: { name: string }) => t.name))] as string[]
157
- // Auto-approve tools that were already approved in this session
158
- // (prevents infinite approval loops for server-side MCP tools)
159
- if (uniqueNames.every((name) => approvedToolsForSession.has(name))) {
160
- return { approved: true }
161
- }
162
-
163
- const id = PermissionV1.ID.ascending()
164
- let unsub: EventV2.Unsubscribe | undefined
165
- try {
166
- unsub = await bridge.promise(
167
- events.listen((event) => {
168
- if (event.type !== Permission.Event.Replied.type) return Effect.void
169
- const data = event.data as EventV2.Data<typeof Permission.Event.Replied>
170
- if (data.requestID !== id) return Effect.void
171
- void data.reply
172
- return Effect.void
173
- }),
174
- )
175
- const toolPatterns = approvalTools.map((t: { name: string; args: string }) => {
176
- try {
177
- const parsed = JSON.parse(t.args) as Record<string, unknown>
178
- const title = (parsed?.title ?? parsed?.name ?? "") as string
179
- return title ? `${t.name}: ${title}` : t.name
180
- } catch {
181
- return t.name
182
- }
183
- })
184
- const uniquePatterns = [...new Set(toolPatterns)] as string[]
185
- await bridge.promise(
186
- perm.ask({
187
- id,
188
- sessionID: SessionID.make(input.sessionID),
189
- permission: "workflow_tool_approval",
190
- patterns: uniquePatterns,
191
- metadata: { tools: approvalTools },
192
- always: uniquePatterns,
193
- ruleset: [],
194
- }),
195
- )
196
- for (const name of uniqueNames) approvedToolsForSession.add(name)
197
- workflowModel.sessionPreapprovedTools = [...(workflowModel.sessionPreapprovedTools ?? []), ...uniqueNames]
198
- return { approved: true }
199
- } catch {
200
- return { approved: false }
201
- } finally {
202
- if (unsub) await bridge.promise(unsub)
203
- }
204
- })
205
- }
206
-
207
- const tracer = undefined
208
- const telemetryTracer = undefined
209
-
210
- // Runtime seam: native is an opt-in adapter over @soraacode/llm. It
211
- // either returns a ready LLMEvent stream or a concrete fallback reason.
212
- if (flags.experimentalNativeLlm) {
213
- const native = LLMNativeRuntime.stream({
214
- model: input.model,
215
- provider: item,
216
- auth: info,
217
- llmClient,
218
- messages: prepared.messages,
219
- tools: prepared.tools,
220
- toolChoice: input.toolChoice,
221
- temperature: prepared.params.temperature,
222
- topP: prepared.params.topP,
223
- topK: prepared.params.topK,
224
- maxOutputTokens: prepared.params.maxOutputTokens,
225
- providerOptions: prepared.params.options,
226
- headers: prepared.headers,
227
- abort: input.abort,
228
- })
229
- if (native.type === "supported") {
230
- yield* Effect.logInfo("llm runtime selected", {
231
- "llm.runtime": "native",
232
- "llm.provider": input.model.providerID,
233
- "llm.model": input.model.id,
234
- })
235
- return {
236
- type: "native" as const,
237
- stream: native.stream,
238
- }
239
- }
240
- yield* Effect.logInfo("llm runtime selected", {
241
- "llm.runtime": "ai-sdk",
242
- "llm.provider": input.model.providerID,
243
- "llm.model": input.model.id,
244
- "llm.native_unsupported_reason": native.reason,
245
- })
246
- yield* Effect.logInfo("native runtime unavailable; falling back to ai-sdk", {
247
- providerID: input.model.providerID,
248
- modelID: input.model.id,
249
- "session.id": input.sessionID,
250
- small: (input.small ?? false).toString(),
251
- agent: input.agent.name,
252
- mode: input.agent.mode,
253
- reason: native.reason,
254
- })
255
- }
256
-
257
- yield* Effect.logInfo("llm runtime selected", {
258
- "llm.runtime": "ai-sdk",
259
- "llm.provider": input.model.providerID,
260
- "llm.model": input.model.id,
261
- })
262
- // Default runtime path: AI SDK owns provider execution and tool dispatch;
263
- // LLMAISDK.toLLMEvents below normalizes fullStream parts for the processor.
264
- return {
265
- type: "ai-sdk" as const,
266
- result: streamText({
267
- onError(error) {
268
- bridge.fork(
269
- Effect.logError("stream error", {
270
- providerID: input.model.providerID,
271
- modelID: input.model.id,
272
- "session.id": input.sessionID,
273
- small: (input.small ?? false).toString(),
274
- agent: input.agent.name,
275
- mode: input.agent.mode,
276
- error,
277
- }),
278
- )
279
- },
280
- // Copilot returns the authoritative billed amount only in provider-specific response fields.
281
- includeRawChunks: input.model.providerID.includes("github-copilot"),
282
- async experimental_repairToolCall(failed) {
283
- const lower = failed.toolCall.toolName.toLowerCase()
284
- if (lower !== failed.toolCall.toolName && prepared.tools[lower]) {
285
- return {
286
- ...failed.toolCall,
287
- toolName: lower,
288
- }
289
- }
290
- return {
291
- ...failed.toolCall,
292
- input: JSON.stringify({
293
- tool: failed.toolCall.toolName,
294
- error: failed.error.message,
295
- }),
296
- toolName: "invalid",
297
- }
298
- },
299
- temperature: prepared.params.temperature,
300
- topP: prepared.params.topP,
301
- topK: prepared.params.topK,
302
- providerOptions: ProviderTransform.providerOptions(input.model, prepared.params.options),
303
- activeTools: Object.keys(prepared.tools).filter((x) => x !== "invalid"),
304
- tools: prepared.tools,
305
- toolChoice: input.toolChoice,
306
- maxOutputTokens: prepared.params.maxOutputTokens,
307
- abortSignal: input.abort,
308
- headers: prepared.headers,
309
- maxRetries: input.retries ?? 0,
310
- messages: prepared.messages,
311
- model: wrapLanguageModel({
312
- model: language,
313
- middleware: [
314
- {
315
- specificationVersion: "v3" as const,
316
- async transformParams(args) {
317
- if (args.type === "stream") {
318
- // @ts-expect-error
319
- args.params.prompt = ProviderTransform.message(
320
- args.params.prompt,
321
- input.model,
322
- prepared.messageTransformOptions,
323
- )
324
- }
325
- return args.params
326
- },
327
- },
328
- ],
329
- }),
330
- experimental_telemetry: {
331
- isEnabled: cfg.experimental?.openTelemetry,
332
- functionId: "session.llm",
333
- tracer: telemetryTracer,
334
- metadata: {
335
- userId: cfg.username ?? "unknown",
336
- sessionId: input.sessionID,
337
- },
338
- },
339
- }),
340
- }
341
- })
342
-
343
- const stream: Interface["stream"] = (input) =>
344
- Stream.scoped(
345
- Stream.unwrap(
346
- Effect.gen(function* () {
347
- const ctrl = yield* Effect.acquireRelease(
348
- Effect.sync(() => new AbortController()),
349
- (ctrl) => Effect.sync(() => ctrl.abort()),
350
- )
351
-
352
- const result = yield* run({ ...input, abort: ctrl.signal })
353
-
354
- if (result.type === "native") return result.stream
355
-
356
- // Adapter seam: both runtimes expose the same LLMEvent stream. Native
357
- // already returns one; AI SDK streams are converted here.
358
- const state = LLMAISDK.adapterState()
359
- return Stream.fromAsyncIterable(result.result.fullStream, (e) =>
360
- e instanceof Error ? e : new Error(String(e)),
361
- ).pipe(
362
- Stream.mapEffect((event) => LLMAISDK.toLLMEvents(state, event)),
363
- Stream.flatMap((events) => Stream.fromIterable(events)),
364
- )
365
- }),
366
- ),
367
- )
368
-
369
- return Service.of({ stream })
370
- }),
371
- )
372
-
373
- export const hasToolCalls = LLMRequestPrep.hasToolCalls
374
-
375
- export const node = LayerNode.make({
376
- service: Service,
377
- layer: live,
378
- deps: [
379
- Auth.node,
380
- Config.node,
381
- Provider.node,
382
- Plugin.node,
383
- Permission.node,
384
- EventV2Bridge.node,
385
- llmClient,
386
- RuntimeFlags.node,
387
- ],
388
- })
389
-
390
- export * as LLM from "./llm"
@@ -1,14 +0,0 @@
1
- import { Schema } from "effect"
2
- import { NamedError } from "@soraacode/core/util/error"
3
-
4
- export const OutputLengthError = NamedError.create("MessageOutputLengthError", {})
5
-
6
- export const AuthError = NamedError.create("ProviderAuthError", {
7
- providerID: Schema.String,
8
- message: Schema.String,
9
- })
10
-
11
- export const Shared = [AuthError.EffectSchema, NamedError.Unknown.EffectSchema, OutputLengthError.EffectSchema] as const
12
- export const SharedSchema = Schema.Union(Shared)
13
-
14
- export * as MessageError from "./message-error"