@sleepy-ai/cli 0.1.16 → 0.1.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (805) hide show
  1. package/{src/skill/compose/LICENSE-superpowers → LICENSE} +3 -6
  2. package/README.md +139 -6
  3. package/package.json +35 -199
  4. package/postinstall.mjs +102 -0
  5. package/.sleepycode-test-fixtures-50158/sleepycode-test-eqsxv84ythu/.watcher-b67v64k2mnv +0 -1
  6. package/.sleepycode-test-fixtures-66172/sleepycode-test-x1ymo4kksaa/sleepycode.json +0 -1
  7. package/Dockerfile +0 -18
  8. package/drizzle.config.ts +0 -10
  9. package/git +0 -0
  10. package/migration/20260127222353_familiar_lady_ursula/migration.sql +0 -90
  11. package/migration/20260127222353_familiar_lady_ursula/snapshot.json +0 -796
  12. package/migration/20260211171708_add_project_commands/migration.sql +0 -1
  13. package/migration/20260211171708_add_project_commands/snapshot.json +0 -806
  14. package/migration/20260213144116_wakeful_the_professor/migration.sql +0 -11
  15. package/migration/20260213144116_wakeful_the_professor/snapshot.json +0 -897
  16. package/migration/20260225215848_workspace/migration.sql +0 -7
  17. package/migration/20260225215848_workspace/snapshot.json +0 -959
  18. package/migration/20260227213759_add_session_workspace_id/migration.sql +0 -2
  19. package/migration/20260227213759_add_session_workspace_id/snapshot.json +0 -983
  20. package/migration/20260228203230_blue_harpoon/migration.sql +0 -17
  21. package/migration/20260228203230_blue_harpoon/snapshot.json +0 -1102
  22. package/migration/20260303231226_add_workspace_fields/migration.sql +0 -5
  23. package/migration/20260303231226_add_workspace_fields/snapshot.json +0 -1013
  24. package/migration/20260309230000_move_org_to_state/migration.sql +0 -3
  25. package/migration/20260309230000_move_org_to_state/snapshot.json +0 -1156
  26. package/migration/20260312043431_session_message_cursor/migration.sql +0 -4
  27. package/migration/20260312043431_session_message_cursor/snapshot.json +0 -1168
  28. package/migration/20260323234822_events/migration.sql +0 -13
  29. package/migration/20260323234822_events/snapshot.json +0 -1271
  30. package/migration/20260410174513_workspace-name/migration.sql +0 -16
  31. package/migration/20260410174513_workspace-name/snapshot.json +0 -1271
  32. package/migration/20260413175956_chief_energizer/migration.sql +0 -13
  33. package/migration/20260413175956_chief_energizer/snapshot.json +0 -1399
  34. package/migration/20260422160000_context_inheritance/migration.sql +0 -3
  35. package/migration/20260422170000_task_registry/migration.sql +0 -18
  36. package/migration/20260423145421_remove_session_entry/migration.sql +0 -4
  37. package/migration/20260515000000_actor_rename/migration.sql +0 -7
  38. package/migration/20260515010000_memory_fts/migration.sql +0 -33
  39. package/migration/20260515020000_user_task/migration.sql +0 -29
  40. package/migration/20260519000000_last_checkpoint_message_id/migration.sql +0 -1
  41. package/migration/20260521000000_message_agent_id/migration.sql +0 -2
  42. package/migration/20260521000100_actor_registry_v6/migration.sql +0 -25
  43. package/migration/20260521010000_memory_fts_v6/migration.sql +0 -33
  44. package/migration/20260521020000_memory_fts_triggers/migration.sql +0 -17
  45. package/migration/20260526000000_agent_id_main/migration.sql +0 -14
  46. package/migration/20260527000000_actor_lifecycle/migration.sql +0 -8
  47. package/migration/20260527000100_inbox/migration.sql +0 -12
  48. package/migration/20260529000000_task_todo_redesign/migration.sql +0 -16
  49. package/migration/20260603000000_task_in_progress_owner/migration.sql +0 -1
  50. package/migration/20260603000000_workflow_run/migration.sql +0 -17
  51. package/migration/20260604000000_workflow_script_sha/migration.sql +0 -1
  52. package/migration/20260608000000_claude_import/migration.sql +0 -7
  53. package/migration/20260608010000_claude_import_message_ids/migration.sql +0 -1
  54. package/migration/20260609000000_history_fts/migration.sql +0 -29
  55. package/migration/20260609230000_workflow_agent_timeout/migration.sql +0 -1
  56. package/migration/20260612000000_external_import/migration.sql +0 -16
  57. package/parsers-config.ts +0 -290
  58. package/src/account/account.sql.ts +0 -39
  59. package/src/account/account.ts +0 -456
  60. package/src/account/repo.ts +0 -166
  61. package/src/account/schema.ts +0 -99
  62. package/src/account/url.ts +0 -8
  63. package/src/acp/README.md +0 -174
  64. package/src/acp/agent.ts +0 -1787
  65. package/src/acp/session.ts +0 -116
  66. package/src/acp/types.ts +0 -24
  67. package/src/actor/actor.sql.ts +0 -38
  68. package/src/actor/events.ts +0 -67
  69. package/src/actor/index.ts +0 -2
  70. package/src/actor/registry.ts +0 -412
  71. package/src/actor/return-header.ts +0 -24
  72. package/src/actor/schema.ts +0 -47
  73. package/src/actor/spawn-ref.ts +0 -16
  74. package/src/actor/spawn.ts +0 -756
  75. package/src/actor/turn.ts +0 -49
  76. package/src/actor/waiter.ts +0 -166
  77. package/src/agent/agent.ts +0 -645
  78. package/src/agent/config.ts +0 -5
  79. package/src/agent/generate.txt +0 -75
  80. package/src/agent/prompt/apex.txt +0 -363
  81. package/src/agent/prompt/checkpoint-writer.txt +0 -167
  82. package/src/agent/prompt/compaction.txt +0 -9
  83. package/src/agent/prompt/distill.txt +0 -199
  84. package/src/agent/prompt/dream.txt +0 -155
  85. package/src/agent/prompt/explore.txt +0 -18
  86. package/src/agent/prompt/forge.txt +0 -491
  87. package/src/agent/prompt/phantom.txt +0 -491
  88. package/src/agent/prompt/pivot.txt +0 -460
  89. package/src/agent/prompt/stack.txt +0 -472
  90. package/src/agent/prompt/summary.txt +0 -11
  91. package/src/agent/prompt/title.txt +0 -44
  92. package/src/audio.d.ts +0 -9
  93. package/src/auth/index.ts +0 -97
  94. package/src/bus/bus-event.ts +0 -33
  95. package/src/bus/global.ts +0 -12
  96. package/src/bus/index.ts +0 -193
  97. package/src/cli/bootstrap.ts +0 -33
  98. package/src/cli/cmd/account.ts +0 -258
  99. package/src/cli/cmd/acp.ts +0 -70
  100. package/src/cli/cmd/agent.ts +0 -248
  101. package/src/cli/cmd/cmd.ts +0 -7
  102. package/src/cli/cmd/db.ts +0 -120
  103. package/src/cli/cmd/debug/agent.ts +0 -192
  104. package/src/cli/cmd/debug/config.ts +0 -17
  105. package/src/cli/cmd/debug/file.ts +0 -100
  106. package/src/cli/cmd/debug/index.ts +0 -48
  107. package/src/cli/cmd/debug/lsp.ts +0 -61
  108. package/src/cli/cmd/debug/ripgrep.ts +0 -105
  109. package/src/cli/cmd/debug/scrap.ts +0 -16
  110. package/src/cli/cmd/debug/skill.ts +0 -23
  111. package/src/cli/cmd/debug/snapshot.ts +0 -53
  112. package/src/cli/cmd/doctor.ts +0 -116
  113. package/src/cli/cmd/export.ts +0 -306
  114. package/src/cli/cmd/generate.ts +0 -50
  115. package/src/cli/cmd/github.ts +0 -1647
  116. package/src/cli/cmd/import.ts +0 -208
  117. package/src/cli/cmd/init.ts +0 -97
  118. package/src/cli/cmd/login.ts +0 -402
  119. package/src/cli/cmd/mcp.ts +0 -812
  120. package/src/cli/cmd/models.ts +0 -88
  121. package/src/cli/cmd/plug.ts +0 -233
  122. package/src/cli/cmd/pr.ts +0 -138
  123. package/src/cli/cmd/providers.ts +0 -713
  124. package/src/cli/cmd/run-completion.ts +0 -77
  125. package/src/cli/cmd/run.ts +0 -694
  126. package/src/cli/cmd/serve.ts +0 -30
  127. package/src/cli/cmd/session.ts +0 -181
  128. package/src/cli/cmd/stats.ts +0 -413
  129. package/src/cli/cmd/tui/app.tsx +0 -1161
  130. package/src/cli/cmd/tui/asset/TEN_VAD_LICENSE +0 -12
  131. package/src/cli/cmd/tui/asset/charge.wav +0 -0
  132. package/src/cli/cmd/tui/asset/pulse-a.wav +0 -0
  133. package/src/cli/cmd/tui/asset/pulse-b.wav +0 -0
  134. package/src/cli/cmd/tui/asset/pulse-c.wav +0 -0
  135. package/src/cli/cmd/tui/asset/ten_vad.wasm +0 -0
  136. package/src/cli/cmd/tui/asset/ten_vad_loader.js +0 -30
  137. package/src/cli/cmd/tui/attach.ts +0 -84
  138. package/src/cli/cmd/tui/component/background-image.tsx +0 -150
  139. package/src/cli/cmd/tui/component/banner-session-expired.tsx +0 -48
  140. package/src/cli/cmd/tui/component/bg-pulse.tsx +0 -130
  141. package/src/cli/cmd/tui/component/border.tsx +0 -21
  142. package/src/cli/cmd/tui/component/dialog-agent.tsx +0 -31
  143. package/src/cli/cmd/tui/component/dialog-agreement.tsx +0 -111
  144. package/src/cli/cmd/tui/component/dialog-command.tsx +0 -219
  145. package/src/cli/cmd/tui/component/dialog-console-org.tsx +0 -103
  146. package/src/cli/cmd/tui/component/dialog-go-upsell.tsx +0 -150
  147. package/src/cli/cmd/tui/component/dialog-image-list.tsx +0 -111
  148. package/src/cli/cmd/tui/component/dialog-logo-design.tsx +0 -37
  149. package/src/cli/cmd/tui/component/dialog-mcp.tsx +0 -86
  150. package/src/cli/cmd/tui/component/dialog-model.tsx +0 -299
  151. package/src/cli/cmd/tui/component/dialog-provider.tsx +0 -449
  152. package/src/cli/cmd/tui/component/dialog-session-delete-failed.tsx +0 -101
  153. package/src/cli/cmd/tui/component/dialog-session-list.tsx +0 -269
  154. package/src/cli/cmd/tui/component/dialog-session-rename.tsx +0 -31
  155. package/src/cli/cmd/tui/component/dialog-skill.tsx +0 -42
  156. package/src/cli/cmd/tui/component/dialog-sleepy-login.tsx +0 -167
  157. package/src/cli/cmd/tui/component/dialog-stash.tsx +0 -87
  158. package/src/cli/cmd/tui/component/dialog-status.tsx +0 -170
  159. package/src/cli/cmd/tui/component/dialog-tag.tsx +0 -44
  160. package/src/cli/cmd/tui/component/dialog-theme-list.tsx +0 -50
  161. package/src/cli/cmd/tui/component/dialog-token-plan.tsx +0 -77
  162. package/src/cli/cmd/tui/component/dialog-variant.tsx +0 -39
  163. package/src/cli/cmd/tui/component/dialog-workflows.tsx +0 -51
  164. package/src/cli/cmd/tui/component/dialog-workspace-create.tsx +0 -289
  165. package/src/cli/cmd/tui/component/dialog-workspace-unavailable.tsx +0 -81
  166. package/src/cli/cmd/tui/component/dialog-worktree.tsx +0 -90
  167. package/src/cli/cmd/tui/component/error-component.tsx +0 -92
  168. package/src/cli/cmd/tui/component/logo.tsx +0 -961
  169. package/src/cli/cmd/tui/component/plugin-route-missing.tsx +0 -14
  170. package/src/cli/cmd/tui/component/prompt/autocomplete-detect.ts +0 -34
  171. package/src/cli/cmd/tui/component/prompt/autocomplete.tsx +0 -668
  172. package/src/cli/cmd/tui/component/prompt/cwd.ts +0 -0
  173. package/src/cli/cmd/tui/component/prompt/frecency.tsx +0 -90
  174. package/src/cli/cmd/tui/component/prompt/history.tsx +0 -108
  175. package/src/cli/cmd/tui/component/prompt/index.tsx +0 -1869
  176. package/src/cli/cmd/tui/component/prompt/offset.ts +0 -45
  177. package/src/cli/cmd/tui/component/prompt/part.ts +0 -36
  178. package/src/cli/cmd/tui/component/prompt/stash.tsx +0 -101
  179. package/src/cli/cmd/tui/component/spinner.tsx +0 -24
  180. package/src/cli/cmd/tui/component/starry-background.tsx +0 -305
  181. package/src/cli/cmd/tui/component/startup-loading.tsx +0 -67
  182. package/src/cli/cmd/tui/component/task-item.tsx +0 -63
  183. package/src/cli/cmd/tui/component/textarea-keybindings.ts +0 -73
  184. package/src/cli/cmd/tui/component/todo-item.tsx +0 -32
  185. package/src/cli/cmd/tui/component/workflow-tree.tsx +0 -177
  186. package/src/cli/cmd/tui/config/cwd.ts +0 -5
  187. package/src/cli/cmd/tui/config/tui-migrate.ts +0 -151
  188. package/src/cli/cmd/tui/config/tui-schema.ts +0 -38
  189. package/src/cli/cmd/tui/config/tui.ts +0 -219
  190. package/src/cli/cmd/tui/context/args.tsx +0 -16
  191. package/src/cli/cmd/tui/context/directory.ts +0 -15
  192. package/src/cli/cmd/tui/context/event.ts +0 -45
  193. package/src/cli/cmd/tui/context/exit.tsx +0 -65
  194. package/src/cli/cmd/tui/context/helper.tsx +0 -25
  195. package/src/cli/cmd/tui/context/keybind.tsx +0 -105
  196. package/src/cli/cmd/tui/context/kv.tsx +0 -86
  197. package/src/cli/cmd/tui/context/language.tsx +0 -91
  198. package/src/cli/cmd/tui/context/local.tsx +0 -458
  199. package/src/cli/cmd/tui/context/plugin-keybinds.ts +0 -41
  200. package/src/cli/cmd/tui/context/project.tsx +0 -109
  201. package/src/cli/cmd/tui/context/prompt.tsx +0 -18
  202. package/src/cli/cmd/tui/context/route.tsx +0 -68
  203. package/src/cli/cmd/tui/context/sdk.tsx +0 -150
  204. package/src/cli/cmd/tui/context/sync.tsx +0 -884
  205. package/src/cli/cmd/tui/context/theme/aura.json +0 -69
  206. package/src/cli/cmd/tui/context/theme/ayu.json +0 -80
  207. package/src/cli/cmd/tui/context/theme/carbonfox.json +0 -248
  208. package/src/cli/cmd/tui/context/theme/catppuccin-frappe.json +0 -230
  209. package/src/cli/cmd/tui/context/theme/catppuccin-macchiato.json +0 -230
  210. package/src/cli/cmd/tui/context/theme/catppuccin.json +0 -112
  211. package/src/cli/cmd/tui/context/theme/cobalt2.json +0 -225
  212. package/src/cli/cmd/tui/context/theme/cursor.json +0 -249
  213. package/src/cli/cmd/tui/context/theme/dracula.json +0 -219
  214. package/src/cli/cmd/tui/context/theme/everforest.json +0 -241
  215. package/src/cli/cmd/tui/context/theme/flexoki.json +0 -237
  216. package/src/cli/cmd/tui/context/theme/github.json +0 -233
  217. package/src/cli/cmd/tui/context/theme/gruvbox.json +0 -242
  218. package/src/cli/cmd/tui/context/theme/kanagawa.json +0 -77
  219. package/src/cli/cmd/tui/context/theme/lucent-orng.json +0 -234
  220. package/src/cli/cmd/tui/context/theme/material.json +0 -235
  221. package/src/cli/cmd/tui/context/theme/matrix.json +0 -77
  222. package/src/cli/cmd/tui/context/theme/mercury.json +0 -252
  223. package/src/cli/cmd/tui/context/theme/monokai.json +0 -221
  224. package/src/cli/cmd/tui/context/theme/nightowl.json +0 -221
  225. package/src/cli/cmd/tui/context/theme/nord.json +0 -223
  226. package/src/cli/cmd/tui/context/theme/one-dark.json +0 -84
  227. package/src/cli/cmd/tui/context/theme/orng.json +0 -249
  228. package/src/cli/cmd/tui/context/theme/osaka-jade.json +0 -93
  229. package/src/cli/cmd/tui/context/theme/palenight.json +0 -222
  230. package/src/cli/cmd/tui/context/theme/rosepine.json +0 -234
  231. package/src/cli/cmd/tui/context/theme/sleepycode.json +0 -245
  232. package/src/cli/cmd/tui/context/theme/solarized.json +0 -223
  233. package/src/cli/cmd/tui/context/theme/synthwave84.json +0 -226
  234. package/src/cli/cmd/tui/context/theme/tokyonight.json +0 -243
  235. package/src/cli/cmd/tui/context/theme/vercel.json +0 -245
  236. package/src/cli/cmd/tui/context/theme/vesper.json +0 -218
  237. package/src/cli/cmd/tui/context/theme/zenburn.json +0 -223
  238. package/src/cli/cmd/tui/context/theme.tsx +0 -1298
  239. package/src/cli/cmd/tui/context/thinking.ts +0 -48
  240. package/src/cli/cmd/tui/context/tui-config.tsx +0 -9
  241. package/src/cli/cmd/tui/event.ts +0 -62
  242. package/src/cli/cmd/tui/feature-plugins/home/footer.tsx +0 -93
  243. package/src/cli/cmd/tui/feature-plugins/home/tips-view.tsx +0 -193
  244. package/src/cli/cmd/tui/feature-plugins/home/tips.tsx +0 -54
  245. package/src/cli/cmd/tui/feature-plugins/sidebar/context.tsx +0 -287
  246. package/src/cli/cmd/tui/feature-plugins/sidebar/cwd.tsx +0 -45
  247. package/src/cli/cmd/tui/feature-plugins/sidebar/files.tsx +0 -62
  248. package/src/cli/cmd/tui/feature-plugins/sidebar/footer.tsx +0 -93
  249. package/src/cli/cmd/tui/feature-plugins/sidebar/goal.tsx +0 -84
  250. package/src/cli/cmd/tui/feature-plugins/sidebar/instructions.tsx +0 -54
  251. package/src/cli/cmd/tui/feature-plugins/sidebar/lsp.tsx +0 -66
  252. package/src/cli/cmd/tui/feature-plugins/sidebar/mascot.tsx +0 -69
  253. package/src/cli/cmd/tui/feature-plugins/sidebar/mcp.tsx +0 -98
  254. package/src/cli/cmd/tui/feature-plugins/sidebar/task.tsx +0 -95
  255. package/src/cli/cmd/tui/feature-plugins/sidebar/todo.tsx +0 -51
  256. package/src/cli/cmd/tui/feature-plugins/sidebar/tps.ts +0 -31
  257. package/src/cli/cmd/tui/feature-plugins/system/plugins.tsx +0 -274
  258. package/src/cli/cmd/tui/i18n/en.ts +0 -454
  259. package/src/cli/cmd/tui/i18n/es.ts +0 -508
  260. package/src/cli/cmd/tui/i18n/fr.ts +0 -515
  261. package/src/cli/cmd/tui/i18n/ja.ts +0 -463
  262. package/src/cli/cmd/tui/i18n/locales.ts +0 -82
  263. package/src/cli/cmd/tui/i18n/ru.ts +0 -527
  264. package/src/cli/cmd/tui/i18n/slash-command.ts +0 -11
  265. package/src/cli/cmd/tui/i18n/zh.ts +0 -454
  266. package/src/cli/cmd/tui/i18n/zht.ts +0 -430
  267. package/src/cli/cmd/tui/layer.ts +0 -6
  268. package/src/cli/cmd/tui/plugin/api.tsx +0 -402
  269. package/src/cli/cmd/tui/plugin/index.ts +0 -3
  270. package/src/cli/cmd/tui/plugin/internal.ts +0 -37
  271. package/src/cli/cmd/tui/plugin/runtime.ts +0 -1057
  272. package/src/cli/cmd/tui/plugin/slots.tsx +0 -60
  273. package/src/cli/cmd/tui/routes/home.tsx +0 -223
  274. package/src/cli/cmd/tui/routes/session/dialog-fork-from-timeline.tsx +0 -76
  275. package/src/cli/cmd/tui/routes/session/dialog-message.tsx +0 -116
  276. package/src/cli/cmd/tui/routes/session/dialog-subagent.tsx +0 -47
  277. package/src/cli/cmd/tui/routes/session/dialog-timeline.tsx +0 -47
  278. package/src/cli/cmd/tui/routes/session/footer.tsx +0 -91
  279. package/src/cli/cmd/tui/routes/session/index.tsx +0 -3068
  280. package/src/cli/cmd/tui/routes/session/permission.tsx +0 -697
  281. package/src/cli/cmd/tui/routes/session/question.tsx +0 -488
  282. package/src/cli/cmd/tui/routes/session/sidebar.tsx +0 -97
  283. package/src/cli/cmd/tui/routes/session/subagent-footer.tsx +0 -143
  284. package/src/cli/cmd/tui/thread.ts +0 -324
  285. package/src/cli/cmd/tui/ui/dialog-alert.tsx +0 -61
  286. package/src/cli/cmd/tui/ui/dialog-confirm.tsx +0 -95
  287. package/src/cli/cmd/tui/ui/dialog-export-options.tsx +0 -223
  288. package/src/cli/cmd/tui/ui/dialog-help.tsx +0 -42
  289. package/src/cli/cmd/tui/ui/dialog-prompt.tsx +0 -123
  290. package/src/cli/cmd/tui/ui/dialog-select.tsx +0 -467
  291. package/src/cli/cmd/tui/ui/dialog.tsx +0 -207
  292. package/src/cli/cmd/tui/ui/link.tsx +0 -28
  293. package/src/cli/cmd/tui/ui/spinner.ts +0 -378
  294. package/src/cli/cmd/tui/ui/toast.tsx +0 -102
  295. package/src/cli/cmd/tui/util/clipboard.ts +0 -197
  296. package/src/cli/cmd/tui/util/editor.ts +0 -41
  297. package/src/cli/cmd/tui/util/image-protocol.ts +0 -35
  298. package/src/cli/cmd/tui/util/index.ts +0 -6
  299. package/src/cli/cmd/tui/util/model.ts +0 -23
  300. package/src/cli/cmd/tui/util/pinyin.ts +0 -20
  301. package/src/cli/cmd/tui/util/provider-origin.ts +0 -7
  302. package/src/cli/cmd/tui/util/revert-diff.ts +0 -18
  303. package/src/cli/cmd/tui/util/scroll.ts +0 -23
  304. package/src/cli/cmd/tui/util/selection.ts +0 -23
  305. package/src/cli/cmd/tui/util/signal.ts +0 -41
  306. package/src/cli/cmd/tui/util/sound.ts +0 -154
  307. package/src/cli/cmd/tui/util/system-locale.ts +0 -209
  308. package/src/cli/cmd/tui/util/terminal.ts +0 -114
  309. package/src/cli/cmd/tui/util/transcript.ts +0 -112
  310. package/src/cli/cmd/tui/util/vad.ts +0 -229
  311. package/src/cli/cmd/tui/util/voice.ts +0 -450
  312. package/src/cli/cmd/tui/win32.ts +0 -130
  313. package/src/cli/cmd/tui/worker.ts +0 -104
  314. package/src/cli/cmd/uninstall.ts +0 -351
  315. package/src/cli/cmd/upgrade.ts +0 -79
  316. package/src/cli/cmd/web.ts +0 -96
  317. package/src/cli/effect/prompt.ts +0 -25
  318. package/src/cli/error.ts +0 -82
  319. package/src/cli/heap.ts +0 -59
  320. package/src/cli/i18n.ts +0 -15
  321. package/src/cli/logo.ts +0 -53
  322. package/src/cli/network.ts +0 -68
  323. package/src/cli/ui.ts +0 -133
  324. package/src/cli/upgrade.ts +0 -41
  325. package/src/command/index.ts +0 -276
  326. package/src/command/template/initialize.txt +0 -66
  327. package/src/command/template/review.txt +0 -101
  328. package/src/config/agent.ts +0 -197
  329. package/src/config/command.ts +0 -69
  330. package/src/config/compose.ts +0 -26
  331. package/src/config/config.ts +0 -1047
  332. package/src/config/console-state.ts +0 -16
  333. package/src/config/entry-name.ts +0 -16
  334. package/src/config/error.ts +0 -21
  335. package/src/config/formatter.ts +0 -17
  336. package/src/config/history.ts +0 -21
  337. package/src/config/index.ts +0 -17
  338. package/src/config/keybinds.ts +0 -127
  339. package/src/config/layout.ts +0 -10
  340. package/src/config/lsp.ts +0 -45
  341. package/src/config/managed.ts +0 -70
  342. package/src/config/markdown.ts +0 -97
  343. package/src/config/mcp.ts +0 -172
  344. package/src/config/model-id.ts +0 -14
  345. package/src/config/parse.ts +0 -44
  346. package/src/config/paths.ts +0 -85
  347. package/src/config/permission.ts +0 -76
  348. package/src/config/plugin.ts +0 -88
  349. package/src/config/provider.ts +0 -118
  350. package/src/config/server.ts +0 -20
  351. package/src/config/skills.ts +0 -16
  352. package/src/config/variable.ts +0 -90
  353. package/src/control-plane/adaptors/index.ts +0 -52
  354. package/src/control-plane/adaptors/worktree.ts +0 -47
  355. package/src/control-plane/dev/debug-workspace-plugin.ts +0 -73
  356. package/src/control-plane/schema.ts +0 -19
  357. package/src/control-plane/sse.ts +0 -66
  358. package/src/control-plane/types.ts +0 -34
  359. package/src/control-plane/util.ts +0 -37
  360. package/src/control-plane/workspace-context.ts +0 -26
  361. package/src/control-plane/workspace.sql.ts +0 -17
  362. package/src/control-plane/workspace.ts +0 -615
  363. package/src/effect/app-runtime.ts +0 -146
  364. package/src/effect/bootstrap-runtime.ts +0 -33
  365. package/src/effect/bridge.ts +0 -48
  366. package/src/effect/cross-spawn-spawner.ts +0 -514
  367. package/src/effect/index.ts +0 -5
  368. package/src/effect/instance-ref.ts +0 -11
  369. package/src/effect/instance-registry.ts +0 -12
  370. package/src/effect/instance-state.ts +0 -81
  371. package/src/effect/logger.ts +0 -73
  372. package/src/effect/memo-map.ts +0 -3
  373. package/src/effect/observability.ts +0 -107
  374. package/src/effect/run-service.ts +0 -52
  375. package/src/effect/runner.ts +0 -210
  376. package/src/effect/runtime.ts +0 -19
  377. package/src/env/index.ts +0 -37
  378. package/src/file/ignore.ts +0 -81
  379. package/src/file/index.ts +0 -664
  380. package/src/file/protected.ts +0 -59
  381. package/src/file/ripgrep.ts +0 -485
  382. package/src/file/watcher.ts +0 -163
  383. package/src/flag/flag.ts +0 -185
  384. package/src/format/formatter.ts +0 -403
  385. package/src/format/index.ts +0 -203
  386. package/src/git/index.ts +0 -260
  387. package/src/global/index.ts +0 -54
  388. package/src/history/backfill.ts +0 -162
  389. package/src/history/extract.ts +0 -67
  390. package/src/history/fts-query.ts +0 -15
  391. package/src/history/fts.sql.ts +0 -20
  392. package/src/history/index.ts +0 -10
  393. package/src/history/resolve.ts +0 -65
  394. package/src/history/service.ts +0 -258
  395. package/src/history/writer.ts +0 -112
  396. package/src/id/id.ts +0 -87
  397. package/src/ide/index.ts +0 -73
  398. package/src/inbox/inbox-ref.ts +0 -38
  399. package/src/inbox/inbox.sql.ts +0 -26
  400. package/src/inbox/inbox.ts +0 -223
  401. package/src/inbox/index.ts +0 -3
  402. package/src/inbox/render.ts +0 -40
  403. package/src/index.ts +0 -268
  404. package/src/installation/index.ts +0 -362
  405. package/src/installation/version.ts +0 -8
  406. package/src/lsp/client.ts +0 -249
  407. package/src/lsp/diagnostic.ts +0 -29
  408. package/src/lsp/index.ts +0 -3
  409. package/src/lsp/language.ts +0 -120
  410. package/src/lsp/launch.ts +0 -21
  411. package/src/lsp/lsp.ts +0 -519
  412. package/src/lsp/server.ts +0 -1956
  413. package/src/mcp/auth.ts +0 -144
  414. package/src/mcp/index.ts +0 -939
  415. package/src/mcp/oauth-callback.ts +0 -236
  416. package/src/mcp/oauth-provider.ts +0 -214
  417. package/src/memory/fts-query.ts +0 -37
  418. package/src/memory/fts.sql.ts +0 -19
  419. package/src/memory/index.ts +0 -1
  420. package/src/memory/paths.ts +0 -116
  421. package/src/memory/reconcile.ts +0 -144
  422. package/src/memory/service.ts +0 -144
  423. package/src/metrics/client.ts +0 -40
  424. package/src/metrics/event.ts +0 -43
  425. package/src/metrics/index.ts +0 -5
  426. package/src/metrics/installation.ts +0 -18
  427. package/src/metrics/subscriber.ts +0 -58
  428. package/src/metrics/util.ts +0 -9
  429. package/src/node.ts +0 -6
  430. package/src/npm/config.ts +0 -0
  431. package/src/npm/index.ts +0 -293
  432. package/src/npmcli-config.d.ts +0 -43
  433. package/src/patch/index.ts +0 -680
  434. package/src/permission/arity.ts +0 -163
  435. package/src/permission/evaluate.ts +0 -15
  436. package/src/permission/index.ts +0 -382
  437. package/src/permission/schema.ts +0 -17
  438. package/src/plugin/checkpoint-splitover.ts +0 -60
  439. package/src/plugin/cloudflare.ts +0 -76
  440. package/src/plugin/codex.ts +0 -611
  441. package/src/plugin/github-copilot/copilot.ts +0 -368
  442. package/src/plugin/github-copilot/models.ts +0 -153
  443. package/src/plugin/index.ts +0 -637
  444. package/src/plugin/install.ts +0 -439
  445. package/src/plugin/loader.ts +0 -216
  446. package/src/plugin/matcher.ts +0 -33
  447. package/src/plugin/meta.ts +0 -188
  448. package/src/plugin/shared.ts +0 -323
  449. package/src/plugin/sleepy.ts +0 -232
  450. package/src/plugin/subagent-progress-checker.ts +0 -147
  451. package/src/project/bootstrap.ts +0 -59
  452. package/src/project/index.ts +0 -2
  453. package/src/project/instance.ts +0 -215
  454. package/src/project/project-id.ts +0 -48
  455. package/src/project/project.sql.ts +0 -16
  456. package/src/project/project.ts +0 -522
  457. package/src/project/schema.ts +0 -15
  458. package/src/project/vcs.ts +0 -227
  459. package/src/project/workspace-trust.ts +0 -67
  460. package/src/provider/auth.ts +0 -234
  461. package/src/provider/error.ts +0 -216
  462. package/src/provider/index.ts +0 -5
  463. package/src/provider/models-snapshot.d.ts +0 -2
  464. package/src/provider/models-snapshot.js +0 -3
  465. package/src/provider/models.ts +0 -180
  466. package/src/provider/provider.ts +0 -2030
  467. package/src/provider/schema.ts +0 -36
  468. package/src/provider/sdk/copilot/README.md +0 -5
  469. package/src/provider/sdk/copilot/chat/convert-to-openai-compatible-chat-messages.ts +0 -170
  470. package/src/provider/sdk/copilot/chat/get-response-metadata.ts +0 -15
  471. package/src/provider/sdk/copilot/chat/map-openai-compatible-finish-reason.ts +0 -19
  472. package/src/provider/sdk/copilot/chat/openai-compatible-api-types.ts +0 -64
  473. package/src/provider/sdk/copilot/chat/openai-compatible-chat-language-model.ts +0 -815
  474. package/src/provider/sdk/copilot/chat/openai-compatible-chat-options.ts +0 -28
  475. package/src/provider/sdk/copilot/chat/openai-compatible-metadata-extractor.ts +0 -44
  476. package/src/provider/sdk/copilot/chat/openai-compatible-prepare-tools.ts +0 -83
  477. package/src/provider/sdk/copilot/copilot-provider.ts +0 -100
  478. package/src/provider/sdk/copilot/index.ts +0 -2
  479. package/src/provider/sdk/copilot/openai-compatible-error.ts +0 -27
  480. package/src/provider/sdk/copilot/responses/convert-to-openai-responses-input.ts +0 -335
  481. package/src/provider/sdk/copilot/responses/map-openai-responses-finish-reason.ts +0 -22
  482. package/src/provider/sdk/copilot/responses/openai-config.ts +0 -18
  483. package/src/provider/sdk/copilot/responses/openai-error.ts +0 -22
  484. package/src/provider/sdk/copilot/responses/openai-responses-api-types.ts +0 -214
  485. package/src/provider/sdk/copilot/responses/openai-responses-language-model.ts +0 -1770
  486. package/src/provider/sdk/copilot/responses/openai-responses-prepare-tools.ts +0 -173
  487. package/src/provider/sdk/copilot/responses/openai-responses-settings.ts +0 -1
  488. package/src/provider/sdk/copilot/responses/tool/code-interpreter.ts +0 -87
  489. package/src/provider/sdk/copilot/responses/tool/file-search.ts +0 -127
  490. package/src/provider/sdk/copilot/responses/tool/image-generation.ts +0 -114
  491. package/src/provider/sdk/copilot/responses/tool/local-shell.ts +0 -64
  492. package/src/provider/sdk/copilot/responses/tool/web-search-preview.ts +0 -103
  493. package/src/provider/sdk/copilot/responses/tool/web-search.ts +0 -102
  494. package/src/provider/session-check.ts +0 -178
  495. package/src/provider/transform.ts +0 -1393
  496. package/src/pty/index.ts +0 -364
  497. package/src/pty/pty.bun.ts +0 -26
  498. package/src/pty/pty.node.ts +0 -27
  499. package/src/pty/pty.ts +0 -25
  500. package/src/pty/schema.ts +0 -17
  501. package/src/question/index.ts +0 -252
  502. package/src/question/schema.ts +0 -17
  503. package/src/server/adapter.bun.ts +0 -40
  504. package/src/server/adapter.node.ts +0 -66
  505. package/src/server/adapter.ts +0 -21
  506. package/src/server/auth.ts +0 -16
  507. package/src/server/error.ts +0 -53
  508. package/src/server/event.ts +0 -7
  509. package/src/server/fence.ts +0 -81
  510. package/src/server/mdns.ts +0 -60
  511. package/src/server/middleware.ts +0 -94
  512. package/src/server/projectors.ts +0 -28
  513. package/src/server/proxy.ts +0 -171
  514. package/src/server/pty-ticket.ts +0 -42
  515. package/src/server/rate-limit.ts +0 -38
  516. package/src/server/routes/control/index.ts +0 -160
  517. package/src/server/routes/control/workspace.ts +0 -203
  518. package/src/server/routes/global.ts +0 -367
  519. package/src/server/routes/instance/bash-interactive.ts +0 -82
  520. package/src/server/routes/instance/config.ts +0 -89
  521. package/src/server/routes/instance/event.ts +0 -108
  522. package/src/server/routes/instance/experimental.ts +0 -408
  523. package/src/server/routes/instance/file.ts +0 -190
  524. package/src/server/routes/instance/httpapi/config.ts +0 -51
  525. package/src/server/routes/instance/httpapi/permission.ts +0 -72
  526. package/src/server/routes/instance/httpapi/project.ts +0 -62
  527. package/src/server/routes/instance/httpapi/provider.ts +0 -142
  528. package/src/server/routes/instance/httpapi/question.ts +0 -121
  529. package/src/server/routes/instance/httpapi/server.ts +0 -153
  530. package/src/server/routes/instance/index.ts +0 -301
  531. package/src/server/routes/instance/mcp.ts +0 -260
  532. package/src/server/routes/instance/middleware.ts +0 -44
  533. package/src/server/routes/instance/permission.ts +0 -73
  534. package/src/server/routes/instance/project.ts +0 -122
  535. package/src/server/routes/instance/provider.ts +0 -158
  536. package/src/server/routes/instance/pty.ts +0 -302
  537. package/src/server/routes/instance/question.ts +0 -162
  538. package/src/server/routes/instance/session.ts +0 -1328
  539. package/src/server/routes/instance/sync.ts +0 -143
  540. package/src/server/routes/instance/trace.ts +0 -59
  541. package/src/server/routes/instance/tui.ts +0 -384
  542. package/src/server/routes/instance/workflows.ts +0 -142
  543. package/src/server/routes/ui.ts +0 -37
  544. package/src/server/server.ts +0 -146
  545. package/src/server/workspace.ts +0 -122
  546. package/src/session/auto-dream.ts +0 -123
  547. package/src/session/boundary.ts +0 -77
  548. package/src/session/budgeted-read.ts +0 -118
  549. package/src/session/checkpoint-align.ts +0 -29
  550. package/src/session/checkpoint-context.ts +0 -36
  551. package/src/session/checkpoint-paths.ts +0 -86
  552. package/src/session/checkpoint-progress-reconcile.ts +0 -111
  553. package/src/session/checkpoint-retry.ts +0 -192
  554. package/src/session/checkpoint-templates.ts +0 -114
  555. package/src/session/checkpoint-validator.ts +0 -259
  556. package/src/session/checkpoint.ts +0 -1560
  557. package/src/session/classify.ts +0 -120
  558. package/src/session/claude-import.ts +0 -381
  559. package/src/session/codex-import.ts +0 -416
  560. package/src/session/compaction.ts +0 -545
  561. package/src/session/external-import.sql.ts +0 -18
  562. package/src/session/external-import.ts +0 -136
  563. package/src/session/goal.ts +0 -232
  564. package/src/session/index.ts +0 -1
  565. package/src/session/instruction.ts +0 -276
  566. package/src/session/last-message-info.ts +0 -32
  567. package/src/session/llm-request-prefix.ts +0 -82
  568. package/src/session/llm.ts +0 -739
  569. package/src/session/max-mode.ts +0 -410
  570. package/src/session/message-v2.ts +0 -1146
  571. package/src/session/message.ts +0 -191
  572. package/src/session/opencode-import.ts +0 -281
  573. package/src/session/overflow.ts +0 -53
  574. package/src/session/prefix-capture-ref.ts +0 -48
  575. package/src/session/processor.ts +0 -983
  576. package/src/session/projectors.ts +0 -137
  577. package/src/session/prompt/anthropic.txt +0 -154
  578. package/src/session/prompt/beast.txt +0 -155
  579. package/src/session/prompt/build-switch.txt +0 -5
  580. package/src/session/prompt/codex.txt +0 -79
  581. package/src/session/prompt/compose.txt +0 -119
  582. package/src/session/prompt/copilot-gpt-5.txt +0 -143
  583. package/src/session/prompt/deepseek.txt +0 -131
  584. package/src/session/prompt/default.old.txt +0 -151
  585. package/src/session/prompt/default.txt +0 -172
  586. package/src/session/prompt/gemini.txt +0 -155
  587. package/src/session/prompt/glm.txt +0 -51
  588. package/src/session/prompt/gpt.txt +0 -107
  589. package/src/session/prompt/kimi.txt +0 -95
  590. package/src/session/prompt/max-steps.txt +0 -16
  591. package/src/session/prompt/minimax.txt +0 -140
  592. package/src/session/prompt/text-loop-recovery.ts +0 -40
  593. package/src/session/prompt/text-ngram-detection.ts +0 -87
  594. package/src/session/prompt/trinity.txt +0 -97
  595. package/src/session/prompt.ts +0 -3879
  596. package/src/session/prune.ts +0 -481
  597. package/src/session/retry.ts +0 -178
  598. package/src/session/revert.ts +0 -161
  599. package/src/session/run-state.ts +0 -135
  600. package/src/session/schema.ts +0 -36
  601. package/src/session/session.sql.ts +0 -110
  602. package/src/session/session.ts +0 -908
  603. package/src/session/status.ts +0 -89
  604. package/src/session/summary.ts +0 -163
  605. package/src/session/system.ts +0 -96
  606. package/src/session/todo.ts +0 -77
  607. package/src/session/trajectory.ts +0 -98
  608. package/src/share/index.ts +0 -2
  609. package/src/share/session.ts +0 -57
  610. package/src/share/share-next.ts +0 -381
  611. package/src/share/share.sql.ts +0 -13
  612. package/src/shell/shell.ts +0 -124
  613. package/src/skill/builtin/.bundle/self-extend/SKILL.md +0 -131
  614. package/src/skill/builtin/.bundle/self-extend/reference/hook-api.md +0 -242
  615. package/src/skill/builtin/.bundle/self-extend/reference/skill-api.md +0 -114
  616. package/src/skill/builtin/.bundle/self-extend/reference/tool-api.md +0 -115
  617. package/src/skill/builtin/.bundle/self-extend/reference/tui-api.md +0 -258
  618. package/src/skill/builtin/bundle.macro.ts +0 -30
  619. package/src/skill/builtin/extract.ts +0 -41
  620. package/src/skill/compose/.bundle/ask/SKILL.md +0 -58
  621. package/src/skill/compose/.bundle/brainstorm/SKILL.md +0 -200
  622. package/src/skill/compose/.bundle/brainstorm/scripts/frame-template.html +0 -214
  623. package/src/skill/compose/.bundle/brainstorm/scripts/helper.js +0 -88
  624. package/src/skill/compose/.bundle/brainstorm/scripts/server.cjs +0 -354
  625. package/src/skill/compose/.bundle/brainstorm/scripts/start-server.sh +0 -148
  626. package/src/skill/compose/.bundle/brainstorm/scripts/stop-server.sh +0 -56
  627. package/src/skill/compose/.bundle/brainstorm/spec-document-reviewer-prompt.md +0 -50
  628. package/src/skill/compose/.bundle/brainstorm/visual-companion.md +0 -258
  629. package/src/skill/compose/.bundle/debug/CREATION-LOG.md +0 -119
  630. package/src/skill/compose/.bundle/debug/SKILL.md +0 -297
  631. package/src/skill/compose/.bundle/debug/condition-based-waiting-example.ts +0 -158
  632. package/src/skill/compose/.bundle/debug/condition-based-waiting.md +0 -106
  633. package/src/skill/compose/.bundle/debug/defense-in-depth.md +0 -122
  634. package/src/skill/compose/.bundle/debug/find-polluter.sh +0 -63
  635. package/src/skill/compose/.bundle/debug/root-cause-tracing.md +0 -144
  636. package/src/skill/compose/.bundle/debug/test-academic.md +0 -14
  637. package/src/skill/compose/.bundle/debug/test-pressure-1.md +0 -58
  638. package/src/skill/compose/.bundle/debug/test-pressure-2.md +0 -68
  639. package/src/skill/compose/.bundle/debug/test-pressure-3.md +0 -69
  640. package/src/skill/compose/.bundle/execute/SKILL.md +0 -71
  641. package/src/skill/compose/.bundle/feedback/SKILL.md +0 -214
  642. package/src/skill/compose/.bundle/merge/SKILL.md +0 -252
  643. package/src/skill/compose/.bundle/new-skill/SKILL.md +0 -211
  644. package/src/skill/compose/.bundle/parallel/SKILL.md +0 -168
  645. package/src/skill/compose/.bundle/plan/SKILL.md +0 -183
  646. package/src/skill/compose/.bundle/plan/plan-document-reviewer-prompt.md +0 -50
  647. package/src/skill/compose/.bundle/report/SKILL.md +0 -180
  648. package/src/skill/compose/.bundle/review/SKILL.md +0 -104
  649. package/src/skill/compose/.bundle/review/code-reviewer.md +0 -178
  650. package/src/skill/compose/.bundle/subagent/SKILL.md +0 -325
  651. package/src/skill/compose/.bundle/subagent/code-quality-reviewer-prompt.md +0 -26
  652. package/src/skill/compose/.bundle/subagent/implementer-prompt.md +0 -128
  653. package/src/skill/compose/.bundle/subagent/spec-reviewer-prompt.md +0 -118
  654. package/src/skill/compose/.bundle/tdd/SKILL.md +0 -360
  655. package/src/skill/compose/.bundle/tdd/testing-anti-patterns.md +0 -299
  656. package/src/skill/compose/.bundle/verify/SKILL.md +0 -140
  657. package/src/skill/compose/.bundle/worktree/SKILL.md +0 -234
  658. package/src/skill/compose/LICENSE-karpathy +0 -28
  659. package/src/skill/compose/bundle.macro.ts +0 -30
  660. package/src/skill/compose/extract.ts +0 -85
  661. package/src/skill/discovery.ts +0 -118
  662. package/src/skill/index.ts +0 -328
  663. package/src/snapshot/index.ts +0 -777
  664. package/src/sql.d.ts +0 -4
  665. package/src/storage/db.bun.ts +0 -8
  666. package/src/storage/db.node.ts +0 -8
  667. package/src/storage/db.ts +0 -172
  668. package/src/storage/index.ts +0 -26
  669. package/src/storage/json-migration.ts +0 -426
  670. package/src/storage/read-sqlite.bun.ts +0 -11
  671. package/src/storage/read-sqlite.node.ts +0 -13
  672. package/src/storage/read-sqlite.ts +0 -10
  673. package/src/storage/schema.sql.ts +0 -10
  674. package/src/storage/schema.ts +0 -7
  675. package/src/storage/storage.ts +0 -331
  676. package/src/sync/README.md +0 -179
  677. package/src/sync/event.sql.ts +0 -16
  678. package/src/sync/index.ts +0 -278
  679. package/src/sync/schema.ts +0 -14
  680. package/src/task/events.ts +0 -28
  681. package/src/task/gate-state.ts +0 -54
  682. package/src/task/gate.ts +0 -116
  683. package/src/task/index.ts +0 -1
  684. package/src/task/registry.ts +0 -394
  685. package/src/task/schema.ts +0 -43
  686. package/src/task/task.sql.ts +0 -50
  687. package/src/team/events.ts +0 -22
  688. package/src/team/index.ts +0 -113
  689. package/src/team/schema.ts +0 -31
  690. package/src/temporary.ts +0 -33
  691. package/src/tool/actor.shell.txt +0 -72
  692. package/src/tool/actor.ts +0 -804
  693. package/src/tool/actor.txt +0 -103
  694. package/src/tool/apply_patch.ts +0 -308
  695. package/src/tool/apply_patch.txt +0 -33
  696. package/src/tool/bash-interactive.ts +0 -183
  697. package/src/tool/bash.ts +0 -704
  698. package/src/tool/bash.txt +0 -123
  699. package/src/tool/change-directory.ts +0 -91
  700. package/src/tool/codesearch.ts +0 -63
  701. package/src/tool/codesearch.txt +0 -12
  702. package/src/tool/edit.ts +0 -693
  703. package/src/tool/edit.txt +0 -10
  704. package/src/tool/external-directory.ts +0 -132
  705. package/src/tool/glob.ts +0 -100
  706. package/src/tool/glob.txt +0 -6
  707. package/src/tool/grep.ts +0 -145
  708. package/src/tool/grep.txt +0 -8
  709. package/src/tool/history.ts +0 -146
  710. package/src/tool/history.txt +0 -17
  711. package/src/tool/index.ts +0 -4
  712. package/src/tool/invalid.ts +0 -20
  713. package/src/tool/invocation-style.ts +0 -17
  714. package/src/tool/lsp.ts +0 -91
  715. package/src/tool/lsp.txt +0 -19
  716. package/src/tool/mcp-exa.ts +0 -78
  717. package/src/tool/memory-path-guard.ts +0 -162
  718. package/src/tool/memory.ts +0 -81
  719. package/src/tool/memory.txt +0 -69
  720. package/src/tool/multiedit.ts +0 -54
  721. package/src/tool/multiedit.txt +0 -41
  722. package/src/tool/notebook-edit.ts +0 -225
  723. package/src/tool/notebook-edit.txt +0 -10
  724. package/src/tool/plan-enter.txt +0 -16
  725. package/src/tool/plan-exit.txt +0 -14
  726. package/src/tool/plan.ts +0 -194
  727. package/src/tool/question.ts +0 -67
  728. package/src/tool/question.txt +0 -10
  729. package/src/tool/read-state.ts +0 -44
  730. package/src/tool/read.ts +0 -327
  731. package/src/tool/read.txt +0 -14
  732. package/src/tool/recoverable.ts +0 -35
  733. package/src/tool/registry.ts +0 -429
  734. package/src/tool/schema.ts +0 -17
  735. package/src/tool/session-cwd.ts +0 -35
  736. package/src/tool/shell-tokenize.ts +0 -374
  737. package/src/tool/shell-wrap.ts +0 -235
  738. package/src/tool/skill.ts +0 -76
  739. package/src/tool/skill.txt +0 -5
  740. package/src/tool/task.shell.txt +0 -57
  741. package/src/tool/task.ts +0 -456
  742. package/src/tool/task.txt +0 -56
  743. package/src/tool/tool.ts +0 -166
  744. package/src/tool/truncate.ts +0 -201
  745. package/src/tool/truncation-dir.ts +0 -4
  746. package/src/tool/webfetch.ts +0 -208
  747. package/src/tool/webfetch.txt +0 -13
  748. package/src/tool/websearch/index.ts +0 -104
  749. package/src/tool/websearch/sleepy.ts +0 -118
  750. package/src/tool/websearch/websearch.txt +0 -14
  751. package/src/tool/workflow.ts +0 -357
  752. package/src/tool/workflow.txt +0 -25
  753. package/src/tool/write.ts +0 -88
  754. package/src/tool/write.txt +0 -10
  755. package/src/util/abort.ts +0 -35
  756. package/src/util/archive.ts +0 -15
  757. package/src/util/color.ts +0 -17
  758. package/src/util/data-url.ts +0 -9
  759. package/src/util/defer.ts +0 -10
  760. package/src/util/effect-http-client.ts +0 -11
  761. package/src/util/effect-zod.ts +0 -367
  762. package/src/util/env-info.ts +0 -62
  763. package/src/util/error.ts +0 -78
  764. package/src/util/filesystem.ts +0 -243
  765. package/src/util/fn.ts +0 -21
  766. package/src/util/format.ts +0 -20
  767. package/src/util/iife.ts +0 -3
  768. package/src/util/index.ts +0 -14
  769. package/src/util/keybind.ts +0 -101
  770. package/src/util/lazy.ts +0 -18
  771. package/src/util/local-context.ts +0 -23
  772. package/src/util/locale.ts +0 -79
  773. package/src/util/lock.ts +0 -96
  774. package/src/util/log.ts +0 -234
  775. package/src/util/media.ts +0 -26
  776. package/src/util/network.ts +0 -9
  777. package/src/util/process.ts +0 -174
  778. package/src/util/provider-priority.ts +0 -48
  779. package/src/util/queue.ts +0 -60
  780. package/src/util/record.ts +0 -3
  781. package/src/util/rpc.ts +0 -64
  782. package/src/util/schema.ts +0 -53
  783. package/src/util/scrap.ts +0 -10
  784. package/src/util/signal.ts +0 -12
  785. package/src/util/sleepy-process.ts +0 -24
  786. package/src/util/ssrf.ts +0 -116
  787. package/src/util/timeout.ts +0 -14
  788. package/src/util/token.ts +0 -5
  789. package/src/util/tool-compat.ts +0 -144
  790. package/src/util/update-schema.ts +0 -13
  791. package/src/util/which.ts +0 -14
  792. package/src/util/wildcard.ts +0 -57
  793. package/src/workflow/builtin/compose.js +0 -749
  794. package/src/workflow/builtin/deep-research.js +0 -397
  795. package/src/workflow/builtin.ts +0 -59
  796. package/src/workflow/events.ts +0 -72
  797. package/src/workflow/meta.ts +0 -335
  798. package/src/workflow/persistence.ts +0 -312
  799. package/src/workflow/resolve.ts +0 -45
  800. package/src/workflow/runtime-ref.ts +0 -18
  801. package/src/workflow/runtime.ts +0 -1447
  802. package/src/workflow/sandbox.ts +0 -286
  803. package/src/workflow/workflow.sql.ts +0 -31
  804. package/src/workflow/workspace.ts +0 -69
  805. package/src/worktree/index.ts +0 -629
@@ -1,1393 +0,0 @@
1
- import type { ModelMessage } from "ai"
2
- import { mergeDeep, unique } from "remeda"
3
- import type { JSONSchema7 } from "@ai-sdk/provider"
4
- import type { JSONSchema } from "zod/v4/core"
5
- import type * as Provider from "./provider"
6
- import type * as ModelsDev from "./models"
7
- import { iife } from "@/util/iife"
8
- import { Flag } from "@/flag/flag"
9
-
10
- type Modality = NonNullable<ModelsDev.Model["modalities"]>["input"][number]
11
-
12
- function mimeToModality(mime: string): Modality | undefined {
13
- if (mime.startsWith("image/")) return "image"
14
- if (mime.startsWith("audio/")) return "audio"
15
- if (mime.startsWith("video/")) return "video"
16
- if (mime === "application/pdf") return "pdf"
17
- return undefined
18
- }
19
-
20
- // Sleepy vision support isn't reflected in models.dev modality data, so the
21
- // generic capability check would strip images before they reach the model.
22
- // sleepy-auto and sleepy-v2.5 accept images; sleepy-v2.5-pro is text-only.
23
- function supportsImageInput(model: Provider.Model): boolean {
24
- if (model.providerID === "sleepy" || model.providerID === "sleepy" || model.providerID === "sleepy") {
25
- const id = model.id.toLowerCase()
26
- if (id.includes("v2.5-pro")) return false
27
- if (id === "sleepy-auto" || id.includes("v2.5")) return true
28
- }
29
- // Claude and GPT models are all multimodal regardless of catalog data.
30
- const id = model.id.toLowerCase()
31
- const apiID = model.api.id.toLowerCase()
32
- if (id.includes("claude") || apiID.includes("claude") || model.providerID === "anthropic") return true
33
- if (id.includes("gpt") || apiID.includes("gpt")) return true
34
- return model.capabilities.input.image
35
- }
36
-
37
- export const OUTPUT_TOKEN_MAX = Flag.SLEEPYCODE_EXPERIMENTAL_OUTPUT_TOKEN_MAX || 32_000
38
- const SLEEPY_OUTPUT_TOKEN_MAX = 128_000
39
-
40
- // Maps npm package to the key the AI SDK expects for providerOptions
41
- function sdkKey(npm: string): string | undefined {
42
- switch (npm) {
43
- case "@ai-sdk/github-copilot":
44
- return "copilot"
45
- case "@ai-sdk/azure":
46
- return "azure"
47
- case "@ai-sdk/openai":
48
- return "openai"
49
- case "@ai-sdk/amazon-bedrock":
50
- return "bedrock"
51
- case "@ai-sdk/anthropic":
52
- case "@ai-sdk/google-vertex/anthropic":
53
- return "anthropic"
54
- case "@ai-sdk/google-vertex":
55
- return "vertex"
56
- case "@ai-sdk/google":
57
- return "google"
58
- case "@ai-sdk/gateway":
59
- return "gateway"
60
- case "@openrouter/ai-sdk-provider":
61
- return "openrouter"
62
- }
63
- return undefined
64
- }
65
-
66
- function normalizeMessages(
67
- msgs: ModelMessage[],
68
- model: Provider.Model,
69
- _options: Record<string, unknown>,
70
- ): ModelMessage[] {
71
- // Anthropic rejects messages with empty content - filter out empty string messages
72
- // and remove empty text/reasoning parts from array content
73
- if (model.api.npm === "@ai-sdk/anthropic" || model.api.npm === "@ai-sdk/amazon-bedrock") {
74
- msgs = msgs
75
- .map((msg) => {
76
- if (typeof msg.content === "string") {
77
- if (msg.content === "") return undefined
78
- return msg
79
- }
80
- if (!Array.isArray(msg.content)) return msg
81
- const filtered = msg.content.filter((part) => {
82
- if (part.type === "text" || part.type === "reasoning") {
83
- return part.text !== ""
84
- }
85
- return true
86
- })
87
- if (filtered.length === 0) return undefined
88
- return { ...msg, content: filtered }
89
- })
90
- .filter((msg): msg is ModelMessage => msg !== undefined && msg.content !== "")
91
- }
92
-
93
- if (model.api.id.includes("claude")) {
94
- const scrub = (id: string) => id.replace(/[^a-zA-Z0-9_-]/g, "_")
95
- msgs = msgs.map((msg) => {
96
- if (msg.role === "assistant" && Array.isArray(msg.content)) {
97
- return {
98
- ...msg,
99
- content: msg.content.map((part) => {
100
- if (part.type === "tool-call" || part.type === "tool-result") {
101
- return { ...part, toolCallId: scrub(part.toolCallId) }
102
- }
103
- return part
104
- }),
105
- }
106
- }
107
- if (msg.role === "tool" && Array.isArray(msg.content)) {
108
- return {
109
- ...msg,
110
- content: msg.content.map((part) => {
111
- if (part.type === "tool-result") {
112
- return { ...part, toolCallId: scrub(part.toolCallId) }
113
- }
114
- return part
115
- }),
116
- }
117
- }
118
- return msg
119
- })
120
- }
121
- if (["@ai-sdk/anthropic", "@ai-sdk/google-vertex/anthropic"].includes(model.api.npm)) {
122
- // Anthropic rejects assistant turns where tool_use blocks are followed by non-tool
123
- // content, e.g. [tool_use, tool_use, text], with:
124
- // `tool_use` ids were found without `tool_result` blocks immediately after...
125
- //
126
- // Reorder that invalid shape into [text] + [tool_use, tool_use]. Consecutive
127
- // assistant messages are later merged by the provider/SDK, so preserving the
128
- // original [tool_use...] then [text] order still produces the invalid payload.
129
- //
130
- // The root cause appears to be somewhere upstream where the stream is originally
131
- // processed. We were unable to locate an exact narrower reproduction elsewhere,
132
- // so we keep this transform in place for the time being.
133
- msgs = msgs.flatMap((msg) => {
134
- if (msg.role !== "assistant" || !Array.isArray(msg.content)) return [msg]
135
-
136
- const parts = msg.content
137
- const first = parts.findIndex((part) => part.type === "tool-call")
138
- if (first === -1) return [msg]
139
- if (!parts.slice(first).some((part) => part.type !== "tool-call")) return [msg]
140
- return [
141
- { ...msg, content: parts.filter((part) => part.type !== "tool-call") },
142
- { ...msg, content: parts.filter((part) => part.type === "tool-call") },
143
- ]
144
- })
145
- }
146
- if (
147
- model.providerID === "mistral" ||
148
- model.api.id.toLowerCase().includes("mistral") ||
149
- model.api.id.toLocaleLowerCase().includes("devstral")
150
- ) {
151
- const scrub = (id: string) => {
152
- return id
153
- .replace(/[^a-zA-Z0-9]/g, "") // Remove non-alphanumeric characters
154
- .substring(0, 9) // Take first 9 characters
155
- .padEnd(9, "0") // Pad with zeros if less than 9 characters
156
- }
157
- const result: ModelMessage[] = []
158
- for (let i = 0; i < msgs.length; i++) {
159
- const msg = msgs[i]
160
- const nextMsg = msgs[i + 1]
161
-
162
- if (msg.role === "assistant" && Array.isArray(msg.content)) {
163
- msg.content = msg.content.map((part) => {
164
- if (part.type === "tool-call" || part.type === "tool-result") {
165
- return { ...part, toolCallId: scrub(part.toolCallId) }
166
- }
167
- return part
168
- })
169
- }
170
- if (msg.role === "tool" && Array.isArray(msg.content)) {
171
- msg.content = msg.content.map((part) => {
172
- if (part.type === "tool-result") {
173
- return { ...part, toolCallId: scrub(part.toolCallId) }
174
- }
175
- return part
176
- })
177
- }
178
- result.push(msg)
179
-
180
- // Fix message sequence: tool messages cannot be followed by user messages
181
- if (msg.role === "tool" && nextMsg?.role === "user") {
182
- result.push({
183
- role: "assistant",
184
- content: [
185
- {
186
- type: "text",
187
- text: "Done.",
188
- },
189
- ],
190
- })
191
- }
192
- }
193
- return result
194
- }
195
-
196
- if (typeof model.capabilities.interleaved === "object" && model.capabilities.interleaved.field) {
197
- const field = model.capabilities.interleaved.field
198
- return msgs.map((msg) => {
199
- if (msg.role === "assistant" && Array.isArray(msg.content)) {
200
- const reasoningParts = msg.content.filter((part: any) => part.type === "reasoning")
201
- const reasoningText = reasoningParts.map((part: any) => part.text).join("")
202
-
203
- // Filter out reasoning parts from content
204
- const filteredContent = msg.content.filter((part: any) => part.type !== "reasoning")
205
-
206
- // Include reasoning_content | reasoning_details directly on the message for all assistant messages
207
- if (reasoningText) {
208
- return {
209
- ...msg,
210
- content: filteredContent,
211
- providerOptions: {
212
- ...msg.providerOptions,
213
- openaiCompatible: {
214
- ...msg.providerOptions?.openaiCompatible,
215
- [field]: reasoningText,
216
- },
217
- },
218
- }
219
- }
220
-
221
- return {
222
- ...msg,
223
- content: filteredContent,
224
- }
225
- }
226
-
227
- return msg
228
- })
229
- }
230
-
231
- return msgs
232
- }
233
-
234
- // Determines whether a model's provider respects inline cache_control / cachePoint
235
- // markers. Pure name matching (model.api.id.includes("claude")) is fragile — a Claude
236
- // model behind an OpenAI-compatible proxy gets matched but markers are silently dropped.
237
- // See docs/cache-policy.md and upstream opencode#26786.
238
- function supportsCacheMarkers(model: Provider.Model): boolean {
239
- // Anthropic-only SDKs — always support inline markers
240
- if (model.api.npm === "@ai-sdk/anthropic" || model.api.npm === "@ai-sdk/google-vertex/anthropic") return true
241
- if (model.providerID === "anthropic" || model.providerID === "google-vertex-anthropic") return true
242
- // Bedrock cachePoint is a Converse API feature, works across model families
243
- if (model.api.npm === "@ai-sdk/amazon-bedrock") return true
244
- // Multi-model providers: only Anthropic/Claude models support cache markers
245
- if (
246
- model.api.npm === "@openrouter/ai-sdk-provider" ||
247
- model.api.npm === "@ai-sdk/github-copilot" ||
248
- model.api.npm === "@ai-sdk/alibaba"
249
- ) {
250
- return (
251
- model.api.id.includes("claude") ||
252
- model.api.id.includes("anthropic") ||
253
- model.id.includes("claude") ||
254
- model.id.includes("anthropic")
255
- )
256
- }
257
- return false
258
- }
259
-
260
- // The cache-control marker shape differs per provider/SDK. This is the single
261
- // source of truth, keyed by the SDK provider-options namespace. `applyCaching`
262
- // attaches the whole object (keyed by stored providerID) and lets `message()`
263
- // remap the active provider's namespace to its SDK key; `tools()` (which
264
- // bypasses that remap) resolves a single namespace up front via `cacheMarkerFor`.
265
- // Only Anthropic and OpenRouter expose a TTL in their AI SDK — the others ignore
266
- // an unknown `ttl`, so we thread it only there.
267
- function cacheMarkerOptions(model: Provider.Model) {
268
- const ttl = model.cachePromptTTL === "1h" ? { ttl: "1h" as const } : {}
269
- return {
270
- anthropic: { cacheControl: { type: "ephemeral", ...ttl } },
271
- openrouter: { cacheControl: { type: "ephemeral", ...ttl } },
272
- bedrock: { cachePoint: { type: "default" } },
273
- openaiCompatible: { cache_control: { type: "ephemeral" } },
274
- copilot: { copilot_cache_control: { type: "ephemeral" } },
275
- alibaba: { cacheControl: { type: "ephemeral" } },
276
- }
277
- }
278
-
279
- // Resolve the marker for a single model, already keyed under the SDK namespace
280
- // the AI SDK expects — i.e. the remap that `message()` performs for messages,
281
- // done up front. Used by `tools()`, whose tools never pass through `message()`.
282
- // Returns undefined for providers that don't take inline markers (callers gate
283
- // on `supportsCacheMarkers` first, so this is just a type-safety fallback).
284
- function cacheMarkerFor(model: Provider.Model): Record<string, unknown> | undefined {
285
- const shapes = cacheMarkerOptions(model)
286
- const ns: keyof typeof shapes | undefined =
287
- model.api.npm === "@ai-sdk/anthropic" || model.api.npm === "@ai-sdk/google-vertex/anthropic"
288
- ? "anthropic"
289
- : model.api.npm === "@openrouter/ai-sdk-provider"
290
- ? "openrouter"
291
- : model.api.npm === "@ai-sdk/amazon-bedrock"
292
- ? "bedrock"
293
- : model.api.npm === "@ai-sdk/github-copilot"
294
- ? "copilot"
295
- : model.api.npm === "@ai-sdk/alibaba"
296
- ? "alibaba"
297
- : undefined
298
- if (!ns) return undefined
299
- return { [ns]: shapes[ns] }
300
- }
301
-
302
- function applyCaching(msgs: ModelMessage[], model: Provider.Model): ModelMessage[] {
303
- const providerOptions = cacheMarkerOptions(model)
304
-
305
- // Strategy: prefix caching is longest-common-prefix based with a backward
306
- // lookback window (Anthropic walks back ~20 blocks from a breakpoint to find
307
- // a prior write). The markers that grow the cached prefix are pinned to the
308
- // *tail* of the request. We place up to three stable breakpoints (Anthropic
309
- // allows max 4):
310
- // 1. Last system message — the immutable prompt prefix.
311
- // 2+3. The last TWO messages — a "rolling double buffer". Each turn marks
312
- // messages[-2] and messages[-1]; next turn the old [-1] is now [-2] and
313
- // still carries its marker, so the lookback gets a cache READ hit, while
314
- // the new [-1] is the WRITE for the turn after.
315
- //
316
- // Why two and not one: the second (next-to-last) marker is the safety
317
- // net for the tail boundary. When the last message is removed — a
318
- // tool-call retry, a Ctrl-C, or the user editing/deleting their latest
319
- // message — a lone tail marker disappears with it, and how much of the
320
- // surrounding prefix the provider then evicts depends on the upstream
321
- // (Anthropic) KV-cache implementation. The next-to-last marker is a
322
- // still-present, further-back write the next lookback can land on, so the
323
- // worst case degrades to "recompute only the removed message" instead of
324
- // "recompute the whole history". It also covers turns that append >20
325
- // blocks (tool spam pushes the prior write outside the lookback window).
326
- // Cost is ~equal to a single marker: the two adjacent breakpoints write
327
- // roughly the same incremental bytes as one, split in two, and a hit
328
- // never rewrites. A third marker would write a segment never read
329
- // independently, so two is the minimum that covers the boundary.
330
- // We deliberately do NOT mark a drifting midpoint or a fixed before-last-user
331
- // INDEX: those shift every turn without tracking the tail.
332
- const targets: ModelMessage[] = []
333
-
334
- const systemMsgs = msgs.filter((msg) => msg.role === "system")
335
- if (systemMsgs.length > 0) targets.push(systemMsgs[systemMsgs.length - 1])
336
-
337
- const nonSystem = msgs.filter((msg) => msg.role !== "system")
338
- for (const msg of nonSystem.slice(-2)) targets.push(msg)
339
-
340
- for (const msg of unique(targets)) {
341
- const useMessageLevelOptions =
342
- model.providerID === "anthropic" ||
343
- model.providerID.includes("bedrock") ||
344
- model.api.npm === "@ai-sdk/amazon-bedrock"
345
- const shouldUseContentOptions = !useMessageLevelOptions && Array.isArray(msg.content) && msg.content.length > 0
346
-
347
- if (shouldUseContentOptions) {
348
- const lastContent = msg.content[msg.content.length - 1]
349
- if (
350
- lastContent &&
351
- typeof lastContent === "object" &&
352
- lastContent.type !== "tool-approval-request" &&
353
- lastContent.type !== "tool-approval-response"
354
- ) {
355
- lastContent.providerOptions = mergeDeep(lastContent.providerOptions ?? {}, providerOptions)
356
- continue
357
- }
358
- }
359
-
360
- msg.providerOptions = mergeDeep(msg.providerOptions ?? {}, providerOptions)
361
- }
362
-
363
- return msgs
364
- }
365
-
366
- // Minimal crash guard: ensure msg.content is never a non-string non-array value
367
- // (object, undefined, null) that would blow up downstream `.map()` calls.
368
- // Strings are valid ModelMessage content (the AI SDK accepts content: string |
369
- // Array) and are left untouched. Only genuinely-invalid types are normalized
370
- // to a safe empty array so every downstream path can safely call `.map()`.
371
- function normalizeContentArray(msgs: ModelMessage[]): ModelMessage[] {
372
- return msgs.map((msg) => {
373
- if (typeof msg.content === "string" || Array.isArray(msg.content)) return msg
374
- // object / undefined / null — not a valid ModelMessage content shape;
375
- // wrap in an empty array so .map() downstream never throws.
376
- return { ...msg, content: [] } as ModelMessage
377
- })
378
- }
379
-
380
- function unsupportedParts(msgs: ModelMessage[], model: Provider.Model): ModelMessage[] {
381
- return msgs.map((msg) => {
382
- if (msg.role !== "user" || !Array.isArray(msg.content)) return msg
383
-
384
- const filtered = msg.content.map((part) => {
385
- if (part.type !== "file" && part.type !== "image") return part
386
-
387
- // Check for empty base64 image data
388
- if (part.type === "image") {
389
- const imageStr = String(part.image)
390
- if (imageStr.startsWith("data:")) {
391
- const match = imageStr.match(/^data:([^;]+);base64,(.*)$/)
392
- if (match && (!match[2] || match[2].length === 0)) {
393
- return {
394
- type: "text" as const,
395
- text: "ERROR: Image file is empty or corrupted. Please provide a valid image.",
396
- }
397
- }
398
- }
399
- }
400
-
401
- const mime = part.type === "image" ? String(part.image).split(";")[0].replace("data:", "") : part.mediaType
402
- const filename = part.type === "file" ? part.filename : undefined
403
- const modality = mimeToModality(mime)
404
- if (!modality) return part
405
- const supported = modality === "image" ? supportsImageInput(model) : model.capabilities.input[modality]
406
- if (supported) return part
407
-
408
- const name = filename ? `"${filename}"` : modality
409
- return {
410
- type: "text" as const,
411
- text: `ERROR: Cannot read ${name} (this model does not support ${modality} input). Inform the user.`,
412
- }
413
- })
414
-
415
- return { ...msg, content: filtered }
416
- })
417
- }
418
-
419
- // Returns the decoded byte size of a base64 data URL, or undefined for inputs
420
- // that aren't data URLs (remote URLs, raw binary) and therefore can't be sized.
421
- function imageByteSize(image: string): number | undefined {
422
- if (!image.startsWith("data:")) return undefined
423
- const base64 = image.slice(image.indexOf(",") + 1)
424
- if (!base64) return 0
425
- const padding = base64.endsWith("==") ? 2 : base64.endsWith("=") ? 1 : 0
426
- return Math.floor((base64.length * 3) / 4) - padding
427
- }
428
-
429
- function limitImages(msgs: ModelMessage[]): ModelMessage[] {
430
- const maxImages = Flag.SLEEPYCODE_MAX_PROMPT_IMAGES
431
- const maxSize = Flag.SLEEPYCODE_MAX_PROMPT_IMAGE_SIZE
432
- if (maxImages === undefined && maxSize === undefined) return msgs
433
-
434
- const total = msgs.reduce(
435
- (sum, msg) =>
436
- msg.role === "user" && Array.isArray(msg.content)
437
- ? sum + msg.content.filter((part) => part.type === "image").length
438
- : sum,
439
- 0,
440
- )
441
- // Drop the oldest excess images so the most recent ones reach the model.
442
- let toDrop = maxImages === undefined ? 0 : Math.max(0, total - maxImages)
443
-
444
- return msgs.map((msg) => {
445
- if (msg.role !== "user" || !Array.isArray(msg.content)) return msg
446
- const content = msg.content.map((part) => {
447
- if (part.type !== "image") return part
448
- if (toDrop > 0) {
449
- toDrop--
450
- return { type: "text" as const, text: `[Image omitted: exceeds the configured limit of ${maxImages} prompt image(s).]` }
451
- }
452
- if (maxSize !== undefined) {
453
- const size = imageByteSize(String(part.image))
454
- if (size !== undefined && size > maxSize) {
455
- return { type: "text" as const, text: `[Image omitted: exceeds the configured ${maxSize}-byte prompt image size limit.]` }
456
- }
457
- }
458
- return part
459
- })
460
- return { ...msg, content }
461
- })
462
- }
463
-
464
- export function message(msgs: ModelMessage[], model: Provider.Model, options: Record<string, unknown>) {
465
- // Guard against genuinely-invalid content (object/undefined/null) that would
466
- // blow up downstream .map() calls. Strings are valid and left untouched.
467
- msgs = normalizeContentArray(msgs)
468
- msgs = unsupportedParts(msgs, model)
469
- msgs = limitImages(msgs)
470
- msgs = normalizeMessages(msgs, model, options)
471
- if (supportsCacheMarkers(model)) {
472
- msgs = applyCaching(msgs, model)
473
- }
474
-
475
- // Remap providerOptions keys from stored providerID to expected SDK key
476
- const key = sdkKey(model.api.npm)
477
- if (key && key !== model.providerID) {
478
- const remap = (opts: Record<string, any> | undefined) => {
479
- if (!opts) return opts
480
- if (!(model.providerID in opts)) return opts
481
- const result = { ...opts }
482
- result[key] = result[model.providerID]
483
- delete result[model.providerID]
484
- return result
485
- }
486
-
487
- msgs = msgs.map((msg) => {
488
- if (!Array.isArray(msg.content)) return { ...msg, providerOptions: remap(msg.providerOptions) }
489
- return {
490
- ...msg,
491
- providerOptions: remap(msg.providerOptions),
492
- content: msg.content.map((part) => {
493
- if (part.type === "tool-approval-request" || part.type === "tool-approval-response") {
494
- return { ...part }
495
- }
496
- return { ...part, providerOptions: remap(part.providerOptions) }
497
- }),
498
- } as typeof msg
499
- })
500
- }
501
-
502
- return msgs
503
- }
504
-
505
- // Place a cache breakpoint on the tool definitions. The cache hierarchy is
506
- // `tools` → `system` → `messages`, so marking the LAST tool caches the entire
507
- // tool-schema block (often several KB) as a stable prefix that sits in front of
508
- // the system + message caches. Tools are passed to the SDK separately from
509
- // `message()` and never go through its providerID→SDK-key remap, so we resolve
510
- // the SDK-keyed marker via `cacheMarkerFor`. Tool registration order is stable
511
- // (insertion order of the tools record), so "last tool" is deterministic.
512
- export function tools<T extends Record<string, any>>(tools: T, model: Provider.Model): T {
513
- if (!supportsCacheMarkers(model)) return tools
514
- const marker = cacheMarkerFor(model)
515
- if (!marker) return tools
516
- const names = Object.keys(tools)
517
- if (names.length === 0) return tools
518
-
519
- const last = tools[names[names.length - 1]]
520
- last.providerOptions = mergeDeep(last.providerOptions ?? {}, marker)
521
- return tools
522
- }
523
-
524
- export function temperature(model: Provider.Model) {
525
- const id = model.id.toLowerCase()
526
- if (id.includes("qwen")) return 0.55
527
- if (id.includes("claude")) return undefined
528
- if (id.includes("gemini")) return 1.0
529
- if (id.includes("glm-4.6")) return 1.0
530
- if (id.includes("glm-4.7")) return 1.0
531
- if (id.includes("minimax-m2")) return 1.0
532
- if (id.includes("sleepy")) return 1.0
533
- if (id.includes("kimi-k2")) {
534
- // kimi-k2-thinking & kimi-k2.5 && kimi-k2p5 && kimi-k2-5
535
- if (["thinking", "k2.", "k2p", "k2-5"].some((s) => id.includes(s))) {
536
- return 1.0
537
- }
538
- return 0.6
539
- }
540
- return undefined
541
- }
542
-
543
- export function topP(model: Provider.Model) {
544
- const id = model.id.toLowerCase()
545
- if (id.includes("qwen")) return 1
546
- if (["minimax-m2", "gemini", "kimi-k2.5", "kimi-k2p5", "kimi-k2-5"].some((s) => id.includes(s))) {
547
- return 0.95
548
- }
549
- return undefined
550
- }
551
-
552
- export function topK(model: Provider.Model) {
553
- const id = model.id.toLowerCase()
554
- if (id.includes("minimax-m2")) {
555
- if (["m2.", "m25", "m21"].some((s) => id.includes(s))) return 40
556
- return 20
557
- }
558
- if (id.includes("gemini")) return 64
559
- return undefined
560
- }
561
-
562
- const WIDELY_SUPPORTED_EFFORTS = ["low", "medium", "high"]
563
- const OPENAI_EFFORTS = ["none", "minimal", ...WIDELY_SUPPORTED_EFFORTS, "xhigh"]
564
-
565
- function anthropicAdaptiveEfforts(apiId: string): string[] | null {
566
- if (["opus-4-7", "opus-4.7", "opus-4-8", "opus-4.8"].some((v) => apiId.includes(v))) {
567
- return ["low", "medium", "high", "xhigh", "max"]
568
- }
569
- if (["opus-4-6", "opus-4.6", "sonnet-4-6", "sonnet-4.6"].some((v) => apiId.includes(v))) {
570
- return ["low", "medium", "high", "max"]
571
- }
572
- return null
573
- }
574
-
575
- export function variants(model: Provider.Model): Record<string, Record<string, any>> {
576
- if (!model.capabilities.reasoning) return {}
577
-
578
- const id = model.id.toLowerCase()
579
- const adaptiveEfforts = anthropicAdaptiveEfforts(model.api.id)
580
- if (
581
- id.includes("deepseek") ||
582
- id.includes("minimax") ||
583
- id.includes("glm") ||
584
- id.includes("mistral") ||
585
- id.includes("kimi") ||
586
- id.includes("k2p5") ||
587
- id.includes("qwen") ||
588
- id.includes("big-pickle")
589
- )
590
- return {}
591
-
592
- // see: https://docs.x.ai/docs/guides/reasoning#control-how-hard-the-model-thinks
593
- if (id.includes("grok") && id.includes("grok-3-mini")) {
594
- if (model.api.npm === "@openrouter/ai-sdk-provider") {
595
- return {
596
- low: { reasoning: { effort: "low" } },
597
- high: { reasoning: { effort: "high" } },
598
- }
599
- }
600
- return {
601
- low: { reasoningEffort: "low" },
602
- high: { reasoningEffort: "high" },
603
- }
604
- }
605
- if (id.includes("grok")) return {}
606
-
607
- switch (model.api.npm) {
608
- case "@openrouter/ai-sdk-provider":
609
- if (!model.id.includes("gpt") && !model.id.includes("gemini-3") && !model.id.includes("claude")) return {}
610
- return Object.fromEntries(OPENAI_EFFORTS.map((effort) => [effort, { reasoning: { effort } }]))
611
-
612
- case "@ai-sdk/gateway":
613
- if (model.id.includes("anthropic")) {
614
- if (adaptiveEfforts) {
615
- return Object.fromEntries(
616
- adaptiveEfforts.map((effort) => [
617
- effort,
618
- {
619
- thinking: {
620
- type: "adaptive",
621
- },
622
- effort,
623
- },
624
- ]),
625
- )
626
- }
627
- return {
628
- high: {
629
- thinking: {
630
- type: "enabled",
631
- budgetTokens: 16000,
632
- },
633
- },
634
- max: {
635
- thinking: {
636
- type: "enabled",
637
- budgetTokens: 31999,
638
- },
639
- },
640
- }
641
- }
642
- if (model.id.includes("google")) {
643
- if (id.includes("2.5")) {
644
- return {
645
- high: {
646
- thinkingConfig: {
647
- includeThoughts: true,
648
- thinkingBudget: 16000,
649
- },
650
- },
651
- max: {
652
- thinkingConfig: {
653
- includeThoughts: true,
654
- thinkingBudget: 24576,
655
- },
656
- },
657
- }
658
- }
659
- return Object.fromEntries(
660
- ["low", "high"].map((effort) => [
661
- effort,
662
- {
663
- includeThoughts: true,
664
- thinkingLevel: effort,
665
- },
666
- ]),
667
- )
668
- }
669
- return Object.fromEntries(OPENAI_EFFORTS.map((effort) => [effort, { reasoningEffort: effort }]))
670
-
671
- case "@ai-sdk/github-copilot":
672
- if (model.id.includes("gemini")) {
673
- // currently github copilot only returns thinking
674
- return {}
675
- }
676
- if (model.id.includes("claude")) {
677
- return Object.fromEntries(WIDELY_SUPPORTED_EFFORTS.map((effort) => [effort, { reasoningEffort: effort }]))
678
- }
679
- const copilotEfforts = iife(() => {
680
- if (id.includes("5.1-codex-max") || id.includes("5.2") || id.includes("5.3"))
681
- return [...WIDELY_SUPPORTED_EFFORTS, "xhigh"]
682
- const arr = [...WIDELY_SUPPORTED_EFFORTS]
683
- if (id.includes("gpt-5") && model.release_date >= "2025-12-04") arr.push("xhigh")
684
- return arr
685
- })
686
- return Object.fromEntries(
687
- copilotEfforts.map((effort) => [
688
- effort,
689
- {
690
- reasoningEffort: effort,
691
- reasoningSummary: "auto",
692
- include: ["reasoning.encrypted_content"],
693
- },
694
- ]),
695
- )
696
-
697
- case "@ai-sdk/cerebras":
698
- // https://v5.ai-sdk.dev/providers/ai-sdk-providers/cerebras
699
- case "@ai-sdk/togetherai":
700
- // https://v5.ai-sdk.dev/providers/ai-sdk-providers/togetherai
701
- case "@ai-sdk/xai":
702
- // https://v5.ai-sdk.dev/providers/ai-sdk-providers/xai
703
- case "@ai-sdk/deepinfra":
704
- // https://v5.ai-sdk.dev/providers/ai-sdk-providers/deepinfra
705
- case "venice-ai-sdk-provider":
706
- // https://docs.venice.ai/overview/guides/reasoning-models#reasoning-effort
707
- case "@ai-sdk/openai-compatible":
708
- return Object.fromEntries(WIDELY_SUPPORTED_EFFORTS.map((effort) => [effort, { reasoningEffort: effort }]))
709
-
710
- case "@ai-sdk/azure":
711
- // https://v5.ai-sdk.dev/providers/ai-sdk-providers/azure
712
- if (id === "o1-mini") return {}
713
- const azureEfforts = ["low", "medium", "high"]
714
- if (id.includes("gpt-5-") || id === "gpt-5") {
715
- azureEfforts.unshift("minimal")
716
- }
717
- return Object.fromEntries(
718
- azureEfforts.map((effort) => [
719
- effort,
720
- {
721
- reasoningEffort: effort,
722
- reasoningSummary: "auto",
723
- include: ["reasoning.encrypted_content"],
724
- },
725
- ]),
726
- )
727
- case "@ai-sdk/openai":
728
- // https://v5.ai-sdk.dev/providers/ai-sdk-providers/openai
729
- if (id === "gpt-5-pro") return {}
730
- const openaiEfforts = iife(() => {
731
- if (id.includes("codex")) {
732
- if (id.includes("5.2") || id.includes("5.3")) return [...WIDELY_SUPPORTED_EFFORTS, "xhigh"]
733
- return WIDELY_SUPPORTED_EFFORTS
734
- }
735
- const arr = [...WIDELY_SUPPORTED_EFFORTS]
736
- if (id.includes("gpt-5-") || id === "gpt-5") {
737
- arr.unshift("minimal")
738
- }
739
- if (model.release_date >= "2025-11-13") {
740
- arr.unshift("none")
741
- }
742
- if (model.release_date >= "2025-12-04") {
743
- arr.push("xhigh")
744
- }
745
- return arr
746
- })
747
- return Object.fromEntries(
748
- openaiEfforts.map((effort) => [
749
- effort,
750
- {
751
- reasoningEffort: effort,
752
- reasoningSummary: "auto",
753
- include: ["reasoning.encrypted_content"],
754
- },
755
- ]),
756
- )
757
-
758
- case "@ai-sdk/anthropic":
759
- // https://v5.ai-sdk.dev/providers/ai-sdk-providers/anthropic
760
- case "@ai-sdk/google-vertex/anthropic":
761
- // https://v5.ai-sdk.dev/providers/ai-sdk-providers/google-vertex#anthropic-provider
762
-
763
- if (model.providerID === "github-copilot") {
764
- if (model.api.id.includes("opus-4.7")) {
765
- return Object.fromEntries(["medium"].map((effort) => [effort, { reasoningEffort: effort }]))
766
- }
767
- }
768
-
769
- if (adaptiveEfforts) {
770
- return Object.fromEntries(
771
- adaptiveEfforts.map((effort) => [
772
- effort,
773
- {
774
- thinking: {
775
- type: "adaptive",
776
- ...(["opus-4-7", "opus-4.7", "opus-4-8", "opus-4.8"].some((v) => model.api.id.includes(v))
777
- ? { display: "summarized" }
778
- : {}),
779
- },
780
- effort,
781
- },
782
- ]),
783
- )
784
- }
785
-
786
- return {
787
- high: {
788
- thinking: {
789
- type: "enabled",
790
- budgetTokens: Math.min(16_000, Math.floor(model.limit.output / 2 - 1)),
791
- },
792
- },
793
- max: {
794
- thinking: {
795
- type: "enabled",
796
- budgetTokens: Math.min(31_999, model.limit.output - 1),
797
- },
798
- },
799
- }
800
-
801
- case "@ai-sdk/amazon-bedrock":
802
- // https://v5.ai-sdk.dev/providers/ai-sdk-providers/amazon-bedrock
803
- if (adaptiveEfforts) {
804
- return Object.fromEntries(
805
- adaptiveEfforts.map((effort) => [
806
- effort,
807
- {
808
- reasoningConfig: {
809
- type: "adaptive",
810
- maxReasoningEffort: effort,
811
- ...(["opus-4-7", "opus-4.7", "opus-4-8", "opus-4.8"].some((v) => model.api.id.includes(v))
812
- ? { display: "summarized" }
813
- : {}),
814
- },
815
- },
816
- ]),
817
- )
818
- }
819
- // For Anthropic models on Bedrock, use reasoningConfig with budgetTokens
820
- if (model.api.id.includes("anthropic")) {
821
- return {
822
- high: {
823
- reasoningConfig: {
824
- type: "enabled",
825
- budgetTokens: 16000,
826
- },
827
- },
828
- max: {
829
- reasoningConfig: {
830
- type: "enabled",
831
- budgetTokens: 31999,
832
- },
833
- },
834
- }
835
- }
836
-
837
- // For Amazon Nova models, use reasoningConfig with maxReasoningEffort
838
- return Object.fromEntries(
839
- WIDELY_SUPPORTED_EFFORTS.map((effort) => [
840
- effort,
841
- {
842
- reasoningConfig: {
843
- type: "enabled",
844
- maxReasoningEffort: effort,
845
- },
846
- },
847
- ]),
848
- )
849
-
850
- case "@ai-sdk/google-vertex":
851
- // https://v5.ai-sdk.dev/providers/ai-sdk-providers/google-vertex
852
- case "@ai-sdk/google":
853
- // https://v5.ai-sdk.dev/providers/ai-sdk-providers/google-generative-ai
854
- if (id.includes("2.5")) {
855
- return {
856
- high: {
857
- thinkingConfig: {
858
- includeThoughts: true,
859
- thinkingBudget: 16000,
860
- },
861
- },
862
- max: {
863
- thinkingConfig: {
864
- includeThoughts: true,
865
- thinkingBudget: 24576,
866
- },
867
- },
868
- }
869
- }
870
- let levels = ["low", "high"]
871
- if (id.includes("3.1")) {
872
- levels = ["low", "medium", "high"]
873
- }
874
-
875
- return Object.fromEntries(
876
- levels.map((effort) => [
877
- effort,
878
- {
879
- thinkingConfig: {
880
- includeThoughts: true,
881
- thinkingLevel: effort,
882
- },
883
- },
884
- ]),
885
- )
886
-
887
- case "@ai-sdk/mistral":
888
- // https://v5.ai-sdk.dev/providers/ai-sdk-providers/mistral
889
- return {}
890
-
891
- case "@ai-sdk/cohere":
892
- // https://v5.ai-sdk.dev/providers/ai-sdk-providers/cohere
893
- return {}
894
-
895
- case "@ai-sdk/groq":
896
- // https://v5.ai-sdk.dev/providers/ai-sdk-providers/groq
897
- const groqEffort = ["none", ...WIDELY_SUPPORTED_EFFORTS]
898
- return Object.fromEntries(
899
- groqEffort.map((effort) => [
900
- effort,
901
- {
902
- reasoningEffort: effort,
903
- },
904
- ]),
905
- )
906
-
907
- case "@ai-sdk/perplexity":
908
- // https://v5.ai-sdk.dev/providers/ai-sdk-providers/perplexity
909
- return {}
910
-
911
- case "@jerome-benoit/sap-ai-provider-v2":
912
- if (model.api.id.includes("anthropic")) {
913
- if (adaptiveEfforts) {
914
- return Object.fromEntries(
915
- adaptiveEfforts.map((effort) => [
916
- effort,
917
- {
918
- thinking: {
919
- type: "adaptive",
920
- },
921
- effort,
922
- },
923
- ]),
924
- )
925
- }
926
- return {
927
- high: {
928
- thinking: {
929
- type: "enabled",
930
- budgetTokens: 16000,
931
- },
932
- },
933
- max: {
934
- thinking: {
935
- type: "enabled",
936
- budgetTokens: 31999,
937
- },
938
- },
939
- }
940
- }
941
- if (model.api.id.includes("gemini") && id.includes("2.5")) {
942
- return {
943
- high: {
944
- thinkingConfig: {
945
- includeThoughts: true,
946
- thinkingBudget: 16000,
947
- },
948
- },
949
- max: {
950
- thinkingConfig: {
951
- includeThoughts: true,
952
- thinkingBudget: 24576,
953
- },
954
- },
955
- }
956
- }
957
- if (model.api.id.includes("gpt") || /\bo[1-9]/.test(model.api.id)) {
958
- return Object.fromEntries(WIDELY_SUPPORTED_EFFORTS.map((effort) => [effort, { reasoningEffort: effort }]))
959
- }
960
- return {}
961
- }
962
- return {}
963
- }
964
-
965
- export function options(input: {
966
- model: Provider.Model
967
- sessionID: string
968
- providerOptions?: Record<string, any>
969
- }): Record<string, any> {
970
- const result: Record<string, any> = {}
971
-
972
- // openai and providers using openai package should set store to false by default.
973
- if (
974
- input.model.providerID === "openai" ||
975
- input.model.api.npm === "@ai-sdk/openai" ||
976
- input.model.api.npm === "@ai-sdk/github-copilot"
977
- ) {
978
- result["store"] = false
979
- }
980
-
981
- if (input.model.api.npm === "@ai-sdk/azure") {
982
- result["store"] = true
983
- result["promptCacheKey"] = input.sessionID
984
- }
985
-
986
- if (input.model.api.npm === "@openrouter/ai-sdk-provider" || input.model.api.npm === "@llmgateway/ai-sdk-provider") {
987
- result["usage"] = {
988
- include: true,
989
- }
990
- if (input.model.api.id.includes("gemini-3")) {
991
- result["reasoning"] = { effort: "high" }
992
- }
993
- }
994
-
995
- if (
996
- input.model.providerID === "baseten" ||
997
- (input.model.providerID === "opencode" && ["kimi-k2-thinking", "glm-4.6"].includes(input.model.api.id))
998
- ) {
999
- result["chat_template_args"] = { enable_thinking: true }
1000
- }
1001
-
1002
- if (
1003
- ["zai", "zhipuai"].some((id) => input.model.providerID.includes(id)) &&
1004
- input.model.api.npm === "@ai-sdk/openai-compatible"
1005
- ) {
1006
- result["thinking"] = {
1007
- type: "enabled",
1008
- clear_thinking: false,
1009
- }
1010
- }
1011
-
1012
- if (input.model.providerID === "openai" || input.providerOptions?.setCacheKey) {
1013
- result["promptCacheKey"] = input.sessionID
1014
- }
1015
-
1016
- if (input.model.api.npm === "@ai-sdk/google" || input.model.api.npm === "@ai-sdk/google-vertex") {
1017
- if (input.model.capabilities.reasoning) {
1018
- result["thinkingConfig"] = {
1019
- includeThoughts: true,
1020
- }
1021
- if (input.model.api.id.includes("gemini-3")) {
1022
- result["thinkingConfig"]["thinkingLevel"] = "high"
1023
- }
1024
- }
1025
- }
1026
-
1027
- // Enable thinking by default for kimi-k2.5/k2p5 models using anthropic SDK
1028
- const modelId = input.model.api.id.toLowerCase()
1029
- if (
1030
- (input.model.api.npm === "@ai-sdk/anthropic" || input.model.api.npm === "@ai-sdk/google-vertex/anthropic") &&
1031
- (modelId.includes("k2p5") || modelId.includes("kimi-k2.5") || modelId.includes("kimi-k2p5"))
1032
- ) {
1033
- result["thinking"] = {
1034
- type: "enabled",
1035
- budgetTokens: Math.min(16_000, Math.floor(input.model.limit.output / 2 - 1)),
1036
- }
1037
- }
1038
-
1039
- // Enable thinking for reasoning models on alibaba-cn (DashScope).
1040
- // DashScope's OpenAI-compatible API requires `enable_thinking: true` in the request body
1041
- // to return reasoning_content. Without it, models like kimi-k2.5, qwen-plus, qwen3, qwq,
1042
- // deepseek-r1, etc. never output thinking/reasoning tokens.
1043
- // Note: kimi-k2-thinking is excluded as it returns reasoning_content by default.
1044
- if (
1045
- input.model.providerID === "alibaba-cn" &&
1046
- input.model.capabilities.reasoning &&
1047
- input.model.api.npm === "@ai-sdk/openai-compatible" &&
1048
- !modelId.includes("kimi-k2-thinking")
1049
- ) {
1050
- result["enable_thinking"] = true
1051
- }
1052
-
1053
- if (input.model.api.id.includes("gpt-5") && !input.model.api.id.includes("gpt-5-chat")) {
1054
- if (!input.model.api.id.includes("gpt-5-pro")) {
1055
- result["reasoningEffort"] = "medium"
1056
- // Only inject reasoningSummary for providers that support it natively.
1057
- // @ai-sdk/openai-compatible proxies (e.g. LiteLLM) do not understand this
1058
- // parameter and return "Unknown parameter: 'reasoningSummary'".
1059
- if (
1060
- input.model.api.npm === "@ai-sdk/openai" ||
1061
- input.model.api.npm === "@ai-sdk/azure" ||
1062
- input.model.api.npm === "@ai-sdk/github-copilot"
1063
- ) {
1064
- result["reasoningSummary"] = "auto"
1065
- }
1066
- }
1067
-
1068
- // Only set textVerbosity for non-chat gpt-5.x models
1069
- // Chat models (e.g. gpt-5.2-chat-latest) only support "medium" verbosity
1070
- if (
1071
- input.model.api.id.includes("gpt-5.") &&
1072
- !input.model.api.id.includes("codex") &&
1073
- !input.model.api.id.includes("-chat") &&
1074
- input.model.providerID !== "azure"
1075
- ) {
1076
- result["textVerbosity"] = "low"
1077
- }
1078
-
1079
- if (input.model.providerID.startsWith("opencode")) {
1080
- result["promptCacheKey"] = input.sessionID
1081
- result["include"] = ["reasoning.encrypted_content"]
1082
- result["reasoningSummary"] = "auto"
1083
- }
1084
- }
1085
-
1086
- if (input.model.providerID === "venice") {
1087
- result["promptCacheKey"] = input.sessionID
1088
- }
1089
-
1090
- if (input.model.providerID === "openrouter") {
1091
- result["prompt_cache_key"] = input.sessionID
1092
- }
1093
- if (input.model.api.npm === "@ai-sdk/gateway") {
1094
- result["gateway"] = {
1095
- caching: "auto",
1096
- }
1097
- }
1098
-
1099
- return result
1100
- }
1101
-
1102
- export function smallOptions(model: Provider.Model) {
1103
- if (
1104
- model.providerID === "openai" ||
1105
- model.api.npm === "@ai-sdk/openai" ||
1106
- model.api.npm === "@ai-sdk/github-copilot"
1107
- ) {
1108
- if (model.api.id.includes("gpt-5")) {
1109
- if (model.api.id.includes("5.") || model.api.id.includes("5-mini")) {
1110
- return { store: false, reasoningEffort: "low" }
1111
- }
1112
- return { store: false, reasoningEffort: "minimal" }
1113
- }
1114
- return { store: false }
1115
- }
1116
- if (model.providerID === "google") {
1117
- // gemini-3 uses thinkingLevel, gemini-2.5 uses thinkingBudget
1118
- if (model.api.id.includes("gemini-3")) {
1119
- return { thinkingConfig: { thinkingLevel: "minimal" } }
1120
- }
1121
- return { thinkingConfig: { thinkingBudget: 0 } }
1122
- }
1123
- if (model.providerID === "openrouter" || model.providerID === "llmgateway") {
1124
- if (model.api.id.includes("google")) {
1125
- return { reasoning: { enabled: false } }
1126
- }
1127
- return { reasoningEffort: "minimal" }
1128
- }
1129
-
1130
- if (model.providerID === "venice") {
1131
- return { veniceParameters: { disableThinking: true } }
1132
- }
1133
-
1134
- return {}
1135
- }
1136
-
1137
- // Maps model ID prefix to provider slug used in providerOptions.
1138
- // Example: "amazon/nova-2-lite" → "bedrock"
1139
- const SLUG_OVERRIDES: Record<string, string> = {
1140
- amazon: "bedrock",
1141
- }
1142
-
1143
- export function providerOptions(model: Provider.Model, options: { [x: string]: any }) {
1144
- if (model.api.npm === "@ai-sdk/gateway") {
1145
- // Gateway providerOptions are split across two namespaces:
1146
- // - `gateway`: gateway-native routing/caching controls (order, only, byok, etc.)
1147
- // - `<upstream slug>`: provider-specific model options (anthropic/openai/...)
1148
- // We keep `gateway` as-is and route every other top-level option under the
1149
- // model-derived upstream slug.
1150
- const i = model.api.id.indexOf("/")
1151
- const rawSlug = i > 0 ? model.api.id.slice(0, i) : undefined
1152
- const slug = rawSlug ? (SLUG_OVERRIDES[rawSlug] ?? rawSlug) : undefined
1153
- const gateway = options.gateway
1154
- const rest = Object.fromEntries(Object.entries(options).filter(([k]) => k !== "gateway"))
1155
- const has = Object.keys(rest).length > 0
1156
-
1157
- const result: Record<string, any> = {}
1158
- if (gateway !== undefined) result.gateway = gateway
1159
-
1160
- if (has) {
1161
- if (slug) {
1162
- // Route model-specific options under the provider slug
1163
- result[slug] = rest
1164
- } else if (gateway && typeof gateway === "object" && !Array.isArray(gateway)) {
1165
- result.gateway = { ...gateway, ...rest }
1166
- } else {
1167
- result.gateway = rest
1168
- }
1169
- }
1170
-
1171
- return result
1172
- }
1173
-
1174
- const key = sdkKey(model.api.npm) ?? model.providerID
1175
- // @ai-sdk/azure delegates to OpenAIChatLanguageModel which reads from
1176
- // providerOptions["openai"], but OpenAIResponsesLanguageModel checks
1177
- // "azure" first. Pass both so model options work on either code path.
1178
- if (model.api.npm === "@ai-sdk/azure") {
1179
- return { openai: options, azure: options }
1180
- }
1181
- return { [key]: options }
1182
- }
1183
-
1184
- export function maxOutputTokens(model: Provider.Model): number {
1185
- if (model.providerID === "sleepy" || model.providerID === "sleepy" || model.providerID === "sleepy" || model.id.toLowerCase().includes("sleepy")) {
1186
- return SLEEPY_OUTPUT_TOKEN_MAX
1187
- }
1188
- return Math.min(model.limit.output, OUTPUT_TOKEN_MAX) || OUTPUT_TOKEN_MAX
1189
- }
1190
-
1191
- // Flatten a root-level `anyOf` / `oneOf` (typically from `z.discriminatedUnion`)
1192
- // into a single `type: "object"` schema with all variant properties merged at
1193
- // the root. The discriminator key becomes an `enum`, and per-variant required
1194
- // fields are encoded as a textual hint on the discriminator's description.
1195
- //
1196
- // OpenAI's function-calling validator rejects oneOf/anyOf/allOf/enum/not at the
1197
- // top level outright, so this is the only shape that gets through. We retain
1198
- // `additionalProperties: false` to keep the model from inventing fields, and
1199
- // rely on zod's runtime parse (still using the original discriminated union)
1200
- // to enforce per-action required fields strictly.
1201
- function flattenDiscriminatedUnion(schema: JSONSchema.BaseSchema | JSONSchema7): JSONSchema7 {
1202
- const root = schema as Record<string, any>
1203
- const variants = (root.anyOf ?? root.oneOf) as Array<Record<string, any>> | undefined
1204
- if (!variants?.length) return schema as JSONSchema7
1205
-
1206
- // Find the discriminator: a property whose `const` differs across all variants.
1207
- const constByKey = new Map<string, Set<unknown>>()
1208
- for (const v of variants) {
1209
- if (!v.properties) continue
1210
- for (const [key, prop] of Object.entries(v.properties as Record<string, any>)) {
1211
- if (prop && typeof prop === "object" && "const" in prop) {
1212
- if (!constByKey.has(key)) constByKey.set(key, new Set())
1213
- constByKey.get(key)!.add(prop.const)
1214
- }
1215
- }
1216
- }
1217
- let discriminator: string | undefined
1218
- for (const [key, values] of constByKey) {
1219
- if (values.size === variants.length) {
1220
- discriminator = key
1221
- break
1222
- }
1223
- }
1224
-
1225
- // Merge non-discriminator properties from every variant. Track which variants
1226
- // each property appeared in so the description can tell the model
1227
- // "(only when action='X'|'Y')" — flat schemas tempt some models (notably
1228
- // gpt-5.5) to fill every property regardless of which action they chose.
1229
- const properties: Record<string, any> = {}
1230
- const propertyOwners: Record<string, unknown[]> = {}
1231
- for (const v of variants) {
1232
- if (!v.properties) continue
1233
- const variantValue = discriminator
1234
- ? (v.properties as Record<string, any>)[discriminator]?.const
1235
- : undefined
1236
- for (const [key, prop] of Object.entries(v.properties as Record<string, any>)) {
1237
- if (key === discriminator) continue
1238
- if (!(key in properties)) properties[key] = prop
1239
- if (variantValue !== undefined) {
1240
- if (!propertyOwners[key]) propertyOwners[key] = []
1241
- propertyOwners[key].push(variantValue)
1242
- }
1243
- }
1244
- }
1245
- if (discriminator) {
1246
- for (const [key, owners] of Object.entries(propertyOwners)) {
1247
- if (owners.length === variants.length) continue // present in every variant — no annotation
1248
- const tag = `(only when ${discriminator}=${owners.map((o) => JSON.stringify(o)).join("|")})`
1249
- const original = (properties[key] as Record<string, any>).description as string | undefined
1250
- properties[key] = {
1251
- ...properties[key],
1252
- description: original ? `${tag} ${original}` : tag,
1253
- }
1254
- }
1255
- }
1256
-
1257
- // Discriminator becomes an enum with per-variant required fields hinted in
1258
- // its description. Without this hint the model only sees a flat bag of
1259
- // optional fields and forgets what to provide for each action.
1260
- if (discriminator) {
1261
- const proto = (variants[0].properties as Record<string, any>)[discriminator]
1262
- const enumValues = variants.map((v) => (v.properties as Record<string, any>)[discriminator!]?.const)
1263
- const baseDescription = (proto?.description as string | undefined) ?? ""
1264
- const hints = variants
1265
- .map((v) => {
1266
- const value = (v.properties as Record<string, any>)[discriminator!]?.const
1267
- const required = ((v.required as string[] | undefined) ?? []).filter((r) => r !== discriminator)
1268
- return required.length > 0 ? `${value}: requires ${required.join(", ")}` : `${value}: no extra required fields`
1269
- })
1270
- .join("; ")
1271
- properties[discriminator] = {
1272
- type: "string",
1273
- enum: enumValues,
1274
- description: baseDescription ? `${baseDescription}\n\nPer-${discriminator}: ${hints}.` : `Per-${discriminator}: ${hints}.`,
1275
- }
1276
- }
1277
-
1278
- return {
1279
- type: "object",
1280
- properties,
1281
- required: discriminator ? [discriminator] : [],
1282
- additionalProperties: false,
1283
- } as JSONSchema7
1284
- }
1285
-
1286
- export function schema(model: Provider.Model, schema: JSONSchema.BaseSchema | JSONSchema7): JSONSchema7 {
1287
- /*
1288
- if (["openai", "azure"].includes(providerID)) {
1289
- if (schema.type === "object" && schema.properties) {
1290
- for (const [key, value] of Object.entries(schema.properties)) {
1291
- if (schema.required?.includes(key)) continue
1292
- schema.properties[key] = {
1293
- anyOf: [
1294
- value as JSONSchema.JSONSchema,
1295
- {
1296
- type: "null",
1297
- },
1298
- ],
1299
- }
1300
- }
1301
- }
1302
- }
1303
- */
1304
-
1305
- // Many providers reject root-level `anyOf`/`oneOf` in tool schemas:
1306
- // - OpenAI/Azure: "schema must have type 'object' and not have 'oneOf'/'anyOf'"
1307
- // - Bedrock: "input_schema.type: Field required"
1308
- // - Anthropic proxies to Bedrock: same Bedrock error
1309
- // Flatten unconditionally — all providers accept a flat `type: "object"` schema,
1310
- // and zod's runtime parse still enforces per-variant required fields strictly.
1311
- schema = flattenDiscriminatedUnion(schema)
1312
-
1313
- // Convert integer enums to string enums for Google/Gemini
1314
- if (model.providerID === "google" || model.api.id.includes("gemini")) {
1315
- const isPlainObject = (node: unknown): node is Record<string, any> =>
1316
- typeof node === "object" && node !== null && !Array.isArray(node)
1317
- const hasCombiner = (node: unknown) =>
1318
- isPlainObject(node) && (Array.isArray(node.anyOf) || Array.isArray(node.oneOf) || Array.isArray(node.allOf))
1319
- const hasSchemaIntent = (node: unknown) => {
1320
- if (!isPlainObject(node)) return false
1321
- if (hasCombiner(node)) return true
1322
- return [
1323
- "type",
1324
- "properties",
1325
- "items",
1326
- "prefixItems",
1327
- "enum",
1328
- "const",
1329
- "$ref",
1330
- "additionalProperties",
1331
- "patternProperties",
1332
- "required",
1333
- "not",
1334
- "if",
1335
- "then",
1336
- "else",
1337
- ].some((key) => key in node)
1338
- }
1339
-
1340
- const sanitizeGemini = (obj: any): any => {
1341
- if (obj === null || typeof obj !== "object") {
1342
- return obj
1343
- }
1344
-
1345
- if (Array.isArray(obj)) {
1346
- return obj.map(sanitizeGemini)
1347
- }
1348
-
1349
- const result: any = {}
1350
- for (const [key, value] of Object.entries(obj)) {
1351
- if (key === "enum" && Array.isArray(value)) {
1352
- // Convert all enum values to strings
1353
- result[key] = value.map((v) => String(v))
1354
- // If we have integer type with enum, change type to string
1355
- if (result.type === "integer" || result.type === "number") {
1356
- result.type = "string"
1357
- }
1358
- } else if (typeof value === "object" && value !== null) {
1359
- result[key] = sanitizeGemini(value)
1360
- } else {
1361
- result[key] = value
1362
- }
1363
- }
1364
-
1365
- // Filter required array to only include fields that exist in properties
1366
- if (result.type === "object" && result.properties && Array.isArray(result.required)) {
1367
- result.required = result.required.filter((field: any) => field in result.properties)
1368
- }
1369
-
1370
- if (result.type === "array" && !hasCombiner(result)) {
1371
- if (result.items == null) {
1372
- result.items = {}
1373
- }
1374
- // Ensure items has a type only when it's still schema-empty.
1375
- if (isPlainObject(result.items) && !hasSchemaIntent(result.items)) {
1376
- result.items.type = "string"
1377
- }
1378
- }
1379
-
1380
- // Remove properties/required from non-object types (Gemini rejects these)
1381
- if (result.type && result.type !== "object" && !hasCombiner(result)) {
1382
- delete result.properties
1383
- delete result.required
1384
- }
1385
-
1386
- return result
1387
- }
1388
-
1389
- schema = sanitizeGemini(schema)
1390
- }
1391
-
1392
- return schema as JSONSchema7
1393
- }