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,56 +0,0 @@
1
- import { LayerNode } from "@soraacode/core/effect/layer-node"
2
- import { InstanceState } from "@/effect/instance-state"
3
- import { SessionID } from "./schema"
4
- import { Effect, Layer, Context } from "effect"
5
- import { EventV2Bridge } from "@/event-v2-bridge"
6
- import { SessionStatusEvent } from "@soraacode/schema/session-status-event"
7
-
8
- export const Info = SessionStatusEvent.Info
9
- export type Info = SessionStatusEvent.Info
10
-
11
- export const Event = SessionStatusEvent
12
-
13
- export interface Interface {
14
- readonly get: (sessionID: SessionID) => Effect.Effect<Info>
15
- readonly list: () => Effect.Effect<Map<SessionID, Info>>
16
- readonly set: (sessionID: SessionID, status: Info) => Effect.Effect<void>
17
- }
18
-
19
- export class Service extends Context.Service<Service, Interface>()("@opencode/SessionStatus") {}
20
-
21
- const layer = Layer.effect(
22
- Service,
23
- Effect.gen(function* () {
24
- const events = yield* EventV2Bridge.Service
25
-
26
- const state = yield* InstanceState.make(
27
- Effect.fn("SessionStatus.state")(() => Effect.succeed(new Map<SessionID, Info>())),
28
- )
29
-
30
- const get = Effect.fn("SessionStatus.get")(function* (sessionID: SessionID) {
31
- const data = yield* InstanceState.get(state)
32
- return data.get(sessionID) ?? { type: "idle" as const }
33
- })
34
-
35
- const list = Effect.fn("SessionStatus.list")(function* () {
36
- return new Map(yield* InstanceState.get(state))
37
- })
38
-
39
- const set = Effect.fn("SessionStatus.set")(function* (sessionID: SessionID, status: Info) {
40
- const data = yield* InstanceState.get(state)
41
- yield* events.publish(Event.Status, { sessionID, status })
42
- if (status.type === "idle") {
43
- yield* events.publish(Event.Idle, { sessionID })
44
- data.delete(sessionID)
45
- return
46
- }
47
- data.set(sessionID, status)
48
- })
49
-
50
- return Service.of({ get, list, set })
51
- }),
52
- )
53
-
54
- export const node = LayerNode.make({ service: Service, layer: layer, deps: [EventV2Bridge.node] })
55
-
56
- export * as SessionStatus from "./status"
@@ -1,160 +0,0 @@
1
- import { LayerNode } from "@soraacode/core/effect/layer-node"
2
- import { Effect, Layer, Context, Schema } from "effect"
3
- import { SessionV1 } from "@soraacode/core/v1/session"
4
- import { EventV2Bridge } from "@/event-v2-bridge"
5
- import { Snapshot } from "@/snapshot"
6
- import { Session } from "./session"
7
- import { SessionID, MessageID } from "./schema"
8
- import { Config } from "@/config/config"
9
-
10
- function unquoteGitPath(input: string) {
11
- if (!input.startsWith('"')) return input
12
- if (!input.endsWith('"')) return input
13
- const body = input.slice(1, -1)
14
- const bytes: number[] = []
15
-
16
- for (let i = 0; i < body.length; i++) {
17
- const char = body[i]!
18
- if (char !== "\\") {
19
- bytes.push(char.charCodeAt(0))
20
- continue
21
- }
22
-
23
- const next = body[i + 1]
24
- if (!next) {
25
- bytes.push("\\".charCodeAt(0))
26
- continue
27
- }
28
-
29
- if (next >= "0" && next <= "7") {
30
- const chunk = body.slice(i + 1, i + 4)
31
- const match = chunk.match(/^[0-7]{1,3}/)
32
- if (!match) {
33
- bytes.push(next.charCodeAt(0))
34
- i++
35
- continue
36
- }
37
- bytes.push(parseInt(match[0], 8))
38
- i += match[0].length
39
- continue
40
- }
41
-
42
- const escaped =
43
- next === "n"
44
- ? "\n"
45
- : next === "r"
46
- ? "\r"
47
- : next === "t"
48
- ? "\t"
49
- : next === "b"
50
- ? "\b"
51
- : next === "f"
52
- ? "\f"
53
- : next === "v"
54
- ? "\v"
55
- : next === "\\" || next === '"'
56
- ? next
57
- : undefined
58
-
59
- bytes.push((escaped ?? next).charCodeAt(0))
60
- i++
61
- }
62
-
63
- return Buffer.from(bytes).toString()
64
- }
65
-
66
- export interface Interface {
67
- readonly summarize: (input: { sessionID: SessionID; messageID: MessageID }) => Effect.Effect<void>
68
- readonly diff: (input: { sessionID: SessionID; messageID?: MessageID }) => Effect.Effect<Snapshot.FileDiff[]>
69
- readonly computeDiff: (input: { messages: SessionV1.WithParts[] }) => Effect.Effect<Snapshot.FileDiff[]>
70
- }
71
-
72
- export class Service extends Context.Service<Service, Interface>()("@opencode/SessionSummary") {}
73
-
74
- const layer = Layer.effect(
75
- Service,
76
- Effect.gen(function* () {
77
- const sessions = yield* Session.Service
78
- const snapshot = yield* Snapshot.Service
79
- const events = yield* EventV2Bridge.Service
80
- const config = yield* Config.Service
81
-
82
- const computeDiff = Effect.fn("SessionSummary.computeDiff")(function* (input: { messages: SessionV1.WithParts[] }) {
83
- let from: string | undefined
84
- let to: string | undefined
85
- for (const item of input.messages) {
86
- if (!from) {
87
- for (const part of item.parts) {
88
- if (part.type === "step-start" && part.snapshot) {
89
- from = part.snapshot
90
- break
91
- }
92
- }
93
- }
94
- for (const part of item.parts) {
95
- if (part.type === "step-finish" && part.snapshot) to = part.snapshot
96
- }
97
- }
98
- if (from && to) return yield* snapshot.diffFull(from, to)
99
- return []
100
- })
101
-
102
- const summarize = Effect.fn("SessionSummary.summarize")(function* (input: {
103
- sessionID: SessionID
104
- messageID: MessageID
105
- }) {
106
- yield* sessions.setSummary({
107
- sessionID: input.sessionID,
108
- summary: {
109
- additions: 0,
110
- deletions: 0,
111
- files: 0,
112
- },
113
- })
114
- yield* events.publish(Session.Event.Diff, { sessionID: input.sessionID, diff: [] })
115
- if ((yield* config.get()).snapshot === false) return
116
- const all = yield* sessions.messages({ sessionID: input.sessionID }).pipe(Effect.orDie)
117
- if (!all.length) return
118
-
119
- const messages = all.filter(
120
- (m) => m.info.id === input.messageID || (m.info.role === "assistant" && m.info.parentID === input.messageID),
121
- )
122
- const target = messages.find((m) => m.info.id === input.messageID)
123
- if (!target || target.info.role !== "user") return
124
- const msgDiffs = yield* computeDiff({ messages })
125
- target.info.summary = { ...target.info.summary, diffs: msgDiffs }
126
- yield* sessions.updateMessage(target.info)
127
- })
128
-
129
- const diff = Effect.fn("SessionSummary.diff")(function* (input: { sessionID: SessionID; messageID?: MessageID }) {
130
- if (!input.messageID) return []
131
- const message = (yield* sessions.messages({ sessionID: input.sessionID }).pipe(Effect.orDie)).find(
132
- (item) => item.info.id === input.messageID,
133
- )
134
- if (!message || message.info.role !== "user") return []
135
- const diffs = message.info.summary?.diffs ?? []
136
- return diffs.map((item) => {
137
- if (item.file === undefined) return item
138
- const file = unquoteGitPath(item.file)
139
- if (file === item.file) return item
140
- return { ...item, file }
141
- })
142
- })
143
-
144
- return Service.of({ summarize, diff, computeDiff })
145
- }),
146
- )
147
-
148
- export const DiffInput = Schema.Struct({
149
- sessionID: SessionID,
150
- messageID: Schema.optional(MessageID),
151
- })
152
- export type DiffInput = Schema.Schema.Type<typeof DiffInput>
153
-
154
- export const node = LayerNode.make({
155
- service: Service,
156
- layer: layer,
157
- deps: [Session.node, Snapshot.node, EventV2Bridge.node, Config.node],
158
- })
159
-
160
- export * as SessionSummary from "./summary"
@@ -1,123 +0,0 @@
1
- import { LayerNode } from "@soraacode/core/effect/layer-node"
2
- import { Context, Effect, Layer } from "effect"
3
-
4
- import { InstanceState } from "@/effect/instance-state"
5
-
6
- import PROMPT_DEFAULT from "./prompt/default.txt"
7
- import type { Provider } from "@/provider/provider"
8
- import type { Agent } from "@/agent/agent"
9
- import { Permission } from "@/permission"
10
- import { Skill } from "@/skill"
11
- import { AbsolutePath } from "@soraacode/core/schema"
12
- import { Location } from "@soraacode/core/location"
13
- import { LocationServiceMap, locationServiceMapLayer } from "@soraacode/core/location-services"
14
- import { Reference } from "@soraacode/core/reference"
15
- import { MCP } from "@/mcp"
16
- import { PermissionV1 } from "@soraacode/core/v1/permission"
17
-
18
- export function provider(model: Provider.Model) {
19
- return [PROMPT_DEFAULT]
20
- }
21
-
22
- export interface Interface {
23
- readonly environment: (model: Provider.Model) => Effect.Effect<string[]>
24
- readonly skills: (agent: Agent.Info) => Effect.Effect<string | undefined>
25
- readonly mcp: (agent: Agent.Info, permission?: PermissionV1.Ruleset) => Effect.Effect<string | undefined>
26
- }
27
-
28
- export class Service extends Context.Service<Service, Interface>()("@opencode/SystemPrompt") {}
29
-
30
- const layer = Layer.effect(
31
- Service,
32
- Effect.gen(function* () {
33
- const skill = yield* Skill.Service
34
- const mcp = yield* MCP.Service
35
- const locations = yield* LocationServiceMap.Service
36
-
37
- return Service.of({
38
- environment: Effect.fn("SystemPrompt.environment")(function* (model: Provider.Model) {
39
- const ctx = yield* InstanceState.context
40
- const references = yield* Effect.gen(function* () {
41
- return (yield* (yield* Reference.Service).list()).filter((reference) => reference.description !== undefined)
42
- }).pipe(Effect.provide(locations.get(Location.Ref.make({ directory: AbsolutePath.make(ctx.directory) }))))
43
- return [
44
- [
45
- `You are powered by the model named ${model.api.id}. The exact model ID is ${model.providerID}/${model.api.id}`,
46
- `Here is some useful information about the environment you are running in:`,
47
- `<env>`,
48
- ` Working directory: ${ctx.directory}`,
49
- ` Workspace root folder: ${ctx.worktree}`,
50
- ` Is directory a git repo: ${ctx.project.vcs === "git" ? "yes" : "no"}`,
51
- ` Platform: ${process.platform}`,
52
- ` Today's date: ${new Date().toDateString()}`,
53
- `</env>`,
54
- ].join("\n"),
55
- references.length === 0
56
- ? undefined
57
- : [
58
- "Project references provide additional directories that can be accessed when relevant.",
59
- "<available_references>",
60
- ...references
61
- .toSorted((a, b) => a.name.localeCompare(b.name))
62
- .flatMap((reference) => [
63
- " <reference>",
64
- ` <name>${reference.name}</name>`,
65
- ` <path>${reference.path}</path>`,
66
- ...(reference.description === undefined
67
- ? []
68
- : [` <description>${reference.description}</description>`]),
69
- " </reference>",
70
- ]),
71
- "</available_references>",
72
- ].join("\n"),
73
- ].filter((part): part is string => part !== undefined)
74
- }),
75
-
76
- skills: Effect.fn("SystemPrompt.skills")(function* (agent: Agent.Info) {
77
- if (Permission.disabled(["skill"], agent.permission).has("skill")) return
78
-
79
- const list = yield* skill.available(agent)
80
-
81
- return [
82
- "Skills provide specialized instructions and workflows for specific tasks.",
83
- "Use the skill tool to load a skill when a task matches its description.",
84
- // the agents seem to ingest the information about skills a bit better if we present a more verbose
85
- // version of them here and a less verbose version in tool description, rather than vice versa.
86
- Skill.fmt(list, { verbose: true }),
87
- ].join("\n")
88
- }),
89
-
90
- mcp: Effect.fn("SystemPrompt.mcp")(function* (agent: Agent.Info, permission?: PermissionV1.Ruleset) {
91
- const ruleset = Permission.merge(agent.permission, permission ?? [])
92
- const instructions = (yield* mcp.instructions()).filter(
93
- (item) => item.tools.length === 0 || Permission.disabled(item.tools, ruleset).size < item.tools.length,
94
- )
95
- if (instructions.length === 0) return
96
-
97
- return [
98
- "<mcp_instructions>",
99
- ...instructions.flatMap((item) => [
100
- ` <server name="${item.name}">`,
101
- ...item.instructions.split("\n").map((line) => ` ${line}`),
102
- " </server>",
103
- ]),
104
- "</mcp_instructions>",
105
- ].join("\n")
106
- }),
107
- })
108
- }),
109
- )
110
-
111
- const locationServiceMapNode = LayerNode.make({
112
- service: LocationServiceMap.Service,
113
- layer: locationServiceMapLayer,
114
- deps: [],
115
- })
116
-
117
- export const node = LayerNode.make({
118
- service: Service,
119
- layer: layer,
120
- deps: [Skill.node, MCP.node, locationServiceMapNode],
121
- })
122
-
123
- export * as SystemPrompt from "./system"
@@ -1,74 +0,0 @@
1
- import { LayerNode } from "@soraacode/core/effect/layer-node"
2
- import { SessionID } from "./schema"
3
- import { Effect, Layer, Context } from "effect"
4
- import { Database } from "@soraacode/core/database/database"
5
- import { eq } from "drizzle-orm"
6
- import { asc } from "drizzle-orm"
7
- import { TodoTable } from "@soraacode/core/session/sql"
8
- import { EventV2Bridge } from "@/event-v2-bridge"
9
- import { SessionTodo } from "@soraacode/schema/session-todo"
10
-
11
- export const Info = SessionTodo.Info
12
- export type Info = SessionTodo.Info
13
-
14
- export const Event = SessionTodo.Event
15
-
16
- export interface Interface {
17
- readonly update: (input: { sessionID: SessionID; todos: ReadonlyArray<Info> }) => Effect.Effect<void>
18
- readonly get: (sessionID: SessionID) => Effect.Effect<Info[]>
19
- }
20
-
21
- export class Service extends Context.Service<Service, Interface>()("@opencode/SessionTodo") {}
22
-
23
- const layer = Layer.effect(
24
- Service,
25
- Effect.gen(function* () {
26
- const events = yield* EventV2Bridge.Service
27
- const { db } = yield* Database.Service
28
-
29
- const update = Effect.fn("Todo.update")(function* (input: { sessionID: SessionID; todos: ReadonlyArray<Info> }) {
30
- yield* db
31
- .transaction((tx) =>
32
- Effect.gen(function* () {
33
- yield* tx.delete(TodoTable).where(eq(TodoTable.session_id, input.sessionID)).run()
34
- if (input.todos.length === 0) return
35
- yield* tx
36
- .insert(TodoTable)
37
- .values(
38
- input.todos.map((todo, position) => ({
39
- session_id: input.sessionID,
40
- content: todo.content,
41
- status: todo.status,
42
- priority: todo.priority,
43
- position,
44
- })),
45
- )
46
- .run()
47
- }),
48
- )
49
- .pipe(Effect.orDie)
50
- yield* events.publish(Event.Updated, input)
51
- })
52
-
53
- const get = Effect.fn("Todo.get")(function* (sessionID: SessionID) {
54
- const rows = yield* db
55
- .select()
56
- .from(TodoTable)
57
- .where(eq(TodoTable.session_id, sessionID))
58
- .orderBy(asc(TodoTable.position))
59
- .all()
60
- .pipe(Effect.orDie)
61
- return rows.map((row) => ({
62
- content: row.content,
63
- status: row.status,
64
- priority: row.priority,
65
- }))
66
- })
67
-
68
- return Service.of({ update, get })
69
- }),
70
- )
71
-
72
- export const node = LayerNode.make({ service: Service, layer: layer, deps: [EventV2Bridge.node, Database.node] })
73
-
74
- export * as Todo from "./todo"