glitchcode-cli 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1169) hide show
  1. package/Dockerfile +18 -0
  2. package/README.md +15 -0
  3. package/bin/glitch +180 -0
  4. package/bunfig.toml +7 -0
  5. package/drizzle.config.ts +10 -0
  6. package/git +0 -0
  7. package/migration/20260127222353_familiar_lady_ursula/migration.sql +90 -0
  8. package/migration/20260127222353_familiar_lady_ursula/snapshot.json +796 -0
  9. package/migration/20260211171708_add_project_commands/migration.sql +1 -0
  10. package/migration/20260211171708_add_project_commands/snapshot.json +806 -0
  11. package/migration/20260213144116_wakeful_the_professor/migration.sql +11 -0
  12. package/migration/20260213144116_wakeful_the_professor/snapshot.json +897 -0
  13. package/migration/20260225215848_workspace/migration.sql +7 -0
  14. package/migration/20260225215848_workspace/snapshot.json +959 -0
  15. package/migration/20260227213759_add_session_workspace_id/migration.sql +2 -0
  16. package/migration/20260227213759_add_session_workspace_id/snapshot.json +983 -0
  17. package/migration/20260228203230_blue_harpoon/migration.sql +17 -0
  18. package/migration/20260228203230_blue_harpoon/snapshot.json +1102 -0
  19. package/migration/20260303231226_add_workspace_fields/migration.sql +5 -0
  20. package/migration/20260303231226_add_workspace_fields/snapshot.json +1013 -0
  21. package/migration/20260309230000_move_org_to_state/migration.sql +3 -0
  22. package/migration/20260309230000_move_org_to_state/snapshot.json +1156 -0
  23. package/migration/20260312043431_session_message_cursor/migration.sql +4 -0
  24. package/migration/20260312043431_session_message_cursor/snapshot.json +1168 -0
  25. package/migration/20260323234822_events/migration.sql +13 -0
  26. package/migration/20260323234822_events/snapshot.json +1271 -0
  27. package/migration/20260410174513_workspace-name/migration.sql +16 -0
  28. package/migration/20260410174513_workspace-name/snapshot.json +1271 -0
  29. package/migration/20260413175956_chief_energizer/migration.sql +13 -0
  30. package/migration/20260413175956_chief_energizer/snapshot.json +1399 -0
  31. package/migration/20260422160000_context_inheritance/migration.sql +3 -0
  32. package/migration/20260422170000_task_registry/migration.sql +18 -0
  33. package/migration/20260423145421_remove_session_entry/migration.sql +4 -0
  34. package/migration/20260515000000_actor_rename/migration.sql +7 -0
  35. package/migration/20260515010000_memory_fts/migration.sql +33 -0
  36. package/migration/20260515020000_user_task/migration.sql +29 -0
  37. package/migration/20260519000000_last_checkpoint_message_id/migration.sql +1 -0
  38. package/migration/20260521000000_message_agent_id/migration.sql +2 -0
  39. package/migration/20260521000100_actor_registry_v6/migration.sql +25 -0
  40. package/migration/20260521010000_memory_fts_v6/migration.sql +33 -0
  41. package/migration/20260521020000_memory_fts_triggers/migration.sql +17 -0
  42. package/migration/20260526000000_agent_id_main/migration.sql +14 -0
  43. package/migration/20260527000000_actor_lifecycle/migration.sql +8 -0
  44. package/migration/20260527000100_inbox/migration.sql +12 -0
  45. package/migration/20260529000000_task_todo_redesign/migration.sql +16 -0
  46. package/migration/20260603000000_task_in_progress_owner/migration.sql +1 -0
  47. package/migration/20260603000000_workflow_run/migration.sql +17 -0
  48. package/migration/20260604000000_workflow_script_sha/migration.sql +1 -0
  49. package/migration/20260608000000_claude_import/migration.sql +7 -0
  50. package/migration/20260608010000_claude_import_message_ids/migration.sql +1 -0
  51. package/migration/20260609000000_history_fts/migration.sql +29 -0
  52. package/migration/20260609230000_workflow_agent_timeout/migration.sql +1 -0
  53. package/migration/20260612000000_external_import/migration.sql +16 -0
  54. package/package.json +203 -0
  55. package/parsers-config.ts +290 -0
  56. package/script/build.ts +304 -0
  57. package/script/check-migrations.ts +16 -0
  58. package/script/fix-node-pty.ts +28 -0
  59. package/script/generate.ts +23 -0
  60. package/script/postinstall.mjs +102 -0
  61. package/script/publish.ts +74 -0
  62. package/script/run-workspace-server +106 -0
  63. package/script/schema.ts +63 -0
  64. package/script/time.ts +6 -0
  65. package/script/trace-imports.ts +153 -0
  66. package/script/upgrade-opentui.ts +64 -0
  67. package/src/account/account.sql.ts +39 -0
  68. package/src/account/account.ts +456 -0
  69. package/src/account/repo.ts +166 -0
  70. package/src/account/schema.ts +99 -0
  71. package/src/account/url.ts +8 -0
  72. package/src/acp/README.md +174 -0
  73. package/src/acp/agent.ts +1783 -0
  74. package/src/acp/session.ts +116 -0
  75. package/src/acp/types.ts +24 -0
  76. package/src/actor/actor.sql.ts +38 -0
  77. package/src/actor/events.ts +67 -0
  78. package/src/actor/index.ts +2 -0
  79. package/src/actor/registry.ts +412 -0
  80. package/src/actor/return-header.ts +24 -0
  81. package/src/actor/schema.ts +47 -0
  82. package/src/actor/spawn-ref.ts +16 -0
  83. package/src/actor/spawn.ts +741 -0
  84. package/src/actor/turn.ts +49 -0
  85. package/src/actor/waiter.ts +166 -0
  86. package/src/agent/agent.ts +554 -0
  87. package/src/agent/config.ts +5 -0
  88. package/src/agent/generate.txt +75 -0
  89. package/src/agent/prompt/checkpoint-writer.txt +167 -0
  90. package/src/agent/prompt/compaction.txt +9 -0
  91. package/src/agent/prompt/distill.txt +199 -0
  92. package/src/agent/prompt/dream.txt +155 -0
  93. package/src/agent/prompt/explore.txt +18 -0
  94. package/src/agent/prompt/summary.txt +11 -0
  95. package/src/agent/prompt/title.txt +44 -0
  96. package/src/audio.d.ts +9 -0
  97. package/src/auth/index.ts +97 -0
  98. package/src/bus/bus-event.ts +33 -0
  99. package/src/bus/global.ts +12 -0
  100. package/src/bus/index.ts +193 -0
  101. package/src/cli/bootstrap.ts +33 -0
  102. package/src/cli/cmd/account.ts +258 -0
  103. package/src/cli/cmd/acp.ts +70 -0
  104. package/src/cli/cmd/agent.ts +248 -0
  105. package/src/cli/cmd/cmd.ts +7 -0
  106. package/src/cli/cmd/db.ts +120 -0
  107. package/src/cli/cmd/debug/agent.ts +192 -0
  108. package/src/cli/cmd/debug/config.ts +17 -0
  109. package/src/cli/cmd/debug/file.ts +100 -0
  110. package/src/cli/cmd/debug/index.ts +48 -0
  111. package/src/cli/cmd/debug/lsp.ts +61 -0
  112. package/src/cli/cmd/debug/ripgrep.ts +105 -0
  113. package/src/cli/cmd/debug/scrap.ts +16 -0
  114. package/src/cli/cmd/debug/skill.ts +23 -0
  115. package/src/cli/cmd/debug/snapshot.ts +53 -0
  116. package/src/cli/cmd/export.ts +306 -0
  117. package/src/cli/cmd/generate.ts +50 -0
  118. package/src/cli/cmd/github.ts +1647 -0
  119. package/src/cli/cmd/import.ts +208 -0
  120. package/src/cli/cmd/init.ts +148 -0
  121. package/src/cli/cmd/mcp.ts +812 -0
  122. package/src/cli/cmd/models.ts +88 -0
  123. package/src/cli/cmd/plug.ts +233 -0
  124. package/src/cli/cmd/pr.ts +138 -0
  125. package/src/cli/cmd/providers.ts +692 -0
  126. package/src/cli/cmd/run-completion.ts +77 -0
  127. package/src/cli/cmd/run.ts +694 -0
  128. package/src/cli/cmd/serve.ts +21 -0
  129. package/src/cli/cmd/session.ts +181 -0
  130. package/src/cli/cmd/stats.ts +413 -0
  131. package/src/cli/cmd/tui/app.tsx +1140 -0
  132. package/src/cli/cmd/tui/asset/TEN_VAD_LICENSE +12 -0
  133. package/src/cli/cmd/tui/asset/charge.wav +0 -0
  134. package/src/cli/cmd/tui/asset/pulse-a.wav +0 -0
  135. package/src/cli/cmd/tui/asset/pulse-b.wav +0 -0
  136. package/src/cli/cmd/tui/asset/pulse-c.wav +0 -0
  137. package/src/cli/cmd/tui/asset/ten_vad.wasm +0 -0
  138. package/src/cli/cmd/tui/asset/ten_vad_loader.js +30 -0
  139. package/src/cli/cmd/tui/attach.ts +84 -0
  140. package/src/cli/cmd/tui/component/background-image.tsx +150 -0
  141. package/src/cli/cmd/tui/component/bg-pulse.tsx +130 -0
  142. package/src/cli/cmd/tui/component/border.tsx +21 -0
  143. package/src/cli/cmd/tui/component/dialog-agent.tsx +31 -0
  144. package/src/cli/cmd/tui/component/dialog-agreement.tsx +111 -0
  145. package/src/cli/cmd/tui/component/dialog-command.tsx +219 -0
  146. package/src/cli/cmd/tui/component/dialog-console-org.tsx +103 -0
  147. package/src/cli/cmd/tui/component/dialog-glitch-login.tsx +253 -0
  148. package/src/cli/cmd/tui/component/dialog-go-upsell.tsx +157 -0
  149. package/src/cli/cmd/tui/component/dialog-image-list.tsx +111 -0
  150. package/src/cli/cmd/tui/component/dialog-logo-design.tsx +37 -0
  151. package/src/cli/cmd/tui/component/dialog-mcp.tsx +86 -0
  152. package/src/cli/cmd/tui/component/dialog-mimo-login.tsx +253 -0
  153. package/src/cli/cmd/tui/component/dialog-model.tsx +252 -0
  154. package/src/cli/cmd/tui/component/dialog-provider.tsx +454 -0
  155. package/src/cli/cmd/tui/component/dialog-session-delete-failed.tsx +101 -0
  156. package/src/cli/cmd/tui/component/dialog-session-list.tsx +269 -0
  157. package/src/cli/cmd/tui/component/dialog-session-rename.tsx +31 -0
  158. package/src/cli/cmd/tui/component/dialog-skill.tsx +42 -0
  159. package/src/cli/cmd/tui/component/dialog-stash.tsx +87 -0
  160. package/src/cli/cmd/tui/component/dialog-status.tsx +170 -0
  161. package/src/cli/cmd/tui/component/dialog-tag.tsx +44 -0
  162. package/src/cli/cmd/tui/component/dialog-theme-list.tsx +50 -0
  163. package/src/cli/cmd/tui/component/dialog-variant.tsx +39 -0
  164. package/src/cli/cmd/tui/component/dialog-workflows.tsx +62 -0
  165. package/src/cli/cmd/tui/component/dialog-workspace-create.tsx +289 -0
  166. package/src/cli/cmd/tui/component/dialog-workspace-unavailable.tsx +81 -0
  167. package/src/cli/cmd/tui/component/dialog-worktree.tsx +90 -0
  168. package/src/cli/cmd/tui/component/error-component.tsx +92 -0
  169. package/src/cli/cmd/tui/component/logo.tsx +961 -0
  170. package/src/cli/cmd/tui/component/plugin-route-missing.tsx +14 -0
  171. package/src/cli/cmd/tui/component/prompt/autocomplete.tsx +684 -0
  172. package/src/cli/cmd/tui/component/prompt/cwd.ts +0 -0
  173. package/src/cli/cmd/tui/component/prompt/frecency.tsx +90 -0
  174. package/src/cli/cmd/tui/component/prompt/history.tsx +108 -0
  175. package/src/cli/cmd/tui/component/prompt/index.tsx +1871 -0
  176. package/src/cli/cmd/tui/component/prompt/part.ts +16 -0
  177. package/src/cli/cmd/tui/component/prompt/stash.tsx +101 -0
  178. package/src/cli/cmd/tui/component/spinner.tsx +24 -0
  179. package/src/cli/cmd/tui/component/starry-background.tsx +305 -0
  180. package/src/cli/cmd/tui/component/startup-loading.tsx +67 -0
  181. package/src/cli/cmd/tui/component/task-item.tsx +63 -0
  182. package/src/cli/cmd/tui/component/textarea-keybindings.ts +73 -0
  183. package/src/cli/cmd/tui/component/todo-item.tsx +32 -0
  184. package/src/cli/cmd/tui/config/cwd.ts +5 -0
  185. package/src/cli/cmd/tui/config/tui-migrate.ts +151 -0
  186. package/src/cli/cmd/tui/config/tui-schema.ts +38 -0
  187. package/src/cli/cmd/tui/config/tui.ts +219 -0
  188. package/src/cli/cmd/tui/context/args.tsx +16 -0
  189. package/src/cli/cmd/tui/context/directory.ts +15 -0
  190. package/src/cli/cmd/tui/context/event.ts +45 -0
  191. package/src/cli/cmd/tui/context/exit.tsx +65 -0
  192. package/src/cli/cmd/tui/context/helper.tsx +25 -0
  193. package/src/cli/cmd/tui/context/keybind.tsx +105 -0
  194. package/src/cli/cmd/tui/context/kv.tsx +86 -0
  195. package/src/cli/cmd/tui/context/language.tsx +91 -0
  196. package/src/cli/cmd/tui/context/local.tsx +455 -0
  197. package/src/cli/cmd/tui/context/plugin-keybinds.ts +41 -0
  198. package/src/cli/cmd/tui/context/project.tsx +109 -0
  199. package/src/cli/cmd/tui/context/prompt.tsx +18 -0
  200. package/src/cli/cmd/tui/context/route.tsx +61 -0
  201. package/src/cli/cmd/tui/context/sdk.tsx +150 -0
  202. package/src/cli/cmd/tui/context/sync.tsx +828 -0
  203. package/src/cli/cmd/tui/context/theme/aura.json +69 -0
  204. package/src/cli/cmd/tui/context/theme/ayu.json +80 -0
  205. package/src/cli/cmd/tui/context/theme/carbonfox.json +248 -0
  206. package/src/cli/cmd/tui/context/theme/catppuccin-frappe.json +230 -0
  207. package/src/cli/cmd/tui/context/theme/catppuccin-macchiato.json +230 -0
  208. package/src/cli/cmd/tui/context/theme/catppuccin.json +112 -0
  209. package/src/cli/cmd/tui/context/theme/cobalt2.json +225 -0
  210. package/src/cli/cmd/tui/context/theme/cursor.json +249 -0
  211. package/src/cli/cmd/tui/context/theme/dracula.json +219 -0
  212. package/src/cli/cmd/tui/context/theme/everforest.json +241 -0
  213. package/src/cli/cmd/tui/context/theme/flexoki.json +237 -0
  214. package/src/cli/cmd/tui/context/theme/github.json +233 -0
  215. package/src/cli/cmd/tui/context/theme/glitch.json +227 -0
  216. package/src/cli/cmd/tui/context/theme/gruvbox.json +242 -0
  217. package/src/cli/cmd/tui/context/theme/kanagawa.json +77 -0
  218. package/src/cli/cmd/tui/context/theme/lucent-orng.json +234 -0
  219. package/src/cli/cmd/tui/context/theme/material.json +235 -0
  220. package/src/cli/cmd/tui/context/theme/matrix.json +77 -0
  221. package/src/cli/cmd/tui/context/theme/mercury.json +252 -0
  222. package/src/cli/cmd/tui/context/theme/mimocode.json +245 -0
  223. package/src/cli/cmd/tui/context/theme/monokai.json +221 -0
  224. package/src/cli/cmd/tui/context/theme/nightowl.json +221 -0
  225. package/src/cli/cmd/tui/context/theme/nord.json +223 -0
  226. package/src/cli/cmd/tui/context/theme/one-dark.json +84 -0
  227. package/src/cli/cmd/tui/context/theme/orng.json +249 -0
  228. package/src/cli/cmd/tui/context/theme/osaka-jade.json +93 -0
  229. package/src/cli/cmd/tui/context/theme/palenight.json +222 -0
  230. package/src/cli/cmd/tui/context/theme/rosepine.json +234 -0
  231. package/src/cli/cmd/tui/context/theme/solarized.json +223 -0
  232. package/src/cli/cmd/tui/context/theme/synthwave84.json +226 -0
  233. package/src/cli/cmd/tui/context/theme/tokyonight.json +243 -0
  234. package/src/cli/cmd/tui/context/theme/vercel.json +245 -0
  235. package/src/cli/cmd/tui/context/theme/vesper.json +218 -0
  236. package/src/cli/cmd/tui/context/theme/zenburn.json +223 -0
  237. package/src/cli/cmd/tui/context/theme.tsx +1300 -0
  238. package/src/cli/cmd/tui/context/thinking.ts +48 -0
  239. package/src/cli/cmd/tui/context/tui-config.tsx +9 -0
  240. package/src/cli/cmd/tui/event.ts +56 -0
  241. package/src/cli/cmd/tui/feature-plugins/home/footer.tsx +93 -0
  242. package/src/cli/cmd/tui/feature-plugins/home/tips-view.tsx +193 -0
  243. package/src/cli/cmd/tui/feature-plugins/home/tips.tsx +54 -0
  244. package/src/cli/cmd/tui/feature-plugins/sidebar/context.tsx +114 -0
  245. package/src/cli/cmd/tui/feature-plugins/sidebar/cwd.tsx +45 -0
  246. package/src/cli/cmd/tui/feature-plugins/sidebar/files.tsx +62 -0
  247. package/src/cli/cmd/tui/feature-plugins/sidebar/footer.tsx +93 -0
  248. package/src/cli/cmd/tui/feature-plugins/sidebar/goal.tsx +84 -0
  249. package/src/cli/cmd/tui/feature-plugins/sidebar/instructions.tsx +54 -0
  250. package/src/cli/cmd/tui/feature-plugins/sidebar/lsp.tsx +66 -0
  251. package/src/cli/cmd/tui/feature-plugins/sidebar/mcp.tsx +98 -0
  252. package/src/cli/cmd/tui/feature-plugins/sidebar/task.tsx +95 -0
  253. package/src/cli/cmd/tui/feature-plugins/sidebar/todo.tsx +51 -0
  254. package/src/cli/cmd/tui/feature-plugins/sidebar/tps.ts +31 -0
  255. package/src/cli/cmd/tui/feature-plugins/system/plugins.tsx +274 -0
  256. package/src/cli/cmd/tui/i18n/en.ts +436 -0
  257. package/src/cli/cmd/tui/i18n/es.ts +478 -0
  258. package/src/cli/cmd/tui/i18n/fr.ts +485 -0
  259. package/src/cli/cmd/tui/i18n/ja.ts +437 -0
  260. package/src/cli/cmd/tui/i18n/locales.ts +82 -0
  261. package/src/cli/cmd/tui/i18n/ru.ts +497 -0
  262. package/src/cli/cmd/tui/i18n/tr.ts +398 -0
  263. package/src/cli/cmd/tui/i18n/zh.ts +429 -0
  264. package/src/cli/cmd/tui/i18n/zht.ts +405 -0
  265. package/src/cli/cmd/tui/layer.ts +6 -0
  266. package/src/cli/cmd/tui/plugin/api.tsx +402 -0
  267. package/src/cli/cmd/tui/plugin/index.ts +3 -0
  268. package/src/cli/cmd/tui/plugin/internal.ts +35 -0
  269. package/src/cli/cmd/tui/plugin/runtime.ts +1057 -0
  270. package/src/cli/cmd/tui/plugin/slots.tsx +60 -0
  271. package/src/cli/cmd/tui/routes/home.tsx +165 -0
  272. package/src/cli/cmd/tui/routes/session/dialog-fork-from-timeline.tsx +76 -0
  273. package/src/cli/cmd/tui/routes/session/dialog-message.tsx +116 -0
  274. package/src/cli/cmd/tui/routes/session/dialog-subagent.tsx +47 -0
  275. package/src/cli/cmd/tui/routes/session/dialog-timeline.tsx +47 -0
  276. package/src/cli/cmd/tui/routes/session/footer.tsx +91 -0
  277. package/src/cli/cmd/tui/routes/session/index.tsx +2567 -0
  278. package/src/cli/cmd/tui/routes/session/permission.tsx +691 -0
  279. package/src/cli/cmd/tui/routes/session/question.tsx +488 -0
  280. package/src/cli/cmd/tui/routes/session/sidebar.tsx +97 -0
  281. package/src/cli/cmd/tui/routes/session/subagent-footer.tsx +142 -0
  282. package/src/cli/cmd/tui/thread.ts +323 -0
  283. package/src/cli/cmd/tui/ui/dialog-alert.tsx +61 -0
  284. package/src/cli/cmd/tui/ui/dialog-confirm.tsx +95 -0
  285. package/src/cli/cmd/tui/ui/dialog-export-options.tsx +223 -0
  286. package/src/cli/cmd/tui/ui/dialog-help.tsx +42 -0
  287. package/src/cli/cmd/tui/ui/dialog-prompt.tsx +123 -0
  288. package/src/cli/cmd/tui/ui/dialog-select.tsx +463 -0
  289. package/src/cli/cmd/tui/ui/dialog.tsx +207 -0
  290. package/src/cli/cmd/tui/ui/link.tsx +28 -0
  291. package/src/cli/cmd/tui/ui/spinner.ts +378 -0
  292. package/src/cli/cmd/tui/ui/toast.tsx +102 -0
  293. package/src/cli/cmd/tui/util/clipboard.ts +203 -0
  294. package/src/cli/cmd/tui/util/editor.ts +36 -0
  295. package/src/cli/cmd/tui/util/image-protocol.ts +35 -0
  296. package/src/cli/cmd/tui/util/index.ts +6 -0
  297. package/src/cli/cmd/tui/util/model.ts +23 -0
  298. package/src/cli/cmd/tui/util/pinyin.ts +20 -0
  299. package/src/cli/cmd/tui/util/provider-origin.ts +7 -0
  300. package/src/cli/cmd/tui/util/revert-diff.ts +18 -0
  301. package/src/cli/cmd/tui/util/scroll.ts +23 -0
  302. package/src/cli/cmd/tui/util/selection.ts +23 -0
  303. package/src/cli/cmd/tui/util/signal.ts +41 -0
  304. package/src/cli/cmd/tui/util/sound.ts +154 -0
  305. package/src/cli/cmd/tui/util/system-locale.ts +209 -0
  306. package/src/cli/cmd/tui/util/terminal.ts +110 -0
  307. package/src/cli/cmd/tui/util/transcript.ts +112 -0
  308. package/src/cli/cmd/tui/util/vad.ts +229 -0
  309. package/src/cli/cmd/tui/util/voice.ts +450 -0
  310. package/src/cli/cmd/tui/win32.ts +130 -0
  311. package/src/cli/cmd/tui/worker.ts +104 -0
  312. package/src/cli/cmd/uninstall.ts +351 -0
  313. package/src/cli/cmd/upgrade.ts +79 -0
  314. package/src/cli/cmd/web.ts +82 -0
  315. package/src/cli/effect/prompt.ts +25 -0
  316. package/src/cli/error.ts +82 -0
  317. package/src/cli/heap.ts +59 -0
  318. package/src/cli/i18n.ts +16 -0
  319. package/src/cli/logo.ts +53 -0
  320. package/src/cli/network.ts +62 -0
  321. package/src/cli/ui.ts +133 -0
  322. package/src/cli/upgrade.ts +41 -0
  323. package/src/command/index.ts +276 -0
  324. package/src/command/template/initialize.txt +66 -0
  325. package/src/command/template/review.txt +101 -0
  326. package/src/config/agent.ts +197 -0
  327. package/src/config/command.ts +69 -0
  328. package/src/config/config.ts +1036 -0
  329. package/src/config/console-state.ts +16 -0
  330. package/src/config/entry-name.ts +16 -0
  331. package/src/config/error.ts +21 -0
  332. package/src/config/formatter.ts +17 -0
  333. package/src/config/history.ts +21 -0
  334. package/src/config/index.ts +16 -0
  335. package/src/config/keybinds.ts +127 -0
  336. package/src/config/layout.ts +10 -0
  337. package/src/config/lsp.ts +45 -0
  338. package/src/config/managed.ts +70 -0
  339. package/src/config/markdown.ts +97 -0
  340. package/src/config/mcp.ts +172 -0
  341. package/src/config/model-id.ts +14 -0
  342. package/src/config/parse.ts +44 -0
  343. package/src/config/paths.ts +73 -0
  344. package/src/config/permission.ts +76 -0
  345. package/src/config/plugin.ts +88 -0
  346. package/src/config/provider.ts +118 -0
  347. package/src/config/server.ts +20 -0
  348. package/src/config/skills.ts +16 -0
  349. package/src/config/variable.ts +90 -0
  350. package/src/control-plane/adaptors/index.ts +52 -0
  351. package/src/control-plane/adaptors/worktree.ts +47 -0
  352. package/src/control-plane/dev/debug-workspace-plugin.ts +73 -0
  353. package/src/control-plane/schema.ts +19 -0
  354. package/src/control-plane/sse.ts +66 -0
  355. package/src/control-plane/types.ts +34 -0
  356. package/src/control-plane/util.ts +37 -0
  357. package/src/control-plane/workspace-context.ts +26 -0
  358. package/src/control-plane/workspace.sql.ts +17 -0
  359. package/src/control-plane/workspace.ts +615 -0
  360. package/src/effect/app-runtime.ts +146 -0
  361. package/src/effect/bootstrap-runtime.ts +33 -0
  362. package/src/effect/bridge.ts +48 -0
  363. package/src/effect/cross-spawn-spawner.ts +514 -0
  364. package/src/effect/index.ts +5 -0
  365. package/src/effect/instance-ref.ts +11 -0
  366. package/src/effect/instance-registry.ts +12 -0
  367. package/src/effect/instance-state.ts +81 -0
  368. package/src/effect/logger.ts +73 -0
  369. package/src/effect/memo-map.ts +3 -0
  370. package/src/effect/observability.ts +107 -0
  371. package/src/effect/run-service.ts +52 -0
  372. package/src/effect/runner.ts +210 -0
  373. package/src/effect/runtime.ts +19 -0
  374. package/src/env/index.ts +37 -0
  375. package/src/file/ignore.ts +81 -0
  376. package/src/file/index.ts +664 -0
  377. package/src/file/protected.ts +59 -0
  378. package/src/file/ripgrep.ts +485 -0
  379. package/src/file/watcher.ts +163 -0
  380. package/src/flag/flag.ts +172 -0
  381. package/src/format/formatter.ts +403 -0
  382. package/src/format/index.ts +203 -0
  383. package/src/git/index.ts +260 -0
  384. package/src/global/index.ts +54 -0
  385. package/src/history/backfill.ts +162 -0
  386. package/src/history/extract.ts +67 -0
  387. package/src/history/fts-query.ts +15 -0
  388. package/src/history/fts.sql.ts +20 -0
  389. package/src/history/index.ts +10 -0
  390. package/src/history/resolve.ts +65 -0
  391. package/src/history/service.ts +258 -0
  392. package/src/history/writer.ts +112 -0
  393. package/src/id/id.ts +87 -0
  394. package/src/ide/index.ts +73 -0
  395. package/src/inbox/inbox-ref.ts +38 -0
  396. package/src/inbox/inbox.sql.ts +26 -0
  397. package/src/inbox/inbox.ts +223 -0
  398. package/src/inbox/index.ts +3 -0
  399. package/src/inbox/render.ts +40 -0
  400. package/src/index.ts +274 -0
  401. package/src/installation/index.ts +362 -0
  402. package/src/installation/version.ts +8 -0
  403. package/src/lsp/client.ts +249 -0
  404. package/src/lsp/diagnostic.ts +29 -0
  405. package/src/lsp/index.ts +3 -0
  406. package/src/lsp/language.ts +120 -0
  407. package/src/lsp/launch.ts +21 -0
  408. package/src/lsp/lsp.ts +519 -0
  409. package/src/lsp/server.ts +1956 -0
  410. package/src/mcp/auth.ts +144 -0
  411. package/src/mcp/index.ts +944 -0
  412. package/src/mcp/oauth-callback.ts +232 -0
  413. package/src/mcp/oauth-provider.ts +214 -0
  414. package/src/memory/fts-query.ts +37 -0
  415. package/src/memory/fts.sql.ts +19 -0
  416. package/src/memory/index.ts +1 -0
  417. package/src/memory/paths.ts +116 -0
  418. package/src/memory/reconcile.ts +144 -0
  419. package/src/memory/service.ts +144 -0
  420. package/src/metrics/client.ts +40 -0
  421. package/src/metrics/event.ts +43 -0
  422. package/src/metrics/index.ts +5 -0
  423. package/src/metrics/installation.ts +18 -0
  424. package/src/metrics/subscriber.ts +58 -0
  425. package/src/metrics/util.ts +9 -0
  426. package/src/node.ts +6 -0
  427. package/src/npm/config.ts +0 -0
  428. package/src/npm/index.ts +293 -0
  429. package/src/npmcli-config.d.ts +43 -0
  430. package/src/patch/index.ts +680 -0
  431. package/src/permission/arity.ts +163 -0
  432. package/src/permission/evaluate.ts +15 -0
  433. package/src/permission/index.ts +378 -0
  434. package/src/permission/schema.ts +17 -0
  435. package/src/plugin/checkpoint-splitover.ts +60 -0
  436. package/src/plugin/cloudflare.ts +76 -0
  437. package/src/plugin/codex.ts +607 -0
  438. package/src/plugin/github-copilot/copilot.ts +368 -0
  439. package/src/plugin/github-copilot/models.ts +153 -0
  440. package/src/plugin/glitch.ts +243 -0
  441. package/src/plugin/index.ts +581 -0
  442. package/src/plugin/install.ts +439 -0
  443. package/src/plugin/loader.ts +216 -0
  444. package/src/plugin/matcher.ts +33 -0
  445. package/src/plugin/meta.ts +188 -0
  446. package/src/plugin/mimo.ts +243 -0
  447. package/src/plugin/shared.ts +323 -0
  448. package/src/plugin/subagent-progress-checker.ts +147 -0
  449. package/src/project/bootstrap.ts +59 -0
  450. package/src/project/index.ts +2 -0
  451. package/src/project/instance.ts +190 -0
  452. package/src/project/project-id.ts +48 -0
  453. package/src/project/project.sql.ts +16 -0
  454. package/src/project/project.ts +522 -0
  455. package/src/project/schema.ts +15 -0
  456. package/src/project/vcs.ts +227 -0
  457. package/src/project/workspace-trust.ts +67 -0
  458. package/src/provider/auth.ts +234 -0
  459. package/src/provider/error.ts +216 -0
  460. package/src/provider/index.ts +5 -0
  461. package/src/provider/models.ts +180 -0
  462. package/src/provider/provider.ts +1788 -0
  463. package/src/provider/schema.ts +36 -0
  464. package/src/provider/sdk/copilot/README.md +5 -0
  465. package/src/provider/sdk/copilot/chat/convert-to-openai-compatible-chat-messages.ts +170 -0
  466. package/src/provider/sdk/copilot/chat/get-response-metadata.ts +15 -0
  467. package/src/provider/sdk/copilot/chat/map-openai-compatible-finish-reason.ts +19 -0
  468. package/src/provider/sdk/copilot/chat/openai-compatible-api-types.ts +64 -0
  469. package/src/provider/sdk/copilot/chat/openai-compatible-chat-language-model.ts +815 -0
  470. package/src/provider/sdk/copilot/chat/openai-compatible-chat-options.ts +28 -0
  471. package/src/provider/sdk/copilot/chat/openai-compatible-metadata-extractor.ts +44 -0
  472. package/src/provider/sdk/copilot/chat/openai-compatible-prepare-tools.ts +83 -0
  473. package/src/provider/sdk/copilot/copilot-provider.ts +100 -0
  474. package/src/provider/sdk/copilot/index.ts +2 -0
  475. package/src/provider/sdk/copilot/openai-compatible-error.ts +27 -0
  476. package/src/provider/sdk/copilot/responses/convert-to-openai-responses-input.ts +335 -0
  477. package/src/provider/sdk/copilot/responses/map-openai-responses-finish-reason.ts +22 -0
  478. package/src/provider/sdk/copilot/responses/openai-config.ts +18 -0
  479. package/src/provider/sdk/copilot/responses/openai-error.ts +22 -0
  480. package/src/provider/sdk/copilot/responses/openai-responses-api-types.ts +214 -0
  481. package/src/provider/sdk/copilot/responses/openai-responses-language-model.ts +1770 -0
  482. package/src/provider/sdk/copilot/responses/openai-responses-prepare-tools.ts +173 -0
  483. package/src/provider/sdk/copilot/responses/openai-responses-settings.ts +1 -0
  484. package/src/provider/sdk/copilot/responses/tool/code-interpreter.ts +87 -0
  485. package/src/provider/sdk/copilot/responses/tool/file-search.ts +127 -0
  486. package/src/provider/sdk/copilot/responses/tool/image-generation.ts +114 -0
  487. package/src/provider/sdk/copilot/responses/tool/local-shell.ts +64 -0
  488. package/src/provider/sdk/copilot/responses/tool/web-search-preview.ts +103 -0
  489. package/src/provider/sdk/copilot/responses/tool/web-search.ts +102 -0
  490. package/src/provider/transform.ts +1322 -0
  491. package/src/pty/index.ts +364 -0
  492. package/src/pty/pty.bun.ts +26 -0
  493. package/src/pty/pty.node.ts +27 -0
  494. package/src/pty/pty.ts +25 -0
  495. package/src/pty/schema.ts +17 -0
  496. package/src/question/index.ts +252 -0
  497. package/src/question/schema.ts +17 -0
  498. package/src/server/adapter.bun.ts +40 -0
  499. package/src/server/adapter.node.ts +66 -0
  500. package/src/server/adapter.ts +21 -0
  501. package/src/server/auth.ts +16 -0
  502. package/src/server/error.ts +53 -0
  503. package/src/server/event.ts +7 -0
  504. package/src/server/fence.ts +81 -0
  505. package/src/server/mdns.ts +60 -0
  506. package/src/server/middleware.ts +96 -0
  507. package/src/server/projectors.ts +28 -0
  508. package/src/server/proxy.ts +171 -0
  509. package/src/server/pty-ticket.ts +42 -0
  510. package/src/server/routes/control/index.ts +160 -0
  511. package/src/server/routes/control/workspace.ts +203 -0
  512. package/src/server/routes/global.ts +367 -0
  513. package/src/server/routes/instance/bash-interactive.ts +82 -0
  514. package/src/server/routes/instance/config.ts +89 -0
  515. package/src/server/routes/instance/event.ts +108 -0
  516. package/src/server/routes/instance/experimental.ts +408 -0
  517. package/src/server/routes/instance/file.ts +190 -0
  518. package/src/server/routes/instance/httpapi/config.ts +51 -0
  519. package/src/server/routes/instance/httpapi/permission.ts +72 -0
  520. package/src/server/routes/instance/httpapi/project.ts +62 -0
  521. package/src/server/routes/instance/httpapi/provider.ts +142 -0
  522. package/src/server/routes/instance/httpapi/question.ts +121 -0
  523. package/src/server/routes/instance/httpapi/server.ts +136 -0
  524. package/src/server/routes/instance/index.ts +301 -0
  525. package/src/server/routes/instance/mcp.ts +260 -0
  526. package/src/server/routes/instance/middleware.ts +35 -0
  527. package/src/server/routes/instance/permission.ts +73 -0
  528. package/src/server/routes/instance/project.ts +122 -0
  529. package/src/server/routes/instance/provider.ts +158 -0
  530. package/src/server/routes/instance/pty.ts +302 -0
  531. package/src/server/routes/instance/question.ts +162 -0
  532. package/src/server/routes/instance/session.ts +1296 -0
  533. package/src/server/routes/instance/sync.ts +143 -0
  534. package/src/server/routes/instance/trace.ts +59 -0
  535. package/src/server/routes/instance/tui.ts +384 -0
  536. package/src/server/routes/instance/workflows.ts +72 -0
  537. package/src/server/routes/ui.ts +37 -0
  538. package/src/server/server.ts +136 -0
  539. package/src/server/workspace.ts +122 -0
  540. package/src/session/auto-dream.ts +123 -0
  541. package/src/session/boundary.ts +77 -0
  542. package/src/session/budgeted-read.ts +118 -0
  543. package/src/session/checkpoint-align.ts +29 -0
  544. package/src/session/checkpoint-context.ts +36 -0
  545. package/src/session/checkpoint-paths.ts +86 -0
  546. package/src/session/checkpoint-progress-reconcile.ts +111 -0
  547. package/src/session/checkpoint-retry.ts +192 -0
  548. package/src/session/checkpoint-templates.ts +114 -0
  549. package/src/session/checkpoint-validator.ts +259 -0
  550. package/src/session/checkpoint.ts +1478 -0
  551. package/src/session/classify.ts +92 -0
  552. package/src/session/claude-import.ts +381 -0
  553. package/src/session/codex-import.ts +416 -0
  554. package/src/session/compaction.ts +543 -0
  555. package/src/session/external-import.sql.ts +18 -0
  556. package/src/session/external-import.ts +136 -0
  557. package/src/session/goal.ts +232 -0
  558. package/src/session/index.ts +1 -0
  559. package/src/session/instruction.ts +276 -0
  560. package/src/session/last-message-info.ts +32 -0
  561. package/src/session/llm-request-prefix.ts +82 -0
  562. package/src/session/llm.ts +725 -0
  563. package/src/session/max-mode.ts +397 -0
  564. package/src/session/message-v2.ts +1136 -0
  565. package/src/session/message.ts +191 -0
  566. package/src/session/opencode-import.ts +281 -0
  567. package/src/session/overflow.ts +53 -0
  568. package/src/session/prefix-capture-ref.ts +48 -0
  569. package/src/session/processor.ts +968 -0
  570. package/src/session/projectors.ts +137 -0
  571. package/src/session/prompt/anthropic.txt +154 -0
  572. package/src/session/prompt/beast.txt +155 -0
  573. package/src/session/prompt/build-switch.txt +5 -0
  574. package/src/session/prompt/codex.txt +79 -0
  575. package/src/session/prompt/compose.txt +115 -0
  576. package/src/session/prompt/copilot-gpt-5.txt +143 -0
  577. package/src/session/prompt/default.txt +151 -0
  578. package/src/session/prompt/gemini.txt +155 -0
  579. package/src/session/prompt/gpt.txt +107 -0
  580. package/src/session/prompt/kimi.txt +95 -0
  581. package/src/session/prompt/max-steps.txt +16 -0
  582. package/src/session/prompt/text-loop-recovery.ts +40 -0
  583. package/src/session/prompt/trinity.txt +97 -0
  584. package/src/session/prompt.ts +3476 -0
  585. package/src/session/prune.ts +481 -0
  586. package/src/session/retry.ts +166 -0
  587. package/src/session/revert.ts +161 -0
  588. package/src/session/run-state.ts +135 -0
  589. package/src/session/schema.ts +36 -0
  590. package/src/session/session.sql.ts +110 -0
  591. package/src/session/session.ts +908 -0
  592. package/src/session/status.ts +89 -0
  593. package/src/session/summary.ts +163 -0
  594. package/src/session/system.ts +86 -0
  595. package/src/session/todo.ts +77 -0
  596. package/src/share/index.ts +2 -0
  597. package/src/share/session.ts +57 -0
  598. package/src/share/share-next.ts +381 -0
  599. package/src/share/share.sql.ts +13 -0
  600. package/src/shell/shell.ts +110 -0
  601. package/src/skill/compose/.bundle/ask/SKILL.md +58 -0
  602. package/src/skill/compose/.bundle/brainstorm/SKILL.md +220 -0
  603. package/src/skill/compose/.bundle/brainstorm/scripts/frame-template.html +214 -0
  604. package/src/skill/compose/.bundle/brainstorm/scripts/helper.js +88 -0
  605. package/src/skill/compose/.bundle/brainstorm/scripts/server.cjs +354 -0
  606. package/src/skill/compose/.bundle/brainstorm/scripts/start-server.sh +148 -0
  607. package/src/skill/compose/.bundle/brainstorm/scripts/stop-server.sh +56 -0
  608. package/src/skill/compose/.bundle/brainstorm/spec-document-reviewer-prompt.md +50 -0
  609. package/src/skill/compose/.bundle/brainstorm/visual-companion.md +287 -0
  610. package/src/skill/compose/.bundle/debug/CREATION-LOG.md +119 -0
  611. package/src/skill/compose/.bundle/debug/SKILL.md +297 -0
  612. package/src/skill/compose/.bundle/debug/condition-based-waiting-example.ts +158 -0
  613. package/src/skill/compose/.bundle/debug/condition-based-waiting.md +115 -0
  614. package/src/skill/compose/.bundle/debug/defense-in-depth.md +122 -0
  615. package/src/skill/compose/.bundle/debug/find-polluter.sh +63 -0
  616. package/src/skill/compose/.bundle/debug/root-cause-tracing.md +169 -0
  617. package/src/skill/compose/.bundle/debug/test-academic.md +14 -0
  618. package/src/skill/compose/.bundle/debug/test-pressure-1.md +58 -0
  619. package/src/skill/compose/.bundle/debug/test-pressure-2.md +68 -0
  620. package/src/skill/compose/.bundle/debug/test-pressure-3.md +69 -0
  621. package/src/skill/compose/.bundle/execute/SKILL.md +71 -0
  622. package/src/skill/compose/.bundle/feedback/SKILL.md +214 -0
  623. package/src/skill/compose/.bundle/merge/SKILL.md +252 -0
  624. package/src/skill/compose/.bundle/new-skill/SKILL.md +656 -0
  625. package/src/skill/compose/.bundle/new-skill/anthropic-best-practices.md +1150 -0
  626. package/src/skill/compose/.bundle/new-skill/examples/CLAUDE_MD_TESTING.md +189 -0
  627. package/src/skill/compose/.bundle/new-skill/graphviz-conventions.dot +172 -0
  628. package/src/skill/compose/.bundle/new-skill/persuasion-principles.md +187 -0
  629. package/src/skill/compose/.bundle/new-skill/render-graphs.js +168 -0
  630. package/src/skill/compose/.bundle/new-skill/testing-skills-with-subagents.md +384 -0
  631. package/src/skill/compose/.bundle/parallel/SKILL.md +182 -0
  632. package/src/skill/compose/.bundle/plan/SKILL.md +161 -0
  633. package/src/skill/compose/.bundle/plan/plan-document-reviewer-prompt.md +50 -0
  634. package/src/skill/compose/.bundle/report/SKILL.md +180 -0
  635. package/src/skill/compose/.bundle/review/SKILL.md +104 -0
  636. package/src/skill/compose/.bundle/review/code-reviewer.md +171 -0
  637. package/src/skill/compose/.bundle/self-extend/SKILL.md +131 -0
  638. package/src/skill/compose/.bundle/self-extend/reference/hook-api.md +242 -0
  639. package/src/skill/compose/.bundle/self-extend/reference/skill-api.md +114 -0
  640. package/src/skill/compose/.bundle/self-extend/reference/tool-api.md +115 -0
  641. package/src/skill/compose/.bundle/self-extend/reference/tui-api.md +258 -0
  642. package/src/skill/compose/.bundle/subagent/SKILL.md +344 -0
  643. package/src/skill/compose/.bundle/subagent/code-quality-reviewer-prompt.md +24 -0
  644. package/src/skill/compose/.bundle/subagent/implementer-prompt.md +126 -0
  645. package/src/skill/compose/.bundle/subagent/spec-reviewer-prompt.md +112 -0
  646. package/src/skill/compose/.bundle/tdd/SKILL.md +372 -0
  647. package/src/skill/compose/.bundle/tdd/testing-anti-patterns.md +299 -0
  648. package/src/skill/compose/.bundle/verify/SKILL.md +140 -0
  649. package/src/skill/compose/.bundle/worktree/SKILL.md +234 -0
  650. package/src/skill/compose/LICENSE-karpathy +28 -0
  651. package/src/skill/compose/LICENSE-superpowers +26 -0
  652. package/src/skill/compose/bundle.macro.ts +30 -0
  653. package/src/skill/compose/extract.ts +85 -0
  654. package/src/skill/discovery.ts +116 -0
  655. package/src/skill/index.ts +317 -0
  656. package/src/snapshot/index.ts +777 -0
  657. package/src/sql.d.ts +4 -0
  658. package/src/storage/db.bun.ts +8 -0
  659. package/src/storage/db.node.ts +8 -0
  660. package/src/storage/db.ts +172 -0
  661. package/src/storage/index.ts +26 -0
  662. package/src/storage/json-migration.ts +426 -0
  663. package/src/storage/read-sqlite.bun.ts +11 -0
  664. package/src/storage/read-sqlite.node.ts +13 -0
  665. package/src/storage/read-sqlite.ts +10 -0
  666. package/src/storage/schema.sql.ts +10 -0
  667. package/src/storage/schema.ts +7 -0
  668. package/src/storage/storage.ts +331 -0
  669. package/src/sync/README.md +179 -0
  670. package/src/sync/event.sql.ts +16 -0
  671. package/src/sync/index.ts +278 -0
  672. package/src/sync/schema.ts +14 -0
  673. package/src/task/events.ts +28 -0
  674. package/src/task/gate-state.ts +54 -0
  675. package/src/task/gate.ts +116 -0
  676. package/src/task/index.ts +1 -0
  677. package/src/task/registry.ts +394 -0
  678. package/src/task/schema.ts +43 -0
  679. package/src/task/task.sql.ts +50 -0
  680. package/src/team/events.ts +22 -0
  681. package/src/team/index.ts +113 -0
  682. package/src/team/schema.ts +31 -0
  683. package/src/temporary.ts +33 -0
  684. package/src/tool/actor.shell.txt +72 -0
  685. package/src/tool/actor.ts +808 -0
  686. package/src/tool/actor.txt +103 -0
  687. package/src/tool/apply_patch.ts +308 -0
  688. package/src/tool/apply_patch.txt +33 -0
  689. package/src/tool/bash-interactive.ts +183 -0
  690. package/src/tool/bash.ts +696 -0
  691. package/src/tool/bash.txt +123 -0
  692. package/src/tool/change-directory.ts +91 -0
  693. package/src/tool/codesearch.ts +63 -0
  694. package/src/tool/codesearch.txt +12 -0
  695. package/src/tool/context-compressor.ts +125 -0
  696. package/src/tool/context-compressor.txt +5 -0
  697. package/src/tool/deep-file-analysis.ts +817 -0
  698. package/src/tool/deep-file-analysis.txt +12 -0
  699. package/src/tool/edit.ts +685 -0
  700. package/src/tool/edit.txt +10 -0
  701. package/src/tool/external-directory.ts +132 -0
  702. package/src/tool/glob.ts +100 -0
  703. package/src/tool/glob.txt +6 -0
  704. package/src/tool/grep.ts +145 -0
  705. package/src/tool/grep.txt +8 -0
  706. package/src/tool/history.ts +146 -0
  707. package/src/tool/history.txt +17 -0
  708. package/src/tool/index.ts +4 -0
  709. package/src/tool/invalid.ts +20 -0
  710. package/src/tool/invocation-style.ts +17 -0
  711. package/src/tool/lsp.ts +91 -0
  712. package/src/tool/lsp.txt +19 -0
  713. package/src/tool/mcp-exa.ts +78 -0
  714. package/src/tool/memory-path-guard.ts +162 -0
  715. package/src/tool/memory.ts +81 -0
  716. package/src/tool/memory.txt +69 -0
  717. package/src/tool/model-router.ts +86 -0
  718. package/src/tool/model-router.txt +6 -0
  719. package/src/tool/multiedit.ts +61 -0
  720. package/src/tool/multiedit.txt +41 -0
  721. package/src/tool/pattern-learner.ts +179 -0
  722. package/src/tool/pattern-learner.txt +4 -0
  723. package/src/tool/plan-enter.txt +14 -0
  724. package/src/tool/plan-exit.txt +13 -0
  725. package/src/tool/plan.ts +90 -0
  726. package/src/tool/question.ts +67 -0
  727. package/src/tool/question.txt +10 -0
  728. package/src/tool/read.ts +327 -0
  729. package/src/tool/read.txt +14 -0
  730. package/src/tool/recoverable.ts +35 -0
  731. package/src/tool/registry.ts +451 -0
  732. package/src/tool/schema.ts +17 -0
  733. package/src/tool/self-healing.ts +145 -0
  734. package/src/tool/self-healing.txt +5 -0
  735. package/src/tool/self-supervision.ts +208 -0
  736. package/src/tool/self-supervision.txt +4 -0
  737. package/src/tool/session-cwd.ts +35 -0
  738. package/src/tool/shell-tokenize.ts +346 -0
  739. package/src/tool/shell-wrap.ts +190 -0
  740. package/src/tool/skill.ts +76 -0
  741. package/src/tool/skill.txt +5 -0
  742. package/src/tool/smart-predict.ts +148 -0
  743. package/src/tool/smart-predict.txt +4 -0
  744. package/src/tool/task.shell.txt +57 -0
  745. package/src/tool/task.ts +456 -0
  746. package/src/tool/task.txt +56 -0
  747. package/src/tool/tool.ts +166 -0
  748. package/src/tool/truncate.ts +201 -0
  749. package/src/tool/truncation-dir.ts +4 -0
  750. package/src/tool/webfetch.ts +199 -0
  751. package/src/tool/webfetch.txt +13 -0
  752. package/src/tool/websearch/glitch.ts +118 -0
  753. package/src/tool/websearch/index.ts +104 -0
  754. package/src/tool/websearch/mimo.ts +118 -0
  755. package/src/tool/websearch/websearch.txt +14 -0
  756. package/src/tool/workflow.ts +164 -0
  757. package/src/tool/workflow.txt +25 -0
  758. package/src/tool/write.ts +88 -0
  759. package/src/tool/write.txt +9 -0
  760. package/src/util/abort.ts +35 -0
  761. package/src/util/archive.ts +15 -0
  762. package/src/util/color.ts +17 -0
  763. package/src/util/data-url.ts +9 -0
  764. package/src/util/defer.ts +10 -0
  765. package/src/util/effect-http-client.ts +11 -0
  766. package/src/util/effect-zod.ts +367 -0
  767. package/src/util/error.ts +78 -0
  768. package/src/util/filesystem.ts +243 -0
  769. package/src/util/fn.ts +21 -0
  770. package/src/util/format.ts +20 -0
  771. package/src/util/glitch-process.ts +24 -0
  772. package/src/util/iife.ts +3 -0
  773. package/src/util/index.ts +12 -0
  774. package/src/util/keybind.ts +101 -0
  775. package/src/util/lazy.ts +18 -0
  776. package/src/util/local-context.ts +23 -0
  777. package/src/util/locale.ts +79 -0
  778. package/src/util/lock.ts +96 -0
  779. package/src/util/log.ts +234 -0
  780. package/src/util/media.ts +26 -0
  781. package/src/util/mimo-process.ts +24 -0
  782. package/src/util/network.ts +9 -0
  783. package/src/util/process.ts +174 -0
  784. package/src/util/queue.ts +60 -0
  785. package/src/util/record.ts +3 -0
  786. package/src/util/rpc.ts +64 -0
  787. package/src/util/schema.ts +53 -0
  788. package/src/util/scrap.ts +10 -0
  789. package/src/util/signal.ts +12 -0
  790. package/src/util/timeout.ts +14 -0
  791. package/src/util/token.ts +5 -0
  792. package/src/util/update-schema.ts +13 -0
  793. package/src/util/which.ts +14 -0
  794. package/src/util/wildcard.ts +57 -0
  795. package/src/workflow/builtin/deep-research.js +391 -0
  796. package/src/workflow/builtin/model-router.js +92 -0
  797. package/src/workflow/builtin/self-healing.js +94 -0
  798. package/src/workflow/builtin/swarm-mode.js +140 -0
  799. package/src/workflow/builtin.ts +65 -0
  800. package/src/workflow/events.ts +72 -0
  801. package/src/workflow/meta.ts +335 -0
  802. package/src/workflow/persistence.ts +312 -0
  803. package/src/workflow/resolve.ts +45 -0
  804. package/src/workflow/runtime-ref.ts +18 -0
  805. package/src/workflow/runtime.ts +1234 -0
  806. package/src/workflow/sandbox.ts +286 -0
  807. package/src/workflow/workflow.sql.ts +31 -0
  808. package/src/workflow/workspace.ts +69 -0
  809. package/src/worktree/index.ts +614 -0
  810. package/sst-env.d.ts +10 -0
  811. package/test/AGENTS.md +133 -0
  812. package/test/account/repo.test.ts +352 -0
  813. package/test/account/service.test.ts +456 -0
  814. package/test/acp/agent-interface.test.ts +51 -0
  815. package/test/acp/event-subscription.test.ts +725 -0
  816. package/test/actor/cancel-cascade.test.ts +432 -0
  817. package/test/actor/no-completion-listener.test.ts +41 -0
  818. package/test/actor/poststop-progress-write-permission.repro.test.ts +414 -0
  819. package/test/actor/registry-render.test.ts +113 -0
  820. package/test/actor/registry-status.test.ts +111 -0
  821. package/test/actor/registry.test.ts +619 -0
  822. package/test/actor/return-header.test.ts +40 -0
  823. package/test/actor/spawn-lifecycle.test.ts +346 -0
  824. package/test/actor/spawn-no-deadlock.test.ts +340 -0
  825. package/test/actor/spawn-notification.test.ts +393 -0
  826. package/test/actor/spawn-task-autostart.test.ts +530 -0
  827. package/test/actor/spawn.test.ts +1072 -0
  828. package/test/actor/status-event-payload.test.ts +132 -0
  829. package/test/actor/terminology.test.ts +39 -0
  830. package/test/actor/turn.test.ts +125 -0
  831. package/test/actor/waiter.test.ts +246 -0
  832. package/test/agent/agent.test.ts +861 -0
  833. package/test/agent/allowlist.test.ts +45 -0
  834. package/test/auth/auth.test.ts +86 -0
  835. package/test/bus/bus-effect.test.ts +162 -0
  836. package/test/bus/bus-integration.test.ts +87 -0
  837. package/test/bus/bus.test.ts +219 -0
  838. package/test/cli/account.test.ts +26 -0
  839. package/test/cli/cmd/tui/prompt-part.test.ts +47 -0
  840. package/test/cli/error.test.ts +18 -0
  841. package/test/cli/github-action.test.ts +198 -0
  842. package/test/cli/github-remote.test.ts +80 -0
  843. package/test/cli/import.test.ts +54 -0
  844. package/test/cli/plugin-auth-picker.test.ts +120 -0
  845. package/test/cli/run-completion.test.ts +131 -0
  846. package/test/cli/tui/keybind-plugin.test.ts +90 -0
  847. package/test/cli/tui/plugin-add.test.ts +111 -0
  848. package/test/cli/tui/plugin-install.test.ts +87 -0
  849. package/test/cli/tui/plugin-lifecycle.test.ts +224 -0
  850. package/test/cli/tui/plugin-loader-entrypoint.test.ts +484 -0
  851. package/test/cli/tui/plugin-loader-pure.test.ts +71 -0
  852. package/test/cli/tui/plugin-loader.test.ts +816 -0
  853. package/test/cli/tui/plugin-toggle.test.ts +157 -0
  854. package/test/cli/tui/revert-diff.test.ts +35 -0
  855. package/test/cli/tui/route-agent-id.test.ts +26 -0
  856. package/test/cli/tui/sidebar-tps.test.ts +63 -0
  857. package/test/cli/tui/slot-replace.test.tsx +47 -0
  858. package/test/cli/tui/sync-bucket.test.ts +29 -0
  859. package/test/cli/tui/theme-store.test.ts +51 -0
  860. package/test/cli/tui/thread.test.ts +122 -0
  861. package/test/cli/tui/transcript.test.ts +426 -0
  862. package/test/cli/tui/use-event.test.tsx +175 -0
  863. package/test/cli/tui/voice.test.ts +443 -0
  864. package/test/command/deep-research-command.test.ts +16 -0
  865. package/test/config/agent-color.test.ts +77 -0
  866. package/test/config/checkpoint-fork.test.ts +21 -0
  867. package/test/config/config.test.ts +2577 -0
  868. package/test/config/fixtures/empty-frontmatter.md +4 -0
  869. package/test/config/fixtures/frontmatter.md +28 -0
  870. package/test/config/fixtures/markdown-header.md +11 -0
  871. package/test/config/fixtures/no-frontmatter.md +1 -0
  872. package/test/config/fixtures/weird-model-id.md +13 -0
  873. package/test/config/lsp.test.ts +87 -0
  874. package/test/config/markdown.test.ts +228 -0
  875. package/test/config/plugin.test.ts +0 -0
  876. package/test/config/tui.test.ts +627 -0
  877. package/test/control-plane/adaptors.test.ts +71 -0
  878. package/test/control-plane/sse.test.ts +56 -0
  879. package/test/effect/app-runtime-logger.test.ts +92 -0
  880. package/test/effect/cross-spawn-spawner.test.ts +411 -0
  881. package/test/effect/instance-state.test.ts +482 -0
  882. package/test/effect/observability.test.ts +46 -0
  883. package/test/effect/run-service.test.ts +46 -0
  884. package/test/effect/runner-warn-log.test.ts +111 -0
  885. package/test/effect/runner.test.ts +494 -0
  886. package/test/fake/provider.ts +90 -0
  887. package/test/file/fsmonitor.test.ts +68 -0
  888. package/test/file/ignore.test.ts +10 -0
  889. package/test/file/index.test.ts +956 -0
  890. package/test/file/path-traversal.test.ts +204 -0
  891. package/test/file/ripgrep.test.ts +214 -0
  892. package/test/file/watcher.test.ts +249 -0
  893. package/test/filesystem/filesystem.test.ts +319 -0
  894. package/test/fixture/db.ts +11 -0
  895. package/test/fixture/fixture.test.ts +58 -0
  896. package/test/fixture/fixture.ts +190 -0
  897. package/test/fixture/flock-worker.ts +72 -0
  898. package/test/fixture/lsp/fake-lsp-server.js +75 -0
  899. package/test/fixture/plug-worker.ts +93 -0
  900. package/test/fixture/plugin-meta-worker.ts +19 -0
  901. package/test/fixture/skills/agents-sdk/SKILL.md +152 -0
  902. package/test/fixture/skills/agents-sdk/references/callable.md +92 -0
  903. package/test/fixture/skills/cloudflare/SKILL.md +211 -0
  904. package/test/fixture/skills/index.json +6 -0
  905. package/test/fixture/tui-plugin.ts +328 -0
  906. package/test/fixture/tui-runtime.ts +31 -0
  907. package/test/format/format.test.ts +244 -0
  908. package/test/git/git.test.ts +128 -0
  909. package/test/global/fixture/global-paths-worker.ts +17 -0
  910. package/test/global/glitchcode-home.test.ts +143 -0
  911. package/test/global/mimocode-home.test.ts +143 -0
  912. package/test/history/backfill.test.ts +149 -0
  913. package/test/history/extract.test.ts +106 -0
  914. package/test/history/fts-query.test.ts +30 -0
  915. package/test/history/resolve.test.ts +130 -0
  916. package/test/history/service.test.ts +210 -0
  917. package/test/history/writer.test.ts +163 -0
  918. package/test/ide/ide.test.ts +82 -0
  919. package/test/inbox/drain-in-loop.test.ts +230 -0
  920. package/test/inbox/fork-agent-compat.test.ts +387 -0
  921. package/test/inbox/gc-on-init.test.ts +167 -0
  922. package/test/inbox/send-no-block.test.ts +120 -0
  923. package/test/inbox/sender-cancel-independence.test.ts +160 -0
  924. package/test/inbox/wake-matrix.test.ts +141 -0
  925. package/test/installation/installation.test.ts +255 -0
  926. package/test/keybind.test.ts +421 -0
  927. package/test/lib/effect.ts +53 -0
  928. package/test/lib/filesystem.ts +10 -0
  929. package/test/lib/llm-server.ts +770 -0
  930. package/test/lib/mock-llm.ts +159 -0
  931. package/test/lib/scripted-llm-server.ts +245 -0
  932. package/test/lsp/client.test.ts +98 -0
  933. package/test/lsp/index.test.ts +109 -0
  934. package/test/lsp/launch.test.ts +22 -0
  935. package/test/lsp/lifecycle.test.ts +184 -0
  936. package/test/mcp/headers.test.ts +178 -0
  937. package/test/mcp/lifecycle.test.ts +824 -0
  938. package/test/mcp/oauth-auto-connect.test.ts +281 -0
  939. package/test/mcp/oauth-browser.test.ts +268 -0
  940. package/test/mcp/oauth-callback.test.ts +34 -0
  941. package/test/memory/abort-leak-webfetch.ts +49 -0
  942. package/test/memory/abort-leak.test.ts +127 -0
  943. package/test/memory/cc-frontmatter.test.ts +85 -0
  944. package/test/memory/cc-paths.test.ts +60 -0
  945. package/test/memory/cc-reconcile.test.ts +239 -0
  946. package/test/memory/cc-search.test.ts +151 -0
  947. package/test/memory/fts-query.test.ts +48 -0
  948. package/test/memory/fts-rowid-stability.test.ts +271 -0
  949. package/test/memory/paths.test.ts +210 -0
  950. package/test/memory/reconcile.test.ts +115 -0
  951. package/test/memory/service.test.ts +169 -0
  952. package/test/npm.test.ts +18 -0
  953. package/test/patch/patch.test.ts +348 -0
  954. package/test/permission/abort.test.ts +116 -0
  955. package/test/permission/arity.test.ts +33 -0
  956. package/test/permission/disabled.test.ts +51 -0
  957. package/test/permission/next.test.ts +1080 -0
  958. package/test/permission/non-interactive.test.ts +55 -0
  959. package/test/permission-task.test.ts +326 -0
  960. package/test/plugin/actor-hooks.test.ts +1471 -0
  961. package/test/plugin/auth-override.test.ts +79 -0
  962. package/test/plugin/checkpoint-splitover.test.ts +434 -0
  963. package/test/plugin/cloudflare.test.ts +68 -0
  964. package/test/plugin/codex.test.ts +123 -0
  965. package/test/plugin/github-copilot-models.test.ts +163 -0
  966. package/test/plugin/glitch.test.ts +257 -0
  967. package/test/plugin/install-concurrency.test.ts +140 -0
  968. package/test/plugin/install.test.ts +570 -0
  969. package/test/plugin/loader-shared.test.ts +1169 -0
  970. package/test/plugin/matcher.test.ts +97 -0
  971. package/test/plugin/meta.test.ts +137 -0
  972. package/test/plugin/mimo.test.ts +257 -0
  973. package/test/plugin/shared.test.ts +88 -0
  974. package/test/plugin/subagent-progress-checker.test.ts +227 -0
  975. package/test/plugin/trigger.test.ts +116 -0
  976. package/test/plugin/workspace-adaptor.test.ts +109 -0
  977. package/test/preload.ts +102 -0
  978. package/test/project/migrate-global.test.ts +150 -0
  979. package/test/project/project-id.test.ts +64 -0
  980. package/test/project/project.test.ts +502 -0
  981. package/test/project/vcs.test.ts +286 -0
  982. package/test/project/worktree-remove.test.ts +126 -0
  983. package/test/project/worktree.test.ts +214 -0
  984. package/test/provider/amazon-bedrock.test.ts +462 -0
  985. package/test/provider/copilot/convert-to-copilot-messages.test.ts +523 -0
  986. package/test/provider/copilot/copilot-chat-model.test.ts +592 -0
  987. package/test/provider/error.test.ts +160 -0
  988. package/test/provider/gitlab-duo.test.ts +413 -0
  989. package/test/provider/model-groups.test.ts +389 -0
  990. package/test/provider/provider-chunk-timeout.test.ts +23 -0
  991. package/test/provider/provider.test.ts +2651 -0
  992. package/test/provider/transform.test.ts +3379 -0
  993. package/test/pty/pty-output-isolation.test.ts +146 -0
  994. package/test/pty/pty-session.test.ts +102 -0
  995. package/test/pty/pty-shell.test.ts +69 -0
  996. package/test/question/question.test.ts +464 -0
  997. package/test/server/global-session-list.test.ts +105 -0
  998. package/test/server/project-init-git.test.ts +122 -0
  999. package/test/server/session-actions.test.ts +49 -0
  1000. package/test/server/session-list.test.ts +110 -0
  1001. package/test/server/session-messages.test.ts +220 -0
  1002. package/test/server/session-prompt-busy.test.ts +146 -0
  1003. package/test/server/session-select.test.ts +100 -0
  1004. package/test/server/session-task-route.test.ts +165 -0
  1005. package/test/server/summarize-route-main-slice.test.ts +99 -0
  1006. package/test/server/trace-attributes.test.ts +76 -0
  1007. package/test/server/workflows-route.test.ts +279 -0
  1008. package/test/session/bootstrap-skip-system.test.ts +121 -0
  1009. package/test/session/boundary.test.ts +33 -0
  1010. package/test/session/budgeted-read.test.ts +74 -0
  1011. package/test/session/checkpoint-align.test.ts +58 -0
  1012. package/test/session/checkpoint-boundary.test.ts +186 -0
  1013. package/test/session/checkpoint-child-session.test.ts +508 -0
  1014. package/test/session/checkpoint-context.test.ts +141 -0
  1015. package/test/session/checkpoint-drain.test.ts +188 -0
  1016. package/test/session/checkpoint-extract-titles.test.ts +58 -0
  1017. package/test/session/checkpoint-fork-mode.test.ts +576 -0
  1018. package/test/session/checkpoint-main-slice.test.ts +259 -0
  1019. package/test/session/checkpoint-paths.test.ts +78 -0
  1020. package/test/session/checkpoint-permission.test.ts +136 -0
  1021. package/test/session/checkpoint-progress-reconcile.test.ts +219 -0
  1022. package/test/session/checkpoint-rebuild-unify.test.ts +143 -0
  1023. package/test/session/checkpoint-rebuild-v3.test.ts +248 -0
  1024. package/test/session/checkpoint-render-verify.test.ts +512 -0
  1025. package/test/session/checkpoint-retry.test.ts +150 -0
  1026. package/test/session/checkpoint-splitover-integration.test.ts +533 -0
  1027. package/test/session/checkpoint-templates.test.ts +51 -0
  1028. package/test/session/checkpoint-thresholds.test.ts +120 -0
  1029. package/test/session/checkpoint-validator.test.ts +189 -0
  1030. package/test/session/classify-integration.test.ts +476 -0
  1031. package/test/session/classify.test.ts +335 -0
  1032. package/test/session/codex-import.test.ts +331 -0
  1033. package/test/session/compaction-agent-scope.test.ts +209 -0
  1034. package/test/session/context-inheritance.test.ts +46 -0
  1035. package/test/session/external-import.test.ts +17 -0
  1036. package/test/session/fork-prefix-invariant.test.ts +116 -0
  1037. package/test/session/goal.test.ts +106 -0
  1038. package/test/session/instruction.test.ts +387 -0
  1039. package/test/session/invalid-output-continuation.test.ts +150 -0
  1040. package/test/session/last-message-info.test.ts +47 -0
  1041. package/test/session/length-tool-safety.test.ts +121 -0
  1042. package/test/session/llm-request-prefix.test.ts +197 -0
  1043. package/test/session/llm-retry.test.ts +59 -0
  1044. package/test/session/llm-system-prompt.test.ts +479 -0
  1045. package/test/session/llm.test.ts +1266 -0
  1046. package/test/session/main-lifecycle.test.ts +51 -0
  1047. package/test/session/main-runloop-history-invariant.test.ts +182 -0
  1048. package/test/session/max-mode-econnreset.test.ts +229 -0
  1049. package/test/session/max-mode.test.ts +54 -0
  1050. package/test/session/message-v2-filter.test.ts +197 -0
  1051. package/test/session/message-v2.test.ts +1119 -0
  1052. package/test/session/messages-default-main.test.ts +105 -0
  1053. package/test/session/messages-pagination.test.ts +888 -0
  1054. package/test/session/overflow.test.ts +576 -0
  1055. package/test/session/processor-effect.test.ts +853 -0
  1056. package/test/session/prompt-effect.test.ts +1614 -0
  1057. package/test/session/prompt-rebuild-loop.test.ts +108 -0
  1058. package/test/session/prompt-rebuild-reset.test.ts +67 -0
  1059. package/test/session/prompt-sweep.test.ts +145 -0
  1060. package/test/session/prompt-task-gate.test.ts +127 -0
  1061. package/test/session/prompt.test.ts +703 -0
  1062. package/test/session/prune-main-slice.test.ts +272 -0
  1063. package/test/session/prune-skip-system.test.ts +346 -0
  1064. package/test/session/prune.test.ts +419 -0
  1065. package/test/session/rebuild-microcompact.test.ts +318 -0
  1066. package/test/session/recall-reminder.test.ts +37 -0
  1067. package/test/session/retry.test.ts +410 -0
  1068. package/test/session/revert-compact.test.ts +639 -0
  1069. package/test/session/run-state-tuple-key.test.ts +152 -0
  1070. package/test/session/session-create-registers-main.test.ts +70 -0
  1071. package/test/session/session.test.ts +181 -0
  1072. package/test/session/snapshot-tool-race.test.ts +301 -0
  1073. package/test/session/structured-output-integration.test.ts +264 -0
  1074. package/test/session/structured-output-retry.test.ts +127 -0
  1075. package/test/session/structured-output.test.ts +397 -0
  1076. package/test/session/summary-main-slice.test.ts +170 -0
  1077. package/test/session/system.test.ts +72 -0
  1078. package/test/session/text-loop-detection.test.ts +185 -0
  1079. package/test/session/text-loop-integration.test.ts +448 -0
  1080. package/test/share/share-next.test.ts +332 -0
  1081. package/test/shell/shell.test.ts +73 -0
  1082. package/test/skill/compose-review.test.ts +141 -0
  1083. package/test/skill/discovery.test.ts +116 -0
  1084. package/test/skill/skill.test.ts +465 -0
  1085. package/test/snapshot/snapshot.test.ts +1531 -0
  1086. package/test/storage/db.test.ts +16 -0
  1087. package/test/storage/json-migration.test.ts +831 -0
  1088. package/test/storage/storage.test.ts +293 -0
  1089. package/test/sync/index.test.ts +237 -0
  1090. package/test/task/gate-state.test.ts +66 -0
  1091. package/test/task/gate.test.ts +167 -0
  1092. package/test/task/registry.test.ts +171 -0
  1093. package/test/task/state-machine.test.ts +292 -0
  1094. package/test/team/migrate-to-inbox.test.ts +124 -0
  1095. package/test/team/team.test.ts +75 -0
  1096. package/test/tool/__snapshots__/tool.test.ts.snap +9 -0
  1097. package/test/tool/actor-cancel.test.ts +206 -0
  1098. package/test/tool/actor-recover.test.ts +50 -0
  1099. package/test/tool/actor-send.test.ts +200 -0
  1100. package/test/tool/actor-status.test.ts +296 -0
  1101. package/test/tool/actor-wait.test.ts +193 -0
  1102. package/test/tool/actor.shell.test.ts +250 -0
  1103. package/test/tool/actor.test.ts +748 -0
  1104. package/test/tool/apply_patch.test.ts +626 -0
  1105. package/test/tool/bash.test.ts +1195 -0
  1106. package/test/tool/describe-workflow.test.ts +12 -0
  1107. package/test/tool/edit.test.ts +691 -0
  1108. package/test/tool/external-directory.test.ts +207 -0
  1109. package/test/tool/fixtures/large-image.png +0 -0
  1110. package/test/tool/fixtures/models-api.json +65179 -0
  1111. package/test/tool/glob.test.ts +81 -0
  1112. package/test/tool/grep.test.ts +114 -0
  1113. package/test/tool/history.test.ts +144 -0
  1114. package/test/tool/invocation-style.test.ts +30 -0
  1115. package/test/tool/memory-edit-ask-skip.test.ts +62 -0
  1116. package/test/tool/memory-path-guard.test.ts +594 -0
  1117. package/test/tool/memory.test.ts +71 -0
  1118. package/test/tool/question.test.ts +167 -0
  1119. package/test/tool/read.test.ts +483 -0
  1120. package/test/tool/recoverable.test.ts +36 -0
  1121. package/test/tool/registry-invocation-style.test.ts +121 -0
  1122. package/test/tool/registry.test.ts +164 -0
  1123. package/test/tool/shell-tokenize.test.ts +273 -0
  1124. package/test/tool/shell-wrap-missing-script.test.ts +128 -0
  1125. package/test/tool/shell-wrap.test.ts +257 -0
  1126. package/test/tool/skill.test.ts +99 -0
  1127. package/test/tool/task-recover.test.ts +36 -0
  1128. package/test/tool/task.shell.test.ts +234 -0
  1129. package/test/tool/task.test.ts +296 -0
  1130. package/test/tool/tool-def-shell-shape.test.ts +23 -0
  1131. package/test/tool/tool-define.test.ts +59 -0
  1132. package/test/tool/tool-validation-error.test.ts +25 -0
  1133. package/test/tool/truncation.test.ts +253 -0
  1134. package/test/tool/webfetch.test.ts +103 -0
  1135. package/test/tool/whitelist.test.ts +373 -0
  1136. package/test/tool/write.test.ts +244 -0
  1137. package/test/util/data-url.test.ts +14 -0
  1138. package/test/util/effect-zod.test.ts +869 -0
  1139. package/test/util/error.test.ts +38 -0
  1140. package/test/util/filesystem.test.ts +656 -0
  1141. package/test/util/format.test.ts +59 -0
  1142. package/test/util/glob.test.ts +164 -0
  1143. package/test/util/iife.test.ts +36 -0
  1144. package/test/util/lazy.test.ts +50 -0
  1145. package/test/util/lock.test.ts +72 -0
  1146. package/test/util/log.test.ts +69 -0
  1147. package/test/util/module.test.ts +59 -0
  1148. package/test/util/process.test.ts +128 -0
  1149. package/test/util/queue.test.ts +64 -0
  1150. package/test/util/timeout.test.ts +21 -0
  1151. package/test/util/which.test.ts +100 -0
  1152. package/test/util/wildcard.test.ts +90 -0
  1153. package/test/workflow/builtin.test.ts +22 -0
  1154. package/test/workflow/deep-research-cluster.test.ts +47 -0
  1155. package/test/workflow/lib.ts +243 -0
  1156. package/test/workflow/meta.test.ts +142 -0
  1157. package/test/workflow/model-routing.test.ts +68 -0
  1158. package/test/workflow/persistence.test.ts +229 -0
  1159. package/test/workflow/resolve.test.ts +37 -0
  1160. package/test/workflow/runtime-nested.test.ts +419 -0
  1161. package/test/workflow/runtime-worktree.test.ts +261 -0
  1162. package/test/workflow/runtime.test.ts +1078 -0
  1163. package/test/workflow/sandbox.test.ts +259 -0
  1164. package/test/workflow/tool.test.ts +473 -0
  1165. package/test/workflow/verify-wow.test.ts +144 -0
  1166. package/test/workflow/workspace.test.ts +88 -0
  1167. package/test/workspace/workspace-restore.test.ts +281 -0
  1168. package/test/worktree/index.test.ts +30 -0
  1169. package/tsconfig.json +24 -0
@@ -0,0 +1,725 @@
1
+ import path from "path"
2
+ import { Provider } from "@/provider"
3
+ import { Log } from "@/util"
4
+ import { Context, Duration, Effect, Layer, Record, Schedule, Ref } from "effect"
5
+ import * as Stream from "effect/Stream"
6
+ import { streamText, wrapLanguageModel, type ModelMessage, type Tool, tool, jsonSchema } from "ai"
7
+ import { mergeDeep, pipe } from "remeda"
8
+ import { GitLabWorkflowLanguageModel } from "gitlab-ai-provider"
9
+ import { ProviderTransform } from "@/provider"
10
+ import { Config } from "@/config"
11
+ import { Instance } from "@/project/instance"
12
+ import type { Agent } from "@/agent/agent"
13
+ import type { MessageV2 } from "./message-v2"
14
+ import { Plugin } from "@/plugin"
15
+ import { SystemPrompt } from "./system"
16
+ import { Permission } from "@/permission"
17
+ import { PermissionID } from "@/permission/schema"
18
+ import { Bus } from "@/bus"
19
+ import { Wildcard } from "@/util"
20
+ import { SessionID } from "@/session/schema"
21
+ import * as Session from "@/session/session"
22
+ import { migrateProjectMemory } from "./checkpoint-paths"
23
+ import { ProjectID } from "@/project/schema"
24
+ import { Auth } from "@/auth"
25
+ import { Installation } from "@/installation"
26
+ import { InstallationVersion } from "@/installation/version"
27
+ import { EffectBridge } from "@/effect"
28
+ import { Global } from "@/global"
29
+ import * as Option from "effect/Option"
30
+ import * as OtelTracer from "@effect/opentelemetry/Tracer"
31
+ import { ActorRegistry } from "@/actor/registry"
32
+ import { Memory } from "@/memory"
33
+ import { isRetryableTransientError } from "./retry"
34
+
35
+ const log = Log.create({ service: "llm" })
36
+ export const OUTPUT_TOKEN_MAX = ProviderTransform.OUTPUT_TOKEN_MAX
37
+ type Result = Awaited<ReturnType<typeof streamText>>
38
+
39
+ /**
40
+ * Match transient errors that the PERSISTENT_RETRY layer should retry.
41
+ *
42
+ * - HTTP 429 / 5xx / 529 — capacity / overload responses
43
+ * - ECONNRESET / EPIPE / ETIMEDOUT — network errors typically caused by
44
+ * stale keep-alive sockets or upstream proxy timeouts
45
+ * - "SSE read timed out" — `provider.ts:wrapSSE` chunk-timeout fired
46
+ * (configured per-provider via `chunkTimeout` in mimocode.json). This
47
+ * is HTTP-byte-level: keep-alive comments still count as activity, so
48
+ * the error only fires when the underlying TCP stream is genuinely dead.
49
+ *
50
+ * Auth errors (401/403), client errors (400, 404, 422), and user-
51
+ * initiated aborts are NOT retryable.
52
+ *
53
+ * @deprecated Use `isRetryableTransientError` from `./retry` directly.
54
+ * Kept as a 1-line wrapper to preserve the existing export name.
55
+ */
56
+ export function isTransientCapacityError(error: unknown): boolean {
57
+ return isRetryableTransientError(error)
58
+ }
59
+
60
+ /**
61
+ * Persistent-retry schedule with exponential backoff.
62
+ *
63
+ * Exponential backoff 500ms × 2 (i.e. 0.5, 1, 2, 4, 8, 16, 32, 64, 128, 256s),
64
+ * each individual delay capped at 5 minutes, total attempts capped at 10.
65
+ *
66
+ * Worst-case total = 11 attempts × chunkTimeout + cumulative backoff
67
+ * ≈ 11 × 8min + 9min ≈ 97 min (with DEFAULT_CHUNK_TIMEOUT = 8min).
68
+ *
69
+ * Intentionally NOT capped via Schedule.upTo() — retry persistence under
70
+ * brief upstream outages is the design goal. Bounding per-attempt latency
71
+ * via chunkTimeout is the primary lever for hang-time control.
72
+ */
73
+ export const persistentRetrySchedule = Schedule.exponential("500 millis", 2).pipe(
74
+ Schedule.modifyDelay((_, delay) =>
75
+ Effect.succeed(Duration.isLessThanOrEqualTo(delay, Duration.minutes(5)) ? delay : Duration.minutes(5)),
76
+ ),
77
+ Schedule.both(Schedule.recurs(10)),
78
+ )
79
+
80
+ /**
81
+ * Memory-system instructions appended to the main agent's system prompt.
82
+ *
83
+ * Teaches the agent its v8.1 ownership of the memory system:
84
+ * - MEMORY.md (project-scoped): writer is sole curator + agent edits for
85
+ * project-level user-stated rules
86
+ * - checkpoint.md (session-scoped): writer EXCLUSIVE; agent never edits
87
+ * - tasks/<id>/progress.md: writer-derived splitover from session-level
88
+ * progress.md; not LLM-written. Subagents handed a task may read but
89
+ * should not write.
90
+ *
91
+ * Also documents the Active recall protocol that prevents re-Reading
92
+ * files already present in the rebuild dump, and the Subagent return
93
+ * format contract.
94
+ *
95
+ * `memoryRoot` is the same absolute root returned by Memory.root(), so these
96
+ * paths match the files used by checkpoint restore and memory/task detection.
97
+ */
98
+ function buildMemoryInstructions(sessionID: SessionID, projectID: ProjectID, memoryRoot: string): string {
99
+ const memoryFile = path.join(memoryRoot, "projects", projectID, "MEMORY.md")
100
+ const checkpointFile = path.join(memoryRoot, "sessions", sessionID, "checkpoint.md")
101
+ const sessionMemoryDir = path.join(memoryRoot, "sessions", sessionID)
102
+ const globalMemoryFile = path.join(memoryRoot, "global", "MEMORY.md")
103
+ return `# Memory system
104
+
105
+ You have a persistent file-based memory system. Four file types:
106
+
107
+ - Project memory at \`${memoryFile}\` — persistent across all sessions in this project. Contains: project context, rules, architecture decisions, durable cross-task knowledge.
108
+ - Session checkpoint at \`${checkpointFile}\` — current session's structured state, written ONLY by the checkpoint-writer subagent. 11 sections covering active intent, next action, directives, task tree, current work, files, learnings, errors, live resources, design decisions, and open notes. Task content lives inside §4 Task tree and §5 Current work.
109
+ - Per-task progress at \`${path.join(sessionMemoryDir, "tasks", "<id>", "progress.md")}\` — writer-derived splitover from session-level progress.md (not LLM-written). When you spawn a subagent on a task, the subagent may be handed this path for reading; you do not maintain it.
110
+ - Global memory at \`${globalMemoryFile}\` — user-level preferences and cross-project feedback that persist across all projects. Auto-injected into rebuild context under the "## Global memory" header when present.
111
+
112
+ The checkpoint writer is the sole curator of the structured files. You don't maintain them mid-task — the writer extracts everything from the conversation at checkpoint events.
113
+
114
+ ## When to Edit MEMORY.md directly
115
+
116
+ You may Edit MEMORY.md when:
117
+ - User states a project-level rule that should hold across sessions → ## Rules
118
+ - User states a project-level architectural decision → ## Architecture decisions
119
+ - A clearly durable cross-session fact emerges that you want available immediately, before the next checkpoint → ## Discovered durable knowledge
120
+
121
+ These are exceptions, not the norm. The writer covers most extraction at checkpoint time.
122
+
123
+ ## Notes scratchpad
124
+
125
+ You have a single legal scratchpad at \`${path.join(sessionMemoryDir, "notes.md")}\`. Append entries to it when you want to record:
126
+
127
+ - A quote (from the user, an article, a known engineer) that has lasting value but isn't a task-specific decision
128
+ - An unresolved question — something you noticed but won't answer this turn
129
+ - A cross-project observation — "we did this in project X, similar pattern here"
130
+ - A note for future-self — context that would matter weeks later but doesn't fit any current task
131
+
132
+ Format each entry as:
133
+ ## [turn N · YYYY-MM-DDTHH:MM:SSZ]
134
+ Free-form body. The writer reorganizes structured content at checkpoint time.
135
+
136
+ This is your ONLY legal scratchpad — don't create \`learning.md\`, \`scratch.md\`, or any other ad-hoc memory file.
137
+
138
+ ## Subagent return format
139
+
140
+ When you (as a subagent) finish your task, your final assistant message will be delivered to the spawning agent. If the spawn machinery added a "Return format (required)" section to your prompt, follow it exactly:
141
+
142
+ **Status**: success | partial | failed | blocked
143
+ **Summary**: <one-line description>
144
+
145
+ <deliverable body>
146
+
147
+ **Files touched**: <comma-separated paths or "(none)">
148
+ **Findings worth promoting**: <bullet list, or "(none)">
149
+
150
+ If your spawn prompt didn't include this format (e.g., explore/title/summary agents have their own contracts), follow whatever your prompt specifies.
151
+
152
+ ## What NOT to do
153
+
154
+ - Don't Edit checkpoint.md — that's the writer's domain.
155
+ - Don't create memory files other than notes.md (no learning.md, no scratch.md). Use notes.md for any free-form entry.
156
+ - Don't ask the user about something memory may already record — search first via Grep / Read.
157
+
158
+ ## Active recall protocol
159
+
160
+ After a checkpoint rebuild, the following dumps may be already in your context (look for the "Summary of previous conversation from checkpoint files:" header followed by these dumps):
161
+
162
+ - checkpoint.md (full or budget-truncated)
163
+ - MEMORY.md (full or budget-truncated)
164
+ - notes.md (full or budget-truncated)
165
+ - global/MEMORY.md (full or budget-truncated)
166
+
167
+ If these dumps are visible in your context:
168
+
169
+ - Do NOT Read them again as whole files. The bytes are already in front of you.
170
+ - For specific past details (a particular turn's content, a specific tool output, an old command), use Grep with a keyword pattern to target the exact item — do not pull a whole file.
171
+ - For files NOT in the rebuild dump (per-task splitover progress.md files for tasks you don't actively need, spillover files, older session checkpoints in other sessions), Read on demand.
172
+
173
+ If a dump shows "⚠️ Truncated at ~N tokens. Read(<path>, offset=L) for the rest." — that file was budget-cut. Use Read with the offset only when you need the missing tail.
174
+
175
+ Memory entries name functions, files, flags, paths — those are CLAIMS about a point in time when they were written. Verify before acting on a specific name.
176
+
177
+ Don't ask the user about something memory may already record.
178
+ `
179
+ }
180
+
181
+ export type StreamInput = {
182
+ user: MessageV2.User
183
+ sessionID: string
184
+ parentSessionID?: string
185
+ model: Provider.Model
186
+ agent: Agent.Info
187
+ permission?: Permission.Ruleset
188
+ system: string[]
189
+ prebuiltSystem?: string[] // when set, skip buildSystemArray and use this verbatim
190
+ messages: ModelMessage[]
191
+ small?: boolean
192
+ tools: Record<string, Tool>
193
+ retries?: number
194
+ toolChoice?: "auto" | "required" | "none"
195
+ agentID?: string
196
+ }
197
+
198
+ export type StreamRequest = StreamInput & {
199
+ abort: AbortSignal
200
+ }
201
+
202
+ export type Event = Result["fullStream"] extends AsyncIterable<infer T> ? T : never
203
+
204
+ export interface Interface {
205
+ readonly stream: (input: StreamInput) => Stream.Stream<Event, unknown>
206
+ readonly buildSystemArray: (input: {
207
+ agent: Agent.Info
208
+ model: Provider.Model
209
+ system: string[]
210
+ user: MessageV2.User
211
+ sessionID: string
212
+ agentID?: string
213
+ }) => Effect.Effect<string[]>
214
+ }
215
+
216
+ export class Service extends Context.Service<Service, Interface>()("@opencode/LLM") {}
217
+
218
+ const live: Layer.Layer<
219
+ Service,
220
+ never,
221
+ Auth.Service | Config.Service | Provider.Service | Plugin.Service | Permission.Service | ActorRegistry.Service | Memory.Service
222
+ > = Layer.effect(
223
+ Service,
224
+ Effect.gen(function* () {
225
+ const auth = yield* Auth.Service
226
+ const config = yield* Config.Service
227
+ const provider = yield* Provider.Service
228
+ const plugin = yield* Plugin.Service
229
+ const perm = yield* Permission.Service
230
+ const actorReg = yield* ActorRegistry.Service
231
+ const memory = yield* Memory.Service
232
+
233
+ const buildSystemArray = Effect.fn("LLM.buildSystemArray")(function* (input: {
234
+ agent: Agent.Info
235
+ model: Provider.Model
236
+ system: string[]
237
+ user: MessageV2.User
238
+ sessionID: string
239
+ agentID?: string
240
+ }) {
241
+ const system: string[] = []
242
+ system.push(
243
+ [
244
+ // use agent prompt otherwise provider prompt
245
+ ...(input.agent.prompt ? [input.agent.prompt] : SystemPrompt.provider(input.model)),
246
+ // any custom prompt passed into this call
247
+ ...input.system,
248
+ // any custom prompt from last user message
249
+ ...(input.user.system ? [input.user.system] : []),
250
+ ]
251
+ .filter((x) => x)
252
+ .join("\n"),
253
+ )
254
+
255
+ // v5: memory-instructions section. Teaches the main agent how/where/when
256
+ // to maintain `MEMORY.md` and `checkpoint.md` directly via Edit. Project
257
+ // ID is resolved from the ALS-bound Instance with a safe fallback to
258
+ // `ProjectID.global` (mirrors the pattern in session/checkpoint.ts so the
259
+ // path the prompt advertises matches the path the writer actually writes).
260
+ // Skip for system-spawned actors (e.g. checkpoint-writer): they shouldn't
261
+ // see the user-facing memory instructions.
262
+ const isSystemActor = input.agentID
263
+ ? yield* actorReg.isSystemSpawned(SessionID.make(input.sessionID), input.agentID)
264
+ : false
265
+ if (!isSystemActor) {
266
+ const projectID =
267
+ (yield* Effect.try({
268
+ try: () => Instance.current?.project?.id as ProjectID | undefined,
269
+ catch: () => undefined,
270
+ }).pipe(Effect.orElseSucceed(() => undefined))) ?? ProjectID.global
271
+ // Bootstrap the memory.md → MEMORY.md migration at session start so a
272
+ // legacy lowercase file is renamed before the agent's first direct
273
+ // Edit/Write (which would otherwise miss it on a case-sensitive FS, or
274
+ // create an uppercase sibling and orphan the legacy content). The two
275
+ // checkpoint-flow call sites cover the writer/rebuild paths; this covers
276
+ // the "agent edits MEMORY.md before any checkpoint" path. Idempotent.
277
+ yield* Effect.promise(() => migrateProjectMemory(projectID)).pipe(Effect.ignore)
278
+ system.push(buildMemoryInstructions(SessionID.make(input.sessionID), projectID, yield* memory.root()))
279
+ }
280
+
281
+ const header = system[0]
282
+ yield* plugin.trigger(
283
+ "experimental.chat.system.transform",
284
+ { sessionID: input.sessionID, model: input.model },
285
+ { system },
286
+ )
287
+ // rejoin to maintain 2-part structure for caching if header unchanged
288
+ if (system.length > 2 && system[0] === header) {
289
+ const rest = system.slice(1)
290
+ system.length = 0
291
+ system.push(header, rest.join("\n"))
292
+ }
293
+
294
+ return system
295
+ })
296
+
297
+ const run = Effect.fn("LLM.run")(function* (input: StreamRequest) {
298
+ const l = log
299
+ .clone()
300
+ .tag("providerID", input.model.providerID)
301
+ .tag("modelID", input.model.id)
302
+ .tag("session.id", input.sessionID)
303
+ .tag("small", (input.small ?? false).toString())
304
+ .tag("agent", input.agent.name)
305
+ .tag("mode", input.agent.mode)
306
+ l.info("stream", {
307
+ modelID: input.model.id,
308
+ providerID: input.model.providerID,
309
+ })
310
+
311
+ const [language, cfg, item, info] = yield* Effect.all(
312
+ [
313
+ provider.getLanguage(input.model),
314
+ config.get(),
315
+ provider.getProvider(input.model.providerID),
316
+ auth.get(input.model.providerID),
317
+ ],
318
+ { concurrency: "unbounded" },
319
+ )
320
+
321
+ // TODO: move this to a proper hook
322
+ const isOpenaiOauth = item.id === "openai" && info?.type === "oauth"
323
+
324
+ const system =
325
+ input.prebuiltSystem ??
326
+ (yield* buildSystemArray({
327
+ agent: input.agent,
328
+ model: input.model,
329
+ system: input.system,
330
+ user: input.user,
331
+ sessionID: input.sessionID,
332
+ agentID: input.agentID,
333
+ }))
334
+
335
+ const variant =
336
+ !input.small && input.model.variants && input.user.model.variant
337
+ ? input.model.variants[input.user.model.variant]
338
+ : {}
339
+ const base = input.small
340
+ ? ProviderTransform.smallOptions(input.model)
341
+ : ProviderTransform.options({
342
+ model: input.model,
343
+ sessionID: input.sessionID,
344
+ providerOptions: item.options,
345
+ })
346
+ const options: Record<string, any> = pipe(
347
+ base,
348
+ mergeDeep(input.model.options),
349
+ mergeDeep(input.agent.options),
350
+ mergeDeep(variant),
351
+ )
352
+ if (isOpenaiOauth) {
353
+ options.instructions = system.join("\n")
354
+ }
355
+
356
+ const isWorkflow = language instanceof GitLabWorkflowLanguageModel
357
+ const messages = isOpenaiOauth
358
+ ? input.messages
359
+ : isWorkflow
360
+ ? input.messages
361
+ : [
362
+ ...system.map(
363
+ (x): ModelMessage => ({
364
+ role: "system",
365
+ content: x,
366
+ }),
367
+ ),
368
+ ...input.messages,
369
+ ]
370
+
371
+ const params = yield* plugin.trigger(
372
+ "chat.params",
373
+ {
374
+ sessionID: input.sessionID,
375
+ agent: input.agent.name,
376
+ model: input.model,
377
+ provider: item,
378
+ message: input.user,
379
+ },
380
+ {
381
+ temperature: input.model.capabilities.temperature
382
+ ? (input.agent.temperature ?? ProviderTransform.temperature(input.model))
383
+ : undefined,
384
+ topP: input.agent.topP ?? ProviderTransform.topP(input.model),
385
+ topK: ProviderTransform.topK(input.model),
386
+ maxOutputTokens: ProviderTransform.maxOutputTokens(input.model),
387
+ options,
388
+ },
389
+ )
390
+
391
+ const { headers } = yield* plugin.trigger(
392
+ "chat.headers",
393
+ {
394
+ sessionID: input.sessionID,
395
+ agent: input.agent.name,
396
+ model: input.model,
397
+ provider: item,
398
+ message: input.user,
399
+ },
400
+ {
401
+ headers: {},
402
+ },
403
+ )
404
+
405
+ const tools = resolveTools(input)
406
+
407
+ // LiteLLM and some Anthropic proxies require the tools parameter to be present
408
+ // when message history contains tool calls, even if no tools are being used.
409
+ // Add a dummy tool that is never called to satisfy this validation.
410
+ // This is enabled for:
411
+ // 1. Providers with "litellm" in their ID or API ID (auto-detected)
412
+ // 2. Providers with explicit "litellmProxy: true" option (opt-in for custom gateways)
413
+ const isLiteLLMProxy =
414
+ item.options?.["litellmProxy"] === true ||
415
+ input.model.providerID.toLowerCase().includes("litellm") ||
416
+ input.model.api.id.toLowerCase().includes("litellm")
417
+
418
+ // LiteLLM/Bedrock rejects requests where the message history contains tool
419
+ // calls but no tools param is present. When there are no active tools (e.g.
420
+ // during compaction), inject a stub tool to satisfy the validation requirement.
421
+ // The stub description explicitly tells the model not to call it.
422
+ if (
423
+ (isLiteLLMProxy || input.model.providerID.includes("github-copilot")) &&
424
+ Object.keys(tools).length === 0 &&
425
+ hasToolCalls(input.messages)
426
+ ) {
427
+ tools["_noop"] = tool({
428
+ description: "Do not call this tool. It exists only for API compatibility and must never be invoked.",
429
+ inputSchema: jsonSchema({
430
+ type: "object",
431
+ properties: {
432
+ reason: { type: "string", description: "Unused" },
433
+ },
434
+ }),
435
+ execute: async () => ({ output: "", title: "", metadata: {} }),
436
+ })
437
+ }
438
+
439
+ // Wire up toolExecutor for DWS workflow models so that tool calls
440
+ // from the workflow service are executed via opencode's tool system
441
+ // and results sent back over the WebSocket.
442
+ if (language instanceof GitLabWorkflowLanguageModel) {
443
+ const workflowModel = language as GitLabWorkflowLanguageModel & {
444
+ sessionID?: string
445
+ sessionPreapprovedTools?: string[]
446
+ approvalHandler?: (approvalTools: { name: string; args: string }[]) => Promise<{ approved: boolean }>
447
+ }
448
+ workflowModel.sessionID = input.sessionID
449
+ workflowModel.systemPrompt = system.join("\n")
450
+ workflowModel.toolExecutor = async (toolName, argsJson, _requestID) => {
451
+ const t = tools[toolName]
452
+ if (!t || !t.execute) {
453
+ return { result: "", error: `Unknown tool: ${toolName}` }
454
+ }
455
+ try {
456
+ const result = await t.execute!(JSON.parse(argsJson), {
457
+ toolCallId: _requestID,
458
+ messages: input.messages,
459
+ abortSignal: input.abort,
460
+ })
461
+ const output = typeof result === "string" ? result : (result?.output ?? JSON.stringify(result))
462
+ return {
463
+ result: output,
464
+ metadata: typeof result === "object" ? result?.metadata : undefined,
465
+ title: typeof result === "object" ? result?.title : undefined,
466
+ }
467
+ } catch (e: any) {
468
+ return { result: "", error: e.message ?? String(e) }
469
+ }
470
+ }
471
+
472
+ const ruleset = Permission.merge(input.agent.permission ?? [], input.permission ?? [])
473
+ workflowModel.sessionPreapprovedTools = Object.keys(tools).filter((name) => {
474
+ const match = ruleset.findLast((rule) => Wildcard.match(name, rule.permission))
475
+ return !match || match.action !== "ask"
476
+ })
477
+
478
+ const bridge = yield* EffectBridge.make()
479
+ const approvedToolsForSession = new Set<string>()
480
+ workflowModel.approvalHandler = Instance.bind(async (approvalTools) => {
481
+ const uniqueNames = [...new Set(approvalTools.map((t: { name: string }) => t.name))] as string[]
482
+ // Auto-approve tools that were already approved in this session
483
+ // (prevents infinite approval loops for server-side MCP tools)
484
+ if (uniqueNames.every((name) => approvedToolsForSession.has(name))) {
485
+ return { approved: true }
486
+ }
487
+
488
+ const id = PermissionID.ascending()
489
+ let unsub: (() => void) | undefined
490
+ try {
491
+ unsub = Bus.subscribe(Permission.Event.Replied, (evt) => {
492
+ if (evt.properties.requestID === id) void evt.properties.reply
493
+ })
494
+ const toolPatterns = approvalTools.map((t: { name: string; args: string }) => {
495
+ try {
496
+ const parsed = JSON.parse(t.args) as Record<string, unknown>
497
+ const title = (parsed?.title ?? parsed?.name ?? "") as string
498
+ return title ? `${t.name}: ${title}` : t.name
499
+ } catch {
500
+ return t.name
501
+ }
502
+ })
503
+ const uniquePatterns = [...new Set(toolPatterns)] as string[]
504
+ await bridge.promise(
505
+ perm.ask({
506
+ id,
507
+ sessionID: SessionID.make(input.sessionID),
508
+ permission: "workflow_tool_approval",
509
+ patterns: uniquePatterns,
510
+ metadata: { tools: approvalTools },
511
+ always: uniquePatterns,
512
+ ruleset: [],
513
+ }),
514
+ )
515
+ for (const name of uniqueNames) approvedToolsForSession.add(name)
516
+ workflowModel.sessionPreapprovedTools = [...(workflowModel.sessionPreapprovedTools ?? []), ...uniqueNames]
517
+ return { approved: true }
518
+ } catch {
519
+ return { approved: false }
520
+ } finally {
521
+ unsub?.()
522
+ }
523
+ })
524
+ }
525
+
526
+ const tracer = cfg.experimental?.openTelemetry
527
+ ? Option.getOrUndefined(yield* Effect.serviceOption(OtelTracer.OtelTracer))
528
+ : undefined
529
+ const telemetryTracer = tracer
530
+ ? new Proxy(tracer, {
531
+ get(target, prop, receiver) {
532
+ if (prop !== "startSpan") return Reflect.get(target, prop, receiver)
533
+ return (...args: Parameters<typeof target.startSpan>) => {
534
+ const span = target.startSpan(...args)
535
+ span.setAttribute("session.id", input.sessionID)
536
+ return span
537
+ }
538
+ },
539
+ })
540
+ : undefined
541
+
542
+ const streamStartTs = Date.now()
543
+ l.debug("streamText starting", {
544
+ messageID: input.user.id,
545
+ msgCount: messages.length,
546
+ toolCount: Object.keys(tools).length,
547
+ })
548
+
549
+ return streamText({
550
+ onError(error) {
551
+ l.debug("streamText error", {
552
+ messageID: input.user.id,
553
+ error: error instanceof Error ? error.message : String(error),
554
+ elapsedMs: Date.now() - streamStartTs,
555
+ })
556
+ l.error("stream error", {
557
+ error,
558
+ })
559
+ },
560
+ async experimental_repairToolCall(failed) {
561
+ const lower = failed.toolCall.toolName.toLowerCase()
562
+ if (lower !== failed.toolCall.toolName && tools[lower]) {
563
+ l.info("repairing tool call", {
564
+ tool: failed.toolCall.toolName,
565
+ repaired: lower,
566
+ })
567
+ return {
568
+ ...failed.toolCall,
569
+ toolName: lower,
570
+ }
571
+ }
572
+ return {
573
+ ...failed.toolCall,
574
+ input: JSON.stringify({
575
+ tool: failed.toolCall.toolName,
576
+ error: failed.error.message,
577
+ }),
578
+ toolName: "invalid",
579
+ }
580
+ },
581
+ temperature: params.temperature,
582
+ topP: params.topP,
583
+ topK: params.topK,
584
+ providerOptions: ProviderTransform.providerOptions(input.model, params.options),
585
+ activeTools: Object.keys(tools).filter((x) => x !== "invalid"),
586
+ tools,
587
+ toolChoice: input.toolChoice,
588
+ maxOutputTokens: params.maxOutputTokens,
589
+ abortSignal: input.abort,
590
+ headers: {
591
+ "x-session-affinity": input.sessionID,
592
+ ...(input.parentSessionID ? { "x-parent-session-id": input.parentSessionID } : {}),
593
+ ...input.model.headers,
594
+ ...headers,
595
+ "User-Agent": `mimocode/${InstallationVersion}`,
596
+ },
597
+ // AI SDK's internal retry loop is SILENT — it emits no events and does
598
+ // not update session status, so the TUI shows only a dead spinner while
599
+ // it runs. Its backoff is also UNCAPPED (delay *= 2 each attempt, capped
600
+ // only by a retry-after header), so the prior default of 10 meant up to
601
+ // ~34 min (2+4+…+1024s) of invisible retrying before the error surfaced.
602
+ // We keep this layer short (absorb a couple of quick blips) and let the
603
+ // VISIBLE processor-level SessionRetry.policy own long-haul resilience —
604
+ // it publishes `type: "retry"` so the `[retrying attempt #N]` banner
605
+ // shows, and its per-attempt delay is capped at 30s.
606
+ maxRetries: input.retries ?? 2,
607
+ messages,
608
+ model: wrapLanguageModel({
609
+ model: language,
610
+ middleware: [
611
+ {
612
+ specificationVersion: "v3" as const,
613
+ async transformParams(args) {
614
+ if (args.type === "stream") {
615
+ // @ts-expect-error
616
+ args.params.prompt = ProviderTransform.message(args.params.prompt, input.model, options)
617
+ }
618
+ return args.params
619
+ },
620
+ },
621
+ ],
622
+ }),
623
+ experimental_telemetry: {
624
+ isEnabled: cfg.experimental?.openTelemetry,
625
+ functionId: "session.llm",
626
+ tracer: telemetryTracer,
627
+ metadata: {
628
+ userId: cfg.username ?? "unknown",
629
+ sessionId: input.sessionID,
630
+ },
631
+ },
632
+ })
633
+ })
634
+
635
+ const stream: Interface["stream"] = (input) =>
636
+ Stream.scoped(
637
+ Stream.unwrap(
638
+ Effect.gen(function* () {
639
+ const ctrl = yield* Effect.acquireRelease(
640
+ Effect.sync(() => new AbortController()),
641
+ (ctrl) => Effect.sync(() => ctrl.abort()),
642
+ )
643
+ const attemptRef = yield* Ref.make(0)
644
+
645
+ const publishRetryEvent = (error: unknown, nextAttempt: number) =>
646
+ Effect.gen(function* () {
647
+ log.debug("retry attempt", {
648
+ sessionID: input.sessionID,
649
+ messageID: input.user.id,
650
+ attempt: nextAttempt,
651
+ reason: error instanceof Error ? error.message : String(error),
652
+ })
653
+ if (nextAttempt > 10) return
654
+ const delayMs = Math.min(500 * 2 ** (nextAttempt - 1), 300_000)
655
+ yield* Effect.promise(() =>
656
+ Bus.publish(Session.Event.RetryAttempt, {
657
+ sessionID: SessionID.make(input.sessionID),
658
+ messageID: input.user.id,
659
+ attempt: nextAttempt,
660
+ maxAttempts: 10,
661
+ reason: error instanceof Error ? error.message : String(error),
662
+ nextDelayMs: delayMs,
663
+ })
664
+ )
665
+ })
666
+
667
+ const streamWithTelemetry = run({ ...input, abort: ctrl.signal }).pipe(
668
+ Effect.tapError((error) => {
669
+ if (!isTransientCapacityError(error)) return Effect.void
670
+ return Ref.updateAndGet(attemptRef, (n) => n + 1).pipe(
671
+ Effect.flatMap((nextAttempt) => publishRetryEvent(error, nextAttempt))
672
+ )
673
+ })
674
+ )
675
+
676
+ const result = yield* streamWithTelemetry.pipe(
677
+ Effect.retry({
678
+ while: isTransientCapacityError,
679
+ schedule: persistentRetrySchedule,
680
+ }),
681
+ )
682
+
683
+ return Stream.fromAsyncIterable(result.fullStream, (e) => (e instanceof Error ? e : new Error(String(e))))
684
+ }),
685
+ ),
686
+ )
687
+
688
+ return Service.of({ stream, buildSystemArray })
689
+ }),
690
+ )
691
+
692
+ export const layer = live.pipe(Layer.provide(Permission.defaultLayer))
693
+
694
+ export const defaultLayer = Layer.suspend(() =>
695
+ layer.pipe(
696
+ Layer.provide(Auth.defaultLayer),
697
+ Layer.provide(Config.defaultLayer),
698
+ Layer.provide(Provider.defaultLayer),
699
+ Layer.provide(Plugin.defaultLayer),
700
+ Layer.provide(ActorRegistry.defaultLayer),
701
+ Layer.provide(Memory.defaultLayer),
702
+ ),
703
+ )
704
+
705
+ function resolveTools(input: Pick<StreamInput, "tools" | "agent" | "permission" | "user">) {
706
+ const disabled = Permission.disabled(
707
+ Object.keys(input.tools),
708
+ Permission.merge(input.agent.permission, input.permission ?? []),
709
+ )
710
+ return Record.filter(input.tools, (_, k) => input.user.tools?.[k] !== false && !disabled.has(k))
711
+ }
712
+
713
+ // Check if messages contain any tool-call content
714
+ // Used to determine if a dummy tool should be added for LiteLLM proxy compatibility
715
+ export function hasToolCalls(messages: ModelMessage[]): boolean {
716
+ for (const msg of messages) {
717
+ if (!Array.isArray(msg.content)) continue
718
+ for (const part of msg.content) {
719
+ if (part.type === "tool-call" || part.type === "tool-result") return true
720
+ }
721
+ }
722
+ return false
723
+ }
724
+
725
+ export * as LLM from "./llm"