@sleepy-ai/cli 0.0.0-main-202607032053 → 0.1.4

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 (799) hide show
  1. package/.sleepycode-test-fixtures-50158/sleepycode-test-eqsxv84ythu/.watcher-b67v64k2mnv +1 -0
  2. package/Dockerfile +18 -0
  3. package/README.md +6 -139
  4. package/drizzle.config.ts +10 -0
  5. package/git +0 -0
  6. package/migration/20260127222353_familiar_lady_ursula/migration.sql +90 -0
  7. package/migration/20260127222353_familiar_lady_ursula/snapshot.json +796 -0
  8. package/migration/20260211171708_add_project_commands/migration.sql +1 -0
  9. package/migration/20260211171708_add_project_commands/snapshot.json +806 -0
  10. package/migration/20260213144116_wakeful_the_professor/migration.sql +11 -0
  11. package/migration/20260213144116_wakeful_the_professor/snapshot.json +897 -0
  12. package/migration/20260225215848_workspace/migration.sql +7 -0
  13. package/migration/20260225215848_workspace/snapshot.json +959 -0
  14. package/migration/20260227213759_add_session_workspace_id/migration.sql +2 -0
  15. package/migration/20260227213759_add_session_workspace_id/snapshot.json +983 -0
  16. package/migration/20260228203230_blue_harpoon/migration.sql +17 -0
  17. package/migration/20260228203230_blue_harpoon/snapshot.json +1102 -0
  18. package/migration/20260303231226_add_workspace_fields/migration.sql +5 -0
  19. package/migration/20260303231226_add_workspace_fields/snapshot.json +1013 -0
  20. package/migration/20260309230000_move_org_to_state/migration.sql +3 -0
  21. package/migration/20260309230000_move_org_to_state/snapshot.json +1156 -0
  22. package/migration/20260312043431_session_message_cursor/migration.sql +4 -0
  23. package/migration/20260312043431_session_message_cursor/snapshot.json +1168 -0
  24. package/migration/20260323234822_events/migration.sql +13 -0
  25. package/migration/20260323234822_events/snapshot.json +1271 -0
  26. package/migration/20260410174513_workspace-name/migration.sql +16 -0
  27. package/migration/20260410174513_workspace-name/snapshot.json +1271 -0
  28. package/migration/20260413175956_chief_energizer/migration.sql +13 -0
  29. package/migration/20260413175956_chief_energizer/snapshot.json +1399 -0
  30. package/migration/20260422160000_context_inheritance/migration.sql +3 -0
  31. package/migration/20260422170000_task_registry/migration.sql +18 -0
  32. package/migration/20260423145421_remove_session_entry/migration.sql +4 -0
  33. package/migration/20260515000000_actor_rename/migration.sql +7 -0
  34. package/migration/20260515010000_memory_fts/migration.sql +33 -0
  35. package/migration/20260515020000_user_task/migration.sql +29 -0
  36. package/migration/20260519000000_last_checkpoint_message_id/migration.sql +1 -0
  37. package/migration/20260521000000_message_agent_id/migration.sql +2 -0
  38. package/migration/20260521000100_actor_registry_v6/migration.sql +25 -0
  39. package/migration/20260521010000_memory_fts_v6/migration.sql +33 -0
  40. package/migration/20260521020000_memory_fts_triggers/migration.sql +17 -0
  41. package/migration/20260526000000_agent_id_main/migration.sql +14 -0
  42. package/migration/20260527000000_actor_lifecycle/migration.sql +8 -0
  43. package/migration/20260527000100_inbox/migration.sql +12 -0
  44. package/migration/20260529000000_task_todo_redesign/migration.sql +16 -0
  45. package/migration/20260603000000_task_in_progress_owner/migration.sql +1 -0
  46. package/migration/20260603000000_workflow_run/migration.sql +17 -0
  47. package/migration/20260604000000_workflow_script_sha/migration.sql +1 -0
  48. package/migration/20260608000000_claude_import/migration.sql +7 -0
  49. package/migration/20260608010000_claude_import_message_ids/migration.sql +1 -0
  50. package/migration/20260609000000_history_fts/migration.sql +29 -0
  51. package/migration/20260609230000_workflow_agent_timeout/migration.sql +1 -0
  52. package/migration/20260612000000_external_import/migration.sql +16 -0
  53. package/package.json +193 -32
  54. package/parsers-config.ts +290 -0
  55. package/src/account/account.sql.ts +39 -0
  56. package/src/account/account.ts +456 -0
  57. package/src/account/repo.ts +166 -0
  58. package/src/account/schema.ts +99 -0
  59. package/src/account/url.ts +8 -0
  60. package/src/acp/README.md +174 -0
  61. package/src/acp/agent.ts +1787 -0
  62. package/src/acp/session.ts +116 -0
  63. package/src/acp/types.ts +24 -0
  64. package/src/actor/actor.sql.ts +38 -0
  65. package/src/actor/events.ts +67 -0
  66. package/src/actor/index.ts +2 -0
  67. package/src/actor/registry.ts +412 -0
  68. package/src/actor/return-header.ts +24 -0
  69. package/src/actor/schema.ts +47 -0
  70. package/src/actor/spawn-ref.ts +16 -0
  71. package/src/actor/spawn.ts +756 -0
  72. package/src/actor/turn.ts +49 -0
  73. package/src/actor/waiter.ts +166 -0
  74. package/src/agent/agent.ts +574 -0
  75. package/src/agent/config.ts +5 -0
  76. package/src/agent/generate.txt +75 -0
  77. package/src/agent/prompt/checkpoint-writer.txt +167 -0
  78. package/src/agent/prompt/compaction.txt +9 -0
  79. package/src/agent/prompt/distill.txt +199 -0
  80. package/src/agent/prompt/dream.txt +155 -0
  81. package/src/agent/prompt/explore.txt +18 -0
  82. package/src/agent/prompt/summary.txt +11 -0
  83. package/src/agent/prompt/title.txt +44 -0
  84. package/src/audio.d.ts +9 -0
  85. package/src/auth/index.ts +97 -0
  86. package/src/bus/bus-event.ts +33 -0
  87. package/src/bus/global.ts +12 -0
  88. package/src/bus/index.ts +193 -0
  89. package/src/cli/bootstrap.ts +33 -0
  90. package/src/cli/cmd/account.ts +258 -0
  91. package/src/cli/cmd/acp.ts +70 -0
  92. package/src/cli/cmd/agent.ts +248 -0
  93. package/src/cli/cmd/cmd.ts +7 -0
  94. package/src/cli/cmd/db.ts +120 -0
  95. package/src/cli/cmd/debug/agent.ts +192 -0
  96. package/src/cli/cmd/debug/config.ts +17 -0
  97. package/src/cli/cmd/debug/file.ts +100 -0
  98. package/src/cli/cmd/debug/index.ts +48 -0
  99. package/src/cli/cmd/debug/lsp.ts +61 -0
  100. package/src/cli/cmd/debug/ripgrep.ts +105 -0
  101. package/src/cli/cmd/debug/scrap.ts +16 -0
  102. package/src/cli/cmd/debug/skill.ts +23 -0
  103. package/src/cli/cmd/debug/snapshot.ts +53 -0
  104. package/src/cli/cmd/doctor.ts +116 -0
  105. package/src/cli/cmd/export.ts +306 -0
  106. package/src/cli/cmd/generate.ts +50 -0
  107. package/src/cli/cmd/github.ts +1647 -0
  108. package/src/cli/cmd/import.ts +208 -0
  109. package/src/cli/cmd/init.ts +97 -0
  110. package/src/cli/cmd/login.ts +402 -0
  111. package/src/cli/cmd/mcp.ts +812 -0
  112. package/src/cli/cmd/models.ts +88 -0
  113. package/src/cli/cmd/plug.ts +233 -0
  114. package/src/cli/cmd/pr.ts +138 -0
  115. package/src/cli/cmd/providers.ts +713 -0
  116. package/src/cli/cmd/run-completion.ts +77 -0
  117. package/src/cli/cmd/run.ts +694 -0
  118. package/src/cli/cmd/serve.ts +30 -0
  119. package/src/cli/cmd/session.ts +181 -0
  120. package/src/cli/cmd/stats.ts +413 -0
  121. package/src/cli/cmd/tui/app.tsx +1181 -0
  122. package/src/cli/cmd/tui/asset/TEN_VAD_LICENSE +12 -0
  123. package/src/cli/cmd/tui/asset/charge.wav +0 -0
  124. package/src/cli/cmd/tui/asset/pulse-a.wav +0 -0
  125. package/src/cli/cmd/tui/asset/pulse-b.wav +0 -0
  126. package/src/cli/cmd/tui/asset/pulse-c.wav +0 -0
  127. package/src/cli/cmd/tui/asset/ten_vad.wasm +0 -0
  128. package/src/cli/cmd/tui/asset/ten_vad_loader.js +30 -0
  129. package/src/cli/cmd/tui/attach.ts +84 -0
  130. package/src/cli/cmd/tui/component/background-image.tsx +150 -0
  131. package/src/cli/cmd/tui/component/banner-session-expired.tsx +48 -0
  132. package/src/cli/cmd/tui/component/bg-pulse.tsx +130 -0
  133. package/src/cli/cmd/tui/component/border.tsx +21 -0
  134. package/src/cli/cmd/tui/component/dialog-agent.tsx +31 -0
  135. package/src/cli/cmd/tui/component/dialog-agreement.tsx +111 -0
  136. package/src/cli/cmd/tui/component/dialog-command.tsx +219 -0
  137. package/src/cli/cmd/tui/component/dialog-console-org.tsx +103 -0
  138. package/src/cli/cmd/tui/component/dialog-go-upsell.tsx +157 -0
  139. package/src/cli/cmd/tui/component/dialog-image-list.tsx +111 -0
  140. package/src/cli/cmd/tui/component/dialog-logo-design.tsx +37 -0
  141. package/src/cli/cmd/tui/component/dialog-mcp.tsx +86 -0
  142. package/src/cli/cmd/tui/component/dialog-model.tsx +299 -0
  143. package/src/cli/cmd/tui/component/dialog-provider.tsx +449 -0
  144. package/src/cli/cmd/tui/component/dialog-session-delete-failed.tsx +101 -0
  145. package/src/cli/cmd/tui/component/dialog-session-list.tsx +269 -0
  146. package/src/cli/cmd/tui/component/dialog-session-rename.tsx +31 -0
  147. package/src/cli/cmd/tui/component/dialog-skill.tsx +42 -0
  148. package/src/cli/cmd/tui/component/dialog-sleepy-login.tsx +288 -0
  149. package/src/cli/cmd/tui/component/dialog-stash.tsx +87 -0
  150. package/src/cli/cmd/tui/component/dialog-status.tsx +170 -0
  151. package/src/cli/cmd/tui/component/dialog-tag.tsx +44 -0
  152. package/src/cli/cmd/tui/component/dialog-theme-list.tsx +50 -0
  153. package/src/cli/cmd/tui/component/dialog-token-plan.tsx +77 -0
  154. package/src/cli/cmd/tui/component/dialog-variant.tsx +39 -0
  155. package/src/cli/cmd/tui/component/dialog-workflows.tsx +51 -0
  156. package/src/cli/cmd/tui/component/dialog-workspace-create.tsx +289 -0
  157. package/src/cli/cmd/tui/component/dialog-workspace-unavailable.tsx +81 -0
  158. package/src/cli/cmd/tui/component/dialog-worktree.tsx +90 -0
  159. package/src/cli/cmd/tui/component/error-component.tsx +92 -0
  160. package/src/cli/cmd/tui/component/logo.tsx +961 -0
  161. package/src/cli/cmd/tui/component/plugin-route-missing.tsx +14 -0
  162. package/src/cli/cmd/tui/component/prompt/autocomplete-detect.ts +34 -0
  163. package/src/cli/cmd/tui/component/prompt/autocomplete.tsx +668 -0
  164. package/src/cli/cmd/tui/component/prompt/cwd.ts +0 -0
  165. package/src/cli/cmd/tui/component/prompt/frecency.tsx +90 -0
  166. package/src/cli/cmd/tui/component/prompt/history.tsx +108 -0
  167. package/src/cli/cmd/tui/component/prompt/index.tsx +1869 -0
  168. package/src/cli/cmd/tui/component/prompt/offset.ts +45 -0
  169. package/src/cli/cmd/tui/component/prompt/part.ts +36 -0
  170. package/src/cli/cmd/tui/component/prompt/stash.tsx +101 -0
  171. package/src/cli/cmd/tui/component/spinner.tsx +24 -0
  172. package/src/cli/cmd/tui/component/starry-background.tsx +305 -0
  173. package/src/cli/cmd/tui/component/startup-loading.tsx +67 -0
  174. package/src/cli/cmd/tui/component/task-item.tsx +63 -0
  175. package/src/cli/cmd/tui/component/textarea-keybindings.ts +73 -0
  176. package/src/cli/cmd/tui/component/todo-item.tsx +32 -0
  177. package/src/cli/cmd/tui/component/workflow-tree.tsx +177 -0
  178. package/src/cli/cmd/tui/config/cwd.ts +5 -0
  179. package/src/cli/cmd/tui/config/tui-migrate.ts +151 -0
  180. package/src/cli/cmd/tui/config/tui-schema.ts +38 -0
  181. package/src/cli/cmd/tui/config/tui.ts +219 -0
  182. package/src/cli/cmd/tui/context/args.tsx +16 -0
  183. package/src/cli/cmd/tui/context/directory.ts +15 -0
  184. package/src/cli/cmd/tui/context/event.ts +45 -0
  185. package/src/cli/cmd/tui/context/exit.tsx +65 -0
  186. package/src/cli/cmd/tui/context/helper.tsx +25 -0
  187. package/src/cli/cmd/tui/context/keybind.tsx +105 -0
  188. package/src/cli/cmd/tui/context/kv.tsx +86 -0
  189. package/src/cli/cmd/tui/context/language.tsx +91 -0
  190. package/src/cli/cmd/tui/context/local.tsx +469 -0
  191. package/src/cli/cmd/tui/context/plugin-keybinds.ts +41 -0
  192. package/src/cli/cmd/tui/context/project.tsx +109 -0
  193. package/src/cli/cmd/tui/context/prompt.tsx +18 -0
  194. package/src/cli/cmd/tui/context/route.tsx +68 -0
  195. package/src/cli/cmd/tui/context/sdk.tsx +150 -0
  196. package/src/cli/cmd/tui/context/sync.tsx +884 -0
  197. package/src/cli/cmd/tui/context/theme/aura.json +69 -0
  198. package/src/cli/cmd/tui/context/theme/ayu.json +80 -0
  199. package/src/cli/cmd/tui/context/theme/carbonfox.json +248 -0
  200. package/src/cli/cmd/tui/context/theme/catppuccin-frappe.json +230 -0
  201. package/src/cli/cmd/tui/context/theme/catppuccin-macchiato.json +230 -0
  202. package/src/cli/cmd/tui/context/theme/catppuccin.json +112 -0
  203. package/src/cli/cmd/tui/context/theme/cobalt2.json +225 -0
  204. package/src/cli/cmd/tui/context/theme/cursor.json +249 -0
  205. package/src/cli/cmd/tui/context/theme/dracula.json +219 -0
  206. package/src/cli/cmd/tui/context/theme/everforest.json +241 -0
  207. package/src/cli/cmd/tui/context/theme/flexoki.json +237 -0
  208. package/src/cli/cmd/tui/context/theme/github.json +233 -0
  209. package/src/cli/cmd/tui/context/theme/gruvbox.json +242 -0
  210. package/src/cli/cmd/tui/context/theme/kanagawa.json +77 -0
  211. package/src/cli/cmd/tui/context/theme/lucent-orng.json +234 -0
  212. package/src/cli/cmd/tui/context/theme/material.json +235 -0
  213. package/src/cli/cmd/tui/context/theme/matrix.json +77 -0
  214. package/src/cli/cmd/tui/context/theme/mercury.json +252 -0
  215. package/src/cli/cmd/tui/context/theme/monokai.json +221 -0
  216. package/src/cli/cmd/tui/context/theme/nightowl.json +221 -0
  217. package/src/cli/cmd/tui/context/theme/nord.json +223 -0
  218. package/src/cli/cmd/tui/context/theme/one-dark.json +84 -0
  219. package/src/cli/cmd/tui/context/theme/orng.json +249 -0
  220. package/src/cli/cmd/tui/context/theme/osaka-jade.json +93 -0
  221. package/src/cli/cmd/tui/context/theme/palenight.json +222 -0
  222. package/src/cli/cmd/tui/context/theme/rosepine.json +234 -0
  223. package/src/cli/cmd/tui/context/theme/sleepycode.json +245 -0
  224. package/src/cli/cmd/tui/context/theme/solarized.json +223 -0
  225. package/src/cli/cmd/tui/context/theme/synthwave84.json +226 -0
  226. package/src/cli/cmd/tui/context/theme/tokyonight.json +243 -0
  227. package/src/cli/cmd/tui/context/theme/vercel.json +245 -0
  228. package/src/cli/cmd/tui/context/theme/vesper.json +218 -0
  229. package/src/cli/cmd/tui/context/theme/zenburn.json +223 -0
  230. package/src/cli/cmd/tui/context/theme.tsx +1298 -0
  231. package/src/cli/cmd/tui/context/thinking.ts +48 -0
  232. package/src/cli/cmd/tui/context/tui-config.tsx +9 -0
  233. package/src/cli/cmd/tui/event.ts +62 -0
  234. package/src/cli/cmd/tui/feature-plugins/home/footer.tsx +93 -0
  235. package/src/cli/cmd/tui/feature-plugins/home/tips-view.tsx +193 -0
  236. package/src/cli/cmd/tui/feature-plugins/home/tips.tsx +54 -0
  237. package/src/cli/cmd/tui/feature-plugins/sidebar/context.tsx +267 -0
  238. package/src/cli/cmd/tui/feature-plugins/sidebar/cwd.tsx +45 -0
  239. package/src/cli/cmd/tui/feature-plugins/sidebar/files.tsx +62 -0
  240. package/src/cli/cmd/tui/feature-plugins/sidebar/footer.tsx +93 -0
  241. package/src/cli/cmd/tui/feature-plugins/sidebar/goal.tsx +84 -0
  242. package/src/cli/cmd/tui/feature-plugins/sidebar/instructions.tsx +54 -0
  243. package/src/cli/cmd/tui/feature-plugins/sidebar/lsp.tsx +66 -0
  244. package/src/cli/cmd/tui/feature-plugins/sidebar/mascot.tsx +69 -0
  245. package/src/cli/cmd/tui/feature-plugins/sidebar/mcp.tsx +98 -0
  246. package/src/cli/cmd/tui/feature-plugins/sidebar/task.tsx +95 -0
  247. package/src/cli/cmd/tui/feature-plugins/sidebar/todo.tsx +51 -0
  248. package/src/cli/cmd/tui/feature-plugins/sidebar/tps.ts +31 -0
  249. package/src/cli/cmd/tui/feature-plugins/system/plugins.tsx +274 -0
  250. package/src/cli/cmd/tui/i18n/en.ts +465 -0
  251. package/src/cli/cmd/tui/i18n/es.ts +508 -0
  252. package/src/cli/cmd/tui/i18n/fr.ts +515 -0
  253. package/src/cli/cmd/tui/i18n/ja.ts +463 -0
  254. package/src/cli/cmd/tui/i18n/locales.ts +82 -0
  255. package/src/cli/cmd/tui/i18n/ru.ts +527 -0
  256. package/src/cli/cmd/tui/i18n/slash-command.ts +11 -0
  257. package/src/cli/cmd/tui/i18n/zh.ts +454 -0
  258. package/src/cli/cmd/tui/i18n/zht.ts +430 -0
  259. package/src/cli/cmd/tui/layer.ts +6 -0
  260. package/src/cli/cmd/tui/plugin/api.tsx +402 -0
  261. package/src/cli/cmd/tui/plugin/index.ts +3 -0
  262. package/src/cli/cmd/tui/plugin/internal.ts +37 -0
  263. package/src/cli/cmd/tui/plugin/runtime.ts +1057 -0
  264. package/src/cli/cmd/tui/plugin/slots.tsx +60 -0
  265. package/src/cli/cmd/tui/routes/home.tsx +165 -0
  266. package/src/cli/cmd/tui/routes/session/dialog-fork-from-timeline.tsx +76 -0
  267. package/src/cli/cmd/tui/routes/session/dialog-message.tsx +116 -0
  268. package/src/cli/cmd/tui/routes/session/dialog-subagent.tsx +47 -0
  269. package/src/cli/cmd/tui/routes/session/dialog-timeline.tsx +47 -0
  270. package/src/cli/cmd/tui/routes/session/footer.tsx +91 -0
  271. package/src/cli/cmd/tui/routes/session/index.tsx +3073 -0
  272. package/src/cli/cmd/tui/routes/session/permission.tsx +697 -0
  273. package/src/cli/cmd/tui/routes/session/question.tsx +488 -0
  274. package/src/cli/cmd/tui/routes/session/sidebar.tsx +97 -0
  275. package/src/cli/cmd/tui/routes/session/subagent-footer.tsx +143 -0
  276. package/src/cli/cmd/tui/thread.ts +323 -0
  277. package/src/cli/cmd/tui/ui/dialog-alert.tsx +61 -0
  278. package/src/cli/cmd/tui/ui/dialog-confirm.tsx +95 -0
  279. package/src/cli/cmd/tui/ui/dialog-export-options.tsx +223 -0
  280. package/src/cli/cmd/tui/ui/dialog-help.tsx +42 -0
  281. package/src/cli/cmd/tui/ui/dialog-prompt.tsx +123 -0
  282. package/src/cli/cmd/tui/ui/dialog-select.tsx +467 -0
  283. package/src/cli/cmd/tui/ui/dialog.tsx +207 -0
  284. package/src/cli/cmd/tui/ui/link.tsx +28 -0
  285. package/src/cli/cmd/tui/ui/spinner.ts +378 -0
  286. package/src/cli/cmd/tui/ui/toast.tsx +102 -0
  287. package/src/cli/cmd/tui/util/clipboard.ts +203 -0
  288. package/src/cli/cmd/tui/util/editor.ts +36 -0
  289. package/src/cli/cmd/tui/util/image-protocol.ts +35 -0
  290. package/src/cli/cmd/tui/util/index.ts +6 -0
  291. package/src/cli/cmd/tui/util/model.ts +23 -0
  292. package/src/cli/cmd/tui/util/pinyin.ts +20 -0
  293. package/src/cli/cmd/tui/util/provider-origin.ts +7 -0
  294. package/src/cli/cmd/tui/util/revert-diff.ts +18 -0
  295. package/src/cli/cmd/tui/util/scroll.ts +23 -0
  296. package/src/cli/cmd/tui/util/selection.ts +23 -0
  297. package/src/cli/cmd/tui/util/signal.ts +41 -0
  298. package/src/cli/cmd/tui/util/sound.ts +154 -0
  299. package/src/cli/cmd/tui/util/system-locale.ts +209 -0
  300. package/src/cli/cmd/tui/util/terminal.ts +110 -0
  301. package/src/cli/cmd/tui/util/transcript.ts +112 -0
  302. package/src/cli/cmd/tui/util/vad.ts +229 -0
  303. package/src/cli/cmd/tui/util/voice.ts +450 -0
  304. package/src/cli/cmd/tui/win32.ts +130 -0
  305. package/src/cli/cmd/tui/worker.ts +104 -0
  306. package/src/cli/cmd/uninstall.ts +351 -0
  307. package/src/cli/cmd/upgrade.ts +79 -0
  308. package/src/cli/cmd/web.ts +96 -0
  309. package/src/cli/effect/prompt.ts +25 -0
  310. package/src/cli/error.ts +82 -0
  311. package/src/cli/heap.ts +59 -0
  312. package/src/cli/i18n.ts +15 -0
  313. package/src/cli/logo.ts +53 -0
  314. package/src/cli/network.ts +68 -0
  315. package/src/cli/ui.ts +133 -0
  316. package/src/cli/upgrade.ts +41 -0
  317. package/src/command/index.ts +276 -0
  318. package/src/command/template/initialize.txt +66 -0
  319. package/src/command/template/review.txt +101 -0
  320. package/src/config/agent.ts +197 -0
  321. package/src/config/command.ts +69 -0
  322. package/src/config/compose.ts +26 -0
  323. package/src/config/config.ts +1047 -0
  324. package/src/config/console-state.ts +16 -0
  325. package/src/config/entry-name.ts +16 -0
  326. package/src/config/error.ts +21 -0
  327. package/src/config/formatter.ts +17 -0
  328. package/src/config/history.ts +21 -0
  329. package/src/config/index.ts +17 -0
  330. package/src/config/keybinds.ts +127 -0
  331. package/src/config/layout.ts +10 -0
  332. package/src/config/lsp.ts +45 -0
  333. package/src/config/managed.ts +70 -0
  334. package/src/config/markdown.ts +97 -0
  335. package/src/config/mcp.ts +172 -0
  336. package/src/config/model-id.ts +14 -0
  337. package/src/config/parse.ts +44 -0
  338. package/src/config/paths.ts +85 -0
  339. package/src/config/permission.ts +76 -0
  340. package/src/config/plugin.ts +88 -0
  341. package/src/config/provider.ts +118 -0
  342. package/src/config/server.ts +20 -0
  343. package/src/config/skills.ts +16 -0
  344. package/src/config/variable.ts +90 -0
  345. package/src/control-plane/adaptors/index.ts +52 -0
  346. package/src/control-plane/adaptors/worktree.ts +47 -0
  347. package/src/control-plane/dev/debug-workspace-plugin.ts +73 -0
  348. package/src/control-plane/schema.ts +19 -0
  349. package/src/control-plane/sse.ts +66 -0
  350. package/src/control-plane/types.ts +34 -0
  351. package/src/control-plane/util.ts +37 -0
  352. package/src/control-plane/workspace-context.ts +26 -0
  353. package/src/control-plane/workspace.sql.ts +17 -0
  354. package/src/control-plane/workspace.ts +615 -0
  355. package/src/effect/app-runtime.ts +146 -0
  356. package/src/effect/bootstrap-runtime.ts +33 -0
  357. package/src/effect/bridge.ts +48 -0
  358. package/src/effect/cross-spawn-spawner.ts +514 -0
  359. package/src/effect/index.ts +5 -0
  360. package/src/effect/instance-ref.ts +11 -0
  361. package/src/effect/instance-registry.ts +12 -0
  362. package/src/effect/instance-state.ts +81 -0
  363. package/src/effect/logger.ts +73 -0
  364. package/src/effect/memo-map.ts +3 -0
  365. package/src/effect/observability.ts +107 -0
  366. package/src/effect/run-service.ts +52 -0
  367. package/src/effect/runner.ts +210 -0
  368. package/src/effect/runtime.ts +19 -0
  369. package/src/env/index.ts +37 -0
  370. package/src/file/ignore.ts +81 -0
  371. package/src/file/index.ts +664 -0
  372. package/src/file/protected.ts +59 -0
  373. package/src/file/ripgrep.ts +485 -0
  374. package/src/file/watcher.ts +163 -0
  375. package/src/flag/flag.ts +185 -0
  376. package/src/format/formatter.ts +403 -0
  377. package/src/format/index.ts +203 -0
  378. package/src/git/index.ts +260 -0
  379. package/src/global/index.ts +54 -0
  380. package/src/history/backfill.ts +162 -0
  381. package/src/history/extract.ts +67 -0
  382. package/src/history/fts-query.ts +15 -0
  383. package/src/history/fts.sql.ts +20 -0
  384. package/src/history/index.ts +10 -0
  385. package/src/history/resolve.ts +65 -0
  386. package/src/history/service.ts +258 -0
  387. package/src/history/writer.ts +112 -0
  388. package/src/id/id.ts +87 -0
  389. package/src/ide/index.ts +73 -0
  390. package/src/inbox/inbox-ref.ts +38 -0
  391. package/src/inbox/inbox.sql.ts +26 -0
  392. package/src/inbox/inbox.ts +223 -0
  393. package/src/inbox/index.ts +3 -0
  394. package/src/inbox/render.ts +40 -0
  395. package/src/index.ts +268 -0
  396. package/src/installation/index.ts +362 -0
  397. package/src/installation/version.ts +8 -0
  398. package/src/lsp/client.ts +249 -0
  399. package/src/lsp/diagnostic.ts +29 -0
  400. package/src/lsp/index.ts +3 -0
  401. package/src/lsp/language.ts +120 -0
  402. package/src/lsp/launch.ts +21 -0
  403. package/src/lsp/lsp.ts +519 -0
  404. package/src/lsp/server.ts +1956 -0
  405. package/src/mcp/auth.ts +144 -0
  406. package/src/mcp/index.ts +939 -0
  407. package/src/mcp/oauth-callback.ts +236 -0
  408. package/src/mcp/oauth-provider.ts +214 -0
  409. package/src/memory/fts-query.ts +37 -0
  410. package/src/memory/fts.sql.ts +19 -0
  411. package/src/memory/index.ts +1 -0
  412. package/src/memory/paths.ts +116 -0
  413. package/src/memory/reconcile.ts +144 -0
  414. package/src/memory/service.ts +144 -0
  415. package/src/metrics/client.ts +40 -0
  416. package/src/metrics/event.ts +43 -0
  417. package/src/metrics/index.ts +5 -0
  418. package/src/metrics/installation.ts +18 -0
  419. package/src/metrics/subscriber.ts +58 -0
  420. package/src/metrics/util.ts +9 -0
  421. package/src/node.ts +6 -0
  422. package/src/npm/config.ts +0 -0
  423. package/src/npm/index.ts +293 -0
  424. package/src/npmcli-config.d.ts +43 -0
  425. package/src/patch/index.ts +680 -0
  426. package/src/permission/arity.ts +163 -0
  427. package/src/permission/evaluate.ts +15 -0
  428. package/src/permission/index.ts +382 -0
  429. package/src/permission/schema.ts +17 -0
  430. package/src/plugin/checkpoint-splitover.ts +60 -0
  431. package/src/plugin/cloudflare.ts +76 -0
  432. package/src/plugin/codex.ts +611 -0
  433. package/src/plugin/github-copilot/copilot.ts +368 -0
  434. package/src/plugin/github-copilot/models.ts +153 -0
  435. package/src/plugin/index.ts +637 -0
  436. package/src/plugin/install.ts +439 -0
  437. package/src/plugin/loader.ts +216 -0
  438. package/src/plugin/matcher.ts +33 -0
  439. package/src/plugin/meta.ts +188 -0
  440. package/src/plugin/shared.ts +323 -0
  441. package/src/plugin/sleepy.ts +244 -0
  442. package/src/plugin/subagent-progress-checker.ts +147 -0
  443. package/src/project/bootstrap.ts +59 -0
  444. package/src/project/index.ts +2 -0
  445. package/src/project/instance.ts +215 -0
  446. package/src/project/project-id.ts +48 -0
  447. package/src/project/project.sql.ts +16 -0
  448. package/src/project/project.ts +522 -0
  449. package/src/project/schema.ts +15 -0
  450. package/src/project/vcs.ts +227 -0
  451. package/src/project/workspace-trust.ts +67 -0
  452. package/src/provider/auth.ts +234 -0
  453. package/src/provider/error.ts +216 -0
  454. package/src/provider/index.ts +5 -0
  455. package/src/provider/models-snapshot.d.ts +2 -0
  456. package/src/provider/models-snapshot.js +3 -0
  457. package/src/provider/models.ts +180 -0
  458. package/src/provider/provider.ts +2098 -0
  459. package/src/provider/schema.ts +36 -0
  460. package/src/provider/sdk/copilot/README.md +5 -0
  461. package/src/provider/sdk/copilot/chat/convert-to-openai-compatible-chat-messages.ts +170 -0
  462. package/src/provider/sdk/copilot/chat/get-response-metadata.ts +15 -0
  463. package/src/provider/sdk/copilot/chat/map-openai-compatible-finish-reason.ts +19 -0
  464. package/src/provider/sdk/copilot/chat/openai-compatible-api-types.ts +64 -0
  465. package/src/provider/sdk/copilot/chat/openai-compatible-chat-language-model.ts +815 -0
  466. package/src/provider/sdk/copilot/chat/openai-compatible-chat-options.ts +28 -0
  467. package/src/provider/sdk/copilot/chat/openai-compatible-metadata-extractor.ts +44 -0
  468. package/src/provider/sdk/copilot/chat/openai-compatible-prepare-tools.ts +83 -0
  469. package/src/provider/sdk/copilot/copilot-provider.ts +100 -0
  470. package/src/provider/sdk/copilot/index.ts +2 -0
  471. package/src/provider/sdk/copilot/openai-compatible-error.ts +27 -0
  472. package/src/provider/sdk/copilot/responses/convert-to-openai-responses-input.ts +335 -0
  473. package/src/provider/sdk/copilot/responses/map-openai-responses-finish-reason.ts +22 -0
  474. package/src/provider/sdk/copilot/responses/openai-config.ts +18 -0
  475. package/src/provider/sdk/copilot/responses/openai-error.ts +22 -0
  476. package/src/provider/sdk/copilot/responses/openai-responses-api-types.ts +214 -0
  477. package/src/provider/sdk/copilot/responses/openai-responses-language-model.ts +1770 -0
  478. package/src/provider/sdk/copilot/responses/openai-responses-prepare-tools.ts +173 -0
  479. package/src/provider/sdk/copilot/responses/openai-responses-settings.ts +1 -0
  480. package/src/provider/sdk/copilot/responses/tool/code-interpreter.ts +87 -0
  481. package/src/provider/sdk/copilot/responses/tool/file-search.ts +127 -0
  482. package/src/provider/sdk/copilot/responses/tool/image-generation.ts +114 -0
  483. package/src/provider/sdk/copilot/responses/tool/local-shell.ts +64 -0
  484. package/src/provider/sdk/copilot/responses/tool/web-search-preview.ts +103 -0
  485. package/src/provider/sdk/copilot/responses/tool/web-search.ts +102 -0
  486. package/src/provider/session-check.ts +163 -0
  487. package/src/provider/transform.ts +1376 -0
  488. package/src/pty/index.ts +364 -0
  489. package/src/pty/pty.bun.ts +26 -0
  490. package/src/pty/pty.node.ts +27 -0
  491. package/src/pty/pty.ts +25 -0
  492. package/src/pty/schema.ts +17 -0
  493. package/src/question/index.ts +252 -0
  494. package/src/question/schema.ts +17 -0
  495. package/src/server/adapter.bun.ts +40 -0
  496. package/src/server/adapter.node.ts +66 -0
  497. package/src/server/adapter.ts +21 -0
  498. package/src/server/auth.ts +16 -0
  499. package/src/server/error.ts +53 -0
  500. package/src/server/event.ts +7 -0
  501. package/src/server/fence.ts +81 -0
  502. package/src/server/mdns.ts +60 -0
  503. package/src/server/middleware.ts +94 -0
  504. package/src/server/projectors.ts +28 -0
  505. package/src/server/proxy.ts +171 -0
  506. package/src/server/pty-ticket.ts +42 -0
  507. package/src/server/rate-limit.ts +38 -0
  508. package/src/server/routes/control/index.ts +160 -0
  509. package/src/server/routes/control/workspace.ts +203 -0
  510. package/src/server/routes/global.ts +367 -0
  511. package/src/server/routes/instance/bash-interactive.ts +82 -0
  512. package/src/server/routes/instance/config.ts +89 -0
  513. package/src/server/routes/instance/event.ts +108 -0
  514. package/src/server/routes/instance/experimental.ts +408 -0
  515. package/src/server/routes/instance/file.ts +190 -0
  516. package/src/server/routes/instance/httpapi/config.ts +51 -0
  517. package/src/server/routes/instance/httpapi/permission.ts +72 -0
  518. package/src/server/routes/instance/httpapi/project.ts +62 -0
  519. package/src/server/routes/instance/httpapi/provider.ts +142 -0
  520. package/src/server/routes/instance/httpapi/question.ts +121 -0
  521. package/src/server/routes/instance/httpapi/server.ts +153 -0
  522. package/src/server/routes/instance/index.ts +301 -0
  523. package/src/server/routes/instance/mcp.ts +260 -0
  524. package/src/server/routes/instance/middleware.ts +44 -0
  525. package/src/server/routes/instance/permission.ts +73 -0
  526. package/src/server/routes/instance/project.ts +122 -0
  527. package/src/server/routes/instance/provider.ts +158 -0
  528. package/src/server/routes/instance/pty.ts +302 -0
  529. package/src/server/routes/instance/question.ts +162 -0
  530. package/src/server/routes/instance/session.ts +1328 -0
  531. package/src/server/routes/instance/sync.ts +143 -0
  532. package/src/server/routes/instance/trace.ts +59 -0
  533. package/src/server/routes/instance/tui.ts +384 -0
  534. package/src/server/routes/instance/workflows.ts +142 -0
  535. package/src/server/routes/ui.ts +37 -0
  536. package/src/server/server.ts +146 -0
  537. package/src/server/workspace.ts +122 -0
  538. package/src/session/auto-dream.ts +123 -0
  539. package/src/session/boundary.ts +77 -0
  540. package/src/session/budgeted-read.ts +118 -0
  541. package/src/session/checkpoint-align.ts +29 -0
  542. package/src/session/checkpoint-context.ts +36 -0
  543. package/src/session/checkpoint-paths.ts +86 -0
  544. package/src/session/checkpoint-progress-reconcile.ts +111 -0
  545. package/src/session/checkpoint-retry.ts +192 -0
  546. package/src/session/checkpoint-templates.ts +114 -0
  547. package/src/session/checkpoint-validator.ts +259 -0
  548. package/src/session/checkpoint.ts +1560 -0
  549. package/src/session/classify.ts +117 -0
  550. package/src/session/claude-import.ts +381 -0
  551. package/src/session/codex-import.ts +416 -0
  552. package/src/session/compaction.ts +545 -0
  553. package/src/session/external-import.sql.ts +18 -0
  554. package/src/session/external-import.ts +136 -0
  555. package/src/session/goal.ts +232 -0
  556. package/src/session/index.ts +1 -0
  557. package/src/session/instruction.ts +276 -0
  558. package/src/session/last-message-info.ts +32 -0
  559. package/src/session/llm-request-prefix.ts +82 -0
  560. package/src/session/llm.ts +737 -0
  561. package/src/session/max-mode.ts +410 -0
  562. package/src/session/message-v2.ts +1138 -0
  563. package/src/session/message.ts +191 -0
  564. package/src/session/opencode-import.ts +281 -0
  565. package/src/session/overflow.ts +53 -0
  566. package/src/session/prefix-capture-ref.ts +48 -0
  567. package/src/session/processor.ts +983 -0
  568. package/src/session/projectors.ts +137 -0
  569. package/src/session/prompt/anthropic.txt +154 -0
  570. package/src/session/prompt/beast.txt +155 -0
  571. package/src/session/prompt/build-switch.txt +5 -0
  572. package/src/session/prompt/codex.txt +79 -0
  573. package/src/session/prompt/compose.txt +119 -0
  574. package/src/session/prompt/copilot-gpt-5.txt +143 -0
  575. package/src/session/prompt/deepseek.txt +131 -0
  576. package/src/session/prompt/default.old.txt +151 -0
  577. package/src/session/prompt/default.txt +172 -0
  578. package/src/session/prompt/gemini.txt +155 -0
  579. package/src/session/prompt/glm.txt +51 -0
  580. package/src/session/prompt/gpt.txt +107 -0
  581. package/src/session/prompt/kimi.txt +95 -0
  582. package/src/session/prompt/max-steps.txt +16 -0
  583. package/src/session/prompt/minimax.txt +140 -0
  584. package/src/session/prompt/text-loop-recovery.ts +40 -0
  585. package/src/session/prompt/text-ngram-detection.ts +87 -0
  586. package/src/session/prompt/trinity.txt +97 -0
  587. package/src/session/prompt.ts +3878 -0
  588. package/src/session/prune.ts +481 -0
  589. package/src/session/retry.ts +178 -0
  590. package/src/session/revert.ts +161 -0
  591. package/src/session/run-state.ts +135 -0
  592. package/src/session/schema.ts +36 -0
  593. package/src/session/session.sql.ts +110 -0
  594. package/src/session/session.ts +908 -0
  595. package/src/session/status.ts +89 -0
  596. package/src/session/summary.ts +163 -0
  597. package/src/session/system.ts +96 -0
  598. package/src/session/todo.ts +77 -0
  599. package/src/session/trajectory.ts +98 -0
  600. package/src/share/index.ts +2 -0
  601. package/src/share/session.ts +57 -0
  602. package/src/share/share-next.ts +381 -0
  603. package/src/share/share.sql.ts +13 -0
  604. package/src/shell/shell.ts +124 -0
  605. package/src/skill/builtin/.bundle/self-extend/SKILL.md +131 -0
  606. package/src/skill/builtin/.bundle/self-extend/reference/hook-api.md +242 -0
  607. package/src/skill/builtin/.bundle/self-extend/reference/skill-api.md +114 -0
  608. package/src/skill/builtin/.bundle/self-extend/reference/tool-api.md +115 -0
  609. package/src/skill/builtin/.bundle/self-extend/reference/tui-api.md +258 -0
  610. package/src/skill/builtin/bundle.macro.ts +30 -0
  611. package/src/skill/builtin/extract.ts +41 -0
  612. package/src/skill/compose/.bundle/ask/SKILL.md +58 -0
  613. package/src/skill/compose/.bundle/brainstorm/SKILL.md +200 -0
  614. package/src/skill/compose/.bundle/brainstorm/scripts/frame-template.html +214 -0
  615. package/src/skill/compose/.bundle/brainstorm/scripts/helper.js +88 -0
  616. package/src/skill/compose/.bundle/brainstorm/scripts/server.cjs +354 -0
  617. package/src/skill/compose/.bundle/brainstorm/scripts/start-server.sh +148 -0
  618. package/src/skill/compose/.bundle/brainstorm/scripts/stop-server.sh +56 -0
  619. package/src/skill/compose/.bundle/brainstorm/spec-document-reviewer-prompt.md +50 -0
  620. package/src/skill/compose/.bundle/brainstorm/visual-companion.md +258 -0
  621. package/src/skill/compose/.bundle/debug/CREATION-LOG.md +119 -0
  622. package/src/skill/compose/.bundle/debug/SKILL.md +297 -0
  623. package/src/skill/compose/.bundle/debug/condition-based-waiting-example.ts +158 -0
  624. package/src/skill/compose/.bundle/debug/condition-based-waiting.md +106 -0
  625. package/src/skill/compose/.bundle/debug/defense-in-depth.md +122 -0
  626. package/src/skill/compose/.bundle/debug/find-polluter.sh +63 -0
  627. package/src/skill/compose/.bundle/debug/root-cause-tracing.md +144 -0
  628. package/src/skill/compose/.bundle/debug/test-academic.md +14 -0
  629. package/src/skill/compose/.bundle/debug/test-pressure-1.md +58 -0
  630. package/src/skill/compose/.bundle/debug/test-pressure-2.md +68 -0
  631. package/src/skill/compose/.bundle/debug/test-pressure-3.md +69 -0
  632. package/src/skill/compose/.bundle/execute/SKILL.md +71 -0
  633. package/src/skill/compose/.bundle/feedback/SKILL.md +214 -0
  634. package/src/skill/compose/.bundle/merge/SKILL.md +252 -0
  635. package/src/skill/compose/.bundle/new-skill/SKILL.md +211 -0
  636. package/src/skill/compose/.bundle/parallel/SKILL.md +168 -0
  637. package/src/skill/compose/.bundle/plan/SKILL.md +183 -0
  638. package/src/skill/compose/.bundle/plan/plan-document-reviewer-prompt.md +50 -0
  639. package/src/skill/compose/.bundle/report/SKILL.md +180 -0
  640. package/src/skill/compose/.bundle/review/SKILL.md +104 -0
  641. package/src/skill/compose/.bundle/review/code-reviewer.md +178 -0
  642. package/src/skill/compose/.bundle/subagent/SKILL.md +325 -0
  643. package/src/skill/compose/.bundle/subagent/code-quality-reviewer-prompt.md +26 -0
  644. package/src/skill/compose/.bundle/subagent/implementer-prompt.md +128 -0
  645. package/src/skill/compose/.bundle/subagent/spec-reviewer-prompt.md +118 -0
  646. package/src/skill/compose/.bundle/tdd/SKILL.md +360 -0
  647. package/src/skill/compose/.bundle/tdd/testing-anti-patterns.md +299 -0
  648. package/src/skill/compose/.bundle/verify/SKILL.md +140 -0
  649. package/src/skill/compose/.bundle/worktree/SKILL.md +234 -0
  650. package/src/skill/compose/LICENSE-karpathy +28 -0
  651. package/{LICENSE → src/skill/compose/LICENSE-superpowers} +6 -3
  652. package/src/skill/compose/bundle.macro.ts +30 -0
  653. package/src/skill/compose/extract.ts +85 -0
  654. package/src/skill/discovery.ts +114 -0
  655. package/src/skill/index.ts +328 -0
  656. package/src/snapshot/index.ts +777 -0
  657. package/src/sql.d.ts +4 -0
  658. package/src/storage/db.bun.ts +8 -0
  659. package/src/storage/db.node.ts +8 -0
  660. package/src/storage/db.ts +172 -0
  661. package/src/storage/index.ts +26 -0
  662. package/src/storage/json-migration.ts +426 -0
  663. package/src/storage/read-sqlite.bun.ts +11 -0
  664. package/src/storage/read-sqlite.node.ts +13 -0
  665. package/src/storage/read-sqlite.ts +10 -0
  666. package/src/storage/schema.sql.ts +10 -0
  667. package/src/storage/schema.ts +7 -0
  668. package/src/storage/storage.ts +331 -0
  669. package/src/sync/README.md +179 -0
  670. package/src/sync/event.sql.ts +16 -0
  671. package/src/sync/index.ts +278 -0
  672. package/src/sync/schema.ts +14 -0
  673. package/src/task/events.ts +28 -0
  674. package/src/task/gate-state.ts +54 -0
  675. package/src/task/gate.ts +116 -0
  676. package/src/task/index.ts +1 -0
  677. package/src/task/registry.ts +394 -0
  678. package/src/task/schema.ts +43 -0
  679. package/src/task/task.sql.ts +50 -0
  680. package/src/team/events.ts +22 -0
  681. package/src/team/index.ts +113 -0
  682. package/src/team/schema.ts +31 -0
  683. package/src/temporary.ts +33 -0
  684. package/src/tool/actor.shell.txt +72 -0
  685. package/src/tool/actor.ts +804 -0
  686. package/src/tool/actor.txt +103 -0
  687. package/src/tool/apply_patch.ts +308 -0
  688. package/src/tool/apply_patch.txt +33 -0
  689. package/src/tool/bash-interactive.ts +183 -0
  690. package/src/tool/bash.ts +704 -0
  691. package/src/tool/bash.txt +123 -0
  692. package/src/tool/change-directory.ts +91 -0
  693. package/src/tool/codesearch.ts +63 -0
  694. package/src/tool/codesearch.txt +12 -0
  695. package/src/tool/edit.ts +693 -0
  696. package/src/tool/edit.txt +10 -0
  697. package/src/tool/external-directory.ts +132 -0
  698. package/src/tool/glob.ts +100 -0
  699. package/src/tool/glob.txt +6 -0
  700. package/src/tool/grep.ts +145 -0
  701. package/src/tool/grep.txt +8 -0
  702. package/src/tool/history.ts +146 -0
  703. package/src/tool/history.txt +17 -0
  704. package/src/tool/index.ts +4 -0
  705. package/src/tool/invalid.ts +20 -0
  706. package/src/tool/invocation-style.ts +17 -0
  707. package/src/tool/lsp.ts +91 -0
  708. package/src/tool/lsp.txt +19 -0
  709. package/src/tool/mcp-exa.ts +78 -0
  710. package/src/tool/memory-path-guard.ts +162 -0
  711. package/src/tool/memory.ts +81 -0
  712. package/src/tool/memory.txt +69 -0
  713. package/src/tool/multiedit.ts +54 -0
  714. package/src/tool/multiedit.txt +41 -0
  715. package/src/tool/notebook-edit.ts +225 -0
  716. package/src/tool/notebook-edit.txt +10 -0
  717. package/src/tool/plan-enter.txt +16 -0
  718. package/src/tool/plan-exit.txt +14 -0
  719. package/src/tool/plan.ts +179 -0
  720. package/src/tool/question.ts +67 -0
  721. package/src/tool/question.txt +10 -0
  722. package/src/tool/read-state.ts +44 -0
  723. package/src/tool/read.ts +327 -0
  724. package/src/tool/read.txt +14 -0
  725. package/src/tool/recoverable.ts +35 -0
  726. package/src/tool/registry.ts +429 -0
  727. package/src/tool/schema.ts +17 -0
  728. package/src/tool/session-cwd.ts +35 -0
  729. package/src/tool/shell-tokenize.ts +374 -0
  730. package/src/tool/shell-wrap.ts +235 -0
  731. package/src/tool/skill.ts +76 -0
  732. package/src/tool/skill.txt +5 -0
  733. package/src/tool/task.shell.txt +57 -0
  734. package/src/tool/task.ts +456 -0
  735. package/src/tool/task.txt +56 -0
  736. package/src/tool/tool.ts +166 -0
  737. package/src/tool/truncate.ts +201 -0
  738. package/src/tool/truncation-dir.ts +4 -0
  739. package/src/tool/webfetch.ts +208 -0
  740. package/src/tool/webfetch.txt +13 -0
  741. package/src/tool/websearch/index.ts +104 -0
  742. package/src/tool/websearch/sleepy.ts +118 -0
  743. package/src/tool/websearch/websearch.txt +14 -0
  744. package/src/tool/workflow.ts +357 -0
  745. package/src/tool/workflow.txt +25 -0
  746. package/src/tool/write.ts +88 -0
  747. package/src/tool/write.txt +10 -0
  748. package/src/util/abort.ts +35 -0
  749. package/src/util/archive.ts +15 -0
  750. package/src/util/color.ts +17 -0
  751. package/src/util/data-url.ts +9 -0
  752. package/src/util/defer.ts +10 -0
  753. package/src/util/effect-http-client.ts +11 -0
  754. package/src/util/effect-zod.ts +367 -0
  755. package/src/util/env-info.ts +62 -0
  756. package/src/util/error.ts +78 -0
  757. package/src/util/filesystem.ts +243 -0
  758. package/src/util/fn.ts +21 -0
  759. package/src/util/format.ts +20 -0
  760. package/src/util/iife.ts +3 -0
  761. package/src/util/index.ts +14 -0
  762. package/src/util/keybind.ts +101 -0
  763. package/src/util/lazy.ts +18 -0
  764. package/src/util/local-context.ts +23 -0
  765. package/src/util/locale.ts +79 -0
  766. package/src/util/lock.ts +96 -0
  767. package/src/util/log.ts +234 -0
  768. package/src/util/media.ts +26 -0
  769. package/src/util/network.ts +9 -0
  770. package/src/util/process.ts +174 -0
  771. package/src/util/provider-priority.ts +48 -0
  772. package/src/util/queue.ts +60 -0
  773. package/src/util/record.ts +3 -0
  774. package/src/util/rpc.ts +64 -0
  775. package/src/util/schema.ts +53 -0
  776. package/src/util/scrap.ts +10 -0
  777. package/src/util/signal.ts +12 -0
  778. package/src/util/sleepy-process.ts +24 -0
  779. package/src/util/ssrf.ts +116 -0
  780. package/src/util/timeout.ts +14 -0
  781. package/src/util/token.ts +5 -0
  782. package/src/util/tool-compat.ts +144 -0
  783. package/src/util/update-schema.ts +13 -0
  784. package/src/util/which.ts +14 -0
  785. package/src/util/wildcard.ts +57 -0
  786. package/src/workflow/builtin/compose.js +749 -0
  787. package/src/workflow/builtin/deep-research.js +398 -0
  788. package/src/workflow/builtin.ts +59 -0
  789. package/src/workflow/events.ts +72 -0
  790. package/src/workflow/meta.ts +335 -0
  791. package/src/workflow/persistence.ts +312 -0
  792. package/src/workflow/resolve.ts +45 -0
  793. package/src/workflow/runtime-ref.ts +18 -0
  794. package/src/workflow/runtime.ts +1447 -0
  795. package/src/workflow/sandbox.ts +286 -0
  796. package/src/workflow/workflow.sql.ts +31 -0
  797. package/src/workflow/workspace.ts +69 -0
  798. package/src/worktree/index.ts +629 -0
  799. package/postinstall.mjs +0 -102
@@ -0,0 +1,142 @@
1
+ import { Hono } from "hono"
2
+ import { describeRoute, validator, resolver } from "hono-openapi"
3
+ import z from "zod"
4
+ import { lazy } from "@/util/lazy"
5
+ import { Identifier } from "@/id/id"
6
+ import { workflowRef } from "@/workflow/runtime-ref"
7
+ import { jsonRequest } from "./trace"
8
+ import type { SessionID } from "@/session/schema"
9
+
10
+ // Read-only routes (transcript/structure) accept BOTH runID shapes: a top-level
11
+ // run is `wf_` + 26 base62 (Identifier.descending), a nested child workflow is
12
+ // `wf_` + 64 hex (sha256 of parent runID + key, see runtime.ts). The resume route
13
+ // keeps the strict 26-char form because only top-level runs are resumable AND it
14
+ // builds a filesystem path from the id; these read routes only do an in-memory
15
+ // runtime map lookup, so the wider (still traversal-proof — no `.`/`/`) charset is
16
+ // safe here.
17
+ const READ_RUN_ID = /^wf_(?:[0-9A-Za-z]{26}|[0-9a-f]{64})$/
18
+
19
+ export const WorkflowRoutes = lazy(() =>
20
+ new Hono()
21
+ .get(
22
+ "/",
23
+ describeRoute({
24
+ summary: "List workflow runs",
25
+ description:
26
+ "List dynamic-workflow runs for a session. sessionID is REQUIRED — there is no per-user identity, so the session is the access boundary and an omitted/invalid sessionID is a 400 (never an unfiltered all-session listing). Empty when the workflow runtime is not running.",
27
+ operationId: "workflow.list",
28
+ responses: {
29
+ 200: {
30
+ description: "Workflow runs",
31
+ content: { "application/json": { schema: resolver(z.array(z.any())) } },
32
+ },
33
+ },
34
+ }),
35
+ validator("query", z.object({ sessionID: Identifier.schema("session") })),
36
+ async (c) =>
37
+ jsonRequest("WorkflowRoutes.list", c, function* () {
38
+ const runtime = workflowRef.current
39
+ if (!runtime) return []
40
+ const query = c.req.valid("query")
41
+ return yield* runtime.list({ sessionID: query.sessionID as SessionID })
42
+ }),
43
+ )
44
+ .post(
45
+ "/:runID/resume",
46
+ describeRoute({
47
+ summary: "Resume a workflow run",
48
+ description:
49
+ "Re-launch a persisted workflow run by id. Returns { runID, resumed }; resumed is false if the run is unknown, still running, or has no persisted script.",
50
+ operationId: "workflow.resume",
51
+ responses: {
52
+ 200: {
53
+ description: "Resume result",
54
+ content: {
55
+ "application/json": { schema: resolver(z.object({ runID: z.string(), resumed: z.boolean() })) },
56
+ },
57
+ },
58
+ },
59
+ }),
60
+ validator(
61
+ "param",
62
+ z.object({
63
+ // Strict shape, NOT just startsWith("wf"): runID flows into
64
+ // scriptPath = join(scriptDir, runID + ".js"), so a value like
65
+ // `wf_../../../etc/passwd` (which startsWith "wf") would escape scriptDir.
66
+ // Identifier mints `wf_` + 26 base62 chars; this charset has no `.` or `/`,
67
+ // so it is traversal-proof by construction. The `{26}` tracks
68
+ // Identifier.LENGTH — if that constant ever changes, widen this too (the
69
+ // in-depth persistence guard uses `+`, so it stays correct regardless).
70
+ runID: z.string().regex(/^wf_[0-9A-Za-z]{26}$/, "invalid workflow runID"),
71
+ }),
72
+ ),
73
+ async (c) =>
74
+ jsonRequest("WorkflowRoutes.resume", c, function* () {
75
+ const runtime = workflowRef.current
76
+ const params = c.req.valid("param")
77
+ if (!runtime) return { runID: params.runID, resumed: false }
78
+ return yield* runtime.resume({ runID: params.runID })
79
+ }),
80
+ )
81
+ .get(
82
+ "/:runID/transcript",
83
+ describeRoute({
84
+ summary: "Get a workflow run's full transcript",
85
+ description:
86
+ "Return the complete ordered phase/log transcript for one run, straight from the runtime's in-memory buffer (uncapped, unlike the tool-part metadata copy). Empty when the runtime is down or the run is unknown.",
87
+ operationId: "workflow.transcript",
88
+ responses: {
89
+ 200: {
90
+ description: "Full transcript",
91
+ content: {
92
+ "application/json": {
93
+ schema: resolver(
94
+ z.object({
95
+ runID: z.string(),
96
+ transcript: z.array(z.object({ kind: z.enum(["phase", "log"]), text: z.string() })),
97
+ }),
98
+ ),
99
+ },
100
+ },
101
+ },
102
+ },
103
+ }),
104
+ validator("param", z.object({ runID: z.string().regex(READ_RUN_ID, "invalid workflow runID") })),
105
+ async (c) =>
106
+ jsonRequest("WorkflowRoutes.transcript", c, function* () {
107
+ const runtime = workflowRef.current
108
+ const params = c.req.valid("param")
109
+ if (!runtime) return { runID: params.runID, transcript: [] }
110
+ const transcript = yield* runtime.transcript({ runID: params.runID })
111
+ return { runID: params.runID, transcript: transcript.slice() }
112
+ }),
113
+ )
114
+ .get(
115
+ "/:runID/structure",
116
+ describeRoute({
117
+ summary: "Get a workflow run's structure tree",
118
+ description:
119
+ "Return the observability-only structure tree (phase/agent/workflow nodes with live status) for one run. Empty when the runtime is down or the run is unknown.",
120
+ operationId: "workflow.structure",
121
+ responses: {
122
+ 200: {
123
+ description: "Structure tree",
124
+ content: {
125
+ "application/json": {
126
+ schema: resolver(z.object({ runID: z.string(), nodes: z.array(z.any()) })),
127
+ },
128
+ },
129
+ },
130
+ },
131
+ }),
132
+ validator("param", z.object({ runID: z.string().regex(READ_RUN_ID, "invalid workflow runID") })),
133
+ async (c) =>
134
+ jsonRequest("WorkflowRoutes.structure", c, function* () {
135
+ const runtime = workflowRef.current
136
+ const params = c.req.valid("param")
137
+ if (!runtime) return { runID: params.runID, nodes: [] }
138
+ const s = yield* runtime.structure({ runID: params.runID })
139
+ return { runID: params.runID, nodes: s.nodes }
140
+ }),
141
+ ),
142
+ )
@@ -0,0 +1,37 @@
1
+ import { Flag } from "@/flag/flag"
2
+ import { Hono } from "hono"
3
+ import { getMimeType } from "hono/utils/mime"
4
+ import fs from "node:fs/promises"
5
+
6
+ const embeddedUIPromise = Flag.SLEEPYCODE_DISABLE_EMBEDDED_WEB_UI
7
+ ? Promise.resolve(null)
8
+ : // @ts-expect-error - generated file at build time
9
+ import("opencode-web-ui.gen.ts").then((module) => module.default as Record<string, string>).catch(() => null)
10
+
11
+ const DEFAULT_CSP =
12
+ "default-src 'self'; script-src 'self' 'wasm-unsafe-eval'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; font-src 'self' data:; media-src 'self' data:; connect-src 'self' data:"
13
+
14
+ export const UIRoutes = (): Hono =>
15
+ new Hono().all("/*", async (c) => {
16
+ const embeddedWebUI = await embeddedUIPromise
17
+ const path = c.req.path
18
+
19
+ if (embeddedWebUI) {
20
+ const match = embeddedWebUI[path.replace(/^\//, "")] ?? embeddedWebUI["index.html"] ?? null
21
+ if (!match) return c.json({ error: "Not Found" }, 404)
22
+
23
+ if (await fs.exists(match)) {
24
+ const mime = getMimeType(match) ?? "text/plain"
25
+ c.header("Content-Type", mime)
26
+ if (mime.startsWith("text/html")) {
27
+ c.header("Content-Security-Policy", DEFAULT_CSP)
28
+ }
29
+ return c.body(new Uint8Array(await fs.readFile(match)))
30
+ } else {
31
+ return c.json({ error: "Not Found" }, 404)
32
+ }
33
+ } else {
34
+ // Web UI temporarily disabled. Embedded UI was not included in this build.
35
+ return c.json({ error: "Web UI is temporarily unavailable." }, 503)
36
+ }
37
+ })
@@ -0,0 +1,146 @@
1
+ import { generateSpecs } from "hono-openapi"
2
+ import { Hono } from "hono"
3
+ import { adapter } from "#hono"
4
+ import { lazy } from "@/util/lazy"
5
+ import { Log } from "@/util"
6
+ import { Flag } from "@/flag/flag"
7
+ import { WorkspaceID } from "@/control-plane/schema"
8
+ import { MDNS } from "./mdns"
9
+ import { AuthMiddleware, CompressionMiddleware, CorsMiddleware, ErrorMiddleware, LoggerMiddleware } from "./middleware"
10
+ import { FenceMiddleware } from "./fence"
11
+ import { initProjectors } from "./projectors"
12
+ import { InstanceRoutes } from "./routes/instance"
13
+ import { ControlPlaneRoutes } from "./routes/control"
14
+ import { UIRoutes } from "./routes/ui"
15
+ import { GlobalRoutes } from "./routes/global"
16
+ import { WorkspaceRouterMiddleware } from "./workspace"
17
+ import { InstanceMiddleware } from "./routes/instance/middleware"
18
+ import { WorkspaceRoutes } from "./routes/control/workspace"
19
+
20
+ // @ts-ignore This global is needed to prevent ai-sdk from logging warnings to stdout https://github.com/vercel/ai/blob/2dc67e0ef538307f21368db32d5a12345d98831b/packages/ai/src/logger/log-warnings.ts#L85
21
+ globalThis.AI_SDK_LOG_WARNINGS = false
22
+
23
+ initProjectors()
24
+
25
+ const log = Log.create({ service: "server" })
26
+
27
+ export type Listener = {
28
+ hostname: string
29
+ port: number
30
+ url: URL
31
+ stop: (close?: boolean) => Promise<void>
32
+ }
33
+
34
+ export const Default = lazy(() => create({}))
35
+
36
+ function create(opts: { cors?: string[] }) {
37
+ const app = new Hono()
38
+ .onError(ErrorMiddleware)
39
+ .use(CorsMiddleware(opts))
40
+ .use(LoggerMiddleware)
41
+ .use(AuthMiddleware)
42
+ .use(CompressionMiddleware)
43
+ .route("/global", GlobalRoutes())
44
+
45
+ const runtime = adapter.create(app)
46
+
47
+ if (Flag.SLEEPYCODE_WORKSPACE_ID) {
48
+ return {
49
+ app: app
50
+ .use(InstanceMiddleware(Flag.SLEEPYCODE_WORKSPACE_ID ? WorkspaceID.make(Flag.SLEEPYCODE_WORKSPACE_ID) : undefined))
51
+ .use(FenceMiddleware)
52
+ .route("/", InstanceRoutes(runtime.upgradeWebSocket)),
53
+ runtime,
54
+ }
55
+ }
56
+
57
+ return {
58
+ app: app
59
+ .route("/", ControlPlaneRoutes())
60
+ .route(
61
+ "/",
62
+ new Hono()
63
+ .use(InstanceMiddleware())
64
+ .route("/experimental/workspace", WorkspaceRoutes())
65
+ .use(WorkspaceRouterMiddleware(runtime.upgradeWebSocket))
66
+ .route("/", InstanceRoutes(runtime.upgradeWebSocket)),
67
+ )
68
+ .route("/", UIRoutes()),
69
+ runtime,
70
+ }
71
+ }
72
+
73
+ export async function openapi() {
74
+ // Build a fresh app with all routes registered directly so
75
+ // hono-openapi can see describeRoute metadata (`.route()` wraps
76
+ // handlers when the sub-app has a custom errorHandler, which
77
+ // strips the metadata symbol).
78
+ const { app } = create({})
79
+ const result = await generateSpecs(app, {
80
+ documentation: {
81
+ info: {
82
+ title: "opencode",
83
+ version: "1.0.0",
84
+ description: "opencode api",
85
+ },
86
+ openapi: "3.1.1",
87
+ },
88
+ })
89
+ return result
90
+ }
91
+
92
+ export let url: URL
93
+
94
+ export async function listen(opts: {
95
+ port: number
96
+ hostname: string
97
+ mdns?: boolean
98
+ mdnsDomain?: string
99
+ cors?: string[]
100
+ noAuth?: boolean
101
+ }): Promise<Listener> {
102
+ const isLoopback =
103
+ opts.hostname === "127.0.0.1" || opts.hostname === "localhost" || opts.hostname === "::1"
104
+ if (!isLoopback && !Flag.SLEEPYCODE_SERVER_PASSWORD && !opts.noAuth) {
105
+ throw new Error(
106
+ "Refusing to bind to non-loopback address without SLEEPYCODE_SERVER_PASSWORD. " +
107
+ "Set the environment variable or pass noAuth to explicitly allow unauthenticated access.",
108
+ )
109
+ }
110
+
111
+ const built = create(opts)
112
+ const server = await built.runtime.listen(opts)
113
+
114
+ const next = new URL("http://localhost")
115
+ next.hostname = opts.hostname
116
+ next.port = String(server.port)
117
+ url = next
118
+
119
+ const mdns =
120
+ opts.mdns &&
121
+ server.port &&
122
+ opts.hostname !== "127.0.0.1" &&
123
+ opts.hostname !== "localhost" &&
124
+ opts.hostname !== "::1"
125
+ if (mdns) {
126
+ MDNS.publish(server.port, opts.mdnsDomain)
127
+ } else if (opts.mdns) {
128
+ log.warn("mDNS enabled but hostname is loopback; skipping mDNS publish")
129
+ }
130
+
131
+ let closing: Promise<void> | undefined
132
+ return {
133
+ hostname: opts.hostname,
134
+ port: server.port,
135
+ url: next,
136
+ stop(close?: boolean) {
137
+ closing ??= (async () => {
138
+ if (mdns) MDNS.unpublish()
139
+ await server.stop(close)
140
+ })()
141
+ return closing
142
+ },
143
+ }
144
+ }
145
+
146
+ export * as Server from "./server"
@@ -0,0 +1,122 @@
1
+ import type { MiddlewareHandler } from "hono"
2
+ import type { UpgradeWebSocket } from "hono/ws"
3
+ import { getAdaptor } from "@/control-plane/adaptors"
4
+ import { WorkspaceID } from "@/control-plane/schema"
5
+ import { WorkspaceContext } from "@/control-plane/workspace-context"
6
+ import { Workspace } from "@/control-plane/workspace"
7
+ import { Flag } from "@/flag/flag"
8
+ import { InstanceBootstrap } from "@/project/bootstrap"
9
+ import { Instance } from "@/project/instance"
10
+ import { Session } from "@/session"
11
+ import { SessionID } from "@/session/schema"
12
+ import { AppRuntime } from "@/effect/app-runtime"
13
+ import { Effect } from "effect"
14
+ import { Log } from "@/util"
15
+ import { ServerProxy } from "./proxy"
16
+
17
+ type Rule = { method?: string; path: string; exact?: boolean; action: "local" | "forward" }
18
+
19
+ const RULES: Array<Rule> = [
20
+ { path: "/session/status", action: "forward" },
21
+ { method: "GET", path: "/session", action: "local" },
22
+ ]
23
+
24
+ function local(method: string, path: string) {
25
+ for (const rule of RULES) {
26
+ if (rule.method && rule.method !== method) continue
27
+ const match = rule.exact ? path === rule.path : path === rule.path || path.startsWith(rule.path + "/")
28
+ if (match) return rule.action === "local"
29
+ }
30
+ return false
31
+ }
32
+
33
+ function getSessionID(url: URL) {
34
+ if (url.pathname === "/session/status") return null
35
+
36
+ const id = url.pathname.match(/^\/session\/([^/]+)(?:\/|$)/)?.[1]
37
+ if (!id) return null
38
+
39
+ return SessionID.make(id)
40
+ }
41
+
42
+ async function getSessionWorkspace(url: URL) {
43
+ const id = getSessionID(url)
44
+ if (!id) return null
45
+
46
+ const session = await AppRuntime.runPromise(
47
+ Session.Service.use((svc) => svc.get(id)).pipe(Effect.withSpan("WorkspaceRouter.lookup")),
48
+ ).catch(() => undefined)
49
+ return session?.workspaceID
50
+ }
51
+
52
+ export function WorkspaceRouterMiddleware(upgrade: UpgradeWebSocket): MiddlewareHandler {
53
+ const log = Log.create({ service: "workspace-router" })
54
+
55
+ return async (c, next) => {
56
+ const url = new URL(c.req.url)
57
+
58
+ const sessionWorkspaceID = await getSessionWorkspace(url)
59
+ const workspaceID = sessionWorkspaceID || url.searchParams.get("workspace")
60
+
61
+ if (!workspaceID || url.pathname.startsWith("/console") || Flag.SLEEPYCODE_WORKSPACE_ID) {
62
+ return next()
63
+ }
64
+
65
+ const workspace = await Workspace.get(WorkspaceID.make(workspaceID))
66
+
67
+ if (!workspace) {
68
+ return new Response(`Workspace not found: ${workspaceID}`, {
69
+ status: 500,
70
+ headers: {
71
+ "content-type": "text/plain; charset=utf-8",
72
+ },
73
+ })
74
+ }
75
+
76
+ if (local(c.req.method, url.pathname)) {
77
+ // No instance provided because we are serving cached data; there
78
+ // is no instance to work with
79
+ return next()
80
+ }
81
+
82
+ const adaptor = await getAdaptor(workspace.projectID, workspace.type)
83
+ const target = await adaptor.target(workspace)
84
+
85
+ if (target.type === "local") {
86
+ return WorkspaceContext.provide({
87
+ workspaceID: WorkspaceID.make(workspaceID),
88
+ fn: () =>
89
+ Instance.provide({
90
+ directory: target.directory,
91
+ init: () => AppRuntime.runPromise(InstanceBootstrap),
92
+ async fn() {
93
+ return next()
94
+ },
95
+ }),
96
+ })
97
+ }
98
+
99
+ const proxyURL = new URL(target.url)
100
+ proxyURL.pathname = `${proxyURL.pathname.replace(/\/$/, "")}${url.pathname}`
101
+ proxyURL.search = url.search
102
+ proxyURL.hash = url.hash
103
+ proxyURL.searchParams.delete("workspace")
104
+
105
+ log.info("workspace proxy forwarding", {
106
+ workspaceID,
107
+ request: url.toString(),
108
+ target: String(target.url),
109
+ proxy: proxyURL.toString(),
110
+ })
111
+
112
+ if (c.req.header("upgrade")?.toLowerCase() === "websocket") {
113
+ return ServerProxy.websocket(upgrade, proxyURL, target.headers, c.req.raw, c.env)
114
+ }
115
+
116
+ const headers = new Headers(c.req.raw.headers)
117
+ headers.delete("x-sleepycode-workspace")
118
+
119
+ const req = new Request(c.req.raw, { headers })
120
+ return ServerProxy.http(proxyURL, target.headers, req, workspace.id)
121
+ }
122
+ }
@@ -0,0 +1,123 @@
1
+ import { Effect } from "effect"
2
+ import { Database, eq, desc, asc, isNull } from "@/storage"
3
+ import { SessionTable } from "./session.sql"
4
+ import { Log } from "@/util"
5
+ import type { Config } from "@/config"
6
+
7
+ const log = Log.create({ service: "auto-dream" })
8
+
9
+ const DAY_MS = 24 * 60 * 60 * 1000
10
+ const DEFAULT_DREAM_INTERVAL_DAYS = 7
11
+ const DEFAULT_DISTILL_INTERVAL_DAYS = 30
12
+ const MIN_SPAWN_GAP_MS = 10_000
13
+
14
+ export const AUTO_DREAM_TITLE = "Auto Dream"
15
+ export const AUTO_DISTILL_TITLE = "Auto Distill"
16
+
17
+ let lastDreamSpawnTime = 0
18
+ let lastDistillSpawnTime = 0
19
+
20
+ export const DREAM_TASK = [
21
+ "Run one automatic dream memory consolidation pass for the current project.",
22
+ "",
23
+ "Use the memory files as the working index and the raw sleepycode trajectory database as the source of truth.",
24
+ "Use bash for read-only SQLite and filesystem inspection. Do not modify the database.",
25
+ "Consolidate only durable, verified information into project memory.",
26
+ ].join("\n")
27
+
28
+ export const DISTILL_TASK = [
29
+ "Run one automatic distill pass for the current project.",
30
+ "",
31
+ "Review the past month of sessions and identify repeated manual workflows worth packaging.",
32
+ "Use the raw sleepycode trajectory database as the source of truth and memory files to spot cross-session patterns.",
33
+ "Inventory existing skills, agents, and commands first so you reuse or extend instead of duplicating.",
34
+ "Use bash for read-only SQLite and filesystem inspection. Do not modify the database.",
35
+ "Produce a compact shortlist, then create only the high-confidence missing assets.",
36
+ ].join("\n")
37
+
38
+ function shouldAutoRun(input: {
39
+ enabled: boolean
40
+ intervalDays: number
41
+ title: string
42
+ label: string
43
+ }) {
44
+ return Effect.gen(function* () {
45
+ if (!input.enabled) return false
46
+
47
+ const intervalMs = input.intervalDays * DAY_MS
48
+
49
+ const lastRun = yield* Effect.sync(() =>
50
+ Database.use((db) =>
51
+ db
52
+ .select({ time_created: SessionTable.time_created })
53
+ .from(SessionTable)
54
+ .where(eq(SessionTable.title, input.title))
55
+ .orderBy(desc(SessionTable.time_created))
56
+ .limit(1)
57
+ .get(),
58
+ ),
59
+ )
60
+
61
+ const now = Date.now()
62
+ const elapsed = lastRun ? now - lastRun.time_created : Infinity
63
+
64
+ // First time ever: check if the project is old enough to have anything worth consolidating.
65
+ // Look at the earliest top-level session (no parent) as the project start time.
66
+ if (!lastRun) {
67
+ const earliest = yield* Effect.sync(() =>
68
+ Database.use((db) =>
69
+ db
70
+ .select({ time_created: SessionTable.time_created })
71
+ .from(SessionTable)
72
+ .where(isNull(SessionTable.parent_id))
73
+ .orderBy(asc(SessionTable.time_created))
74
+ .limit(1)
75
+ .get(),
76
+ ),
77
+ )
78
+ if (!earliest || now - earliest.time_created < intervalMs) {
79
+ log.info(`auto-${input.label} skipped — project too young`, {
80
+ projectAge: earliest ? Math.round((now - earliest.time_created) / DAY_MS) + "d" : "empty",
81
+ interval: input.intervalDays + "d",
82
+ })
83
+ return false
84
+ }
85
+ }
86
+
87
+ if (elapsed < intervalMs) {
88
+ log.info(`auto-${input.label} skipped — last run too recent`, {
89
+ lastRunAgo: Math.round(elapsed / DAY_MS) + "d",
90
+ interval: input.intervalDays + "d",
91
+ })
92
+ return false
93
+ }
94
+
95
+ log.info(`auto-${input.label} triggering`, {
96
+ lastRun: lastRun ? new Date(lastRun.time_created).toISOString() : "never",
97
+ interval: input.intervalDays + "d",
98
+ })
99
+ return true
100
+ })
101
+ }
102
+
103
+ export function shouldAutoDream(cfg: Config.Info) {
104
+ const enabled = cfg.dream?.auto !== false
105
+ if (!enabled) return Effect.succeed(false)
106
+ const now = Date.now()
107
+ if (now - lastDreamSpawnTime < MIN_SPAWN_GAP_MS) return Effect.succeed(false)
108
+ lastDreamSpawnTime = now
109
+ const intervalDays = cfg.dream?.interval_days ?? DEFAULT_DREAM_INTERVAL_DAYS
110
+ return shouldAutoRun({ enabled, intervalDays, title: AUTO_DREAM_TITLE, label: "dream" })
111
+ }
112
+
113
+ export function shouldAutoDistill(cfg: Config.Info) {
114
+ const enabled = cfg.distill?.auto !== false
115
+ if (!enabled) return Effect.succeed(false)
116
+ const now = Date.now()
117
+ if (now - lastDistillSpawnTime < MIN_SPAWN_GAP_MS) return Effect.succeed(false)
118
+ lastDistillSpawnTime = now
119
+ const intervalDays = cfg.distill?.interval_days ?? DEFAULT_DISTILL_INTERVAL_DAYS
120
+ return shouldAutoRun({ enabled, intervalDays, title: AUTO_DISTILL_TITLE, label: "distill" })
121
+ }
122
+
123
+ export * as AutoDream from "./auto-dream"
@@ -0,0 +1,77 @@
1
+ type AnyMessage = {
2
+ role: string
3
+ content?: unknown[]
4
+ id?: string
5
+ }
6
+
7
+ function getToolResultIds(msg: AnyMessage): string[] {
8
+ if (!Array.isArray(msg.content)) return []
9
+ const ids: string[] = []
10
+ for (const block of msg.content as Array<Record<string, unknown>>) {
11
+ if (block.type === "tool_result" && typeof block.tool_use_id === "string") {
12
+ ids.push(block.tool_use_id)
13
+ }
14
+ }
15
+ return ids
16
+ }
17
+
18
+ function getToolUseIds(msg: AnyMessage): string[] {
19
+ if (!Array.isArray(msg.content)) return []
20
+ const ids: string[] = []
21
+ for (const block of msg.content as Array<Record<string, unknown>>) {
22
+ if (block.type === "tool_use" && typeof block.id === "string") {
23
+ ids.push(block.id)
24
+ }
25
+ }
26
+ return ids
27
+ }
28
+
29
+ /**
30
+ * Walk the boundary backward to ensure tool_use/tool_result pairs are not
31
+ * split across the summary/tail divide, and that thinking blocks sharing
32
+ * a message.id with kept assistants are included.
33
+ */
34
+ export function adjustBoundaryForApiInvariants(
35
+ messages: AnyMessage[],
36
+ candidateBoundary: number,
37
+ ): number {
38
+ if (candidateBoundary <= 0 || candidateBoundary >= messages.length) {
39
+ return candidateBoundary
40
+ }
41
+
42
+ let idx = candidateBoundary
43
+
44
+ // Step 1: tool_use/tool_result pairing.
45
+ const tailToolResults: string[] = []
46
+ const tailToolUses = new Set<string>()
47
+ for (let i = idx; i < messages.length; i++) {
48
+ tailToolResults.push(...getToolResultIds(messages[i]))
49
+ for (const useId of getToolUseIds(messages[i])) tailToolUses.add(useId)
50
+ }
51
+ let orphans = tailToolResults.filter((id) => !tailToolUses.has(id))
52
+
53
+ for (let i = idx - 1; i >= 0 && orphans.length > 0; i--) {
54
+ const m = messages[i]
55
+ if (m.role !== "assistant") continue
56
+ const useIds = getToolUseIds(m)
57
+ const matched = useIds.filter((id) => orphans.includes(id))
58
+ if (matched.length > 0) {
59
+ idx = i
60
+ orphans = orphans.filter((id) => !matched.includes(id))
61
+ }
62
+ }
63
+
64
+ // Step 2: same message.id walk-back (thinking blocks share id with sibling).
65
+ const boundaryMsgId = messages[idx]?.id
66
+ if (boundaryMsgId) {
67
+ for (let i = idx - 1; i >= 0; i--) {
68
+ if (messages[i].id === boundaryMsgId) {
69
+ idx = i
70
+ } else {
71
+ break
72
+ }
73
+ }
74
+ }
75
+
76
+ return idx
77
+ }