@neurocode-ai/core 1.18.8

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 (490) hide show
  1. package/bin/neurocode +199 -0
  2. package/bunfig.toml +2 -0
  3. package/drizzle.config.ts +10 -0
  4. package/package.json +131 -0
  5. package/schema.json +2071 -0
  6. package/script/fix-node-pty.ts +28 -0
  7. package/script/migration.ts +196 -0
  8. package/src/account/sql.ts +39 -0
  9. package/src/account.ts +101 -0
  10. package/src/agent.ts +111 -0
  11. package/src/aisdk.ts +235 -0
  12. package/src/background-job.ts +365 -0
  13. package/src/catalog.ts +301 -0
  14. package/src/command.ts +64 -0
  15. package/src/config/agent.ts +25 -0
  16. package/src/config/attachments.ts +15 -0
  17. package/src/config/command.ts +12 -0
  18. package/src/config/compaction.ts +15 -0
  19. package/src/config/experimental.ts +18 -0
  20. package/src/config/formatter.ts +12 -0
  21. package/src/config/lsp.ts +18 -0
  22. package/src/config/markdown.ts +36 -0
  23. package/src/config/mcp.ts +48 -0
  24. package/src/config/plugin/agent.ts +179 -0
  25. package/src/config/plugin/command.ts +83 -0
  26. package/src/config/plugin/external.ts +91 -0
  27. package/src/config/plugin/provider.ts +113 -0
  28. package/src/config/plugin/reference.ts +70 -0
  29. package/src/config/plugin/skill.ts +50 -0
  30. package/src/config/plugin.ts +13 -0
  31. package/src/config/provider.ts +71 -0
  32. package/src/config/reference.ts +22 -0
  33. package/src/config/tool-output.ts +9 -0
  34. package/src/config/watcher.ts +7 -0
  35. package/src/config.ts +227 -0
  36. package/src/control-plane/move-session.ts +148 -0
  37. package/src/control-plane/workspace.sql.ts +20 -0
  38. package/src/credential/sql.ts +14 -0
  39. package/src/credential.ts +138 -0
  40. package/src/cross-spawn-spawner.ts +507 -0
  41. package/src/data-migration.sql.ts +6 -0
  42. package/src/database/database.ts +57 -0
  43. package/src/database/migration/20260127222353_familiar_lady_ursula.ts +107 -0
  44. package/src/database/migration/20260211171708_add_project_commands.ts +11 -0
  45. package/src/database/migration/20260213144116_wakeful_the_professor.ts +23 -0
  46. package/src/database/migration/20260225215848_workspace.ts +19 -0
  47. package/src/database/migration/20260227213759_add_session_workspace_id.ts +12 -0
  48. package/src/database/migration/20260228203230_blue_harpoon.ts +30 -0
  49. package/src/database/migration/20260303231226_add_workspace_fields.ts +15 -0
  50. package/src/database/migration/20260309230000_move_org_to_state.ts +15 -0
  51. package/src/database/migration/20260312043431_session_message_cursor.ts +16 -0
  52. package/src/database/migration/20260323234822_events.ts +26 -0
  53. package/src/database/migration/20260410174513_workspace-name.ts +29 -0
  54. package/src/database/migration/20260413175956_chief_energizer.ts +24 -0
  55. package/src/database/migration/20260423070820_add_icon_url_override.ts +14 -0
  56. package/src/database/migration/20260427172553_slow_nightmare.ts +30 -0
  57. package/src/database/migration/20260428004200_add_session_path.ts +11 -0
  58. package/src/database/migration/20260501142318_next_venus.ts +12 -0
  59. package/src/database/migration/20260504145000_add_sync_owner.ts +11 -0
  60. package/src/database/migration/20260507164347_add_workspace_time.ts +11 -0
  61. package/src/database/migration/20260510033149_session_usage.ts +56 -0
  62. package/src/database/migration/20260511000411_data_migration_state.ts +16 -0
  63. package/src/database/migration/20260511173437_session-metadata.ts +16 -0
  64. package/src/database/migration/20260601010001_normalize_storage_paths.ts +22 -0
  65. package/src/database/migration/20260601202201_amazing_prowler.ts +11 -0
  66. package/src/database/migration/20260602002951_lowly_union_jack.ts +24 -0
  67. package/src/database/migration/20260602182828_add_project_directories.ts +20 -0
  68. package/src/database/migration/20260603001617_session_message_projection_indexes.ts +19 -0
  69. package/src/database/migration/20260603040000_session_message_projection_order.ts +19 -0
  70. package/src/database/migration/20260603141458_session_input_inbox.ts +25 -0
  71. package/src/database/migration/20260603160727_jittery_ezekiel_stane.ts +20 -0
  72. package/src/database/migration/20260604172448_event_sourced_session_input.ts +47 -0
  73. package/src/database/migration/20260605003541_add_session_context_snapshot.ts +21 -0
  74. package/src/database/migration/20260605042240_add_context_epoch_agent.ts +11 -0
  75. package/src/database/migration/20260611035744_credential.ts +25 -0
  76. package/src/database/migration/20260611192811_lush_chimera.ts +25 -0
  77. package/src/database/migration/20260612174303_project_dir_strategy.ts +29 -0
  78. package/src/database/migration/20260622142730_simplify_session_context_epoch.ts +13 -0
  79. package/src/database/migration/20260622170816_reset_v2_session_state.ts +17 -0
  80. package/src/database/migration/20260622202450_simplify_session_input.ts +17 -0
  81. package/src/database/migration.gen.ts +44 -0
  82. package/src/database/migration.ts +81 -0
  83. package/src/database/path.ts +91 -0
  84. package/src/database/schema.gen.ts +274 -0
  85. package/src/database/schema.sql.ts +10 -0
  86. package/src/database/sqlite.bun.ts +183 -0
  87. package/src/database/sqlite.node.ts +178 -0
  88. package/src/database/sqlite.ts +8 -0
  89. package/src/effect/app-node-builder.ts +23 -0
  90. package/src/effect/app-node-platform.ts +18 -0
  91. package/src/effect/app-node.ts +14 -0
  92. package/src/effect/dfdf +1 -0
  93. package/src/effect/keyed-mutex.ts +45 -0
  94. package/src/effect/layer-node.ts +333 -0
  95. package/src/effect/memo-map.ts +3 -0
  96. package/src/effect/runtime.ts +21 -0
  97. package/src/effect/service-use.ts +43 -0
  98. package/src/event/sql.ts +25 -0
  99. package/src/event.ts +638 -0
  100. package/src/file-mutation.ts +207 -0
  101. package/src/file.ts +6 -0
  102. package/src/filesystem/fff.bun.ts +140 -0
  103. package/src/filesystem/fff.node.ts +138 -0
  104. package/src/filesystem/ignore.ts +67 -0
  105. package/src/filesystem/protected.ts +53 -0
  106. package/src/filesystem/search.ts +239 -0
  107. package/src/filesystem/watcher.ts +140 -0
  108. package/src/filesystem.ts +118 -0
  109. package/src/flag/flag.ts +78 -0
  110. package/src/fs-util.ts +274 -0
  111. package/src/git.ts +987 -0
  112. package/src/github-copilot/README.md +5 -0
  113. package/src/github-copilot/chat/convert-to-openai-compatible-chat-messages.ts +170 -0
  114. package/src/github-copilot/chat/get-response-metadata.ts +15 -0
  115. package/src/github-copilot/chat/map-openai-compatible-finish-reason.ts +19 -0
  116. package/src/github-copilot/chat/openai-compatible-api-types.ts +64 -0
  117. package/src/github-copilot/chat/openai-compatible-chat-language-model.ts +815 -0
  118. package/src/github-copilot/chat/openai-compatible-chat-options.ts +28 -0
  119. package/src/github-copilot/chat/openai-compatible-metadata-extractor.ts +44 -0
  120. package/src/github-copilot/chat/openai-compatible-prepare-tools.ts +83 -0
  121. package/src/github-copilot/copilot-provider.ts +100 -0
  122. package/src/github-copilot/openai-compatible-error.ts +27 -0
  123. package/src/github-copilot/responses/convert-to-openai-responses-input.ts +335 -0
  124. package/src/github-copilot/responses/map-openai-responses-finish-reason.ts +22 -0
  125. package/src/github-copilot/responses/openai-config.ts +18 -0
  126. package/src/github-copilot/responses/openai-error.ts +22 -0
  127. package/src/github-copilot/responses/openai-responses-api-types.ts +214 -0
  128. package/src/github-copilot/responses/openai-responses-language-model.ts +1770 -0
  129. package/src/github-copilot/responses/openai-responses-prepare-tools.ts +173 -0
  130. package/src/github-copilot/responses/openai-responses-settings.ts +1 -0
  131. package/src/github-copilot/responses/tool/code-interpreter.ts +87 -0
  132. package/src/github-copilot/responses/tool/file-search.ts +127 -0
  133. package/src/github-copilot/responses/tool/image-generation.ts +114 -0
  134. package/src/github-copilot/responses/tool/local-shell.ts +64 -0
  135. package/src/github-copilot/responses/tool/web-search-preview.ts +103 -0
  136. package/src/github-copilot/responses/tool/web-search.ts +102 -0
  137. package/src/global.ts +87 -0
  138. package/src/id/id.ts +47 -0
  139. package/src/image/photon.ts +94 -0
  140. package/src/image.ts +81 -0
  141. package/src/installation/version.ts +8 -0
  142. package/src/instruction-context.ts +101 -0
  143. package/src/integration/connection.ts +12 -0
  144. package/src/integration.ts +520 -0
  145. package/src/location-mutation.ts +162 -0
  146. package/src/location-service-map.ts +18 -0
  147. package/src/location-services.ts +115 -0
  148. package/src/location.ts +39 -0
  149. package/src/markdown.d.ts +4 -0
  150. package/src/model.ts +41 -0
  151. package/src/models-dev.ts +260 -0
  152. package/src/npm-config.ts +40 -0
  153. package/src/npm.ts +269 -0
  154. package/src/oauth/page.ts +276 -0
  155. package/src/observability/logging.ts +71 -0
  156. package/src/observability/otlp.ts +79 -0
  157. package/src/observability/shared.ts +1 -0
  158. package/src/observability.ts +24 -0
  159. package/src/patch.ts +197 -0
  160. package/src/permission/saved.ts +79 -0
  161. package/src/permission/sql.ts +20 -0
  162. package/src/permission.ts +310 -0
  163. package/src/plugin/agent.ts +206 -0
  164. package/src/plugin/command/initialize.txt +65 -0
  165. package/src/plugin/command/review.txt +100 -0
  166. package/src/plugin/command.ts +25 -0
  167. package/src/plugin/host.ts +219 -0
  168. package/src/plugin/internal.ts +153 -0
  169. package/src/plugin/layer-map.example.ts +94 -0
  170. package/src/plugin/models-dev.ts +183 -0
  171. package/src/plugin/promise.ts +93 -0
  172. package/src/plugin/provider/alibaba.ts +15 -0
  173. package/src/plugin/provider/amazon-bedrock.ts +126 -0
  174. package/src/plugin/provider/anthropic.ts +27 -0
  175. package/src/plugin/provider/azure.ts +82 -0
  176. package/src/plugin/provider/cerebras.ts +26 -0
  177. package/src/plugin/provider/cloudflare-ai-gateway.ts +81 -0
  178. package/src/plugin/provider/cloudflare-workers-ai.ts +81 -0
  179. package/src/plugin/provider/cohere.ts +15 -0
  180. package/src/plugin/provider/deepinfra.ts +15 -0
  181. package/src/plugin/provider/dynamic.ts +31 -0
  182. package/src/plugin/provider/gateway.ts +15 -0
  183. package/src/plugin/provider/github-copilot.ts +52 -0
  184. package/src/plugin/provider/gitlab.ts +65 -0
  185. package/src/plugin/provider/google-vertex.ts +173 -0
  186. package/src/plugin/provider/google.ts +15 -0
  187. package/src/plugin/provider/groq.ts +15 -0
  188. package/src/plugin/provider/kilo.ts +21 -0
  189. package/src/plugin/provider/llmgateway.ts +26 -0
  190. package/src/plugin/provider/mistral.ts +15 -0
  191. package/src/plugin/provider/nvidia.ts +22 -0
  192. package/src/plugin/provider/openai-compatible.ts +17 -0
  193. package/src/plugin/provider/openai.ts +292 -0
  194. package/src/plugin/provider/opencode.ts +311 -0
  195. package/src/plugin/provider/openrouter.ts +36 -0
  196. package/src/plugin/provider/perplexity.ts +15 -0
  197. package/src/plugin/provider/sap-ai-core.ts +46 -0
  198. package/src/plugin/provider/snowflake-cortex.ts +89 -0
  199. package/src/plugin/provider/togetherai.ts +15 -0
  200. package/src/plugin/provider/venice.ts +15 -0
  201. package/src/plugin/provider/vercel.ts +27 -0
  202. package/src/plugin/provider/xai.ts +22 -0
  203. package/src/plugin/provider/zenmux.ts +21 -0
  204. package/src/plugin/provider.ts +71 -0
  205. package/src/plugin/skill/customize-neurocode.md +452 -0
  206. package/src/plugin/skill.ts +31 -0
  207. package/src/plugin/variant.ts +39 -0
  208. package/src/plugin.ts +167 -0
  209. package/src/policy.ts +49 -0
  210. package/src/process.ts +261 -0
  211. package/src/project/copy-strategies.ts +35 -0
  212. package/src/project/copy.ts +292 -0
  213. package/src/project/directories.ts +158 -0
  214. package/src/project/schema.ts +16 -0
  215. package/src/project/sql.ts +35 -0
  216. package/src/project.ts +136 -0
  217. package/src/provider.ts +25 -0
  218. package/src/pty/protocol.ts +37 -0
  219. package/src/pty/pty.bun.ts +26 -0
  220. package/src/pty/pty.node.ts +29 -0
  221. package/src/pty/pty.ts +25 -0
  222. package/src/pty/schema.ts +1 -0
  223. package/src/pty/ticket.ts +56 -0
  224. package/src/pty.ts +318 -0
  225. package/src/public-event-manifest.ts +7 -0
  226. package/src/question.ts +153 -0
  227. package/src/reference/guidance.ts +69 -0
  228. package/src/reference.ts +125 -0
  229. package/src/repository-cache.ts +259 -0
  230. package/src/repository.ts +214 -0
  231. package/src/ripgrep/binary.ts +132 -0
  232. package/src/ripgrep.ts +281 -0
  233. package/src/schema.ts +79 -0
  234. package/src/session/compaction.ts +241 -0
  235. package/src/session/context-epoch.ts +174 -0
  236. package/src/session/error.ts +24 -0
  237. package/src/session/event.ts +2 -0
  238. package/src/session/execution/local.ts +46 -0
  239. package/src/session/execution.ts +34 -0
  240. package/src/session/history.ts +101 -0
  241. package/src/session/info.ts +50 -0
  242. package/src/session/input.ts +288 -0
  243. package/src/session/message-updater.ts +397 -0
  244. package/src/session/message.ts +2 -0
  245. package/src/session/projector.ts +458 -0
  246. package/src/session/prompt.ts +1 -0
  247. package/src/session/revert.ts +121 -0
  248. package/src/session/run-coordinator.ts +104 -0
  249. package/src/session/runner/index.ts +28 -0
  250. package/src/session/runner/llm.ts +432 -0
  251. package/src/session/runner/max-steps.ts +16 -0
  252. package/src/session/runner/model.ts +218 -0
  253. package/src/session/runner/publish-llm-event.ts +423 -0
  254. package/src/session/runner/to-llm-message.ts +171 -0
  255. package/src/session/schema.ts +9 -0
  256. package/src/session/sql.ts +176 -0
  257. package/src/session/store.ts +63 -0
  258. package/src/session/todo.ts +78 -0
  259. package/src/session.ts +486 -0
  260. package/src/share/sql.ts +13 -0
  261. package/src/shell.ts +226 -0
  262. package/src/skill/discovery.ts +213 -0
  263. package/src/skill/guidance.ts +76 -0
  264. package/src/skill.ts +132 -0
  265. package/src/snapshot.ts +266 -0
  266. package/src/state.ts +128 -0
  267. package/src/system-context/builtins.ts +50 -0
  268. package/src/system-context/index.ts +320 -0
  269. package/src/system-context/registry.ts +49 -0
  270. package/src/tool/AGENTS.md +59 -0
  271. package/src/tool/application-tools.ts +57 -0
  272. package/src/tool/apply-patch.ts +219 -0
  273. package/src/tool/bash.ts +207 -0
  274. package/src/tool/builtins.ts +48 -0
  275. package/src/tool/edit.ts +223 -0
  276. package/src/tool/glob.ts +105 -0
  277. package/src/tool/grep.ts +137 -0
  278. package/src/tool/http-body.ts +30 -0
  279. package/src/tool/question.ts +94 -0
  280. package/src/tool/read-filesystem.ts +366 -0
  281. package/src/tool/read.ts +117 -0
  282. package/src/tool/registry.ts +147 -0
  283. package/src/tool/skill.ts +109 -0
  284. package/src/tool/todowrite.ts +62 -0
  285. package/src/tool/tool.ts +162 -0
  286. package/src/tool/tools.ts +13 -0
  287. package/src/tool/webfetch.ts +218 -0
  288. package/src/tool/websearch.ts +260 -0
  289. package/src/tool/write.ts +101 -0
  290. package/src/tool-output-store.ts +211 -0
  291. package/src/util/array.ts +10 -0
  292. package/src/util/binary.ts +41 -0
  293. package/src/util/effect-flock.ts +284 -0
  294. package/src/util/encode.ts +51 -0
  295. package/src/util/error.ts +70 -0
  296. package/src/util/flock.ts +358 -0
  297. package/src/util/glob.ts +34 -0
  298. package/src/util/hash.ts +11 -0
  299. package/src/util/identifier.ts +1 -0
  300. package/src/util/iife.ts +3 -0
  301. package/src/util/lazy.ts +11 -0
  302. package/src/util/module.ts +10 -0
  303. package/src/util/path.ts +37 -0
  304. package/src/util/retry.ts +42 -0
  305. package/src/util/slug.ts +74 -0
  306. package/src/util/token.ts +5 -0
  307. package/src/util/which.ts +14 -0
  308. package/src/util/wildcard.ts +14 -0
  309. package/src/v1/config/agent.ts +89 -0
  310. package/src/v1/config/attachment.ts +25 -0
  311. package/src/v1/config/command.ts +13 -0
  312. package/src/v1/config/config.ts +192 -0
  313. package/src/v1/config/console-state.ts +16 -0
  314. package/src/v1/config/error.ts +39 -0
  315. package/src/v1/config/formatter.ts +13 -0
  316. package/src/v1/config/layout.ts +6 -0
  317. package/src/v1/config/lsp.ts +80 -0
  318. package/src/v1/config/mcp.ts +63 -0
  319. package/src/v1/config/migrate.ts +254 -0
  320. package/src/v1/config/permission.ts +50 -0
  321. package/src/v1/config/plugin.ts +9 -0
  322. package/src/v1/config/provider-options.ts +227 -0
  323. package/src/v1/config/provider.ts +121 -0
  324. package/src/v1/config/server.ts +19 -0
  325. package/src/v1/config/skills.ts +13 -0
  326. package/src/v1/permission.ts +33 -0
  327. package/src/v1/session.ts +68 -0
  328. package/src/v2-schema.ts +3 -0
  329. package/src/workspace.ts +6 -0
  330. package/sst-env.d.ts +10 -0
  331. package/test/agent.test.ts +131 -0
  332. package/test/application-tools.test.ts +287 -0
  333. package/test/background-job.test.ts +106 -0
  334. package/test/catalog.test.ts +353 -0
  335. package/test/command.test.ts +56 -0
  336. package/test/config/agent.test.ts +349 -0
  337. package/test/config/command.test.ts +83 -0
  338. package/test/config/config.test.ts +798 -0
  339. package/test/config/fixtures/plugin/directory-plugin.ts +13 -0
  340. package/test/config/plugin.test.ts +248 -0
  341. package/test/config/provider-options.test.ts +224 -0
  342. package/test/config/provider.test.ts +269 -0
  343. package/test/config/skill.test.ts +80 -0
  344. package/test/credential.test.ts +36 -0
  345. package/test/database-migration.test.ts +644 -0
  346. package/test/effect/cross-spawn-spawner.test.ts +426 -0
  347. package/test/effect/keyed-mutex.test.ts +73 -0
  348. package/test/effect/layer-node/layer-node-types.test.ts +143 -0
  349. package/test/effect/layer-node/layer-node.test.ts +261 -0
  350. package/test/effect/layer-node/node-build.test.ts +125 -0
  351. package/test/effect/observability.test.ts +109 -0
  352. package/test/event.test.ts +1124 -0
  353. package/test/file-mutation.test.ts +368 -0
  354. package/test/filesystem/filesystem.test.ts +387 -0
  355. package/test/filesystem/ignore.test.ts +10 -0
  356. package/test/filesystem/search.test.ts +44 -0
  357. package/test/filesystem/watcher.test.ts +266 -0
  358. package/test/fixture/effect-flock-worker.ts +60 -0
  359. package/test/fixture/flock-worker.ts +72 -0
  360. package/test/fixture/git.ts +49 -0
  361. package/test/fixture/location.ts +26 -0
  362. package/test/fixture/tmpdir.ts +25 -0
  363. package/test/fixtures/recordings/session-runner/openai-chat-streams-text.json +27 -0
  364. package/test/git.test.ts +164 -0
  365. package/test/github-copilot/convert-to-copilot-messages.test.ts +523 -0
  366. package/test/github-copilot/copilot-chat-model.test.ts +592 -0
  367. package/test/github-copilot/openai-responses-language-model.test.ts +206 -0
  368. package/test/global.test.ts +16 -0
  369. package/test/instruction-context.test.ts +323 -0
  370. package/test/integration.test.ts +349 -0
  371. package/test/legacy-event-schema.test.ts +16 -0
  372. package/test/lib/effect.ts +53 -0
  373. package/test/lib/tool.ts +20 -0
  374. package/test/location-filesystem.test.ts +69 -0
  375. package/test/location-layer.test.ts +226 -0
  376. package/test/location-mutation.test.ts +178 -0
  377. package/test/location.test.ts +42 -0
  378. package/test/model.test.ts +23 -0
  379. package/test/models.test.ts +290 -0
  380. package/test/move-session.test.ts +235 -0
  381. package/test/npm-config.test.ts +51 -0
  382. package/test/npm.test.ts +84 -0
  383. package/test/oauth-page.test.ts +15 -0
  384. package/test/patch.test.ts +68 -0
  385. package/test/permission.test.ts +315 -0
  386. package/test/plugin/command.test.ts +47 -0
  387. package/test/plugin/fixture.ts +52 -0
  388. package/test/plugin/fixtures/config-effect-plugin.ts +15 -0
  389. package/test/plugin/fixtures/config-promise-plugin.ts +13 -0
  390. package/test/plugin/fixtures/invalid-plugin.ts +1 -0
  391. package/test/plugin/fixtures/models-dev.json +14 -0
  392. package/test/plugin/fixtures/provider-factory.ts +9 -0
  393. package/test/plugin/host.ts +303 -0
  394. package/test/plugin/models-dev.test.ts +170 -0
  395. package/test/plugin/promise.test.ts +67 -0
  396. package/test/plugin/provider-alibaba.test.ts +92 -0
  397. package/test/plugin/provider-amazon-bedrock.test.ts +622 -0
  398. package/test/plugin/provider-anthropic.test.ts +94 -0
  399. package/test/plugin/provider-azure-cognitive-services.test.ts +199 -0
  400. package/test/plugin/provider-azure.test.ts +293 -0
  401. package/test/plugin/provider-cerebras.test.ts +136 -0
  402. package/test/plugin/provider-cloudflare-ai-gateway.test.ts +426 -0
  403. package/test/plugin/provider-cloudflare-workers-ai.test.ts +279 -0
  404. package/test/plugin/provider-cohere.test.ts +123 -0
  405. package/test/plugin/provider-deepinfra.test.ts +159 -0
  406. package/test/plugin/provider-dynamic.test.ts +184 -0
  407. package/test/plugin/provider-gateway.test.ts +115 -0
  408. package/test/plugin/provider-github-copilot.test.ts +278 -0
  409. package/test/plugin/provider-gitlab.test.ts +308 -0
  410. package/test/plugin/provider-google-vertex-anthropic.test.ts +264 -0
  411. package/test/plugin/provider-google-vertex.test.ts +387 -0
  412. package/test/plugin/provider-google.test.ts +80 -0
  413. package/test/plugin/provider-groq.test.ts +121 -0
  414. package/test/plugin/provider-kilo.test.ts +99 -0
  415. package/test/plugin/provider-llmgateway.test.ts +80 -0
  416. package/test/plugin/provider-mistral.test.ts +129 -0
  417. package/test/plugin/provider-nvidia.test.ts +97 -0
  418. package/test/plugin/provider-openai-compatible.test.ts +107 -0
  419. package/test/plugin/provider-openai.test.ts +176 -0
  420. package/test/plugin/provider-opencode.test.ts +423 -0
  421. package/test/plugin/provider-openrouter.test.ts +113 -0
  422. package/test/plugin/provider-perplexity.test.ts +122 -0
  423. package/test/plugin/provider-sap-ai-core.test.ts +159 -0
  424. package/test/plugin/provider-snowflake-cortex.test.ts +261 -0
  425. package/test/plugin/provider-togetherai.test.ts +129 -0
  426. package/test/plugin/provider-venice.test.ts +115 -0
  427. package/test/plugin/provider-vercel.test.ts +83 -0
  428. package/test/plugin/provider-xai.test.ts +125 -0
  429. package/test/plugin/provider-zenmux.test.ts +110 -0
  430. package/test/plugin/skill.test.ts +25 -0
  431. package/test/plugin/variant.test.ts +67 -0
  432. package/test/plugin.test.ts +71 -0
  433. package/test/policy.test.ts +85 -0
  434. package/test/preload.ts +5 -0
  435. package/test/process/process.test.ts +368 -0
  436. package/test/project-copy.test.ts +400 -0
  437. package/test/project-directories.test.ts +61 -0
  438. package/test/project.test.ts +221 -0
  439. package/test/provider-mistral.test.ts +282 -0
  440. package/test/provider-xai-responses.test.ts +32 -0
  441. package/test/pty/info-schema.test.ts +32 -0
  442. package/test/pty/protocol.test.ts +27 -0
  443. package/test/pty/pty-session.test.ts +240 -0
  444. package/test/pty/ticket.test.ts +62 -0
  445. package/test/question.test.ts +114 -0
  446. package/test/reference-guidance.test.ts +76 -0
  447. package/test/reference.test.ts +78 -0
  448. package/test/repository-cache.test.ts +153 -0
  449. package/test/repository.test.ts +71 -0
  450. package/test/ripgrep.test.ts +65 -0
  451. package/test/session-compaction.test.ts +27 -0
  452. package/test/session-create.test.ts +425 -0
  453. package/test/session-history.test.ts +165 -0
  454. package/test/session-projector.test.ts +533 -0
  455. package/test/session-prompt.test.ts +584 -0
  456. package/test/session-run-coordinator.test.ts +418 -0
  457. package/test/session-runner-message.test.ts +501 -0
  458. package/test/session-runner-model.test.ts +347 -0
  459. package/test/session-runner-recorded.test.ts +193 -0
  460. package/test/session-runner-tool-events.test.ts +136 -0
  461. package/test/session-runner-tool-registry.test.ts +452 -0
  462. package/test/session-runner.test.ts +3365 -0
  463. package/test/session-todo.test.ts +94 -0
  464. package/test/session-tool-progress.test.ts +158 -0
  465. package/test/shared-schema.test.ts +206 -0
  466. package/test/shell.test.ts +108 -0
  467. package/test/skill/guidance.test.ts +144 -0
  468. package/test/skill-discovery.test.ts +165 -0
  469. package/test/skill.test.ts +125 -0
  470. package/test/snapshot.test.ts +178 -0
  471. package/test/state.test.ts +115 -0
  472. package/test/system-context/builtins.test.ts +129 -0
  473. package/test/system-context/index.test.ts +307 -0
  474. package/test/system-context/registry.test.ts +114 -0
  475. package/test/tool-apply-patch.test.ts +436 -0
  476. package/test/tool-bash.test.ts +437 -0
  477. package/test/tool-edit.test.ts +434 -0
  478. package/test/tool-output-store.test.ts +247 -0
  479. package/test/tool-question.test.ts +162 -0
  480. package/test/tool-read-filesystem.test.ts +118 -0
  481. package/test/tool-read.test.ts +674 -0
  482. package/test/tool-skill.test.ts +149 -0
  483. package/test/tool-todowrite.test.ts +125 -0
  484. package/test/tool-webfetch.test.ts +281 -0
  485. package/test/tool-websearch.test.ts +316 -0
  486. package/test/tool-write.test.ts +305 -0
  487. package/test/util/effect-flock.test.ts +392 -0
  488. package/test/util/flock.test.ts +428 -0
  489. package/test/util/which.test.ts +100 -0
  490. package/tsconfig.json +7 -0
@@ -0,0 +1,23 @@
1
+ import { Effect } from "effect"
2
+ import type { DatabaseMigration } from "../migration"
3
+
4
+ export default {
5
+ id: "20260213144116_wakeful_the_professor",
6
+ up(tx) {
7
+ return Effect.gen(function* () {
8
+ yield* tx.run(`
9
+ CREATE TABLE \`control_account\` (
10
+ \`email\` text NOT NULL,
11
+ \`url\` text NOT NULL,
12
+ \`access_token\` text NOT NULL,
13
+ \`refresh_token\` text NOT NULL,
14
+ \`token_expiry\` integer,
15
+ \`active\` integer NOT NULL,
16
+ \`time_created\` integer NOT NULL,
17
+ \`time_updated\` integer NOT NULL,
18
+ CONSTRAINT \`control_account_pk\` PRIMARY KEY(\`email\`, \`url\`)
19
+ );
20
+ `)
21
+ })
22
+ },
23
+ } satisfies DatabaseMigration.Migration
@@ -0,0 +1,19 @@
1
+ import { Effect } from "effect"
2
+ import type { DatabaseMigration } from "../migration"
3
+
4
+ export default {
5
+ id: "20260225215848_workspace",
6
+ up(tx) {
7
+ return Effect.gen(function* () {
8
+ yield* tx.run(`
9
+ CREATE TABLE \`workspace\` (
10
+ \`id\` text PRIMARY KEY,
11
+ \`branch\` text,
12
+ \`project_id\` text NOT NULL,
13
+ \`config\` text NOT NULL,
14
+ CONSTRAINT \`fk_workspace_project_id_project_id_fk\` FOREIGN KEY (\`project_id\`) REFERENCES \`project\`(\`id\`) ON DELETE CASCADE
15
+ );
16
+ `)
17
+ })
18
+ },
19
+ } satisfies DatabaseMigration.Migration
@@ -0,0 +1,12 @@
1
+ import { Effect } from "effect"
2
+ import type { DatabaseMigration } from "../migration"
3
+
4
+ export default {
5
+ id: "20260227213759_add_session_workspace_id",
6
+ up(tx) {
7
+ return Effect.gen(function* () {
8
+ yield* tx.run(`ALTER TABLE \`session\` ADD \`workspace_id\` text;`)
9
+ yield* tx.run(`CREATE INDEX \`session_workspace_idx\` ON \`session\` (\`workspace_id\`);`)
10
+ })
11
+ },
12
+ } satisfies DatabaseMigration.Migration
@@ -0,0 +1,30 @@
1
+ import { Effect } from "effect"
2
+ import type { DatabaseMigration } from "../migration"
3
+
4
+ export default {
5
+ id: "20260228203230_blue_harpoon",
6
+ up(tx) {
7
+ return Effect.gen(function* () {
8
+ yield* tx.run(`
9
+ CREATE TABLE \`account\` (
10
+ \`id\` text PRIMARY KEY,
11
+ \`email\` text NOT NULL,
12
+ \`url\` text NOT NULL,
13
+ \`access_token\` text NOT NULL,
14
+ \`refresh_token\` text NOT NULL,
15
+ \`token_expiry\` integer,
16
+ \`selected_org_id\` text,
17
+ \`time_created\` integer NOT NULL,
18
+ \`time_updated\` integer NOT NULL
19
+ );
20
+ `)
21
+ yield* tx.run(`
22
+ CREATE TABLE \`account_state\` (
23
+ \`id\` integer PRIMARY KEY NOT NULL,
24
+ \`active_account_id\` text,
25
+ FOREIGN KEY (\`active_account_id\`) REFERENCES \`account\`(\`id\`) ON UPDATE no action ON DELETE set null
26
+ );
27
+ `)
28
+ })
29
+ },
30
+ } satisfies DatabaseMigration.Migration
@@ -0,0 +1,15 @@
1
+ import { Effect } from "effect"
2
+ import type { DatabaseMigration } from "../migration"
3
+
4
+ export default {
5
+ id: "20260303231226_add_workspace_fields",
6
+ up(tx) {
7
+ return Effect.gen(function* () {
8
+ yield* tx.run(`ALTER TABLE \`workspace\` ADD \`type\` text NOT NULL;`)
9
+ yield* tx.run(`ALTER TABLE \`workspace\` ADD \`name\` text;`)
10
+ yield* tx.run(`ALTER TABLE \`workspace\` ADD \`directory\` text;`)
11
+ yield* tx.run(`ALTER TABLE \`workspace\` ADD \`extra\` text;`)
12
+ yield* tx.run(`ALTER TABLE \`workspace\` DROP COLUMN \`config\`;`)
13
+ })
14
+ },
15
+ } satisfies DatabaseMigration.Migration
@@ -0,0 +1,15 @@
1
+ import { Effect } from "effect"
2
+ import type { DatabaseMigration } from "../migration"
3
+
4
+ export default {
5
+ id: "20260309230000_move_org_to_state",
6
+ up(tx) {
7
+ return Effect.gen(function* () {
8
+ yield* tx.run(`ALTER TABLE \`account_state\` ADD \`active_org_id\` text;`)
9
+ yield* tx.run(
10
+ `UPDATE \`account_state\` SET \`active_org_id\` = (SELECT \`selected_org_id\` FROM \`account\` WHERE \`account\`.\`id\` = \`account_state\`.\`active_account_id\`);`,
11
+ )
12
+ yield* tx.run(`ALTER TABLE \`account\` DROP COLUMN \`selected_org_id\`;`)
13
+ })
14
+ },
15
+ } satisfies DatabaseMigration.Migration
@@ -0,0 +1,16 @@
1
+ import { Effect } from "effect"
2
+ import type { DatabaseMigration } from "../migration"
3
+
4
+ export default {
5
+ id: "20260312043431_session_message_cursor",
6
+ up(tx) {
7
+ return Effect.gen(function* () {
8
+ yield* tx.run(`DROP INDEX IF EXISTS \`message_session_idx\`;`)
9
+ yield* tx.run(`DROP INDEX IF EXISTS \`part_message_idx\`;`)
10
+ yield* tx.run(
11
+ `CREATE INDEX \`message_session_time_created_id_idx\` ON \`message\` (\`session_id\`,\`time_created\`,\`id\`);`,
12
+ )
13
+ yield* tx.run(`CREATE INDEX \`part_message_id_id_idx\` ON \`part\` (\`message_id\`,\`id\`);`)
14
+ })
15
+ },
16
+ } satisfies DatabaseMigration.Migration
@@ -0,0 +1,26 @@
1
+ import { Effect } from "effect"
2
+ import type { DatabaseMigration } from "../migration"
3
+
4
+ export default {
5
+ id: "20260323234822_events",
6
+ up(tx) {
7
+ return Effect.gen(function* () {
8
+ yield* tx.run(`
9
+ CREATE TABLE \`event_sequence\` (
10
+ \`aggregate_id\` text PRIMARY KEY,
11
+ \`seq\` integer NOT NULL
12
+ );
13
+ `)
14
+ yield* tx.run(`
15
+ CREATE TABLE \`event\` (
16
+ \`id\` text PRIMARY KEY,
17
+ \`aggregate_id\` text NOT NULL,
18
+ \`seq\` integer NOT NULL,
19
+ \`type\` text NOT NULL,
20
+ \`data\` text NOT NULL,
21
+ CONSTRAINT \`fk_event_aggregate_id_event_sequence_aggregate_id_fk\` FOREIGN KEY (\`aggregate_id\`) REFERENCES \`event_sequence\`(\`aggregate_id\`) ON DELETE CASCADE
22
+ );
23
+ `)
24
+ })
25
+ },
26
+ } satisfies DatabaseMigration.Migration
@@ -0,0 +1,29 @@
1
+ import { Effect } from "effect"
2
+ import type { DatabaseMigration } from "../migration"
3
+
4
+ export default {
5
+ id: "20260410174513_workspace-name",
6
+ up(tx) {
7
+ return Effect.gen(function* () {
8
+ yield* tx.run(`PRAGMA foreign_keys=OFF;`)
9
+ yield* tx.run(`
10
+ CREATE TABLE \`__new_workspace\` (
11
+ \`id\` text PRIMARY KEY,
12
+ \`type\` text NOT NULL,
13
+ \`name\` text DEFAULT '' NOT NULL,
14
+ \`branch\` text,
15
+ \`directory\` text,
16
+ \`extra\` text,
17
+ \`project_id\` text NOT NULL,
18
+ CONSTRAINT \`fk_workspace_project_id_project_id_fk\` FOREIGN KEY (\`project_id\`) REFERENCES \`project\`(\`id\`) ON DELETE CASCADE
19
+ );
20
+ `)
21
+ yield* tx.run(
22
+ `INSERT INTO \`__new_workspace\`(\`id\`, \`type\`, \`branch\`, \`name\`, \`directory\`, \`extra\`, \`project_id\`) SELECT \`id\`, \`type\`, \`branch\`, \`name\`, \`directory\`, \`extra\`, \`project_id\` FROM \`workspace\`;`,
23
+ )
24
+ yield* tx.run(`DROP TABLE \`workspace\`;`)
25
+ yield* tx.run(`ALTER TABLE \`__new_workspace\` RENAME TO \`workspace\`;`)
26
+ yield* tx.run(`PRAGMA foreign_keys=ON;`)
27
+ })
28
+ },
29
+ } satisfies DatabaseMigration.Migration
@@ -0,0 +1,24 @@
1
+ import { Effect } from "effect"
2
+ import type { DatabaseMigration } from "../migration"
3
+
4
+ export default {
5
+ id: "20260413175956_chief_energizer",
6
+ up(tx) {
7
+ return Effect.gen(function* () {
8
+ yield* tx.run(`
9
+ CREATE TABLE \`session_entry\` (
10
+ \`id\` text PRIMARY KEY,
11
+ \`session_id\` text NOT NULL,
12
+ \`type\` text NOT NULL,
13
+ \`time_created\` integer NOT NULL,
14
+ \`time_updated\` integer NOT NULL,
15
+ \`data\` text NOT NULL,
16
+ CONSTRAINT \`fk_session_entry_session_id_session_id_fk\` FOREIGN KEY (\`session_id\`) REFERENCES \`session\`(\`id\`) ON DELETE CASCADE
17
+ );
18
+ `)
19
+ yield* tx.run(`CREATE INDEX \`session_entry_session_idx\` ON \`session_entry\` (\`session_id\`);`)
20
+ yield* tx.run(`CREATE INDEX \`session_entry_session_type_idx\` ON \`session_entry\` (\`session_id\`,\`type\`);`)
21
+ yield* tx.run(`CREATE INDEX \`session_entry_time_created_idx\` ON \`session_entry\` (\`time_created\`);`)
22
+ })
23
+ },
24
+ } satisfies DatabaseMigration.Migration
@@ -0,0 +1,14 @@
1
+ import { Effect } from "effect"
2
+ import type { DatabaseMigration } from "../migration"
3
+
4
+ export default {
5
+ id: "20260423070820_add_icon_url_override",
6
+ up(tx) {
7
+ return Effect.gen(function* () {
8
+ yield* tx.run(`
9
+ ALTER TABLE \`project\` ADD \`icon_url_override\` text;
10
+ UPDATE \`project\` SET \`icon_url_override\` = \`icon_url\` WHERE \`icon_url\` IS NOT NULL;
11
+ `)
12
+ })
13
+ },
14
+ } satisfies DatabaseMigration.Migration
@@ -0,0 +1,30 @@
1
+ import { Effect } from "effect"
2
+ import type { DatabaseMigration } from "../migration"
3
+
4
+ export default {
5
+ id: "20260427172553_slow_nightmare",
6
+ up(tx) {
7
+ return Effect.gen(function* () {
8
+ yield* tx.run(`
9
+ CREATE TABLE \`session_message\` (
10
+ \`id\` text PRIMARY KEY,
11
+ \`session_id\` text NOT NULL,
12
+ \`type\` text NOT NULL,
13
+ \`time_created\` integer NOT NULL,
14
+ \`time_updated\` integer NOT NULL,
15
+ \`data\` text NOT NULL,
16
+ CONSTRAINT \`fk_session_message_session_id_session_id_fk\` FOREIGN KEY (\`session_id\`) REFERENCES \`session\`(\`id\`) ON DELETE CASCADE
17
+ );
18
+ `)
19
+ yield* tx.run(`DROP INDEX IF EXISTS \`session_entry_session_idx\`;`)
20
+ yield* tx.run(`DROP INDEX IF EXISTS \`session_entry_session_type_idx\`;`)
21
+ yield* tx.run(`DROP INDEX IF EXISTS \`session_entry_time_created_idx\`;`)
22
+ yield* tx.run(`CREATE INDEX \`session_message_session_idx\` ON \`session_message\` (\`session_id\`);`)
23
+ yield* tx.run(
24
+ `CREATE INDEX \`session_message_session_type_idx\` ON \`session_message\` (\`session_id\`,\`type\`);`,
25
+ )
26
+ yield* tx.run(`CREATE INDEX \`session_message_time_created_idx\` ON \`session_message\` (\`time_created\`);`)
27
+ yield* tx.run(`DROP TABLE \`session_entry\`;`)
28
+ })
29
+ },
30
+ } satisfies DatabaseMigration.Migration
@@ -0,0 +1,11 @@
1
+ import { Effect } from "effect"
2
+ import type { DatabaseMigration } from "../migration"
3
+
4
+ export default {
5
+ id: "20260428004200_add_session_path",
6
+ up(tx) {
7
+ return Effect.gen(function* () {
8
+ yield* tx.run(`ALTER TABLE \`session\` ADD \`path\` text;`)
9
+ })
10
+ },
11
+ } satisfies DatabaseMigration.Migration
@@ -0,0 +1,12 @@
1
+ import { Effect } from "effect"
2
+ import type { DatabaseMigration } from "../migration"
3
+
4
+ export default {
5
+ id: "20260501142318_next_venus",
6
+ up(tx) {
7
+ return Effect.gen(function* () {
8
+ yield* tx.run(`ALTER TABLE \`session\` ADD \`agent\` text;`)
9
+ yield* tx.run(`ALTER TABLE \`session\` ADD \`model\` text;`)
10
+ })
11
+ },
12
+ } satisfies DatabaseMigration.Migration
@@ -0,0 +1,11 @@
1
+ import { Effect } from "effect"
2
+ import type { DatabaseMigration } from "../migration"
3
+
4
+ export default {
5
+ id: "20260504145000_add_sync_owner",
6
+ up(tx) {
7
+ return Effect.gen(function* () {
8
+ yield* tx.run(`ALTER TABLE \`event_sequence\` ADD \`owner_id\` text;`)
9
+ })
10
+ },
11
+ } satisfies DatabaseMigration.Migration
@@ -0,0 +1,11 @@
1
+ import { Effect } from "effect"
2
+ import type { DatabaseMigration } from "../migration"
3
+
4
+ export default {
5
+ id: "20260507164347_add_workspace_time",
6
+ up(tx) {
7
+ return Effect.gen(function* () {
8
+ yield* tx.run(`ALTER TABLE \`workspace\` ADD \`time_used\` integer NOT NULL DEFAULT 0;`)
9
+ })
10
+ },
11
+ } satisfies DatabaseMigration.Migration
@@ -0,0 +1,56 @@
1
+ import { Effect } from "effect"
2
+ import type { DatabaseMigration } from "../migration"
3
+
4
+ export default {
5
+ id: "20260510033149_session_usage",
6
+ up(tx) {
7
+ return Effect.gen(function* () {
8
+ yield* tx.run(`ALTER TABLE \`session\` ADD \`cost\` real DEFAULT 0 NOT NULL;`)
9
+ yield* tx.run(`ALTER TABLE \`session\` ADD \`tokens_input\` integer DEFAULT 0 NOT NULL;`)
10
+ yield* tx.run(`ALTER TABLE \`session\` ADD \`tokens_output\` integer DEFAULT 0 NOT NULL;`)
11
+ yield* tx.run(`ALTER TABLE \`session\` ADD \`tokens_reasoning\` integer DEFAULT 0 NOT NULL;`)
12
+ yield* tx.run(`ALTER TABLE \`session\` ADD \`tokens_cache_read\` integer DEFAULT 0 NOT NULL;`)
13
+ yield* tx.run(`ALTER TABLE \`session\` ADD \`tokens_cache_write\` integer DEFAULT 0 NOT NULL;`)
14
+ yield* tx.run(`
15
+ UPDATE session
16
+ SET
17
+ cost = coalesce((
18
+ SELECT sum(coalesce(json_extract(message.data, '$.cost'), 0))
19
+ FROM message
20
+ WHERE message.session_id = session.id
21
+ AND json_extract(message.data, '$.role') = 'assistant'
22
+ ), 0),
23
+ tokens_input = coalesce((
24
+ SELECT sum(coalesce(json_extract(message.data, '$.tokens.input'), 0))
25
+ FROM message
26
+ WHERE message.session_id = session.id
27
+ AND json_extract(message.data, '$.role') = 'assistant'
28
+ ), 0),
29
+ tokens_output = coalesce((
30
+ SELECT sum(coalesce(json_extract(message.data, '$.tokens.output'), 0))
31
+ FROM message
32
+ WHERE message.session_id = session.id
33
+ AND json_extract(message.data, '$.role') = 'assistant'
34
+ ), 0),
35
+ tokens_reasoning = coalesce((
36
+ SELECT sum(coalesce(json_extract(message.data, '$.tokens.reasoning'), 0))
37
+ FROM message
38
+ WHERE message.session_id = session.id
39
+ AND json_extract(message.data, '$.role') = 'assistant'
40
+ ), 0),
41
+ tokens_cache_read = coalesce((
42
+ SELECT sum(coalesce(json_extract(message.data, '$.tokens.cache.read'), 0))
43
+ FROM message
44
+ WHERE message.session_id = session.id
45
+ AND json_extract(message.data, '$.role') = 'assistant'
46
+ ), 0),
47
+ tokens_cache_write = coalesce((
48
+ SELECT sum(coalesce(json_extract(message.data, '$.tokens.cache.write'), 0))
49
+ FROM message
50
+ WHERE message.session_id = session.id
51
+ AND json_extract(message.data, '$.role') = 'assistant'
52
+ ), 0)
53
+ `)
54
+ })
55
+ },
56
+ } satisfies DatabaseMigration.Migration
@@ -0,0 +1,16 @@
1
+ import { Effect } from "effect"
2
+ import type { DatabaseMigration } from "../migration"
3
+
4
+ export default {
5
+ id: "20260511000411_data_migration_state",
6
+ up(tx) {
7
+ return Effect.gen(function* () {
8
+ yield* tx.run(`
9
+ CREATE TABLE \`data_migration\` (
10
+ \`name\` text PRIMARY KEY,
11
+ \`time_completed\` integer NOT NULL
12
+ );
13
+ `)
14
+ })
15
+ },
16
+ } satisfies DatabaseMigration.Migration
@@ -0,0 +1,16 @@
1
+ import { Effect } from "effect"
2
+ import type { DatabaseMigration } from "../migration"
3
+
4
+ export default {
5
+ id: "20260511173437_session-metadata",
6
+ up(tx) {
7
+ return Effect.gen(function* () {
8
+ // This column briefly shipped again under 20260530232709_lovely_romulus.
9
+ if (
10
+ (yield* tx.all<{ name: string }>(`PRAGMA table_info(\`session\`)`)).some((column) => column.name === "metadata")
11
+ )
12
+ return
13
+ yield* tx.run(`ALTER TABLE \`session\` ADD \`metadata\` text;`)
14
+ })
15
+ },
16
+ } satisfies DatabaseMigration.Migration
@@ -0,0 +1,22 @@
1
+ import { Effect } from "effect"
2
+ import type { DatabaseMigration } from "../migration"
3
+
4
+ export default {
5
+ id: "20260601010001_normalize_storage_paths",
6
+ up(tx) {
7
+ return Effect.gen(function* () {
8
+ yield* tx.run(
9
+ `UPDATE project SET worktree = REPLACE(worktree, char(92), '/') WHERE worktree GLOB '[A-Za-z]:' || char(92) || '*' OR worktree LIKE char(92) || char(92) || '%';`,
10
+ )
11
+ yield* tx.run(
12
+ `UPDATE project SET sandboxes = REPLACE(sandboxes, char(92) || char(92), '/') WHERE instr(sandboxes, char(92)) > 0 AND (worktree GLOB '[A-Za-z]:*' OR worktree LIKE '//%');`,
13
+ )
14
+ yield* tx.run(
15
+ `UPDATE session SET directory = REPLACE(directory, char(92), '/') WHERE directory GLOB '[A-Za-z]:' || char(92) || '*' OR directory LIKE char(92) || char(92) || '%';`,
16
+ )
17
+ yield* tx.run(
18
+ `UPDATE session SET path = REPLACE(path, char(92), '/') WHERE path IS NOT NULL AND instr(path, char(92)) > 0 AND (directory GLOB '[A-Za-z]:*' OR directory LIKE '//%');`,
19
+ )
20
+ })
21
+ },
22
+ } satisfies DatabaseMigration.Migration
@@ -0,0 +1,11 @@
1
+ import { Effect } from "effect"
2
+ import type { DatabaseMigration } from "../migration"
3
+
4
+ export default {
5
+ id: "20260601202201_amazing_prowler",
6
+ up(tx) {
7
+ return Effect.gen(function* () {
8
+ yield* tx.run(`DROP TABLE \`permission\`;`)
9
+ })
10
+ },
11
+ } satisfies DatabaseMigration.Migration
@@ -0,0 +1,24 @@
1
+ import { Effect } from "effect"
2
+ import type { DatabaseMigration } from "../migration"
3
+
4
+ export default {
5
+ id: "20260602002951_lowly_union_jack",
6
+ up(tx) {
7
+ return Effect.gen(function* () {
8
+ yield* tx.run(`
9
+ CREATE TABLE \`permission\` (
10
+ \`id\` text PRIMARY KEY,
11
+ \`project_id\` text NOT NULL,
12
+ \`action\` text NOT NULL,
13
+ \`resource\` text NOT NULL,
14
+ \`time_created\` integer NOT NULL,
15
+ \`time_updated\` integer NOT NULL,
16
+ CONSTRAINT \`fk_permission_project_id_project_id_fk\` FOREIGN KEY (\`project_id\`) REFERENCES \`project\`(\`id\`) ON DELETE CASCADE
17
+ );
18
+ `)
19
+ yield* tx.run(
20
+ `CREATE UNIQUE INDEX \`permission_project_action_resource_idx\` ON \`permission\` (\`project_id\`,\`action\`,\`resource\`);`,
21
+ )
22
+ })
23
+ },
24
+ } satisfies DatabaseMigration.Migration
@@ -0,0 +1,20 @@
1
+ import { Effect } from "effect"
2
+ import type { DatabaseMigration } from "../migration"
3
+
4
+ export default {
5
+ id: "20260602182828_add_project_directories",
6
+ up(tx) {
7
+ return Effect.gen(function* () {
8
+ yield* tx.run(`
9
+ CREATE TABLE \`project_directory\` (
10
+ \`project_id\` text NOT NULL,
11
+ \`directory\` text NOT NULL,
12
+ \`type\` text NOT NULL,
13
+ \`time_created\` integer NOT NULL,
14
+ CONSTRAINT \`project_directory_pk\` PRIMARY KEY(\`project_id\`, \`directory\`),
15
+ CONSTRAINT \`fk_project_directory_project_id_project_id_fk\` FOREIGN KEY (\`project_id\`) REFERENCES \`project\`(\`id\`) ON DELETE CASCADE
16
+ );
17
+ `)
18
+ })
19
+ },
20
+ } satisfies DatabaseMigration.Migration
@@ -0,0 +1,19 @@
1
+ import { Effect } from "effect"
2
+ import type { DatabaseMigration } from "../migration"
3
+
4
+ export default {
5
+ id: "20260603001617_session_message_projection_indexes",
6
+ up(tx) {
7
+ return Effect.gen(function* () {
8
+ yield* tx.run(`DROP INDEX IF EXISTS \`session_message_session_idx\`;`)
9
+ yield* tx.run(`DROP INDEX IF EXISTS \`session_message_session_type_idx\`;`)
10
+ yield* tx.run(`CREATE INDEX \`event_aggregate_seq_idx\` ON \`event\` (\`aggregate_id\`,\`seq\`);`)
11
+ yield* tx.run(
12
+ `CREATE INDEX \`session_message_session_time_created_id_idx\` ON \`session_message\` (\`session_id\`,\`time_created\`,\`id\`);`,
13
+ )
14
+ yield* tx.run(
15
+ `CREATE INDEX \`session_message_session_type_time_created_id_idx\` ON \`session_message\` (\`session_id\`,\`type\`,\`time_created\`,\`id\`);`,
16
+ )
17
+ })
18
+ },
19
+ } satisfies DatabaseMigration.Migration
@@ -0,0 +1,19 @@
1
+ import { Effect } from "effect"
2
+ import type { DatabaseMigration } from "../migration"
3
+
4
+ export default {
5
+ id: "20260603040000_session_message_projection_order",
6
+ up(tx) {
7
+ return Effect.gen(function* () {
8
+ // Pre-launch Session projections were written before durable event persistence
9
+ // became unconditional, so they cannot be assigned truthful aggregate order.
10
+ yield* tx.run(`DELETE FROM \`session_message\`;`)
11
+ yield* tx.run(`ALTER TABLE \`session_message\` ADD COLUMN \`seq\` integer NOT NULL;`)
12
+ yield* tx.run(`DROP INDEX IF EXISTS \`session_message_session_type_time_created_id_idx\`;`)
13
+ yield* tx.run(`CREATE INDEX \`session_message_session_seq_idx\` ON \`session_message\` (\`session_id\`,\`seq\`);`)
14
+ yield* tx.run(
15
+ `CREATE INDEX \`session_message_session_type_seq_idx\` ON \`session_message\` (\`session_id\`,\`type\`,\`seq\`);`,
16
+ )
17
+ })
18
+ },
19
+ } satisfies DatabaseMigration.Migration
@@ -0,0 +1,25 @@
1
+ import { Effect } from "effect"
2
+ import type { DatabaseMigration } from "../migration"
3
+
4
+ export default {
5
+ id: "20260603141458_session_input_inbox",
6
+ up(tx) {
7
+ return Effect.gen(function* () {
8
+ yield* tx.run(`
9
+ CREATE TABLE \`session_input\` (
10
+ \`seq\` integer PRIMARY KEY AUTOINCREMENT,
11
+ \`id\` text NOT NULL UNIQUE,
12
+ \`session_id\` text NOT NULL,
13
+ \`prompt\` text NOT NULL,
14
+ \`delivery\` text NOT NULL,
15
+ \`promoted_seq\` integer,
16
+ \`time_created\` integer NOT NULL,
17
+ CONSTRAINT \`fk_session_input_session_id_session_id_fk\` FOREIGN KEY (\`session_id\`) REFERENCES \`session\`(\`id\`) ON DELETE CASCADE
18
+ );
19
+ `)
20
+ yield* tx.run(
21
+ `CREATE INDEX \`session_input_session_pending_seq_idx\` ON \`session_input\` (\`session_id\`,\`promoted_seq\`,\`seq\`);`,
22
+ )
23
+ })
24
+ },
25
+ } satisfies DatabaseMigration.Migration
@@ -0,0 +1,20 @@
1
+ import { Effect } from "effect"
2
+ import type { DatabaseMigration } from "../migration"
3
+
4
+ export default {
5
+ id: "20260603160727_jittery_ezekiel_stane",
6
+ up(tx) {
7
+ return Effect.gen(function* () {
8
+ yield* tx.run(`DROP INDEX IF EXISTS \`session_input_session_pending_seq_idx\`;`)
9
+ yield* tx.run(
10
+ `CREATE INDEX IF NOT EXISTS \`event_aggregate_type_seq_idx\` ON \`event\` (\`aggregate_id\`,\`type\`,\`seq\`);`,
11
+ )
12
+ yield* tx.run(
13
+ `CREATE INDEX IF NOT EXISTS \`session_input_session_pending_delivery_seq_idx\` ON \`session_input\` (\`session_id\`,\`promoted_seq\`,\`delivery\`,\`seq\`);`,
14
+ )
15
+ yield* tx.run(
16
+ `CREATE INDEX IF NOT EXISTS \`session_message_session_time_created_id_idx\` ON \`session_message\` (\`session_id\`,\`time_created\`,\`id\`);`,
17
+ )
18
+ })
19
+ },
20
+ } satisfies DatabaseMigration.Migration
@@ -0,0 +1,47 @@
1
+ import { Effect } from "effect"
2
+ import type { DatabaseMigration } from "../migration"
3
+
4
+ export default {
5
+ id: "20260604172448_event_sourced_session_input",
6
+ up(tx) {
7
+ return Effect.gen(function* () {
8
+ yield* tx.run(`DELETE FROM \`session_input\`;`)
9
+ yield* tx.run(`DELETE FROM \`session_message\`;`)
10
+ yield* tx.run(`DELETE FROM \`event\`;`)
11
+ yield* tx.run(`DELETE FROM \`event_sequence\`;`)
12
+ yield* tx.run(`UPDATE \`session\` SET \`workspace_id\` = NULL;`)
13
+ yield* tx.run(`DELETE FROM \`workspace\`;`)
14
+ yield* tx.run(`DROP INDEX IF EXISTS \`event_aggregate_seq_idx\`;`)
15
+ yield* tx.run(`CREATE UNIQUE INDEX \`event_aggregate_seq_idx\` ON \`event\` (\`aggregate_id\`,\`seq\`);`)
16
+ yield* tx.run(`DROP INDEX IF EXISTS \`session_message_session_seq_idx\`;`)
17
+ yield* tx.run(
18
+ `CREATE UNIQUE INDEX \`session_message_session_seq_idx\` ON \`session_message\` (\`session_id\`,\`seq\`);`,
19
+ )
20
+ yield* tx.run(`PRAGMA foreign_keys=OFF;`)
21
+ yield* tx.run(`
22
+ CREATE TABLE \`__new_session_input\` (
23
+ \`id\` text PRIMARY KEY,
24
+ \`session_id\` text NOT NULL,
25
+ \`prompt\` text NOT NULL,
26
+ \`delivery\` text NOT NULL,
27
+ \`admitted_seq\` integer NOT NULL,
28
+ \`promoted_seq\` integer,
29
+ \`time_created\` integer NOT NULL,
30
+ CONSTRAINT \`fk_session_input_session_id_session_id_fk\` FOREIGN KEY (\`session_id\`) REFERENCES \`session\`(\`id\`) ON DELETE CASCADE
31
+ );
32
+ `)
33
+ yield* tx.run(`DROP TABLE \`session_input\`;`)
34
+ yield* tx.run(`ALTER TABLE \`__new_session_input\` RENAME TO \`session_input\`;`)
35
+ yield* tx.run(`PRAGMA foreign_keys=ON;`)
36
+ yield* tx.run(
37
+ `CREATE INDEX \`session_input_session_pending_delivery_seq_idx\` ON \`session_input\` (\`session_id\`,\`promoted_seq\`,\`delivery\`,\`admitted_seq\`);`,
38
+ )
39
+ yield* tx.run(
40
+ `CREATE UNIQUE INDEX \`session_input_session_admitted_seq_idx\` ON \`session_input\` (\`session_id\`,\`admitted_seq\`);`,
41
+ )
42
+ yield* tx.run(
43
+ `CREATE UNIQUE INDEX \`session_input_session_promoted_seq_idx\` ON \`session_input\` (\`session_id\`,\`promoted_seq\`);`,
44
+ )
45
+ })
46
+ },
47
+ } satisfies DatabaseMigration.Migration
@@ -0,0 +1,21 @@
1
+ import { Effect } from "effect"
2
+ import type { DatabaseMigration } from "../migration"
3
+
4
+ export default {
5
+ id: "20260605003541_add_session_context_snapshot",
6
+ up(tx) {
7
+ return Effect.gen(function* () {
8
+ yield* tx.run(`
9
+ CREATE TABLE \`session_context_epoch\` (
10
+ \`session_id\` text PRIMARY KEY,
11
+ \`baseline\` text NOT NULL,
12
+ \`snapshot\` text NOT NULL,
13
+ \`baseline_seq\` integer NOT NULL,
14
+ \`replacement_seq\` integer,
15
+ \`revision\` integer DEFAULT 0 NOT NULL,
16
+ CONSTRAINT \`fk_session_context_epoch_session_id_session_id_fk\` FOREIGN KEY (\`session_id\`) REFERENCES \`session\`(\`id\`) ON DELETE CASCADE
17
+ );
18
+ `)
19
+ })
20
+ },
21
+ } satisfies DatabaseMigration.Migration