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
@@ -1,163 +0,0 @@
1
- export function prefix(tokens: string[]) {
2
- for (let len = tokens.length; len > 0; len--) {
3
- const prefix = tokens.slice(0, len).join(" ")
4
- const arity = ARITY[prefix]
5
- if (arity !== undefined) return tokens.slice(0, arity)
6
- }
7
- if (tokens.length === 0) return []
8
- return tokens.slice(0, 1)
9
- }
10
-
11
- /* Generated with following prompt:
12
- You are generating a dictionary of command-prefix arities for bash-style commands.
13
- This dictionary is used to identify the "human-understandable command" from an input shell command.### **RULES (follow strictly)**1. Each entry maps a **command prefix string → number**, representing how many **tokens** define the command.
14
- 2. **Flags NEVER count as tokens**. Only subcommands count.
15
- 3. **Longest matching prefix wins**.
16
- 4. **Only include a longer prefix if its arity is different from what the shorter prefix already implies**. * Example: If `git` is 2, then do **not** include `git checkout`, `git commit`, etc. unless they require *different* arity.
17
- 5. The output must be a **single JSON object**. Each entry should have a comment with an example real world matching command. DO NOT MAKE ANY OTHER COMMENTS. Should be alphabetical
18
- 6. Include the **most commonly used commands** across many stacks and languages. More is better.### **Semantics examples*** `touch foo.txt` → `touch` (arity 1, explicitly listed)
19
- * `git checkout main` → `git checkout` (because `git` has arity 2)
20
- * `npm install` → `npm install` (because `npm` has arity 2)
21
- * `npm run dev` → `npm run dev` (because `npm run` has arity 3)
22
- * `python script.py` → `python script.py` (default: whole input, not in dictionary)### **Now generate the dictionary.**
23
- */
24
- const ARITY: Record<string, number> = {
25
- cat: 1, // cat file.txt
26
- cd: 1, // cd /path/to/dir
27
- chmod: 1, // chmod 755 script.sh
28
- chown: 1, // chown user:group file.txt
29
- cp: 1, // cp source.txt dest.txt
30
- echo: 1, // echo "hello world"
31
- env: 1, // env
32
- export: 1, // export PATH=/usr/bin
33
- grep: 1, // grep pattern file.txt
34
- kill: 1, // kill 1234
35
- killall: 1, // killall process
36
- ln: 1, // ln -s source target
37
- ls: 1, // ls -la
38
- mkdir: 1, // mkdir new-dir
39
- mv: 1, // mv old.txt new.txt
40
- ps: 1, // ps aux
41
- pwd: 1, // pwd
42
- rm: 1, // rm file.txt
43
- rmdir: 1, // rmdir empty-dir
44
- sleep: 1, // sleep 5
45
- source: 1, // source ~/.bashrc
46
- tail: 1, // tail -f log.txt
47
- touch: 1, // touch file.txt
48
- unset: 1, // unset VAR
49
- which: 1, // which node
50
- aws: 3, // aws s3 ls
51
- az: 3, // az storage blob list
52
- bazel: 2, // bazel build
53
- brew: 2, // brew install node
54
- bun: 2, // bun install
55
- "bun run": 3, // bun run dev
56
- "bun x": 3, // bun x vite
57
- cargo: 2, // cargo build
58
- "cargo add": 3, // cargo add tokio
59
- "cargo run": 3, // cargo run main
60
- cdk: 2, // cdk deploy
61
- cf: 2, // cf push app
62
- cmake: 2, // cmake build
63
- composer: 2, // composer require laravel
64
- consul: 2, // consul members
65
- "consul kv": 3, // consul kv get config/app
66
- crictl: 2, // crictl ps
67
- deno: 2, // deno run server.ts
68
- "deno task": 3, // deno task dev
69
- doctl: 3, // doctl kubernetes cluster list
70
- docker: 2, // docker run nginx
71
- "docker builder": 3, // docker builder prune
72
- "docker compose": 3, // docker compose up
73
- "docker container": 3, // docker container ls
74
- "docker image": 3, // docker image prune
75
- "docker network": 3, // docker network inspect
76
- "docker volume": 3, // docker volume ls
77
- eksctl: 2, // eksctl get clusters
78
- "eksctl create": 3, // eksctl create cluster
79
- firebase: 2, // firebase deploy
80
- flyctl: 2, // flyctl deploy
81
- gcloud: 3, // gcloud compute instances list
82
- gh: 3, // gh pr list
83
- git: 2, // git checkout main
84
- "git config": 3, // git config user.name
85
- "git remote": 3, // git remote add origin
86
- "git stash": 3, // git stash pop
87
- go: 2, // go build
88
- gradle: 2, // gradle build
89
- helm: 2, // helm install mychart
90
- heroku: 2, // heroku logs
91
- hugo: 2, // hugo new site blog
92
- ip: 2, // ip link show
93
- "ip addr": 3, // ip addr show
94
- "ip link": 3, // ip link set eth0 up
95
- "ip netns": 3, // ip netns exec foo bash
96
- "ip route": 3, // ip route add default via 1.1.1.1
97
- kind: 2, // kind delete cluster
98
- "kind create": 3, // kind create cluster
99
- kubectl: 2, // kubectl get pods
100
- "kubectl kustomize": 3, // kubectl kustomize overlays/dev
101
- "kubectl rollout": 3, // kubectl rollout restart deploy/api
102
- kustomize: 2, // kustomize build .
103
- make: 2, // make build
104
- mc: 2, // mc ls myminio
105
- "mc admin": 3, // mc admin info myminio
106
- minikube: 2, // minikube start
107
- mongosh: 2, // mongosh test
108
- mysql: 2, // mysql -u root
109
- mvn: 2, // mvn compile
110
- ng: 2, // ng generate component home
111
- npm: 2, // npm install
112
- "npm exec": 3, // npm exec vite
113
- "npm init": 3, // npm init vue
114
- "npm run": 3, // npm run dev
115
- "npm view": 3, // npm view react version
116
- nvm: 2, // nvm use 18
117
- nx: 2, // nx build
118
- openssl: 2, // openssl genrsa 2048
119
- "openssl req": 3, // openssl req -new -key key.pem
120
- "openssl x509": 3, // openssl x509 -in cert.pem
121
- pip: 2, // pip install numpy
122
- pipenv: 2, // pipenv install flask
123
- pnpm: 2, // pnpm install
124
- "pnpm dlx": 3, // pnpm dlx create-next-app
125
- "pnpm exec": 3, // pnpm exec vite
126
- "pnpm run": 3, // pnpm run dev
127
- poetry: 2, // poetry add requests
128
- podman: 2, // podman run alpine
129
- "podman container": 3, // podman container ls
130
- "podman image": 3, // podman image prune
131
- psql: 2, // psql -d mydb
132
- pulumi: 2, // pulumi up
133
- "pulumi stack": 3, // pulumi stack output
134
- pyenv: 2, // pyenv install 3.11
135
- python: 2, // python -m venv env
136
- rake: 2, // rake db:migrate
137
- rbenv: 2, // rbenv install 3.2.0
138
- "redis-cli": 2, // redis-cli ping
139
- rustup: 2, // rustup update
140
- serverless: 2, // serverless invoke
141
- sfdx: 3, // sfdx force:org:list
142
- skaffold: 2, // skaffold dev
143
- sls: 2, // sls deploy
144
- sst: 2, // sst deploy
145
- swift: 2, // swift build
146
- systemctl: 2, // systemctl restart nginx
147
- terraform: 2, // terraform apply
148
- "terraform workspace": 3, // terraform workspace select prod
149
- tmux: 2, // tmux new -s dev
150
- turbo: 2, // turbo run build
151
- ufw: 2, // ufw allow 22
152
- vault: 2, // vault login
153
- "vault auth": 3, // vault auth list
154
- "vault kv": 3, // vault kv get secret/api
155
- vercel: 2, // vercel deploy
156
- volta: 2, // volta install node
157
- wp: 2, // wp plugin install
158
- yarn: 2, // yarn add react
159
- "yarn dlx": 3, // yarn dlx create-react-app
160
- "yarn run": 3, // yarn run dev
161
- }
162
-
163
- export * as BashArity from "./arity"
@@ -1 +0,0 @@
1
- export { evaluate } from "."
@@ -1,223 +0,0 @@
1
- import { LayerNode } from "@soraacode/core/effect/layer-node"
2
- import { ConfigPermissionV1 } from "@soraacode/core/v1/config/permission"
3
- import { InstanceState } from "@/effect/instance-state"
4
- import { Wildcard } from "@soraacode/core/util/wildcard"
5
- import { Deferred, Effect, Layer, Context } from "effect"
6
- import os from "os"
7
- import { PermissionV1 } from "@soraacode/core/v1/permission"
8
- import { EventV2Bridge } from "@/event-v2-bridge"
9
-
10
- export const Event = PermissionV1.Event
11
-
12
- export interface Interface {
13
- readonly ask: (input: PermissionV1.AskInput) => Effect.Effect<void, PermissionV1.Error>
14
- readonly reply: (input: PermissionV1.ReplyInput) => Effect.Effect<void, PermissionV1.NotFoundError>
15
- readonly list: () => Effect.Effect<ReadonlyArray<PermissionV1.Request>>
16
- }
17
-
18
- interface PendingEntry {
19
- info: PermissionV1.Request
20
- deferred: Deferred.Deferred<void, PermissionV1.RejectedError | PermissionV1.CorrectedError>
21
- }
22
-
23
- interface State {
24
- pending: Map<PermissionV1.ID, PendingEntry>
25
- approved: PermissionV1.Rule[]
26
- }
27
-
28
- export function evaluate(permission: string, pattern: string, ...rulesets: PermissionV1.Ruleset[]): PermissionV1.Rule {
29
- return (
30
- rulesets
31
- .flat()
32
- .findLast((rule) => Wildcard.match(permission, rule.permission) && Wildcard.match(pattern, rule.pattern)) ?? {
33
- action: "ask",
34
- permission,
35
- pattern: "*",
36
- }
37
- )
38
- }
39
-
40
- export class Service extends Context.Service<Service, Interface>()("@opencode/Permission") {}
41
-
42
- const layer = Layer.effect(
43
- Service,
44
- Effect.gen(function* () {
45
- const events = yield* EventV2Bridge.Service
46
- const state = yield* InstanceState.make<State>(
47
- Effect.fn("Permission.state")(function* (ctx) {
48
- void ctx
49
- const state = {
50
- pending: new Map<PermissionV1.ID, PendingEntry>(),
51
- approved: [],
52
- }
53
-
54
- yield* Effect.addFinalizer(() =>
55
- Effect.gen(function* () {
56
- for (const item of state.pending.values()) {
57
- yield* Deferred.fail(item.deferred, new PermissionV1.RejectedError())
58
- }
59
- state.pending.clear()
60
- }),
61
- )
62
-
63
- return state
64
- }),
65
- )
66
-
67
- const ask = Effect.fn("Permission.ask")(function* (input: PermissionV1.AskInput) {
68
- const { approved, pending } = yield* InstanceState.get(state)
69
- const { ruleset, ...request } = input
70
- let needsAsk = false
71
-
72
- for (const pattern of request.patterns) {
73
- const rule = evaluate(request.permission, pattern, ruleset, approved)
74
- yield* Effect.logInfo("evaluated", { permission: request.permission, pattern, action: rule })
75
- if (rule.action === "deny") {
76
- return yield* new PermissionV1.DeniedError({
77
- ruleset: ruleset.filter((rule) => Wildcard.match(request.permission, rule.permission)),
78
- })
79
- }
80
- if (rule.action === "allow") continue
81
- needsAsk = true
82
- }
83
-
84
- if (!needsAsk) return
85
-
86
- const id = request.id ?? PermissionV1.ID.ascending()
87
- const info: PermissionV1.Request = {
88
- id,
89
- sessionID: request.sessionID,
90
- permission: request.permission,
91
- patterns: request.patterns,
92
- metadata: request.metadata,
93
- always: request.always,
94
- tool: request.tool,
95
- }
96
- yield* Effect.logInfo("asking", { id, permission: info.permission, patterns: info.patterns })
97
-
98
- const deferred = yield* Deferred.make<void, PermissionV1.RejectedError | PermissionV1.CorrectedError>()
99
- pending.set(id, { info, deferred })
100
- yield* events.publish(Event.Asked, info)
101
- return yield* Effect.ensuring(
102
- Deferred.await(deferred),
103
- Effect.sync(() => {
104
- pending.delete(id)
105
- }),
106
- )
107
- })
108
-
109
- const reply = Effect.fn("Permission.reply")(function* (input: PermissionV1.ReplyInput) {
110
- const { approved, pending } = yield* InstanceState.get(state)
111
- const existing = pending.get(input.requestID)
112
- if (!existing) return yield* new PermissionV1.NotFoundError({ requestID: input.requestID })
113
-
114
- pending.delete(input.requestID)
115
- yield* events.publish(Event.Replied, {
116
- sessionID: existing.info.sessionID,
117
- requestID: existing.info.id,
118
- reply: input.reply,
119
- })
120
-
121
- if (input.reply === "reject") {
122
- yield* Deferred.fail(
123
- existing.deferred,
124
- input.message
125
- ? new PermissionV1.CorrectedError({ feedback: input.message })
126
- : new PermissionV1.RejectedError(),
127
- )
128
-
129
- for (const [id, item] of pending.entries()) {
130
- if (item.info.sessionID !== existing.info.sessionID) continue
131
- pending.delete(id)
132
- yield* events.publish(Event.Replied, {
133
- sessionID: item.info.sessionID,
134
- requestID: item.info.id,
135
- reply: "reject",
136
- })
137
- yield* Deferred.fail(item.deferred, new PermissionV1.RejectedError())
138
- }
139
- return
140
- }
141
-
142
- yield* Deferred.succeed(existing.deferred, undefined)
143
- if (input.reply === "once") return
144
-
145
- for (const pattern of existing.info.always) {
146
- approved.push({
147
- permission: existing.info.permission,
148
- pattern,
149
- action: "allow",
150
- })
151
- }
152
-
153
- for (const [id, item] of pending.entries()) {
154
- if (item.info.sessionID !== existing.info.sessionID) continue
155
- const ok = item.info.patterns.every(
156
- (pattern) => evaluate(item.info.permission, pattern, approved).action === "allow",
157
- )
158
- if (!ok) continue
159
- pending.delete(id)
160
- yield* events.publish(Event.Replied, {
161
- sessionID: item.info.sessionID,
162
- requestID: item.info.id,
163
- reply: "always",
164
- })
165
- yield* Deferred.succeed(item.deferred, undefined)
166
- }
167
- })
168
-
169
- const list = Effect.fn("Permission.list")(function* () {
170
- const pending = (yield* InstanceState.get(state)).pending
171
- return Array.from(pending.values(), (item) => item.info)
172
- })
173
-
174
- return Service.of({ ask, reply, list })
175
- }),
176
- )
177
-
178
- function expand(pattern: string): string {
179
- if (pattern.startsWith("~/")) return os.homedir() + pattern.slice(1)
180
- if (pattern === "~") return os.homedir()
181
- if (pattern.startsWith("$HOME/")) return os.homedir() + pattern.slice(5)
182
- if (pattern.startsWith("$HOME")) return os.homedir() + pattern.slice(5)
183
- return pattern
184
- }
185
-
186
- export function fromConfig(permission: ConfigPermissionV1.Info) {
187
- const ruleset: PermissionV1.Rule[] = []
188
- for (const [key, value] of Object.entries(permission)) {
189
- if (typeof value === "string") {
190
- ruleset.push({ permission: key, action: value, pattern: "*" })
191
- continue
192
- }
193
- ruleset.push(
194
- ...Object.entries(value).map(([pattern, action]) => ({ permission: key, pattern: expand(pattern), action })),
195
- )
196
- }
197
- return ruleset
198
- }
199
-
200
- export function merge(...rulesets: PermissionV1.Ruleset[]): PermissionV1.Rule[] {
201
- return rulesets.flat()
202
- }
203
-
204
- export function disabled(tools: string[], ruleset: PermissionV1.Ruleset): Set<string> {
205
- const edits = ["edit", "write", "apply_patch"]
206
- const reads = ["list_mcp_resources", "list_mcp_resource_templates", "read_mcp_resource"]
207
- return new Set(
208
- tools.filter((tool) => {
209
- const permission = edits.includes(tool) ? "edit" : reads.includes(tool) ? "read" : tool
210
- const rule = ruleset.findLast((rule) => Wildcard.match(permission, rule.permission))
211
- return rule?.pattern === "*" && rule.action === "deny"
212
- }),
213
- )
214
- }
215
-
216
- export function visibleTools<T>(tools: Record<string, T>, ruleset: PermissionV1.Ruleset): Record<string, T> {
217
- const hidden = disabled(Object.keys(tools), ruleset)
218
- return Object.fromEntries(Object.entries(tools).filter(([name]) => !hidden.has(name)))
219
- }
220
-
221
- export const node = LayerNode.make({ service: Service, layer: layer, deps: [EventV2Bridge.node] })
222
-
223
- export * as Permission from "."