@sleepy-ai/cli 0.1.16 → 0.1.17

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 (805) hide show
  1. package/{src/skill/compose/LICENSE-superpowers → LICENSE} +3 -6
  2. package/README.md +139 -6
  3. package/package.json +35 -199
  4. package/postinstall.mjs +102 -0
  5. package/.sleepycode-test-fixtures-50158/sleepycode-test-eqsxv84ythu/.watcher-b67v64k2mnv +0 -1
  6. package/.sleepycode-test-fixtures-66172/sleepycode-test-x1ymo4kksaa/sleepycode.json +0 -1
  7. package/Dockerfile +0 -18
  8. package/drizzle.config.ts +0 -10
  9. package/git +0 -0
  10. package/migration/20260127222353_familiar_lady_ursula/migration.sql +0 -90
  11. package/migration/20260127222353_familiar_lady_ursula/snapshot.json +0 -796
  12. package/migration/20260211171708_add_project_commands/migration.sql +0 -1
  13. package/migration/20260211171708_add_project_commands/snapshot.json +0 -806
  14. package/migration/20260213144116_wakeful_the_professor/migration.sql +0 -11
  15. package/migration/20260213144116_wakeful_the_professor/snapshot.json +0 -897
  16. package/migration/20260225215848_workspace/migration.sql +0 -7
  17. package/migration/20260225215848_workspace/snapshot.json +0 -959
  18. package/migration/20260227213759_add_session_workspace_id/migration.sql +0 -2
  19. package/migration/20260227213759_add_session_workspace_id/snapshot.json +0 -983
  20. package/migration/20260228203230_blue_harpoon/migration.sql +0 -17
  21. package/migration/20260228203230_blue_harpoon/snapshot.json +0 -1102
  22. package/migration/20260303231226_add_workspace_fields/migration.sql +0 -5
  23. package/migration/20260303231226_add_workspace_fields/snapshot.json +0 -1013
  24. package/migration/20260309230000_move_org_to_state/migration.sql +0 -3
  25. package/migration/20260309230000_move_org_to_state/snapshot.json +0 -1156
  26. package/migration/20260312043431_session_message_cursor/migration.sql +0 -4
  27. package/migration/20260312043431_session_message_cursor/snapshot.json +0 -1168
  28. package/migration/20260323234822_events/migration.sql +0 -13
  29. package/migration/20260323234822_events/snapshot.json +0 -1271
  30. package/migration/20260410174513_workspace-name/migration.sql +0 -16
  31. package/migration/20260410174513_workspace-name/snapshot.json +0 -1271
  32. package/migration/20260413175956_chief_energizer/migration.sql +0 -13
  33. package/migration/20260413175956_chief_energizer/snapshot.json +0 -1399
  34. package/migration/20260422160000_context_inheritance/migration.sql +0 -3
  35. package/migration/20260422170000_task_registry/migration.sql +0 -18
  36. package/migration/20260423145421_remove_session_entry/migration.sql +0 -4
  37. package/migration/20260515000000_actor_rename/migration.sql +0 -7
  38. package/migration/20260515010000_memory_fts/migration.sql +0 -33
  39. package/migration/20260515020000_user_task/migration.sql +0 -29
  40. package/migration/20260519000000_last_checkpoint_message_id/migration.sql +0 -1
  41. package/migration/20260521000000_message_agent_id/migration.sql +0 -2
  42. package/migration/20260521000100_actor_registry_v6/migration.sql +0 -25
  43. package/migration/20260521010000_memory_fts_v6/migration.sql +0 -33
  44. package/migration/20260521020000_memory_fts_triggers/migration.sql +0 -17
  45. package/migration/20260526000000_agent_id_main/migration.sql +0 -14
  46. package/migration/20260527000000_actor_lifecycle/migration.sql +0 -8
  47. package/migration/20260527000100_inbox/migration.sql +0 -12
  48. package/migration/20260529000000_task_todo_redesign/migration.sql +0 -16
  49. package/migration/20260603000000_task_in_progress_owner/migration.sql +0 -1
  50. package/migration/20260603000000_workflow_run/migration.sql +0 -17
  51. package/migration/20260604000000_workflow_script_sha/migration.sql +0 -1
  52. package/migration/20260608000000_claude_import/migration.sql +0 -7
  53. package/migration/20260608010000_claude_import_message_ids/migration.sql +0 -1
  54. package/migration/20260609000000_history_fts/migration.sql +0 -29
  55. package/migration/20260609230000_workflow_agent_timeout/migration.sql +0 -1
  56. package/migration/20260612000000_external_import/migration.sql +0 -16
  57. package/parsers-config.ts +0 -290
  58. package/src/account/account.sql.ts +0 -39
  59. package/src/account/account.ts +0 -456
  60. package/src/account/repo.ts +0 -166
  61. package/src/account/schema.ts +0 -99
  62. package/src/account/url.ts +0 -8
  63. package/src/acp/README.md +0 -174
  64. package/src/acp/agent.ts +0 -1787
  65. package/src/acp/session.ts +0 -116
  66. package/src/acp/types.ts +0 -24
  67. package/src/actor/actor.sql.ts +0 -38
  68. package/src/actor/events.ts +0 -67
  69. package/src/actor/index.ts +0 -2
  70. package/src/actor/registry.ts +0 -412
  71. package/src/actor/return-header.ts +0 -24
  72. package/src/actor/schema.ts +0 -47
  73. package/src/actor/spawn-ref.ts +0 -16
  74. package/src/actor/spawn.ts +0 -756
  75. package/src/actor/turn.ts +0 -49
  76. package/src/actor/waiter.ts +0 -166
  77. package/src/agent/agent.ts +0 -645
  78. package/src/agent/config.ts +0 -5
  79. package/src/agent/generate.txt +0 -75
  80. package/src/agent/prompt/apex.txt +0 -363
  81. package/src/agent/prompt/checkpoint-writer.txt +0 -167
  82. package/src/agent/prompt/compaction.txt +0 -9
  83. package/src/agent/prompt/distill.txt +0 -199
  84. package/src/agent/prompt/dream.txt +0 -155
  85. package/src/agent/prompt/explore.txt +0 -18
  86. package/src/agent/prompt/forge.txt +0 -491
  87. package/src/agent/prompt/phantom.txt +0 -491
  88. package/src/agent/prompt/pivot.txt +0 -460
  89. package/src/agent/prompt/stack.txt +0 -472
  90. package/src/agent/prompt/summary.txt +0 -11
  91. package/src/agent/prompt/title.txt +0 -44
  92. package/src/audio.d.ts +0 -9
  93. package/src/auth/index.ts +0 -97
  94. package/src/bus/bus-event.ts +0 -33
  95. package/src/bus/global.ts +0 -12
  96. package/src/bus/index.ts +0 -193
  97. package/src/cli/bootstrap.ts +0 -33
  98. package/src/cli/cmd/account.ts +0 -258
  99. package/src/cli/cmd/acp.ts +0 -70
  100. package/src/cli/cmd/agent.ts +0 -248
  101. package/src/cli/cmd/cmd.ts +0 -7
  102. package/src/cli/cmd/db.ts +0 -120
  103. package/src/cli/cmd/debug/agent.ts +0 -192
  104. package/src/cli/cmd/debug/config.ts +0 -17
  105. package/src/cli/cmd/debug/file.ts +0 -100
  106. package/src/cli/cmd/debug/index.ts +0 -48
  107. package/src/cli/cmd/debug/lsp.ts +0 -61
  108. package/src/cli/cmd/debug/ripgrep.ts +0 -105
  109. package/src/cli/cmd/debug/scrap.ts +0 -16
  110. package/src/cli/cmd/debug/skill.ts +0 -23
  111. package/src/cli/cmd/debug/snapshot.ts +0 -53
  112. package/src/cli/cmd/doctor.ts +0 -116
  113. package/src/cli/cmd/export.ts +0 -306
  114. package/src/cli/cmd/generate.ts +0 -50
  115. package/src/cli/cmd/github.ts +0 -1647
  116. package/src/cli/cmd/import.ts +0 -208
  117. package/src/cli/cmd/init.ts +0 -97
  118. package/src/cli/cmd/login.ts +0 -402
  119. package/src/cli/cmd/mcp.ts +0 -812
  120. package/src/cli/cmd/models.ts +0 -88
  121. package/src/cli/cmd/plug.ts +0 -233
  122. package/src/cli/cmd/pr.ts +0 -138
  123. package/src/cli/cmd/providers.ts +0 -713
  124. package/src/cli/cmd/run-completion.ts +0 -77
  125. package/src/cli/cmd/run.ts +0 -694
  126. package/src/cli/cmd/serve.ts +0 -30
  127. package/src/cli/cmd/session.ts +0 -181
  128. package/src/cli/cmd/stats.ts +0 -413
  129. package/src/cli/cmd/tui/app.tsx +0 -1161
  130. package/src/cli/cmd/tui/asset/TEN_VAD_LICENSE +0 -12
  131. package/src/cli/cmd/tui/asset/charge.wav +0 -0
  132. package/src/cli/cmd/tui/asset/pulse-a.wav +0 -0
  133. package/src/cli/cmd/tui/asset/pulse-b.wav +0 -0
  134. package/src/cli/cmd/tui/asset/pulse-c.wav +0 -0
  135. package/src/cli/cmd/tui/asset/ten_vad.wasm +0 -0
  136. package/src/cli/cmd/tui/asset/ten_vad_loader.js +0 -30
  137. package/src/cli/cmd/tui/attach.ts +0 -84
  138. package/src/cli/cmd/tui/component/background-image.tsx +0 -150
  139. package/src/cli/cmd/tui/component/banner-session-expired.tsx +0 -48
  140. package/src/cli/cmd/tui/component/bg-pulse.tsx +0 -130
  141. package/src/cli/cmd/tui/component/border.tsx +0 -21
  142. package/src/cli/cmd/tui/component/dialog-agent.tsx +0 -31
  143. package/src/cli/cmd/tui/component/dialog-agreement.tsx +0 -111
  144. package/src/cli/cmd/tui/component/dialog-command.tsx +0 -219
  145. package/src/cli/cmd/tui/component/dialog-console-org.tsx +0 -103
  146. package/src/cli/cmd/tui/component/dialog-go-upsell.tsx +0 -150
  147. package/src/cli/cmd/tui/component/dialog-image-list.tsx +0 -111
  148. package/src/cli/cmd/tui/component/dialog-logo-design.tsx +0 -37
  149. package/src/cli/cmd/tui/component/dialog-mcp.tsx +0 -86
  150. package/src/cli/cmd/tui/component/dialog-model.tsx +0 -299
  151. package/src/cli/cmd/tui/component/dialog-provider.tsx +0 -449
  152. package/src/cli/cmd/tui/component/dialog-session-delete-failed.tsx +0 -101
  153. package/src/cli/cmd/tui/component/dialog-session-list.tsx +0 -269
  154. package/src/cli/cmd/tui/component/dialog-session-rename.tsx +0 -31
  155. package/src/cli/cmd/tui/component/dialog-skill.tsx +0 -42
  156. package/src/cli/cmd/tui/component/dialog-sleepy-login.tsx +0 -167
  157. package/src/cli/cmd/tui/component/dialog-stash.tsx +0 -87
  158. package/src/cli/cmd/tui/component/dialog-status.tsx +0 -170
  159. package/src/cli/cmd/tui/component/dialog-tag.tsx +0 -44
  160. package/src/cli/cmd/tui/component/dialog-theme-list.tsx +0 -50
  161. package/src/cli/cmd/tui/component/dialog-token-plan.tsx +0 -77
  162. package/src/cli/cmd/tui/component/dialog-variant.tsx +0 -39
  163. package/src/cli/cmd/tui/component/dialog-workflows.tsx +0 -51
  164. package/src/cli/cmd/tui/component/dialog-workspace-create.tsx +0 -289
  165. package/src/cli/cmd/tui/component/dialog-workspace-unavailable.tsx +0 -81
  166. package/src/cli/cmd/tui/component/dialog-worktree.tsx +0 -90
  167. package/src/cli/cmd/tui/component/error-component.tsx +0 -92
  168. package/src/cli/cmd/tui/component/logo.tsx +0 -961
  169. package/src/cli/cmd/tui/component/plugin-route-missing.tsx +0 -14
  170. package/src/cli/cmd/tui/component/prompt/autocomplete-detect.ts +0 -34
  171. package/src/cli/cmd/tui/component/prompt/autocomplete.tsx +0 -668
  172. package/src/cli/cmd/tui/component/prompt/cwd.ts +0 -0
  173. package/src/cli/cmd/tui/component/prompt/frecency.tsx +0 -90
  174. package/src/cli/cmd/tui/component/prompt/history.tsx +0 -108
  175. package/src/cli/cmd/tui/component/prompt/index.tsx +0 -1869
  176. package/src/cli/cmd/tui/component/prompt/offset.ts +0 -45
  177. package/src/cli/cmd/tui/component/prompt/part.ts +0 -36
  178. package/src/cli/cmd/tui/component/prompt/stash.tsx +0 -101
  179. package/src/cli/cmd/tui/component/spinner.tsx +0 -24
  180. package/src/cli/cmd/tui/component/starry-background.tsx +0 -305
  181. package/src/cli/cmd/tui/component/startup-loading.tsx +0 -67
  182. package/src/cli/cmd/tui/component/task-item.tsx +0 -63
  183. package/src/cli/cmd/tui/component/textarea-keybindings.ts +0 -73
  184. package/src/cli/cmd/tui/component/todo-item.tsx +0 -32
  185. package/src/cli/cmd/tui/component/workflow-tree.tsx +0 -177
  186. package/src/cli/cmd/tui/config/cwd.ts +0 -5
  187. package/src/cli/cmd/tui/config/tui-migrate.ts +0 -151
  188. package/src/cli/cmd/tui/config/tui-schema.ts +0 -38
  189. package/src/cli/cmd/tui/config/tui.ts +0 -219
  190. package/src/cli/cmd/tui/context/args.tsx +0 -16
  191. package/src/cli/cmd/tui/context/directory.ts +0 -15
  192. package/src/cli/cmd/tui/context/event.ts +0 -45
  193. package/src/cli/cmd/tui/context/exit.tsx +0 -65
  194. package/src/cli/cmd/tui/context/helper.tsx +0 -25
  195. package/src/cli/cmd/tui/context/keybind.tsx +0 -105
  196. package/src/cli/cmd/tui/context/kv.tsx +0 -86
  197. package/src/cli/cmd/tui/context/language.tsx +0 -91
  198. package/src/cli/cmd/tui/context/local.tsx +0 -458
  199. package/src/cli/cmd/tui/context/plugin-keybinds.ts +0 -41
  200. package/src/cli/cmd/tui/context/project.tsx +0 -109
  201. package/src/cli/cmd/tui/context/prompt.tsx +0 -18
  202. package/src/cli/cmd/tui/context/route.tsx +0 -68
  203. package/src/cli/cmd/tui/context/sdk.tsx +0 -150
  204. package/src/cli/cmd/tui/context/sync.tsx +0 -884
  205. package/src/cli/cmd/tui/context/theme/aura.json +0 -69
  206. package/src/cli/cmd/tui/context/theme/ayu.json +0 -80
  207. package/src/cli/cmd/tui/context/theme/carbonfox.json +0 -248
  208. package/src/cli/cmd/tui/context/theme/catppuccin-frappe.json +0 -230
  209. package/src/cli/cmd/tui/context/theme/catppuccin-macchiato.json +0 -230
  210. package/src/cli/cmd/tui/context/theme/catppuccin.json +0 -112
  211. package/src/cli/cmd/tui/context/theme/cobalt2.json +0 -225
  212. package/src/cli/cmd/tui/context/theme/cursor.json +0 -249
  213. package/src/cli/cmd/tui/context/theme/dracula.json +0 -219
  214. package/src/cli/cmd/tui/context/theme/everforest.json +0 -241
  215. package/src/cli/cmd/tui/context/theme/flexoki.json +0 -237
  216. package/src/cli/cmd/tui/context/theme/github.json +0 -233
  217. package/src/cli/cmd/tui/context/theme/gruvbox.json +0 -242
  218. package/src/cli/cmd/tui/context/theme/kanagawa.json +0 -77
  219. package/src/cli/cmd/tui/context/theme/lucent-orng.json +0 -234
  220. package/src/cli/cmd/tui/context/theme/material.json +0 -235
  221. package/src/cli/cmd/tui/context/theme/matrix.json +0 -77
  222. package/src/cli/cmd/tui/context/theme/mercury.json +0 -252
  223. package/src/cli/cmd/tui/context/theme/monokai.json +0 -221
  224. package/src/cli/cmd/tui/context/theme/nightowl.json +0 -221
  225. package/src/cli/cmd/tui/context/theme/nord.json +0 -223
  226. package/src/cli/cmd/tui/context/theme/one-dark.json +0 -84
  227. package/src/cli/cmd/tui/context/theme/orng.json +0 -249
  228. package/src/cli/cmd/tui/context/theme/osaka-jade.json +0 -93
  229. package/src/cli/cmd/tui/context/theme/palenight.json +0 -222
  230. package/src/cli/cmd/tui/context/theme/rosepine.json +0 -234
  231. package/src/cli/cmd/tui/context/theme/sleepycode.json +0 -245
  232. package/src/cli/cmd/tui/context/theme/solarized.json +0 -223
  233. package/src/cli/cmd/tui/context/theme/synthwave84.json +0 -226
  234. package/src/cli/cmd/tui/context/theme/tokyonight.json +0 -243
  235. package/src/cli/cmd/tui/context/theme/vercel.json +0 -245
  236. package/src/cli/cmd/tui/context/theme/vesper.json +0 -218
  237. package/src/cli/cmd/tui/context/theme/zenburn.json +0 -223
  238. package/src/cli/cmd/tui/context/theme.tsx +0 -1298
  239. package/src/cli/cmd/tui/context/thinking.ts +0 -48
  240. package/src/cli/cmd/tui/context/tui-config.tsx +0 -9
  241. package/src/cli/cmd/tui/event.ts +0 -62
  242. package/src/cli/cmd/tui/feature-plugins/home/footer.tsx +0 -93
  243. package/src/cli/cmd/tui/feature-plugins/home/tips-view.tsx +0 -193
  244. package/src/cli/cmd/tui/feature-plugins/home/tips.tsx +0 -54
  245. package/src/cli/cmd/tui/feature-plugins/sidebar/context.tsx +0 -287
  246. package/src/cli/cmd/tui/feature-plugins/sidebar/cwd.tsx +0 -45
  247. package/src/cli/cmd/tui/feature-plugins/sidebar/files.tsx +0 -62
  248. package/src/cli/cmd/tui/feature-plugins/sidebar/footer.tsx +0 -93
  249. package/src/cli/cmd/tui/feature-plugins/sidebar/goal.tsx +0 -84
  250. package/src/cli/cmd/tui/feature-plugins/sidebar/instructions.tsx +0 -54
  251. package/src/cli/cmd/tui/feature-plugins/sidebar/lsp.tsx +0 -66
  252. package/src/cli/cmd/tui/feature-plugins/sidebar/mascot.tsx +0 -69
  253. package/src/cli/cmd/tui/feature-plugins/sidebar/mcp.tsx +0 -98
  254. package/src/cli/cmd/tui/feature-plugins/sidebar/task.tsx +0 -95
  255. package/src/cli/cmd/tui/feature-plugins/sidebar/todo.tsx +0 -51
  256. package/src/cli/cmd/tui/feature-plugins/sidebar/tps.ts +0 -31
  257. package/src/cli/cmd/tui/feature-plugins/system/plugins.tsx +0 -274
  258. package/src/cli/cmd/tui/i18n/en.ts +0 -454
  259. package/src/cli/cmd/tui/i18n/es.ts +0 -508
  260. package/src/cli/cmd/tui/i18n/fr.ts +0 -515
  261. package/src/cli/cmd/tui/i18n/ja.ts +0 -463
  262. package/src/cli/cmd/tui/i18n/locales.ts +0 -82
  263. package/src/cli/cmd/tui/i18n/ru.ts +0 -527
  264. package/src/cli/cmd/tui/i18n/slash-command.ts +0 -11
  265. package/src/cli/cmd/tui/i18n/zh.ts +0 -454
  266. package/src/cli/cmd/tui/i18n/zht.ts +0 -430
  267. package/src/cli/cmd/tui/layer.ts +0 -6
  268. package/src/cli/cmd/tui/plugin/api.tsx +0 -402
  269. package/src/cli/cmd/tui/plugin/index.ts +0 -3
  270. package/src/cli/cmd/tui/plugin/internal.ts +0 -37
  271. package/src/cli/cmd/tui/plugin/runtime.ts +0 -1057
  272. package/src/cli/cmd/tui/plugin/slots.tsx +0 -60
  273. package/src/cli/cmd/tui/routes/home.tsx +0 -223
  274. package/src/cli/cmd/tui/routes/session/dialog-fork-from-timeline.tsx +0 -76
  275. package/src/cli/cmd/tui/routes/session/dialog-message.tsx +0 -116
  276. package/src/cli/cmd/tui/routes/session/dialog-subagent.tsx +0 -47
  277. package/src/cli/cmd/tui/routes/session/dialog-timeline.tsx +0 -47
  278. package/src/cli/cmd/tui/routes/session/footer.tsx +0 -91
  279. package/src/cli/cmd/tui/routes/session/index.tsx +0 -3068
  280. package/src/cli/cmd/tui/routes/session/permission.tsx +0 -697
  281. package/src/cli/cmd/tui/routes/session/question.tsx +0 -488
  282. package/src/cli/cmd/tui/routes/session/sidebar.tsx +0 -97
  283. package/src/cli/cmd/tui/routes/session/subagent-footer.tsx +0 -143
  284. package/src/cli/cmd/tui/thread.ts +0 -324
  285. package/src/cli/cmd/tui/ui/dialog-alert.tsx +0 -61
  286. package/src/cli/cmd/tui/ui/dialog-confirm.tsx +0 -95
  287. package/src/cli/cmd/tui/ui/dialog-export-options.tsx +0 -223
  288. package/src/cli/cmd/tui/ui/dialog-help.tsx +0 -42
  289. package/src/cli/cmd/tui/ui/dialog-prompt.tsx +0 -123
  290. package/src/cli/cmd/tui/ui/dialog-select.tsx +0 -467
  291. package/src/cli/cmd/tui/ui/dialog.tsx +0 -207
  292. package/src/cli/cmd/tui/ui/link.tsx +0 -28
  293. package/src/cli/cmd/tui/ui/spinner.ts +0 -378
  294. package/src/cli/cmd/tui/ui/toast.tsx +0 -102
  295. package/src/cli/cmd/tui/util/clipboard.ts +0 -197
  296. package/src/cli/cmd/tui/util/editor.ts +0 -41
  297. package/src/cli/cmd/tui/util/image-protocol.ts +0 -35
  298. package/src/cli/cmd/tui/util/index.ts +0 -6
  299. package/src/cli/cmd/tui/util/model.ts +0 -23
  300. package/src/cli/cmd/tui/util/pinyin.ts +0 -20
  301. package/src/cli/cmd/tui/util/provider-origin.ts +0 -7
  302. package/src/cli/cmd/tui/util/revert-diff.ts +0 -18
  303. package/src/cli/cmd/tui/util/scroll.ts +0 -23
  304. package/src/cli/cmd/tui/util/selection.ts +0 -23
  305. package/src/cli/cmd/tui/util/signal.ts +0 -41
  306. package/src/cli/cmd/tui/util/sound.ts +0 -154
  307. package/src/cli/cmd/tui/util/system-locale.ts +0 -209
  308. package/src/cli/cmd/tui/util/terminal.ts +0 -114
  309. package/src/cli/cmd/tui/util/transcript.ts +0 -112
  310. package/src/cli/cmd/tui/util/vad.ts +0 -229
  311. package/src/cli/cmd/tui/util/voice.ts +0 -450
  312. package/src/cli/cmd/tui/win32.ts +0 -130
  313. package/src/cli/cmd/tui/worker.ts +0 -104
  314. package/src/cli/cmd/uninstall.ts +0 -351
  315. package/src/cli/cmd/upgrade.ts +0 -79
  316. package/src/cli/cmd/web.ts +0 -96
  317. package/src/cli/effect/prompt.ts +0 -25
  318. package/src/cli/error.ts +0 -82
  319. package/src/cli/heap.ts +0 -59
  320. package/src/cli/i18n.ts +0 -15
  321. package/src/cli/logo.ts +0 -53
  322. package/src/cli/network.ts +0 -68
  323. package/src/cli/ui.ts +0 -133
  324. package/src/cli/upgrade.ts +0 -41
  325. package/src/command/index.ts +0 -276
  326. package/src/command/template/initialize.txt +0 -66
  327. package/src/command/template/review.txt +0 -101
  328. package/src/config/agent.ts +0 -197
  329. package/src/config/command.ts +0 -69
  330. package/src/config/compose.ts +0 -26
  331. package/src/config/config.ts +0 -1047
  332. package/src/config/console-state.ts +0 -16
  333. package/src/config/entry-name.ts +0 -16
  334. package/src/config/error.ts +0 -21
  335. package/src/config/formatter.ts +0 -17
  336. package/src/config/history.ts +0 -21
  337. package/src/config/index.ts +0 -17
  338. package/src/config/keybinds.ts +0 -127
  339. package/src/config/layout.ts +0 -10
  340. package/src/config/lsp.ts +0 -45
  341. package/src/config/managed.ts +0 -70
  342. package/src/config/markdown.ts +0 -97
  343. package/src/config/mcp.ts +0 -172
  344. package/src/config/model-id.ts +0 -14
  345. package/src/config/parse.ts +0 -44
  346. package/src/config/paths.ts +0 -85
  347. package/src/config/permission.ts +0 -76
  348. package/src/config/plugin.ts +0 -88
  349. package/src/config/provider.ts +0 -118
  350. package/src/config/server.ts +0 -20
  351. package/src/config/skills.ts +0 -16
  352. package/src/config/variable.ts +0 -90
  353. package/src/control-plane/adaptors/index.ts +0 -52
  354. package/src/control-plane/adaptors/worktree.ts +0 -47
  355. package/src/control-plane/dev/debug-workspace-plugin.ts +0 -73
  356. package/src/control-plane/schema.ts +0 -19
  357. package/src/control-plane/sse.ts +0 -66
  358. package/src/control-plane/types.ts +0 -34
  359. package/src/control-plane/util.ts +0 -37
  360. package/src/control-plane/workspace-context.ts +0 -26
  361. package/src/control-plane/workspace.sql.ts +0 -17
  362. package/src/control-plane/workspace.ts +0 -615
  363. package/src/effect/app-runtime.ts +0 -146
  364. package/src/effect/bootstrap-runtime.ts +0 -33
  365. package/src/effect/bridge.ts +0 -48
  366. package/src/effect/cross-spawn-spawner.ts +0 -514
  367. package/src/effect/index.ts +0 -5
  368. package/src/effect/instance-ref.ts +0 -11
  369. package/src/effect/instance-registry.ts +0 -12
  370. package/src/effect/instance-state.ts +0 -81
  371. package/src/effect/logger.ts +0 -73
  372. package/src/effect/memo-map.ts +0 -3
  373. package/src/effect/observability.ts +0 -107
  374. package/src/effect/run-service.ts +0 -52
  375. package/src/effect/runner.ts +0 -210
  376. package/src/effect/runtime.ts +0 -19
  377. package/src/env/index.ts +0 -37
  378. package/src/file/ignore.ts +0 -81
  379. package/src/file/index.ts +0 -664
  380. package/src/file/protected.ts +0 -59
  381. package/src/file/ripgrep.ts +0 -485
  382. package/src/file/watcher.ts +0 -163
  383. package/src/flag/flag.ts +0 -185
  384. package/src/format/formatter.ts +0 -403
  385. package/src/format/index.ts +0 -203
  386. package/src/git/index.ts +0 -260
  387. package/src/global/index.ts +0 -54
  388. package/src/history/backfill.ts +0 -162
  389. package/src/history/extract.ts +0 -67
  390. package/src/history/fts-query.ts +0 -15
  391. package/src/history/fts.sql.ts +0 -20
  392. package/src/history/index.ts +0 -10
  393. package/src/history/resolve.ts +0 -65
  394. package/src/history/service.ts +0 -258
  395. package/src/history/writer.ts +0 -112
  396. package/src/id/id.ts +0 -87
  397. package/src/ide/index.ts +0 -73
  398. package/src/inbox/inbox-ref.ts +0 -38
  399. package/src/inbox/inbox.sql.ts +0 -26
  400. package/src/inbox/inbox.ts +0 -223
  401. package/src/inbox/index.ts +0 -3
  402. package/src/inbox/render.ts +0 -40
  403. package/src/index.ts +0 -268
  404. package/src/installation/index.ts +0 -362
  405. package/src/installation/version.ts +0 -8
  406. package/src/lsp/client.ts +0 -249
  407. package/src/lsp/diagnostic.ts +0 -29
  408. package/src/lsp/index.ts +0 -3
  409. package/src/lsp/language.ts +0 -120
  410. package/src/lsp/launch.ts +0 -21
  411. package/src/lsp/lsp.ts +0 -519
  412. package/src/lsp/server.ts +0 -1956
  413. package/src/mcp/auth.ts +0 -144
  414. package/src/mcp/index.ts +0 -939
  415. package/src/mcp/oauth-callback.ts +0 -236
  416. package/src/mcp/oauth-provider.ts +0 -214
  417. package/src/memory/fts-query.ts +0 -37
  418. package/src/memory/fts.sql.ts +0 -19
  419. package/src/memory/index.ts +0 -1
  420. package/src/memory/paths.ts +0 -116
  421. package/src/memory/reconcile.ts +0 -144
  422. package/src/memory/service.ts +0 -144
  423. package/src/metrics/client.ts +0 -40
  424. package/src/metrics/event.ts +0 -43
  425. package/src/metrics/index.ts +0 -5
  426. package/src/metrics/installation.ts +0 -18
  427. package/src/metrics/subscriber.ts +0 -58
  428. package/src/metrics/util.ts +0 -9
  429. package/src/node.ts +0 -6
  430. package/src/npm/config.ts +0 -0
  431. package/src/npm/index.ts +0 -293
  432. package/src/npmcli-config.d.ts +0 -43
  433. package/src/patch/index.ts +0 -680
  434. package/src/permission/arity.ts +0 -163
  435. package/src/permission/evaluate.ts +0 -15
  436. package/src/permission/index.ts +0 -382
  437. package/src/permission/schema.ts +0 -17
  438. package/src/plugin/checkpoint-splitover.ts +0 -60
  439. package/src/plugin/cloudflare.ts +0 -76
  440. package/src/plugin/codex.ts +0 -611
  441. package/src/plugin/github-copilot/copilot.ts +0 -368
  442. package/src/plugin/github-copilot/models.ts +0 -153
  443. package/src/plugin/index.ts +0 -637
  444. package/src/plugin/install.ts +0 -439
  445. package/src/plugin/loader.ts +0 -216
  446. package/src/plugin/matcher.ts +0 -33
  447. package/src/plugin/meta.ts +0 -188
  448. package/src/plugin/shared.ts +0 -323
  449. package/src/plugin/sleepy.ts +0 -232
  450. package/src/plugin/subagent-progress-checker.ts +0 -147
  451. package/src/project/bootstrap.ts +0 -59
  452. package/src/project/index.ts +0 -2
  453. package/src/project/instance.ts +0 -215
  454. package/src/project/project-id.ts +0 -48
  455. package/src/project/project.sql.ts +0 -16
  456. package/src/project/project.ts +0 -522
  457. package/src/project/schema.ts +0 -15
  458. package/src/project/vcs.ts +0 -227
  459. package/src/project/workspace-trust.ts +0 -67
  460. package/src/provider/auth.ts +0 -234
  461. package/src/provider/error.ts +0 -216
  462. package/src/provider/index.ts +0 -5
  463. package/src/provider/models-snapshot.d.ts +0 -2
  464. package/src/provider/models-snapshot.js +0 -3
  465. package/src/provider/models.ts +0 -180
  466. package/src/provider/provider.ts +0 -2030
  467. package/src/provider/schema.ts +0 -36
  468. package/src/provider/sdk/copilot/README.md +0 -5
  469. package/src/provider/sdk/copilot/chat/convert-to-openai-compatible-chat-messages.ts +0 -170
  470. package/src/provider/sdk/copilot/chat/get-response-metadata.ts +0 -15
  471. package/src/provider/sdk/copilot/chat/map-openai-compatible-finish-reason.ts +0 -19
  472. package/src/provider/sdk/copilot/chat/openai-compatible-api-types.ts +0 -64
  473. package/src/provider/sdk/copilot/chat/openai-compatible-chat-language-model.ts +0 -815
  474. package/src/provider/sdk/copilot/chat/openai-compatible-chat-options.ts +0 -28
  475. package/src/provider/sdk/copilot/chat/openai-compatible-metadata-extractor.ts +0 -44
  476. package/src/provider/sdk/copilot/chat/openai-compatible-prepare-tools.ts +0 -83
  477. package/src/provider/sdk/copilot/copilot-provider.ts +0 -100
  478. package/src/provider/sdk/copilot/index.ts +0 -2
  479. package/src/provider/sdk/copilot/openai-compatible-error.ts +0 -27
  480. package/src/provider/sdk/copilot/responses/convert-to-openai-responses-input.ts +0 -335
  481. package/src/provider/sdk/copilot/responses/map-openai-responses-finish-reason.ts +0 -22
  482. package/src/provider/sdk/copilot/responses/openai-config.ts +0 -18
  483. package/src/provider/sdk/copilot/responses/openai-error.ts +0 -22
  484. package/src/provider/sdk/copilot/responses/openai-responses-api-types.ts +0 -214
  485. package/src/provider/sdk/copilot/responses/openai-responses-language-model.ts +0 -1770
  486. package/src/provider/sdk/copilot/responses/openai-responses-prepare-tools.ts +0 -173
  487. package/src/provider/sdk/copilot/responses/openai-responses-settings.ts +0 -1
  488. package/src/provider/sdk/copilot/responses/tool/code-interpreter.ts +0 -87
  489. package/src/provider/sdk/copilot/responses/tool/file-search.ts +0 -127
  490. package/src/provider/sdk/copilot/responses/tool/image-generation.ts +0 -114
  491. package/src/provider/sdk/copilot/responses/tool/local-shell.ts +0 -64
  492. package/src/provider/sdk/copilot/responses/tool/web-search-preview.ts +0 -103
  493. package/src/provider/sdk/copilot/responses/tool/web-search.ts +0 -102
  494. package/src/provider/session-check.ts +0 -178
  495. package/src/provider/transform.ts +0 -1393
  496. package/src/pty/index.ts +0 -364
  497. package/src/pty/pty.bun.ts +0 -26
  498. package/src/pty/pty.node.ts +0 -27
  499. package/src/pty/pty.ts +0 -25
  500. package/src/pty/schema.ts +0 -17
  501. package/src/question/index.ts +0 -252
  502. package/src/question/schema.ts +0 -17
  503. package/src/server/adapter.bun.ts +0 -40
  504. package/src/server/adapter.node.ts +0 -66
  505. package/src/server/adapter.ts +0 -21
  506. package/src/server/auth.ts +0 -16
  507. package/src/server/error.ts +0 -53
  508. package/src/server/event.ts +0 -7
  509. package/src/server/fence.ts +0 -81
  510. package/src/server/mdns.ts +0 -60
  511. package/src/server/middleware.ts +0 -94
  512. package/src/server/projectors.ts +0 -28
  513. package/src/server/proxy.ts +0 -171
  514. package/src/server/pty-ticket.ts +0 -42
  515. package/src/server/rate-limit.ts +0 -38
  516. package/src/server/routes/control/index.ts +0 -160
  517. package/src/server/routes/control/workspace.ts +0 -203
  518. package/src/server/routes/global.ts +0 -367
  519. package/src/server/routes/instance/bash-interactive.ts +0 -82
  520. package/src/server/routes/instance/config.ts +0 -89
  521. package/src/server/routes/instance/event.ts +0 -108
  522. package/src/server/routes/instance/experimental.ts +0 -408
  523. package/src/server/routes/instance/file.ts +0 -190
  524. package/src/server/routes/instance/httpapi/config.ts +0 -51
  525. package/src/server/routes/instance/httpapi/permission.ts +0 -72
  526. package/src/server/routes/instance/httpapi/project.ts +0 -62
  527. package/src/server/routes/instance/httpapi/provider.ts +0 -142
  528. package/src/server/routes/instance/httpapi/question.ts +0 -121
  529. package/src/server/routes/instance/httpapi/server.ts +0 -153
  530. package/src/server/routes/instance/index.ts +0 -301
  531. package/src/server/routes/instance/mcp.ts +0 -260
  532. package/src/server/routes/instance/middleware.ts +0 -44
  533. package/src/server/routes/instance/permission.ts +0 -73
  534. package/src/server/routes/instance/project.ts +0 -122
  535. package/src/server/routes/instance/provider.ts +0 -158
  536. package/src/server/routes/instance/pty.ts +0 -302
  537. package/src/server/routes/instance/question.ts +0 -162
  538. package/src/server/routes/instance/session.ts +0 -1328
  539. package/src/server/routes/instance/sync.ts +0 -143
  540. package/src/server/routes/instance/trace.ts +0 -59
  541. package/src/server/routes/instance/tui.ts +0 -384
  542. package/src/server/routes/instance/workflows.ts +0 -142
  543. package/src/server/routes/ui.ts +0 -37
  544. package/src/server/server.ts +0 -146
  545. package/src/server/workspace.ts +0 -122
  546. package/src/session/auto-dream.ts +0 -123
  547. package/src/session/boundary.ts +0 -77
  548. package/src/session/budgeted-read.ts +0 -118
  549. package/src/session/checkpoint-align.ts +0 -29
  550. package/src/session/checkpoint-context.ts +0 -36
  551. package/src/session/checkpoint-paths.ts +0 -86
  552. package/src/session/checkpoint-progress-reconcile.ts +0 -111
  553. package/src/session/checkpoint-retry.ts +0 -192
  554. package/src/session/checkpoint-templates.ts +0 -114
  555. package/src/session/checkpoint-validator.ts +0 -259
  556. package/src/session/checkpoint.ts +0 -1560
  557. package/src/session/classify.ts +0 -120
  558. package/src/session/claude-import.ts +0 -381
  559. package/src/session/codex-import.ts +0 -416
  560. package/src/session/compaction.ts +0 -545
  561. package/src/session/external-import.sql.ts +0 -18
  562. package/src/session/external-import.ts +0 -136
  563. package/src/session/goal.ts +0 -232
  564. package/src/session/index.ts +0 -1
  565. package/src/session/instruction.ts +0 -276
  566. package/src/session/last-message-info.ts +0 -32
  567. package/src/session/llm-request-prefix.ts +0 -82
  568. package/src/session/llm.ts +0 -739
  569. package/src/session/max-mode.ts +0 -410
  570. package/src/session/message-v2.ts +0 -1146
  571. package/src/session/message.ts +0 -191
  572. package/src/session/opencode-import.ts +0 -281
  573. package/src/session/overflow.ts +0 -53
  574. package/src/session/prefix-capture-ref.ts +0 -48
  575. package/src/session/processor.ts +0 -983
  576. package/src/session/projectors.ts +0 -137
  577. package/src/session/prompt/anthropic.txt +0 -154
  578. package/src/session/prompt/beast.txt +0 -155
  579. package/src/session/prompt/build-switch.txt +0 -5
  580. package/src/session/prompt/codex.txt +0 -79
  581. package/src/session/prompt/compose.txt +0 -119
  582. package/src/session/prompt/copilot-gpt-5.txt +0 -143
  583. package/src/session/prompt/deepseek.txt +0 -131
  584. package/src/session/prompt/default.old.txt +0 -151
  585. package/src/session/prompt/default.txt +0 -172
  586. package/src/session/prompt/gemini.txt +0 -155
  587. package/src/session/prompt/glm.txt +0 -51
  588. package/src/session/prompt/gpt.txt +0 -107
  589. package/src/session/prompt/kimi.txt +0 -95
  590. package/src/session/prompt/max-steps.txt +0 -16
  591. package/src/session/prompt/minimax.txt +0 -140
  592. package/src/session/prompt/text-loop-recovery.ts +0 -40
  593. package/src/session/prompt/text-ngram-detection.ts +0 -87
  594. package/src/session/prompt/trinity.txt +0 -97
  595. package/src/session/prompt.ts +0 -3879
  596. package/src/session/prune.ts +0 -481
  597. package/src/session/retry.ts +0 -178
  598. package/src/session/revert.ts +0 -161
  599. package/src/session/run-state.ts +0 -135
  600. package/src/session/schema.ts +0 -36
  601. package/src/session/session.sql.ts +0 -110
  602. package/src/session/session.ts +0 -908
  603. package/src/session/status.ts +0 -89
  604. package/src/session/summary.ts +0 -163
  605. package/src/session/system.ts +0 -96
  606. package/src/session/todo.ts +0 -77
  607. package/src/session/trajectory.ts +0 -98
  608. package/src/share/index.ts +0 -2
  609. package/src/share/session.ts +0 -57
  610. package/src/share/share-next.ts +0 -381
  611. package/src/share/share.sql.ts +0 -13
  612. package/src/shell/shell.ts +0 -124
  613. package/src/skill/builtin/.bundle/self-extend/SKILL.md +0 -131
  614. package/src/skill/builtin/.bundle/self-extend/reference/hook-api.md +0 -242
  615. package/src/skill/builtin/.bundle/self-extend/reference/skill-api.md +0 -114
  616. package/src/skill/builtin/.bundle/self-extend/reference/tool-api.md +0 -115
  617. package/src/skill/builtin/.bundle/self-extend/reference/tui-api.md +0 -258
  618. package/src/skill/builtin/bundle.macro.ts +0 -30
  619. package/src/skill/builtin/extract.ts +0 -41
  620. package/src/skill/compose/.bundle/ask/SKILL.md +0 -58
  621. package/src/skill/compose/.bundle/brainstorm/SKILL.md +0 -200
  622. package/src/skill/compose/.bundle/brainstorm/scripts/frame-template.html +0 -214
  623. package/src/skill/compose/.bundle/brainstorm/scripts/helper.js +0 -88
  624. package/src/skill/compose/.bundle/brainstorm/scripts/server.cjs +0 -354
  625. package/src/skill/compose/.bundle/brainstorm/scripts/start-server.sh +0 -148
  626. package/src/skill/compose/.bundle/brainstorm/scripts/stop-server.sh +0 -56
  627. package/src/skill/compose/.bundle/brainstorm/spec-document-reviewer-prompt.md +0 -50
  628. package/src/skill/compose/.bundle/brainstorm/visual-companion.md +0 -258
  629. package/src/skill/compose/.bundle/debug/CREATION-LOG.md +0 -119
  630. package/src/skill/compose/.bundle/debug/SKILL.md +0 -297
  631. package/src/skill/compose/.bundle/debug/condition-based-waiting-example.ts +0 -158
  632. package/src/skill/compose/.bundle/debug/condition-based-waiting.md +0 -106
  633. package/src/skill/compose/.bundle/debug/defense-in-depth.md +0 -122
  634. package/src/skill/compose/.bundle/debug/find-polluter.sh +0 -63
  635. package/src/skill/compose/.bundle/debug/root-cause-tracing.md +0 -144
  636. package/src/skill/compose/.bundle/debug/test-academic.md +0 -14
  637. package/src/skill/compose/.bundle/debug/test-pressure-1.md +0 -58
  638. package/src/skill/compose/.bundle/debug/test-pressure-2.md +0 -68
  639. package/src/skill/compose/.bundle/debug/test-pressure-3.md +0 -69
  640. package/src/skill/compose/.bundle/execute/SKILL.md +0 -71
  641. package/src/skill/compose/.bundle/feedback/SKILL.md +0 -214
  642. package/src/skill/compose/.bundle/merge/SKILL.md +0 -252
  643. package/src/skill/compose/.bundle/new-skill/SKILL.md +0 -211
  644. package/src/skill/compose/.bundle/parallel/SKILL.md +0 -168
  645. package/src/skill/compose/.bundle/plan/SKILL.md +0 -183
  646. package/src/skill/compose/.bundle/plan/plan-document-reviewer-prompt.md +0 -50
  647. package/src/skill/compose/.bundle/report/SKILL.md +0 -180
  648. package/src/skill/compose/.bundle/review/SKILL.md +0 -104
  649. package/src/skill/compose/.bundle/review/code-reviewer.md +0 -178
  650. package/src/skill/compose/.bundle/subagent/SKILL.md +0 -325
  651. package/src/skill/compose/.bundle/subagent/code-quality-reviewer-prompt.md +0 -26
  652. package/src/skill/compose/.bundle/subagent/implementer-prompt.md +0 -128
  653. package/src/skill/compose/.bundle/subagent/spec-reviewer-prompt.md +0 -118
  654. package/src/skill/compose/.bundle/tdd/SKILL.md +0 -360
  655. package/src/skill/compose/.bundle/tdd/testing-anti-patterns.md +0 -299
  656. package/src/skill/compose/.bundle/verify/SKILL.md +0 -140
  657. package/src/skill/compose/.bundle/worktree/SKILL.md +0 -234
  658. package/src/skill/compose/LICENSE-karpathy +0 -28
  659. package/src/skill/compose/bundle.macro.ts +0 -30
  660. package/src/skill/compose/extract.ts +0 -85
  661. package/src/skill/discovery.ts +0 -118
  662. package/src/skill/index.ts +0 -328
  663. package/src/snapshot/index.ts +0 -777
  664. package/src/sql.d.ts +0 -4
  665. package/src/storage/db.bun.ts +0 -8
  666. package/src/storage/db.node.ts +0 -8
  667. package/src/storage/db.ts +0 -172
  668. package/src/storage/index.ts +0 -26
  669. package/src/storage/json-migration.ts +0 -426
  670. package/src/storage/read-sqlite.bun.ts +0 -11
  671. package/src/storage/read-sqlite.node.ts +0 -13
  672. package/src/storage/read-sqlite.ts +0 -10
  673. package/src/storage/schema.sql.ts +0 -10
  674. package/src/storage/schema.ts +0 -7
  675. package/src/storage/storage.ts +0 -331
  676. package/src/sync/README.md +0 -179
  677. package/src/sync/event.sql.ts +0 -16
  678. package/src/sync/index.ts +0 -278
  679. package/src/sync/schema.ts +0 -14
  680. package/src/task/events.ts +0 -28
  681. package/src/task/gate-state.ts +0 -54
  682. package/src/task/gate.ts +0 -116
  683. package/src/task/index.ts +0 -1
  684. package/src/task/registry.ts +0 -394
  685. package/src/task/schema.ts +0 -43
  686. package/src/task/task.sql.ts +0 -50
  687. package/src/team/events.ts +0 -22
  688. package/src/team/index.ts +0 -113
  689. package/src/team/schema.ts +0 -31
  690. package/src/temporary.ts +0 -33
  691. package/src/tool/actor.shell.txt +0 -72
  692. package/src/tool/actor.ts +0 -804
  693. package/src/tool/actor.txt +0 -103
  694. package/src/tool/apply_patch.ts +0 -308
  695. package/src/tool/apply_patch.txt +0 -33
  696. package/src/tool/bash-interactive.ts +0 -183
  697. package/src/tool/bash.ts +0 -704
  698. package/src/tool/bash.txt +0 -123
  699. package/src/tool/change-directory.ts +0 -91
  700. package/src/tool/codesearch.ts +0 -63
  701. package/src/tool/codesearch.txt +0 -12
  702. package/src/tool/edit.ts +0 -693
  703. package/src/tool/edit.txt +0 -10
  704. package/src/tool/external-directory.ts +0 -132
  705. package/src/tool/glob.ts +0 -100
  706. package/src/tool/glob.txt +0 -6
  707. package/src/tool/grep.ts +0 -145
  708. package/src/tool/grep.txt +0 -8
  709. package/src/tool/history.ts +0 -146
  710. package/src/tool/history.txt +0 -17
  711. package/src/tool/index.ts +0 -4
  712. package/src/tool/invalid.ts +0 -20
  713. package/src/tool/invocation-style.ts +0 -17
  714. package/src/tool/lsp.ts +0 -91
  715. package/src/tool/lsp.txt +0 -19
  716. package/src/tool/mcp-exa.ts +0 -78
  717. package/src/tool/memory-path-guard.ts +0 -162
  718. package/src/tool/memory.ts +0 -81
  719. package/src/tool/memory.txt +0 -69
  720. package/src/tool/multiedit.ts +0 -54
  721. package/src/tool/multiedit.txt +0 -41
  722. package/src/tool/notebook-edit.ts +0 -225
  723. package/src/tool/notebook-edit.txt +0 -10
  724. package/src/tool/plan-enter.txt +0 -16
  725. package/src/tool/plan-exit.txt +0 -14
  726. package/src/tool/plan.ts +0 -194
  727. package/src/tool/question.ts +0 -67
  728. package/src/tool/question.txt +0 -10
  729. package/src/tool/read-state.ts +0 -44
  730. package/src/tool/read.ts +0 -327
  731. package/src/tool/read.txt +0 -14
  732. package/src/tool/recoverable.ts +0 -35
  733. package/src/tool/registry.ts +0 -429
  734. package/src/tool/schema.ts +0 -17
  735. package/src/tool/session-cwd.ts +0 -35
  736. package/src/tool/shell-tokenize.ts +0 -374
  737. package/src/tool/shell-wrap.ts +0 -235
  738. package/src/tool/skill.ts +0 -76
  739. package/src/tool/skill.txt +0 -5
  740. package/src/tool/task.shell.txt +0 -57
  741. package/src/tool/task.ts +0 -456
  742. package/src/tool/task.txt +0 -56
  743. package/src/tool/tool.ts +0 -166
  744. package/src/tool/truncate.ts +0 -201
  745. package/src/tool/truncation-dir.ts +0 -4
  746. package/src/tool/webfetch.ts +0 -208
  747. package/src/tool/webfetch.txt +0 -13
  748. package/src/tool/websearch/index.ts +0 -104
  749. package/src/tool/websearch/sleepy.ts +0 -118
  750. package/src/tool/websearch/websearch.txt +0 -14
  751. package/src/tool/workflow.ts +0 -357
  752. package/src/tool/workflow.txt +0 -25
  753. package/src/tool/write.ts +0 -88
  754. package/src/tool/write.txt +0 -10
  755. package/src/util/abort.ts +0 -35
  756. package/src/util/archive.ts +0 -15
  757. package/src/util/color.ts +0 -17
  758. package/src/util/data-url.ts +0 -9
  759. package/src/util/defer.ts +0 -10
  760. package/src/util/effect-http-client.ts +0 -11
  761. package/src/util/effect-zod.ts +0 -367
  762. package/src/util/env-info.ts +0 -62
  763. package/src/util/error.ts +0 -78
  764. package/src/util/filesystem.ts +0 -243
  765. package/src/util/fn.ts +0 -21
  766. package/src/util/format.ts +0 -20
  767. package/src/util/iife.ts +0 -3
  768. package/src/util/index.ts +0 -14
  769. package/src/util/keybind.ts +0 -101
  770. package/src/util/lazy.ts +0 -18
  771. package/src/util/local-context.ts +0 -23
  772. package/src/util/locale.ts +0 -79
  773. package/src/util/lock.ts +0 -96
  774. package/src/util/log.ts +0 -234
  775. package/src/util/media.ts +0 -26
  776. package/src/util/network.ts +0 -9
  777. package/src/util/process.ts +0 -174
  778. package/src/util/provider-priority.ts +0 -48
  779. package/src/util/queue.ts +0 -60
  780. package/src/util/record.ts +0 -3
  781. package/src/util/rpc.ts +0 -64
  782. package/src/util/schema.ts +0 -53
  783. package/src/util/scrap.ts +0 -10
  784. package/src/util/signal.ts +0 -12
  785. package/src/util/sleepy-process.ts +0 -24
  786. package/src/util/ssrf.ts +0 -116
  787. package/src/util/timeout.ts +0 -14
  788. package/src/util/token.ts +0 -5
  789. package/src/util/tool-compat.ts +0 -144
  790. package/src/util/update-schema.ts +0 -13
  791. package/src/util/which.ts +0 -14
  792. package/src/util/wildcard.ts +0 -57
  793. package/src/workflow/builtin/compose.js +0 -749
  794. package/src/workflow/builtin/deep-research.js +0 -397
  795. package/src/workflow/builtin.ts +0 -59
  796. package/src/workflow/events.ts +0 -72
  797. package/src/workflow/meta.ts +0 -335
  798. package/src/workflow/persistence.ts +0 -312
  799. package/src/workflow/resolve.ts +0 -45
  800. package/src/workflow/runtime-ref.ts +0 -18
  801. package/src/workflow/runtime.ts +0 -1447
  802. package/src/workflow/sandbox.ts +0 -286
  803. package/src/workflow/workflow.sql.ts +0 -31
  804. package/src/workflow/workspace.ts +0 -69
  805. package/src/worktree/index.ts +0 -629
package/src/acp/agent.ts DELETED
@@ -1,1787 +0,0 @@
1
- import {
2
- RequestError,
3
- type Agent as ACPAgent,
4
- type AgentSideConnection,
5
- type AuthenticateRequest,
6
- type AuthMethod,
7
- type CancelNotification,
8
- type ForkSessionRequest,
9
- type ForkSessionResponse,
10
- type InitializeRequest,
11
- type InitializeResponse,
12
- type ListSessionsRequest,
13
- type ListSessionsResponse,
14
- type LoadSessionRequest,
15
- type NewSessionRequest,
16
- type PermissionOption,
17
- type PromptRequest,
18
- type ResumeSessionRequest,
19
- type ResumeSessionResponse,
20
- type Role,
21
- type SessionInfo,
22
- type SetSessionModelRequest,
23
- type SessionConfigOption,
24
- type SetSessionConfigOptionRequest,
25
- type SetSessionConfigOptionResponse,
26
- type SetSessionModeRequest,
27
- type SetSessionModeResponse,
28
- type ToolCallContent,
29
- type ToolKind,
30
- type Usage,
31
- } from "@agentclientprotocol/sdk"
32
-
33
- import { Log } from "../util"
34
- import { pathToFileURL } from "url"
35
- import { Filesystem } from "../util"
36
- import { Hash } from "@sleepy-ai/shared/util/hash"
37
- import { ACPSessionManager } from "./session"
38
- import type { ACPConfig } from "./types"
39
- import { Provider } from "../provider"
40
- import { ModelID, ProviderID } from "../provider/schema"
41
- import { Agent as AgentModule } from "../agent/agent"
42
- import { AppRuntime } from "@/effect/app-runtime"
43
- import { Installation } from "@/installation"
44
- import { MessageV2 } from "@/session/message-v2"
45
- import { Config } from "@/config"
46
- import { ConfigMCP } from "@/config/mcp"
47
- import { z } from "zod"
48
- import { LoadAPIKeyError } from "ai"
49
- import type { AssistantMessage, Event, OpencodeClient, SessionMessageResponse, ToolPart } from "@sleepy-ai/sdk/v2"
50
- import { applyPatch } from "diff"
51
- import { InstallationVersion } from "@/installation/version"
52
-
53
- type ModeOption = { id: string; name: string; description?: string }
54
- type ModelOption = { modelId: string; name: string }
55
-
56
- const DEFAULT_VARIANT_VALUE = "default"
57
-
58
- const log = Log.create({ service: "acp-agent" })
59
-
60
- async function getContextLimit(
61
- sdk: OpencodeClient,
62
- providerID: ProviderID,
63
- modelID: ModelID,
64
- directory: string,
65
- ): Promise<number | null> {
66
- const providers = await sdk.config
67
- .providers({ directory })
68
- .then((x) => x.data?.providers ?? [])
69
- .catch((error) => {
70
- log.error("failed to get providers for context limit", { error })
71
- return []
72
- })
73
-
74
- const provider = providers.find((p) => p.id === providerID)
75
- const model = provider?.models[modelID]
76
- return model?.limit.context ?? null
77
- }
78
-
79
- async function sendUsageUpdate(
80
- connection: AgentSideConnection,
81
- sdk: OpencodeClient,
82
- sessionID: string,
83
- directory: string,
84
- ): Promise<void> {
85
- const messages = await sdk.session
86
- .messages({ sessionID, directory, agent_id: "main" }, { throwOnError: true })
87
- .then((x) => x.data)
88
- .catch((error) => {
89
- log.error("failed to fetch messages for usage update", { error })
90
- return undefined
91
- })
92
-
93
- if (!messages) return
94
-
95
- const assistantMessages = messages.filter(
96
- (m): m is { info: AssistantMessage; parts: SessionMessageResponse["parts"] } => m.info.role === "assistant",
97
- )
98
-
99
- const lastAssistant = assistantMessages[assistantMessages.length - 1]
100
- if (!lastAssistant) return
101
-
102
- const msg = lastAssistant.info
103
- if (!msg.providerID || !msg.modelID) return
104
- const size = await getContextLimit(sdk, ProviderID.make(msg.providerID), ModelID.make(msg.modelID), directory)
105
-
106
- if (!size) {
107
- // Cannot calculate usage without known context size
108
- return
109
- }
110
-
111
- const used = msg.tokens.input + (msg.tokens.cache?.read ?? 0)
112
- const totalCost = assistantMessages.reduce((sum, m) => sum + m.info.cost, 0)
113
-
114
- await connection
115
- .sessionUpdate({
116
- sessionId: sessionID,
117
- update: {
118
- sessionUpdate: "usage_update",
119
- used,
120
- size,
121
- cost: { amount: totalCost, currency: "USD" },
122
- },
123
- })
124
- .catch((error) => {
125
- log.error("failed to send usage update", { error })
126
- })
127
- }
128
-
129
- export async function init({ sdk: _sdk }: { sdk: OpencodeClient }) {
130
- return {
131
- create: (connection: AgentSideConnection, fullConfig: ACPConfig) => {
132
- return new Agent(connection, fullConfig)
133
- },
134
- }
135
- }
136
-
137
- export class Agent implements ACPAgent {
138
- private connection: AgentSideConnection
139
- private config: ACPConfig
140
- private sdk: OpencodeClient
141
- private sessionManager: ACPSessionManager
142
- private eventAbort = new AbortController()
143
- private eventStarted = false
144
- private bashSnapshots = new Map<string, string>()
145
- private toolStarts = new Set<string>()
146
- private permissionQueues = new Map<string, Promise<void>>()
147
- private permissionOptions: PermissionOption[] = [
148
- { optionId: "once", kind: "allow_once", name: "Allow once" },
149
- { optionId: "always", kind: "allow_always", name: "Always allow" },
150
- { optionId: "reject", kind: "reject_once", name: "Reject" },
151
- ]
152
-
153
- constructor(connection: AgentSideConnection, config: ACPConfig) {
154
- this.connection = connection
155
- this.config = config
156
- this.sdk = config.sdk
157
- this.sessionManager = new ACPSessionManager(this.sdk)
158
- this.startEventSubscription()
159
- }
160
-
161
- private startEventSubscription() {
162
- if (this.eventStarted) return
163
- this.eventStarted = true
164
- this.runEventSubscription().catch((error) => {
165
- if (this.eventAbort.signal.aborted) return
166
- log.error("event subscription failed", { error })
167
- })
168
- }
169
-
170
- private async runEventSubscription() {
171
- while (true) {
172
- if (this.eventAbort.signal.aborted) return
173
- const events = await this.sdk.global.event({
174
- signal: this.eventAbort.signal,
175
- })
176
- for await (const event of events.stream) {
177
- if (this.eventAbort.signal.aborted) return
178
- const payload = event?.payload
179
- if (!payload) continue
180
- await this.handleEvent(payload as Event).catch((error) => {
181
- log.error("failed to handle event", { error, type: payload.type })
182
- })
183
- }
184
- }
185
- }
186
-
187
- private async handleEvent(event: Event) {
188
- switch (event.type) {
189
- case "permission.asked": {
190
- const permission = event.properties
191
- const session = this.sessionManager.tryGet(permission.sessionID)
192
- if (!session) return
193
-
194
- const prev = this.permissionQueues.get(permission.sessionID) ?? Promise.resolve()
195
- const next = prev
196
- .then(async () => {
197
- const directory = session.cwd
198
-
199
- const res = await this.connection
200
- .requestPermission({
201
- sessionId: permission.sessionID,
202
- toolCall: {
203
- toolCallId: permission.tool?.callID ?? permission.id,
204
- status: "pending",
205
- title: permission.permission,
206
- rawInput: permission.metadata,
207
- kind: toToolKind(permission.permission),
208
- locations: toLocations(permission.permission, permission.metadata),
209
- },
210
- options: this.permissionOptions,
211
- })
212
- .catch(async (error) => {
213
- log.error("failed to request permission from ACP", {
214
- error,
215
- permissionID: permission.id,
216
- sessionID: permission.sessionID,
217
- })
218
- await this.sdk.permission.reply({
219
- requestID: permission.id,
220
- reply: "reject",
221
- directory,
222
- })
223
- return undefined
224
- })
225
-
226
- if (!res) return
227
- if (res.outcome.outcome !== "selected") {
228
- await this.sdk.permission.reply({
229
- requestID: permission.id,
230
- reply: "reject",
231
- directory,
232
- })
233
- return
234
- }
235
-
236
- if (res.outcome.optionId !== "reject" && permission.permission == "edit") {
237
- const metadata = permission.metadata || {}
238
- const filepath = typeof metadata["filepath"] === "string" ? metadata["filepath"] : ""
239
- const diff = typeof metadata["diff"] === "string" ? metadata["diff"] : ""
240
- const content = (await Filesystem.exists(filepath)) ? await Filesystem.readText(filepath) : ""
241
- const newContent = getNewContent(content, diff)
242
-
243
- if (newContent) {
244
- void this.connection.writeTextFile({
245
- sessionId: session.id,
246
- path: filepath,
247
- content: newContent,
248
- })
249
- }
250
- }
251
-
252
- await this.sdk.permission.reply({
253
- requestID: permission.id,
254
- reply: res.outcome.optionId as "once" | "always" | "reject",
255
- directory,
256
- })
257
- })
258
- .catch((error) => {
259
- log.error("failed to handle permission", { error, permissionID: permission.id })
260
- })
261
- .finally(() => {
262
- if (this.permissionQueues.get(permission.sessionID) === next) {
263
- this.permissionQueues.delete(permission.sessionID)
264
- }
265
- })
266
- this.permissionQueues.set(permission.sessionID, next)
267
- return
268
- }
269
-
270
- case "message.part.updated": {
271
- log.info("message part updated", { event: event.properties })
272
- const props = event.properties
273
- const part = props.part
274
- const session = this.sessionManager.tryGet(part.sessionID)
275
- if (!session) return
276
- const sessionId = session.id
277
-
278
- if (part.type === "tool") {
279
- await this.toolStart(sessionId, part)
280
-
281
- switch (part.state.status) {
282
- case "pending":
283
- this.bashSnapshots.delete(part.callID)
284
- return
285
-
286
- case "running":
287
- const output = this.bashOutput(part)
288
- const content: ToolCallContent[] = []
289
- if (output) {
290
- const hash = Hash.fast(output)
291
- if (part.tool === "bash") {
292
- if (this.bashSnapshots.get(part.callID) === hash) {
293
- await this.connection
294
- .sessionUpdate({
295
- sessionId,
296
- update: {
297
- sessionUpdate: "tool_call_update",
298
- toolCallId: part.callID,
299
- status: "in_progress",
300
- kind: toToolKind(part.tool),
301
- title: part.tool,
302
- locations: toLocations(part.tool, part.state.input),
303
- rawInput: part.state.input,
304
- },
305
- })
306
- .catch((error) => {
307
- log.error("failed to send tool in_progress to ACP", { error })
308
- })
309
- return
310
- }
311
- this.bashSnapshots.set(part.callID, hash)
312
- }
313
- content.push({
314
- type: "content",
315
- content: {
316
- type: "text",
317
- text: output,
318
- },
319
- })
320
- }
321
- await this.connection
322
- .sessionUpdate({
323
- sessionId,
324
- update: {
325
- sessionUpdate: "tool_call_update",
326
- toolCallId: part.callID,
327
- status: "in_progress",
328
- kind: toToolKind(part.tool),
329
- title: part.tool,
330
- locations: toLocations(part.tool, part.state.input),
331
- rawInput: part.state.input,
332
- ...(content.length > 0 && { content }),
333
- },
334
- })
335
- .catch((error) => {
336
- log.error("failed to send tool in_progress to ACP", { error })
337
- })
338
- return
339
-
340
- case "completed": {
341
- this.toolStarts.delete(part.callID)
342
- this.bashSnapshots.delete(part.callID)
343
- const kind = toToolKind(part.tool)
344
- const content: ToolCallContent[] = [
345
- {
346
- type: "content",
347
- content: {
348
- type: "text",
349
- text: part.state.output,
350
- },
351
- },
352
- ]
353
-
354
- if (kind === "edit") {
355
- const diff = editDiffContent(part.state.input)
356
- content.push({
357
- type: "diff",
358
- path: diff.path,
359
- oldText: diff.oldText,
360
- newText: diff.newText,
361
- })
362
- }
363
-
364
- await this.connection
365
- .sessionUpdate({
366
- sessionId,
367
- update: {
368
- sessionUpdate: "tool_call_update",
369
- toolCallId: part.callID,
370
- status: "completed",
371
- kind,
372
- content,
373
- title: part.state.title,
374
- rawInput: part.state.input,
375
- rawOutput: {
376
- output: part.state.output,
377
- metadata: part.state.metadata,
378
- },
379
- },
380
- })
381
- .catch((error) => {
382
- log.error("failed to send tool completed to ACP", { error })
383
- })
384
- return
385
- }
386
- case "error":
387
- this.toolStarts.delete(part.callID)
388
- this.bashSnapshots.delete(part.callID)
389
- await this.connection
390
- .sessionUpdate({
391
- sessionId,
392
- update: {
393
- sessionUpdate: "tool_call_update",
394
- toolCallId: part.callID,
395
- status: "failed",
396
- kind: toToolKind(part.tool),
397
- title: part.tool,
398
- rawInput: part.state.input,
399
- content: [
400
- {
401
- type: "content",
402
- content: {
403
- type: "text",
404
- text: part.state.error,
405
- },
406
- },
407
- ],
408
- rawOutput: {
409
- error: part.state.error,
410
- metadata: part.state.metadata,
411
- },
412
- },
413
- })
414
- .catch((error) => {
415
- log.error("failed to send tool error to ACP", { error })
416
- })
417
- return
418
- }
419
- }
420
-
421
- // ACP clients already know the prompt they just submitted, so replaying
422
- // live user parts duplicates the message. We still replay user history in
423
- // loadSession() and forkSession() via processMessage().
424
- if (part.type !== "text" && part.type !== "file") return
425
-
426
- return
427
- }
428
-
429
- case "message.part.delta": {
430
- const props = event.properties
431
- const session = this.sessionManager.tryGet(props.sessionID)
432
- if (!session) return
433
- const sessionId = session.id
434
-
435
- const message = await this.sdk.session
436
- .message(
437
- {
438
- sessionID: props.sessionID,
439
- messageID: props.messageID,
440
- directory: session.cwd,
441
- },
442
- { throwOnError: true },
443
- )
444
- .then((x) => x.data)
445
- .catch((error) => {
446
- log.error("unexpected error when fetching message", { error })
447
- return undefined
448
- })
449
-
450
- if (!message || message.info.role !== "assistant") return
451
-
452
- const part = message.parts.find((p) => p.id === props.partID)
453
- if (!part) return
454
-
455
- if (part.type === "text" && props.field === "text" && part.ignored !== true) {
456
- await this.connection
457
- .sessionUpdate({
458
- sessionId,
459
- update: {
460
- sessionUpdate: "agent_message_chunk",
461
- messageId: props.messageID,
462
- content: {
463
- type: "text",
464
- text: props.delta,
465
- },
466
- },
467
- })
468
- .catch((error) => {
469
- log.error("failed to send text delta to ACP", { error })
470
- })
471
- return
472
- }
473
-
474
- if (part.type === "reasoning" && props.field === "text") {
475
- await this.connection
476
- .sessionUpdate({
477
- sessionId,
478
- update: {
479
- sessionUpdate: "agent_thought_chunk",
480
- messageId: props.messageID,
481
- content: {
482
- type: "text",
483
- text: props.delta,
484
- },
485
- },
486
- })
487
- .catch((error) => {
488
- log.error("failed to send reasoning delta to ACP", { error })
489
- })
490
- }
491
- return
492
- }
493
- }
494
- }
495
-
496
- async initialize(params: InitializeRequest): Promise<InitializeResponse> {
497
- log.info("initialize", { protocolVersion: params.protocolVersion })
498
-
499
- const authMethod: AuthMethod = {
500
- description: "Run `opencode auth login` in the terminal",
501
- name: "Login with opencode",
502
- id: "opencode-login",
503
- }
504
-
505
- // If client supports terminal-auth capability, use that instead.
506
- if (params.clientCapabilities?._meta?.["terminal-auth"] === true) {
507
- authMethod._meta = {
508
- "terminal-auth": {
509
- command: "opencode",
510
- args: ["auth", "login"],
511
- label: "OpenCode Login",
512
- },
513
- }
514
- }
515
-
516
- return {
517
- protocolVersion: 1,
518
- agentCapabilities: {
519
- loadSession: true,
520
- mcpCapabilities: {
521
- http: true,
522
- sse: true,
523
- },
524
- promptCapabilities: {
525
- embeddedContext: true,
526
- image: true,
527
- },
528
- sessionCapabilities: {
529
- fork: {},
530
- list: {},
531
- resume: {},
532
- },
533
- },
534
- authMethods: [authMethod],
535
- agentInfo: {
536
- name: "OpenCode",
537
- version: InstallationVersion,
538
- },
539
- }
540
- }
541
-
542
- async authenticate(_params: AuthenticateRequest) {
543
- throw new Error("Authentication not implemented")
544
- }
545
-
546
- async newSession(params: NewSessionRequest) {
547
- const directory = params.cwd
548
- try {
549
- const model = await defaultModel(this.config, directory)
550
-
551
- // Store ACP session state
552
- const state = await this.sessionManager.create(params.cwd, params.mcpServers, model)
553
- const sessionId = state.id
554
-
555
- log.info("creating_session", { sessionId, mcpServers: params.mcpServers.length })
556
-
557
- const load = await this.loadSessionMode({
558
- cwd: directory,
559
- mcpServers: params.mcpServers,
560
- sessionId,
561
- })
562
-
563
- return {
564
- sessionId,
565
- configOptions: load.configOptions,
566
- models: load.models,
567
- modes: load.modes,
568
- _meta: load._meta,
569
- }
570
- } catch (e) {
571
- const error = MessageV2.fromError(e, {
572
- providerID: ProviderID.make(this.config.defaultModel?.providerID ?? "unknown"),
573
- })
574
- if (LoadAPIKeyError.isInstance(error)) {
575
- throw RequestError.authRequired()
576
- }
577
- throw e
578
- }
579
- }
580
-
581
- async loadSession(params: LoadSessionRequest) {
582
- const directory = params.cwd
583
- const sessionId = params.sessionId
584
-
585
- try {
586
- const model = await defaultModel(this.config, directory)
587
-
588
- // Store ACP session state
589
- await this.sessionManager.load(sessionId, params.cwd, params.mcpServers, model)
590
-
591
- log.info("load_session", { sessionId, mcpServers: params.mcpServers.length })
592
-
593
- const result = await this.loadSessionMode({
594
- cwd: directory,
595
- mcpServers: params.mcpServers,
596
- sessionId,
597
- })
598
-
599
- // Replay session history
600
- const messages = await this.sdk.session
601
- .messages(
602
- {
603
- sessionID: sessionId,
604
- directory,
605
- agent_id: "main",
606
- },
607
- { throwOnError: true },
608
- )
609
- .then((x) => x.data)
610
- .catch((err) => {
611
- log.error("unexpected error when fetching message", { error: err })
612
- return undefined
613
- })
614
-
615
- const lastUser = messages?.findLast((m) => m.info.role === "user")?.info
616
- if (lastUser?.role === "user") {
617
- result.models.currentModelId = `${lastUser.model.providerID}/${lastUser.model.modelID}`
618
- this.sessionManager.setModel(sessionId, {
619
- providerID: ProviderID.make(lastUser.model.providerID),
620
- modelID: ModelID.make(lastUser.model.modelID),
621
- })
622
- if (result.modes?.availableModes.some((m) => m.id === lastUser.agent)) {
623
- result.modes.currentModeId = lastUser.agent
624
- this.sessionManager.setMode(sessionId, lastUser.agent)
625
- }
626
- result.configOptions = buildConfigOptions({
627
- currentModelId: result.models.currentModelId,
628
- availableModels: result.models.availableModels,
629
- modes: result.modes,
630
- })
631
- }
632
-
633
- for (const msg of messages ?? []) {
634
- log.debug("replay message", msg)
635
- await this.processMessage(msg)
636
- }
637
-
638
- await sendUsageUpdate(this.connection, this.sdk, sessionId, directory)
639
-
640
- return result
641
- } catch (e) {
642
- const error = MessageV2.fromError(e, {
643
- providerID: ProviderID.make(this.config.defaultModel?.providerID ?? "unknown"),
644
- })
645
- if (LoadAPIKeyError.isInstance(error)) {
646
- throw RequestError.authRequired()
647
- }
648
- throw e
649
- }
650
- }
651
-
652
- async listSessions(params: ListSessionsRequest): Promise<ListSessionsResponse> {
653
- try {
654
- const cursor = params.cursor ? Number(params.cursor) : undefined
655
- const limit = 100
656
-
657
- const sessions = await this.sdk.session
658
- .list(
659
- {
660
- directory: params.cwd ?? undefined,
661
- roots: true,
662
- },
663
- { throwOnError: true },
664
- )
665
- .then((x) => x.data ?? [])
666
-
667
- const sorted = sessions.toSorted((a, b) => b.time.updated - a.time.updated)
668
- const filtered = cursor ? sorted.filter((s) => s.time.updated < cursor) : sorted
669
- const page = filtered.slice(0, limit)
670
-
671
- const entries: SessionInfo[] = page.map((session) => ({
672
- sessionId: session.id,
673
- cwd: session.directory,
674
- title: session.title,
675
- updatedAt: new Date(session.time.updated).toISOString(),
676
- }))
677
-
678
- const last = page[page.length - 1]
679
- const next = filtered.length > limit && last ? String(last.time.updated) : undefined
680
-
681
- const response: ListSessionsResponse = {
682
- sessions: entries,
683
- }
684
- if (next) response.nextCursor = next
685
- return response
686
- } catch (e) {
687
- const error = MessageV2.fromError(e, {
688
- providerID: ProviderID.make(this.config.defaultModel?.providerID ?? "unknown"),
689
- })
690
- if (LoadAPIKeyError.isInstance(error)) {
691
- throw RequestError.authRequired()
692
- }
693
- throw e
694
- }
695
- }
696
-
697
- async unstable_forkSession(params: ForkSessionRequest): Promise<ForkSessionResponse> {
698
- const directory = params.cwd
699
- const mcpServers = params.mcpServers ?? []
700
-
701
- try {
702
- const model = await defaultModel(this.config, directory)
703
-
704
- const forked = await this.sdk.session
705
- .fork(
706
- {
707
- sessionID: params.sessionId,
708
- directory,
709
- },
710
- { throwOnError: true },
711
- )
712
- .then((x) => x.data)
713
-
714
- if (!forked) {
715
- throw new Error("Fork session returned no data")
716
- }
717
-
718
- const sessionId = forked.id
719
- await this.sessionManager.load(sessionId, directory, mcpServers, model)
720
-
721
- log.info("fork_session", { sessionId, mcpServers: mcpServers.length })
722
-
723
- const mode = await this.loadSessionMode({
724
- cwd: directory,
725
- mcpServers,
726
- sessionId,
727
- })
728
-
729
- const messages = await this.sdk.session
730
- .messages(
731
- {
732
- sessionID: sessionId,
733
- directory,
734
- agent_id: "main",
735
- },
736
- { throwOnError: true },
737
- )
738
- .then((x) => x.data)
739
- .catch((err) => {
740
- log.error("unexpected error when fetching message", { error: err })
741
- return undefined
742
- })
743
-
744
- for (const msg of messages ?? []) {
745
- log.debug("replay message", msg)
746
- await this.processMessage(msg)
747
- }
748
-
749
- await sendUsageUpdate(this.connection, this.sdk, sessionId, directory)
750
-
751
- return mode
752
- } catch (e) {
753
- const error = MessageV2.fromError(e, {
754
- providerID: ProviderID.make(this.config.defaultModel?.providerID ?? "unknown"),
755
- })
756
- if (LoadAPIKeyError.isInstance(error)) {
757
- throw RequestError.authRequired()
758
- }
759
- throw e
760
- }
761
- }
762
-
763
- async unstable_resumeSession(params: ResumeSessionRequest): Promise<ResumeSessionResponse> {
764
- const directory = params.cwd
765
- const sessionId = params.sessionId
766
- const mcpServers = params.mcpServers ?? []
767
-
768
- try {
769
- const model = await defaultModel(this.config, directory)
770
- await this.sessionManager.load(sessionId, directory, mcpServers, model)
771
-
772
- log.info("resume_session", { sessionId, mcpServers: mcpServers.length })
773
-
774
- const result = await this.loadSessionMode({
775
- cwd: directory,
776
- mcpServers,
777
- sessionId,
778
- })
779
-
780
- await sendUsageUpdate(this.connection, this.sdk, sessionId, directory)
781
-
782
- return result
783
- } catch (e) {
784
- const error = MessageV2.fromError(e, {
785
- providerID: ProviderID.make(this.config.defaultModel?.providerID ?? "unknown"),
786
- })
787
- if (LoadAPIKeyError.isInstance(error)) {
788
- throw RequestError.authRequired()
789
- }
790
- throw e
791
- }
792
- }
793
-
794
- private async processMessage(message: SessionMessageResponse) {
795
- log.debug("process message", message)
796
- if (message.info.role !== "assistant" && message.info.role !== "user") return
797
- const sessionId = message.info.sessionID
798
-
799
- for (const part of message.parts) {
800
- if (part.type === "tool") {
801
- await this.toolStart(sessionId, part)
802
- switch (part.state.status) {
803
- case "pending":
804
- this.bashSnapshots.delete(part.callID)
805
- break
806
- case "running":
807
- const output = this.bashOutput(part)
808
- const runningContent: ToolCallContent[] = []
809
- if (output) {
810
- runningContent.push({
811
- type: "content",
812
- content: {
813
- type: "text",
814
- text: output,
815
- },
816
- })
817
- }
818
- await this.connection
819
- .sessionUpdate({
820
- sessionId,
821
- update: {
822
- sessionUpdate: "tool_call_update",
823
- toolCallId: part.callID,
824
- status: "in_progress",
825
- kind: toToolKind(part.tool),
826
- title: part.tool,
827
- locations: toLocations(part.tool, part.state.input),
828
- rawInput: part.state.input,
829
- ...(runningContent.length > 0 && { content: runningContent }),
830
- },
831
- })
832
- .catch((err) => {
833
- log.error("failed to send tool in_progress to ACP", { error: err })
834
- })
835
- break
836
- case "completed":
837
- this.toolStarts.delete(part.callID)
838
- this.bashSnapshots.delete(part.callID)
839
- const kind = toToolKind(part.tool)
840
- const content: ToolCallContent[] = [
841
- {
842
- type: "content",
843
- content: {
844
- type: "text",
845
- text: part.state.output,
846
- },
847
- },
848
- ]
849
-
850
- if (kind === "edit") {
851
- const diff = editDiffContent(part.state.input)
852
- content.push({
853
- type: "diff",
854
- path: diff.path,
855
- oldText: diff.oldText,
856
- newText: diff.newText,
857
- })
858
- }
859
-
860
- await this.connection
861
- .sessionUpdate({
862
- sessionId,
863
- update: {
864
- sessionUpdate: "tool_call_update",
865
- toolCallId: part.callID,
866
- status: "completed",
867
- kind,
868
- content,
869
- title: part.state.title,
870
- rawInput: part.state.input,
871
- rawOutput: {
872
- output: part.state.output,
873
- metadata: part.state.metadata,
874
- },
875
- },
876
- })
877
- .catch((err) => {
878
- log.error("failed to send tool completed to ACP", { error: err })
879
- })
880
- break
881
- case "error":
882
- this.toolStarts.delete(part.callID)
883
- this.bashSnapshots.delete(part.callID)
884
- await this.connection
885
- .sessionUpdate({
886
- sessionId,
887
- update: {
888
- sessionUpdate: "tool_call_update",
889
- toolCallId: part.callID,
890
- status: "failed",
891
- kind: toToolKind(part.tool),
892
- title: part.tool,
893
- rawInput: part.state.input,
894
- content: [
895
- {
896
- type: "content",
897
- content: {
898
- type: "text",
899
- text: part.state.error,
900
- },
901
- },
902
- ],
903
- rawOutput: {
904
- error: part.state.error,
905
- metadata: part.state.metadata,
906
- },
907
- },
908
- })
909
- .catch((err) => {
910
- log.error("failed to send tool error to ACP", { error: err })
911
- })
912
- break
913
- }
914
- } else if (part.type === "text") {
915
- if (part.text) {
916
- const audience: Role[] | undefined = part.synthetic ? ["assistant"] : part.ignored ? ["user"] : undefined
917
- await this.connection
918
- .sessionUpdate({
919
- sessionId,
920
- update: {
921
- sessionUpdate: message.info.role === "user" ? "user_message_chunk" : "agent_message_chunk",
922
- messageId: message.info.id,
923
- content: {
924
- type: "text",
925
- text: part.text,
926
- ...(audience && { annotations: { audience } }),
927
- },
928
- },
929
- })
930
- .catch((err) => {
931
- log.error("failed to send text to ACP", { error: err })
932
- })
933
- }
934
- } else if (part.type === "file") {
935
- // Replay file attachments as appropriate ACP content blocks.
936
- // OpenCode stores files internally as { type: "file", url, filename, mime }.
937
- // We convert these back to ACP blocks based on the URL scheme and MIME type:
938
- // - file:// URLs → resource_link
939
- // - data: URLs with image/* → image block
940
- // - data: URLs with text/* or application/json → resource with text
941
- // - data: URLs with other types → resource with blob
942
- const url = part.url
943
- const filename = part.filename ?? "file"
944
- const mime = part.mime || "application/octet-stream"
945
- const messageChunk = message.info.role === "user" ? "user_message_chunk" : "agent_message_chunk"
946
-
947
- if (url.startsWith("file://")) {
948
- // Local file reference - send as resource_link
949
- await this.connection
950
- .sessionUpdate({
951
- sessionId,
952
- update: {
953
- sessionUpdate: messageChunk,
954
- messageId: message.info.id,
955
- content: { type: "resource_link", uri: url, name: filename, mimeType: mime },
956
- },
957
- })
958
- .catch((err) => {
959
- log.error("failed to send resource_link to ACP", { error: err })
960
- })
961
- } else if (url.startsWith("data:")) {
962
- // Embedded content - parse data URL and send as appropriate block type
963
- const base64Match = url.match(/^data:([^;]+);base64,(.*)$/)
964
- const dataMime = base64Match?.[1]
965
- const base64Data = base64Match?.[2] ?? ""
966
-
967
- const effectiveMime = dataMime || mime
968
-
969
- if (effectiveMime.startsWith("image/")) {
970
- // Image - send as image block
971
- await this.connection
972
- .sessionUpdate({
973
- sessionId,
974
- update: {
975
- sessionUpdate: messageChunk,
976
- messageId: message.info.id,
977
- content: {
978
- type: "image",
979
- mimeType: effectiveMime,
980
- data: base64Data,
981
- uri: pathToFileURL(filename).href,
982
- },
983
- },
984
- })
985
- .catch((err) => {
986
- log.error("failed to send image to ACP", { error: err })
987
- })
988
- } else {
989
- // Non-image: text types get decoded, binary types stay as blob
990
- const isText = effectiveMime.startsWith("text/") || effectiveMime === "application/json"
991
- const fileUri = pathToFileURL(filename).href
992
- const resource = isText
993
- ? {
994
- uri: fileUri,
995
- mimeType: effectiveMime,
996
- text: Buffer.from(base64Data, "base64").toString("utf-8"),
997
- }
998
- : { uri: fileUri, mimeType: effectiveMime, blob: base64Data }
999
-
1000
- await this.connection
1001
- .sessionUpdate({
1002
- sessionId,
1003
- update: {
1004
- sessionUpdate: messageChunk,
1005
- messageId: message.info.id,
1006
- content: { type: "resource", resource },
1007
- },
1008
- })
1009
- .catch((err) => {
1010
- log.error("failed to send resource to ACP", { error: err })
1011
- })
1012
- }
1013
- }
1014
- // URLs that don't match file:// or data: are skipped (unsupported)
1015
- } else if (part.type === "reasoning") {
1016
- if (part.text) {
1017
- await this.connection
1018
- .sessionUpdate({
1019
- sessionId,
1020
- update: {
1021
- sessionUpdate: "agent_thought_chunk",
1022
- messageId: message.info.id,
1023
- content: {
1024
- type: "text",
1025
- text: part.text,
1026
- },
1027
- },
1028
- })
1029
- .catch((err) => {
1030
- log.error("failed to send reasoning to ACP", { error: err })
1031
- })
1032
- }
1033
- }
1034
- }
1035
- }
1036
-
1037
- private bashOutput(part: ToolPart) {
1038
- if (part.tool !== "bash") return
1039
- if (!("metadata" in part.state) || !part.state.metadata || typeof part.state.metadata !== "object") return
1040
- const output = part.state.metadata["output"]
1041
- if (typeof output !== "string") return
1042
- return output
1043
- }
1044
-
1045
- private async toolStart(sessionId: string, part: ToolPart) {
1046
- if (this.toolStarts.has(part.callID)) return
1047
- this.toolStarts.add(part.callID)
1048
- await this.connection
1049
- .sessionUpdate({
1050
- sessionId,
1051
- update: {
1052
- sessionUpdate: "tool_call",
1053
- toolCallId: part.callID,
1054
- title: part.tool,
1055
- kind: toToolKind(part.tool),
1056
- status: "pending",
1057
- locations: [],
1058
- rawInput: {},
1059
- },
1060
- })
1061
- .catch((error) => {
1062
- log.error("failed to send tool pending to ACP", { error })
1063
- })
1064
- }
1065
-
1066
- private async loadAvailableModes(directory: string): Promise<ModeOption[]> {
1067
- const agents = await this.config.sdk.app
1068
- .agents(
1069
- {
1070
- directory,
1071
- },
1072
- { throwOnError: true },
1073
- )
1074
- .then((resp) => resp.data!)
1075
-
1076
- return agents
1077
- .filter((agent) => agent.mode !== "subagent" && !agent.hidden)
1078
- .map((agent) => ({
1079
- id: agent.name,
1080
- name: agent.name,
1081
- description: agent.description,
1082
- }))
1083
- }
1084
-
1085
- private async resolveModeState(
1086
- directory: string,
1087
- sessionId: string,
1088
- ): Promise<{ availableModes: ModeOption[]; currentModeId?: string }> {
1089
- const availableModes = await this.loadAvailableModes(directory)
1090
- const currentModeId =
1091
- this.sessionManager.get(sessionId).modeId ||
1092
- (await (async () => {
1093
- if (!availableModes.length) return undefined
1094
- const defaultAgentName = await AppRuntime.runPromise(AgentModule.Service.use((svc) => svc.defaultAgent()))
1095
- const resolvedModeId = availableModes.find((mode) => mode.name === defaultAgentName)?.id ?? availableModes[0].id
1096
- this.sessionManager.setMode(sessionId, resolvedModeId)
1097
- return resolvedModeId
1098
- })())
1099
-
1100
- return { availableModes, currentModeId }
1101
- }
1102
-
1103
- private async loadSessionMode(params: LoadSessionRequest) {
1104
- const directory = params.cwd
1105
- const model = await defaultModel(this.config, directory)
1106
- const sessionId = params.sessionId
1107
-
1108
- const providers = await this.sdk.config.providers({ directory }).then((x) => x.data!.providers)
1109
- const entries = sortProvidersByName(providers)
1110
- const availableVariants = modelVariantsFromProviders(entries, model)
1111
- const currentVariant = this.sessionManager.getVariant(sessionId)
1112
- if (currentVariant && !availableVariants.includes(currentVariant)) {
1113
- this.sessionManager.setVariant(sessionId, undefined)
1114
- }
1115
- const availableModels = buildAvailableModels(entries, { includeVariants: true })
1116
- const modeState = await this.resolveModeState(directory, sessionId)
1117
- const currentModeId = modeState.currentModeId
1118
- const modes = currentModeId
1119
- ? {
1120
- availableModes: modeState.availableModes,
1121
- currentModeId,
1122
- }
1123
- : undefined
1124
-
1125
- const commands = await this.config.sdk.command
1126
- .list(
1127
- {
1128
- directory,
1129
- },
1130
- { throwOnError: true },
1131
- )
1132
- .then((resp) => resp.data!)
1133
-
1134
- const availableCommands = commands.map((command) => ({
1135
- name: command.name,
1136
- description: command.description ?? "",
1137
- }))
1138
- const names = new Set(availableCommands.map((c) => c.name))
1139
- if (!names.has("compact"))
1140
- availableCommands.push({
1141
- name: "compact",
1142
- description: "summarize the session to reduce context",
1143
- })
1144
-
1145
- const mcpServers: Record<string, ConfigMCP.Info> = {}
1146
- for (const server of params.mcpServers) {
1147
- if ("type" in server) {
1148
- mcpServers[server.name] = {
1149
- url: server.url,
1150
- headers: server.headers.reduce<Record<string, string>>((acc, { name, value }) => {
1151
- acc[name] = value
1152
- return acc
1153
- }, {}),
1154
- type: "remote",
1155
- }
1156
- } else {
1157
- mcpServers[server.name] = {
1158
- type: "local",
1159
- command: [server.command, ...server.args],
1160
- environment: server.env.reduce<Record<string, string>>((acc, { name, value }) => {
1161
- acc[name] = value
1162
- return acc
1163
- }, {}),
1164
- }
1165
- }
1166
- }
1167
-
1168
- await Promise.all(
1169
- Object.entries(mcpServers).map(async ([key, mcp]) => {
1170
- await this.sdk.mcp
1171
- .add(
1172
- {
1173
- directory,
1174
- name: key,
1175
- config: mcp,
1176
- },
1177
- { throwOnError: true },
1178
- )
1179
- .catch((error) => {
1180
- log.error("failed to add mcp server", { name: key, error })
1181
- })
1182
- }),
1183
- )
1184
-
1185
- setTimeout(() => {
1186
- void this.connection.sessionUpdate({
1187
- sessionId,
1188
- update: {
1189
- sessionUpdate: "available_commands_update",
1190
- availableCommands,
1191
- },
1192
- })
1193
- }, 0)
1194
-
1195
- return {
1196
- sessionId,
1197
- models: {
1198
- currentModelId: formatModelIdWithVariant(model, currentVariant, availableVariants, true),
1199
- availableModels,
1200
- },
1201
- modes,
1202
- configOptions: buildConfigOptions({
1203
- currentModelId: formatModelIdWithVariant(model, currentVariant, availableVariants, true),
1204
- availableModels,
1205
- modes,
1206
- }),
1207
- _meta: buildVariantMeta({
1208
- model,
1209
- variant: this.sessionManager.getVariant(sessionId),
1210
- availableVariants,
1211
- }),
1212
- }
1213
- }
1214
-
1215
- async unstable_setSessionModel(params: SetSessionModelRequest) {
1216
- const session = this.sessionManager.get(params.sessionId)
1217
- const providers = await this.sdk.config
1218
- .providers({ directory: session.cwd }, { throwOnError: true })
1219
- .then((x) => x.data!.providers)
1220
-
1221
- const selection = parseModelSelection(params.modelId, providers)
1222
- this.sessionManager.setModel(session.id, selection.model)
1223
- this.sessionManager.setVariant(session.id, selection.variant)
1224
-
1225
- const entries = sortProvidersByName(providers)
1226
- const availableVariants = modelVariantsFromProviders(entries, selection.model)
1227
-
1228
- return {
1229
- _meta: buildVariantMeta({
1230
- model: selection.model,
1231
- variant: selection.variant,
1232
- availableVariants,
1233
- }),
1234
- }
1235
- }
1236
-
1237
- async setSessionMode(params: SetSessionModeRequest): Promise<SetSessionModeResponse | void> {
1238
- const session = this.sessionManager.get(params.sessionId)
1239
- const availableModes = await this.loadAvailableModes(session.cwd)
1240
- if (!availableModes.some((mode) => mode.id === params.modeId)) {
1241
- throw new Error(`Agent not found: ${params.modeId}`)
1242
- }
1243
- this.sessionManager.setMode(params.sessionId, params.modeId)
1244
- }
1245
-
1246
- async setSessionConfigOption(params: SetSessionConfigOptionRequest): Promise<SetSessionConfigOptionResponse> {
1247
- const session = this.sessionManager.get(params.sessionId)
1248
- const providers = await this.sdk.config
1249
- .providers({ directory: session.cwd }, { throwOnError: true })
1250
- .then((x) => x.data!.providers)
1251
- const entries = sortProvidersByName(providers)
1252
-
1253
- if (params.configId === "model") {
1254
- if (typeof params.value !== "string") throw RequestError.invalidParams("model value must be a string")
1255
- const selection = parseModelSelection(params.value, providers)
1256
- this.sessionManager.setModel(session.id, selection.model)
1257
- this.sessionManager.setVariant(session.id, selection.variant)
1258
- } else if (params.configId === "mode") {
1259
- if (typeof params.value !== "string") throw RequestError.invalidParams("mode value must be a string")
1260
- const availableModes = await this.loadAvailableModes(session.cwd)
1261
- if (!availableModes.some((mode) => mode.id === params.value)) {
1262
- throw RequestError.invalidParams(JSON.stringify({ error: `Mode not found: ${params.value}` }))
1263
- }
1264
- this.sessionManager.setMode(session.id, params.value)
1265
- } else {
1266
- throw RequestError.invalidParams(JSON.stringify({ error: `Unknown config option: ${params.configId}` }))
1267
- }
1268
-
1269
- const updatedSession = this.sessionManager.get(session.id)
1270
- const model = updatedSession.model ?? (await defaultModel(this.config, session.cwd))
1271
- const availableVariants = modelVariantsFromProviders(entries, model)
1272
- const currentModelId = formatModelIdWithVariant(model, updatedSession.variant, availableVariants, true)
1273
- const availableModels = buildAvailableModels(entries, { includeVariants: true })
1274
- const modeState = await this.resolveModeState(session.cwd, session.id)
1275
- const modes = modeState.currentModeId
1276
- ? { availableModes: modeState.availableModes, currentModeId: modeState.currentModeId }
1277
- : undefined
1278
-
1279
- return {
1280
- configOptions: buildConfigOptions({ currentModelId, availableModels, modes }),
1281
- }
1282
- }
1283
-
1284
- async prompt(params: PromptRequest) {
1285
- const sessionID = params.sessionId
1286
- const session = this.sessionManager.get(sessionID)
1287
- const directory = session.cwd
1288
-
1289
- const current = session.model
1290
- const model = current ?? (await defaultModel(this.config, directory))
1291
- if (!current) {
1292
- this.sessionManager.setModel(session.id, model)
1293
- }
1294
- const agent = session.modeId ?? (await AppRuntime.runPromise(AgentModule.Service.use((svc) => svc.defaultAgent())))
1295
-
1296
- const parts: Array<
1297
- | { type: "text"; text: string; synthetic?: boolean; ignored?: boolean }
1298
- | { type: "file"; url: string; filename: string; mime: string }
1299
- > = []
1300
- for (const part of params.prompt) {
1301
- switch (part.type) {
1302
- case "text":
1303
- const audience = part.annotations?.audience
1304
- const forAssistant = audience?.length === 1 && audience[0] === "assistant"
1305
- const forUser = audience?.length === 1 && audience[0] === "user"
1306
- parts.push({
1307
- type: "text" as const,
1308
- text: part.text,
1309
- ...(forAssistant && { synthetic: true }),
1310
- ...(forUser && { ignored: true }),
1311
- })
1312
- break
1313
- case "image": {
1314
- const parsed = parseUri(part.uri ?? "")
1315
- const filename = parsed.type === "file" ? parsed.filename : "image"
1316
- if (part.data) {
1317
- parts.push({
1318
- type: "file",
1319
- url: `data:${part.mimeType};base64,${part.data}`,
1320
- filename,
1321
- mime: part.mimeType,
1322
- })
1323
- } else if (part.uri && part.uri.startsWith("http:")) {
1324
- parts.push({
1325
- type: "file",
1326
- url: part.uri,
1327
- filename,
1328
- mime: part.mimeType,
1329
- })
1330
- }
1331
- break
1332
- }
1333
-
1334
- case "resource_link":
1335
- const parsed = parseUri(part.uri)
1336
- // Use the name from resource_link if available
1337
- if (part.name && parsed.type === "file") {
1338
- parsed.filename = part.name
1339
- }
1340
- parts.push(parsed)
1341
-
1342
- break
1343
-
1344
- case "resource": {
1345
- const resource = part.resource
1346
- if ("text" in resource && resource.text) {
1347
- parts.push({
1348
- type: "text",
1349
- text: resource.text,
1350
- })
1351
- } else if ("blob" in resource && resource.blob && resource.mimeType) {
1352
- // Binary resource (PDFs, etc.): store as file part with data URL
1353
- const parsed = parseUri(resource.uri ?? "")
1354
- const filename = parsed.type === "file" ? parsed.filename : "file"
1355
- parts.push({
1356
- type: "file",
1357
- url: `data:${resource.mimeType};base64,${resource.blob}`,
1358
- filename,
1359
- mime: resource.mimeType,
1360
- })
1361
- }
1362
- break
1363
- }
1364
-
1365
- default:
1366
- break
1367
- }
1368
- }
1369
-
1370
- log.info("parts", { parts })
1371
-
1372
- const cmd = (() => {
1373
- const text = parts
1374
- .filter((p): p is { type: "text"; text: string } => p.type === "text")
1375
- .map((p) => p.text)
1376
- .join("")
1377
- .trim()
1378
-
1379
- if (!text.startsWith("/")) return
1380
-
1381
- const [name, ...rest] = text.slice(1).split(/\s+/)
1382
- return { name, args: rest.join(" ").trim() }
1383
- })()
1384
-
1385
- const buildUsage = (msg: AssistantMessage): Usage => ({
1386
- totalTokens:
1387
- msg.tokens.input +
1388
- msg.tokens.output +
1389
- msg.tokens.reasoning +
1390
- (msg.tokens.cache?.read ?? 0) +
1391
- (msg.tokens.cache?.write ?? 0),
1392
- inputTokens: msg.tokens.input,
1393
- outputTokens: msg.tokens.output,
1394
- thoughtTokens: msg.tokens.reasoning || undefined,
1395
- cachedReadTokens: msg.tokens.cache?.read || undefined,
1396
- cachedWriteTokens: msg.tokens.cache?.write || undefined,
1397
- })
1398
-
1399
- if (!cmd) {
1400
- const response = await this.sdk.session.prompt({
1401
- sessionID,
1402
- model: {
1403
- providerID: model.providerID,
1404
- modelID: model.modelID,
1405
- },
1406
- variant: this.sessionManager.getVariant(sessionID),
1407
- parts,
1408
- agent,
1409
- directory,
1410
- })
1411
- const msg = response.data?.info
1412
-
1413
- await sendUsageUpdate(this.connection, this.sdk, sessionID, directory)
1414
-
1415
- return {
1416
- stopReason: "end_turn" as const,
1417
- usage: msg ? buildUsage(msg) : undefined,
1418
- _meta: {},
1419
- }
1420
- }
1421
-
1422
- const command = await this.config.sdk.command
1423
- .list({ directory }, { throwOnError: true })
1424
- .then((x) => x.data!.find((c) => c.name === cmd.name))
1425
- if (command) {
1426
- const response = await this.sdk.session.command({
1427
- sessionID,
1428
- command: command.name,
1429
- arguments: cmd.args,
1430
- model: model.providerID + "/" + model.modelID,
1431
- agent,
1432
- directory,
1433
- })
1434
- const msg = response.data?.info
1435
-
1436
- await sendUsageUpdate(this.connection, this.sdk, sessionID, directory)
1437
-
1438
- return {
1439
- stopReason: "end_turn" as const,
1440
- usage: msg ? buildUsage(msg) : undefined,
1441
- _meta: {},
1442
- }
1443
- }
1444
-
1445
- switch (cmd.name) {
1446
- case "compact":
1447
- await this.config.sdk.session.summarize(
1448
- {
1449
- sessionID,
1450
- directory,
1451
- providerID: model.providerID,
1452
- modelID: model.modelID,
1453
- },
1454
- { throwOnError: true },
1455
- )
1456
- break
1457
- }
1458
-
1459
- await sendUsageUpdate(this.connection, this.sdk, sessionID, directory)
1460
-
1461
- return {
1462
- stopReason: "end_turn" as const,
1463
- _meta: {},
1464
- }
1465
- }
1466
-
1467
- async cancel(params: CancelNotification) {
1468
- const session = this.sessionManager.get(params.sessionId)
1469
- await this.config.sdk.session.abort(
1470
- {
1471
- sessionID: params.sessionId,
1472
- directory: session.cwd,
1473
- },
1474
- { throwOnError: true },
1475
- )
1476
- }
1477
- }
1478
-
1479
- function toToolKind(toolName: string): ToolKind {
1480
- const tool = toolName.toLocaleLowerCase()
1481
- switch (tool) {
1482
- case "bash":
1483
- return "execute"
1484
- case "webfetch":
1485
- return "fetch"
1486
-
1487
- case "edit":
1488
- case "patch":
1489
- case "write":
1490
- return "edit"
1491
-
1492
- case "grep":
1493
- case "glob":
1494
- case "context7_resolve_library_id":
1495
- case "context7_get_library_docs":
1496
- return "search"
1497
-
1498
- case "read":
1499
- return "read"
1500
-
1501
- default:
1502
- return "other"
1503
- }
1504
- }
1505
-
1506
- function stringField(input: Record<string, any>, ...keys: string[]): string {
1507
- for (const key of keys) {
1508
- const value = input[key]
1509
- if (typeof value === "string") return value
1510
- }
1511
- return ""
1512
- }
1513
-
1514
- function editDiffContent(input: Record<string, any>): { path: string; oldText: string; newText: string } {
1515
- return {
1516
- path: stringField(input, "file_path", "filePath"),
1517
- oldText: stringField(input, "old_string", "oldString"),
1518
- newText: stringField(input, "new_string", "newString", "content"),
1519
- }
1520
- }
1521
-
1522
- function toLocations(toolName: string, input: Record<string, any>): { path: string }[] {
1523
- const tool = toolName.toLocaleLowerCase()
1524
- switch (tool) {
1525
- case "read":
1526
- case "write":
1527
- case "edit":
1528
- case "multiedit":
1529
- case "lsp":
1530
- const filePath = stringField(input, "file_path", "filePath")
1531
- return filePath ? [{ path: filePath }] : []
1532
- case "glob":
1533
- case "grep":
1534
- const target = stringField(input, "path")
1535
- return target ? [{ path: target }] : []
1536
- case "bash":
1537
- return []
1538
- default:
1539
- return []
1540
- }
1541
- }
1542
-
1543
- async function defaultModel(config: ACPConfig, cwd?: string): Promise<{ providerID: ProviderID; modelID: ModelID }> {
1544
- const sdk = config.sdk
1545
- const configured = config.defaultModel
1546
- if (configured) return configured
1547
-
1548
- const directory = cwd ?? process.cwd()
1549
-
1550
- const specified = await sdk.config
1551
- .get({ directory }, { throwOnError: true })
1552
- .then((resp) => {
1553
- const cfg = resp.data
1554
- if (!cfg || !cfg.model) return undefined
1555
- return Provider.parseModel(cfg.model)
1556
- })
1557
- .catch((error) => {
1558
- log.error("failed to load user config for default model", { error })
1559
- return undefined
1560
- })
1561
-
1562
- const providers = await sdk.config
1563
- .providers({ directory }, { throwOnError: true })
1564
- .then((x) => x.data?.providers ?? [])
1565
- .catch((error) => {
1566
- log.error("failed to list providers for default model", { error })
1567
- return []
1568
- })
1569
-
1570
- if (specified && providers.length) {
1571
- const provider = providers.find((p) => p.id === specified.providerID)
1572
- if (provider && provider.models[specified.modelID]) return specified
1573
- }
1574
-
1575
- if (specified && !providers.length) return specified
1576
-
1577
- const opencodeProvider = providers.find((p) => p.id === "opencode")
1578
- if (opencodeProvider) {
1579
- if (opencodeProvider.models["big-pickle"]) {
1580
- return { providerID: ProviderID.opencode, modelID: ModelID.make("big-pickle") }
1581
- }
1582
- const [best] = Provider.sort(Object.values(opencodeProvider.models))
1583
- if (best) {
1584
- return {
1585
- providerID: ProviderID.make(best.providerID),
1586
- modelID: ModelID.make(best.id),
1587
- }
1588
- }
1589
- }
1590
-
1591
- const models = providers.flatMap((p) => Object.values(p.models))
1592
- const [best] = Provider.sort(models)
1593
- if (best) {
1594
- return {
1595
- providerID: ProviderID.make(best.providerID),
1596
- modelID: ModelID.make(best.id),
1597
- }
1598
- }
1599
-
1600
- if (specified) return specified
1601
-
1602
- return { providerID: ProviderID.opencode, modelID: ModelID.make("big-pickle") }
1603
- }
1604
-
1605
- function parseUri(
1606
- uri: string,
1607
- ): { type: "file"; url: string; filename: string; mime: string } | { type: "text"; text: string } {
1608
- try {
1609
- if (uri.startsWith("file://")) {
1610
- const path = uri.slice(7)
1611
- const name = path.split("/").pop() || path
1612
- return {
1613
- type: "file",
1614
- url: uri,
1615
- filename: name,
1616
- mime: "text/plain",
1617
- }
1618
- }
1619
- if (uri.startsWith("zed://")) {
1620
- const url = new URL(uri)
1621
- const path = url.searchParams.get("path")
1622
- if (path) {
1623
- const name = path.split("/").pop() || path
1624
- return {
1625
- type: "file",
1626
- url: pathToFileURL(path).href,
1627
- filename: name,
1628
- mime: "text/plain",
1629
- }
1630
- }
1631
- }
1632
- return {
1633
- type: "text",
1634
- text: uri,
1635
- }
1636
- } catch {
1637
- return {
1638
- type: "text",
1639
- text: uri,
1640
- }
1641
- }
1642
- }
1643
-
1644
- function getNewContent(fileOriginal: string, unifiedDiff: string): string | undefined {
1645
- const result = applyPatch(fileOriginal, unifiedDiff)
1646
- if (result === false) {
1647
- log.error("Failed to apply unified diff (context mismatch)")
1648
- return undefined
1649
- }
1650
- return result
1651
- }
1652
-
1653
- function sortProvidersByName<T extends { name: string }>(providers: T[]): T[] {
1654
- return [...providers].sort((a, b) => {
1655
- const nameA = a.name.toLowerCase()
1656
- const nameB = b.name.toLowerCase()
1657
- if (nameA < nameB) return -1
1658
- if (nameA > nameB) return 1
1659
- return 0
1660
- })
1661
- }
1662
-
1663
- function modelVariantsFromProviders(
1664
- providers: Array<{ id: string; models: Record<string, { variants?: Record<string, any> }> }>,
1665
- model: { providerID: ProviderID; modelID: ModelID },
1666
- ): string[] {
1667
- const provider = providers.find((entry) => entry.id === model.providerID)
1668
- if (!provider) return []
1669
- const modelInfo = provider.models[model.modelID]
1670
- if (!modelInfo?.variants) return []
1671
- return Object.keys(modelInfo.variants)
1672
- }
1673
-
1674
- function buildAvailableModels(
1675
- providers: Array<{ id: string; name: string; models: Record<string, any> }>,
1676
- options: { includeVariants?: boolean } = {},
1677
- ): ModelOption[] {
1678
- const includeVariants = options.includeVariants ?? false
1679
- return providers.flatMap((provider) => {
1680
- const unsorted: Array<{ id: string; name: string; variants?: Record<string, any> }> = Object.values(provider.models)
1681
- const models = Provider.sort(unsorted)
1682
- return models.flatMap((model) => {
1683
- const base: ModelOption = {
1684
- modelId: `${provider.id}/${model.id}`,
1685
- name: `${provider.name}/${model.name}`,
1686
- }
1687
- if (!includeVariants || !model.variants) return [base]
1688
- const variants = Object.keys(model.variants).filter((variant) => variant !== DEFAULT_VARIANT_VALUE)
1689
- const variantOptions = variants.map((variant) => ({
1690
- modelId: `${provider.id}/${model.id}/${variant}`,
1691
- name: `${provider.name}/${model.name} (${variant})`,
1692
- }))
1693
- return [base, ...variantOptions]
1694
- })
1695
- })
1696
- }
1697
-
1698
- function formatModelIdWithVariant(
1699
- model: { providerID: ProviderID; modelID: ModelID },
1700
- variant: string | undefined,
1701
- availableVariants: string[],
1702
- includeVariant: boolean,
1703
- ) {
1704
- const base = `${model.providerID}/${model.modelID}`
1705
- if (!includeVariant || !variant || !availableVariants.includes(variant)) return base
1706
- return `${base}/${variant}`
1707
- }
1708
-
1709
- function buildVariantMeta(input: {
1710
- model: { providerID: ProviderID; modelID: ModelID }
1711
- variant?: string
1712
- availableVariants: string[]
1713
- }) {
1714
- return {
1715
- opencode: {
1716
- modelId: `${input.model.providerID}/${input.model.modelID}`,
1717
- variant: input.variant ?? null,
1718
- availableVariants: input.availableVariants,
1719
- },
1720
- }
1721
- }
1722
-
1723
- function parseModelSelection(
1724
- modelId: string,
1725
- providers: Array<{ id: string; models: Record<string, { variants?: Record<string, any> }> }>,
1726
- ): { model: { providerID: ProviderID; modelID: ModelID }; variant?: string } {
1727
- const parsed = Provider.parseModel(modelId)
1728
- const provider = providers.find((p) => p.id === parsed.providerID)
1729
- if (!provider) {
1730
- return { model: parsed, variant: undefined }
1731
- }
1732
-
1733
- // Check if modelID exists directly
1734
- if (provider.models[parsed.modelID]) {
1735
- return { model: parsed, variant: undefined }
1736
- }
1737
-
1738
- // Try to extract variant from end of modelID (e.g., "claude-sonnet-4/high" -> model: "claude-sonnet-4", variant: "high")
1739
- const segments = parsed.modelID.split("/")
1740
- if (segments.length > 1) {
1741
- const candidateVariant = segments[segments.length - 1]
1742
- const baseModelId = segments.slice(0, -1).join("/")
1743
- const baseModelInfo = provider.models[baseModelId]
1744
- if (baseModelInfo?.variants && candidateVariant in baseModelInfo.variants) {
1745
- return {
1746
- model: { providerID: parsed.providerID, modelID: ModelID.make(baseModelId) },
1747
- variant: candidateVariant,
1748
- }
1749
- }
1750
- }
1751
-
1752
- return { model: parsed, variant: undefined }
1753
- }
1754
-
1755
- function buildConfigOptions(input: {
1756
- currentModelId: string
1757
- availableModels: ModelOption[]
1758
- modes?: { availableModes: ModeOption[]; currentModeId: string } | undefined
1759
- }): SessionConfigOption[] {
1760
- const options: SessionConfigOption[] = [
1761
- {
1762
- id: "model",
1763
- name: "Model",
1764
- category: "model",
1765
- type: "select",
1766
- currentValue: input.currentModelId,
1767
- options: input.availableModels.map((m) => ({ value: m.modelId, name: m.name })),
1768
- },
1769
- ]
1770
- if (input.modes) {
1771
- options.push({
1772
- id: "mode",
1773
- name: "Session Mode",
1774
- category: "mode",
1775
- type: "select",
1776
- currentValue: input.modes.currentModeId,
1777
- options: input.modes.availableModes.map((m) => ({
1778
- value: m.id,
1779
- name: m.name,
1780
- ...(m.description ? { description: m.description } : {}),
1781
- })),
1782
- })
1783
- }
1784
- return options
1785
- }
1786
-
1787
- export * as ACP from "./agent"