@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,11 @@
1
+ import { Effect } from "effect"
2
+ import type { DatabaseMigration } from "../migration"
3
+
4
+ export default {
5
+ id: "20260605042240_add_context_epoch_agent",
6
+ up(tx) {
7
+ return Effect.gen(function* () {
8
+ yield* tx.run(`ALTER TABLE \`session_context_epoch\` ADD \`agent\` text DEFAULT 'build' NOT NULL;`)
9
+ })
10
+ },
11
+ } satisfies DatabaseMigration.Migration
@@ -0,0 +1,25 @@
1
+ import { Effect } from "effect"
2
+ import type { DatabaseMigration } from "../migration"
3
+
4
+ export default {
5
+ id: "20260611035744_credential",
6
+ up(tx) {
7
+ return Effect.gen(function* () {
8
+ yield* tx.run(`
9
+ CREATE TABLE \`credential\` (
10
+ \`id\` text PRIMARY KEY,
11
+ \`connector_id\` text NOT NULL,
12
+ \`method_id\` text NOT NULL,
13
+ \`label\` text NOT NULL,
14
+ \`value\` text NOT NULL,
15
+ \`active\` integer DEFAULT false NOT NULL,
16
+ \`time_created\` integer NOT NULL,
17
+ \`time_updated\` integer NOT NULL
18
+ );
19
+ `)
20
+ yield* tx.run(
21
+ `CREATE UNIQUE INDEX \`credential_connector_active_idx\` ON \`credential\` (\`connector_id\`) WHERE "credential"."active" = 1;`,
22
+ )
23
+ })
24
+ },
25
+ } satisfies DatabaseMigration.Migration
@@ -0,0 +1,25 @@
1
+ import { Effect } from "effect"
2
+ import type { DatabaseMigration } from "../migration"
3
+
4
+ export default {
5
+ id: "20260611192811_lush_chimera",
6
+ up(tx) {
7
+ return Effect.gen(function* () {
8
+ yield* tx.run(`DROP INDEX IF EXISTS \`credential_connector_active_idx\`;`)
9
+ yield* tx.run(`DROP TABLE \`credential\`;`)
10
+ yield* tx.run(`
11
+ CREATE TABLE \`credential\` (
12
+ \`id\` text PRIMARY KEY,
13
+ \`integration_id\` text,
14
+ \`label\` text NOT NULL,
15
+ \`value\` text NOT NULL,
16
+ \`connector_id\` text,
17
+ \`method_id\` text,
18
+ \`active\` integer,
19
+ \`time_created\` integer NOT NULL,
20
+ \`time_updated\` integer NOT NULL
21
+ );
22
+ `)
23
+ })
24
+ },
25
+ } satisfies DatabaseMigration.Migration
@@ -0,0 +1,29 @@
1
+ import { Effect } from "effect"
2
+ import type { DatabaseMigration } from "../migration"
3
+
4
+ export default {
5
+ id: "20260612174303_project_dir_strategy",
6
+ up(tx) {
7
+ return Effect.gen(function* () {
8
+ yield* tx.run(`ALTER TABLE \`project_directory\` ADD \`strategy\` text;`)
9
+ yield* tx.run(`PRAGMA foreign_keys=OFF;`)
10
+ yield* tx.run(`
11
+ CREATE TABLE \`__new_project_directory\` (
12
+ \`project_id\` text NOT NULL,
13
+ \`directory\` text NOT NULL,
14
+ \`type\` text,
15
+ \`strategy\` text,
16
+ \`time_created\` integer NOT NULL,
17
+ CONSTRAINT \`project_directory_pk\` PRIMARY KEY(\`project_id\`, \`directory\`),
18
+ CONSTRAINT \`fk_project_directory_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_project_directory\`(\`project_id\`, \`directory\`, \`type\`, \`time_created\`) SELECT \`project_id\`, \`directory\`, \`type\`, \`time_created\` FROM \`project_directory\`;`,
23
+ )
24
+ yield* tx.run(`DROP TABLE \`project_directory\`;`)
25
+ yield* tx.run(`ALTER TABLE \`__new_project_directory\` RENAME TO \`project_directory\`;`)
26
+ yield* tx.run(`PRAGMA foreign_keys=ON;`)
27
+ })
28
+ },
29
+ } satisfies DatabaseMigration.Migration
@@ -0,0 +1,13 @@
1
+ import { Effect } from "effect"
2
+ import type { DatabaseMigration } from "../migration"
3
+
4
+ export default {
5
+ id: "20260622142730_simplify_session_context_epoch",
6
+ up(tx) {
7
+ return Effect.gen(function* () {
8
+ yield* tx.run(`ALTER TABLE \`session_context_epoch\` DROP COLUMN \`agent\`;`)
9
+ yield* tx.run(`ALTER TABLE \`session_context_epoch\` DROP COLUMN \`replacement_seq\`;`)
10
+ yield* tx.run(`ALTER TABLE \`session_context_epoch\` DROP COLUMN \`revision\`;`)
11
+ })
12
+ },
13
+ } satisfies DatabaseMigration.Migration
@@ -0,0 +1,17 @@
1
+ import { Effect } from "effect"
2
+ import type { DatabaseMigration } from "../migration"
3
+
4
+ export default {
5
+ id: "20260622170816_reset_v2_session_state",
6
+ up(tx) {
7
+ return Effect.gen(function* () {
8
+ yield* tx.run(`DELETE FROM \`session_context_epoch\`;`)
9
+ yield* tx.run(`DELETE FROM \`session_input\`;`)
10
+ yield* tx.run(`DELETE FROM \`session_message\`;`)
11
+ yield* tx.run(`DELETE FROM \`event\`;`)
12
+ yield* tx.run(`DELETE FROM \`event_sequence\`;`)
13
+ yield* tx.run(`UPDATE \`session\` SET \`workspace_id\` = NULL WHERE \`workspace_id\` IS NOT NULL;`)
14
+ yield* tx.run(`DELETE FROM \`workspace\`;`)
15
+ })
16
+ },
17
+ } satisfies DatabaseMigration.Migration
@@ -0,0 +1,17 @@
1
+ import { Effect } from "effect"
2
+ import type { DatabaseMigration } from "../migration"
3
+
4
+ export default {
5
+ id: "20260622202450_simplify_session_input",
6
+ up(tx) {
7
+ return Effect.gen(function* () {
8
+ yield* tx.run(`DELETE FROM \`session_context_epoch\`;`)
9
+ yield* tx.run(`DELETE FROM \`session_input\`;`)
10
+ yield* tx.run(`DELETE FROM \`session_message\`;`)
11
+ yield* tx.run(`DELETE FROM \`event\`;`)
12
+ yield* tx.run(`DELETE FROM \`event_sequence\`;`)
13
+ yield* tx.run(`UPDATE \`session\` SET \`workspace_id\` = NULL WHERE \`workspace_id\` IS NOT NULL;`)
14
+ yield* tx.run(`DELETE FROM \`workspace\`;`)
15
+ })
16
+ },
17
+ } satisfies DatabaseMigration.Migration
@@ -0,0 +1,44 @@
1
+ import type { DatabaseMigration } from "./migration"
2
+
3
+ export const migrations = (
4
+ await Promise.all([
5
+ import("./migration/20260127222353_familiar_lady_ursula"),
6
+ import("./migration/20260211171708_add_project_commands"),
7
+ import("./migration/20260213144116_wakeful_the_professor"),
8
+ import("./migration/20260225215848_workspace"),
9
+ import("./migration/20260227213759_add_session_workspace_id"),
10
+ import("./migration/20260228203230_blue_harpoon"),
11
+ import("./migration/20260303231226_add_workspace_fields"),
12
+ import("./migration/20260309230000_move_org_to_state"),
13
+ import("./migration/20260312043431_session_message_cursor"),
14
+ import("./migration/20260323234822_events"),
15
+ import("./migration/20260410174513_workspace-name"),
16
+ import("./migration/20260413175956_chief_energizer"),
17
+ import("./migration/20260423070820_add_icon_url_override"),
18
+ import("./migration/20260427172553_slow_nightmare"),
19
+ import("./migration/20260428004200_add_session_path"),
20
+ import("./migration/20260501142318_next_venus"),
21
+ import("./migration/20260504145000_add_sync_owner"),
22
+ import("./migration/20260507164347_add_workspace_time"),
23
+ import("./migration/20260510033149_session_usage"),
24
+ import("./migration/20260511000411_data_migration_state"),
25
+ import("./migration/20260511173437_session-metadata"),
26
+ import("./migration/20260601010001_normalize_storage_paths"),
27
+ import("./migration/20260601202201_amazing_prowler"),
28
+ import("./migration/20260602002951_lowly_union_jack"),
29
+ import("./migration/20260602182828_add_project_directories"),
30
+ import("./migration/20260603001617_session_message_projection_indexes"),
31
+ import("./migration/20260603040000_session_message_projection_order"),
32
+ import("./migration/20260603141458_session_input_inbox"),
33
+ import("./migration/20260603160727_jittery_ezekiel_stane"),
34
+ import("./migration/20260604172448_event_sourced_session_input"),
35
+ import("./migration/20260605003541_add_session_context_snapshot"),
36
+ import("./migration/20260605042240_add_context_epoch_agent"),
37
+ import("./migration/20260611035744_credential"),
38
+ import("./migration/20260611192811_lush_chimera"),
39
+ import("./migration/20260612174303_project_dir_strategy"),
40
+ import("./migration/20260622142730_simplify_session_context_epoch"),
41
+ import("./migration/20260622170816_reset_v2_session_state"),
42
+ import("./migration/20260622202450_simplify_session_input"),
43
+ ])
44
+ ).map((module) => module.default) satisfies DatabaseMigration.Migration[]
@@ -0,0 +1,81 @@
1
+ export * as DatabaseMigration from "./migration"
2
+
3
+ import { sql } from "drizzle-orm"
4
+ import { Effect, Semaphore } from "effect"
5
+ import type { EffectDrizzleSqlite } from "@neurocode-ai/effect-drizzle-sqlite"
6
+ import { migrations } from "./migration.gen"
7
+ import schema from "./schema.gen"
8
+
9
+ type Database = EffectDrizzleSqlite.EffectSQLiteDatabase
10
+ type Transaction = Parameters<Parameters<Database["transaction"]>[0]>[0]
11
+ const lock = Semaphore.makeUnsafe(1)
12
+
13
+ export type Migration = {
14
+ id: string
15
+ up: (tx: Transaction) => Effect.Effect<void, unknown>
16
+ }
17
+
18
+ export function apply(db: Database) {
19
+ return lock.withPermit(
20
+ Effect.gen(function* () {
21
+ const tables = yield* db.all<{ name: string }>(
22
+ sql`SELECT name FROM sqlite_master WHERE type = 'table' AND name NOT LIKE 'sqlite_%'`,
23
+ )
24
+ if (tables.some((table) => table.name === "session")) return yield* applyOnly(db, migrations)
25
+ if (tables.length > 0) return yield* Effect.die("Database is not empty and has no session table")
26
+ yield* db.transaction((tx) =>
27
+ Effect.gen(function* () {
28
+ yield* schema.up(tx)
29
+ yield* tx.run(
30
+ sql`CREATE TABLE ${sql.identifier("migration")} (id TEXT PRIMARY KEY, time_completed INTEGER NOT NULL)`,
31
+ )
32
+ yield* Effect.forEach(migrations, (migration) =>
33
+ tx.run(
34
+ sql`INSERT INTO ${sql.identifier("migration")} (id, time_completed) VALUES (${migration.id}, ${Date.now()})`,
35
+ ),
36
+ )
37
+ }),
38
+ )
39
+ }),
40
+ )
41
+ }
42
+
43
+ export function applyOnly(db: Database, input: Migration[]) {
44
+ return Effect.gen(function* () {
45
+ yield* db.run(
46
+ sql`CREATE TABLE IF NOT EXISTS ${sql.identifier("migration")} (id TEXT PRIMARY KEY, time_completed INTEGER NOT NULL)`,
47
+ )
48
+ let completed = new Set(
49
+ (yield* db.all<{ id: string }>(sql`SELECT id FROM ${sql.identifier("migration")}`)).map((row) => row.id),
50
+ )
51
+ if (completed.size === 0) {
52
+ // Existing installs used Drizzle's migration journal. Seed the new
53
+ // journal once so TypeScript migrations don't replay old SQL.
54
+ if (
55
+ yield* db.get(sql`SELECT name FROM sqlite_master WHERE type = 'table' AND name = ${"__drizzle_migrations"}`)
56
+ ) {
57
+ yield* db.run(sql`
58
+ INSERT OR IGNORE INTO ${sql.identifier("migration")} (id, time_completed)
59
+ SELECT name, ${Date.now()}
60
+ FROM ${sql.identifier("__drizzle_migrations")}
61
+ WHERE name IS NOT NULL
62
+ `)
63
+ completed = new Set(
64
+ (yield* db.all<{ id: string }>(sql`SELECT id FROM ${sql.identifier("migration")}`)).map((row) => row.id),
65
+ )
66
+ }
67
+ }
68
+
69
+ for (const migration of input) {
70
+ if (completed.has(migration.id)) continue
71
+ yield* db.transaction((tx) =>
72
+ Effect.gen(function* () {
73
+ yield* migration.up(tx)
74
+ yield* tx.run(
75
+ sql`INSERT INTO ${sql.identifier("migration")} (id, time_completed) VALUES (${migration.id}, ${Date.now()})`,
76
+ )
77
+ }),
78
+ )
79
+ }
80
+ })
81
+ }
@@ -0,0 +1,91 @@
1
+ import nodePath from "path"
2
+ import { customType } from "drizzle-orm/sqlite-core"
3
+ import { AbsolutePath } from "../schema"
4
+
5
+ function storagePath(input: string) {
6
+ if (process.platform !== "win32") return input
7
+ return input.replaceAll("\\", "/")
8
+ }
9
+
10
+ function isWindowsStoragePath(input: string) {
11
+ return /^[A-Za-z]:\//.test(input) || input.startsWith("//")
12
+ }
13
+
14
+ function absolute(input: string) {
15
+ const result = storagePath(input)
16
+ if (!nodePath.posix.isAbsolute(result) && !(process.platform === "win32" && isWindowsStoragePath(result))) {
17
+ throw new Error(`Path is not absolute: ${input}`)
18
+ }
19
+ return result
20
+ }
21
+
22
+ function toPlatform(input: string) {
23
+ if (process.platform !== "win32" || !isWindowsStoragePath(input)) return input
24
+ return input.replaceAll("/", "\\")
25
+ }
26
+
27
+ export const absoluteColumn = customType<{
28
+ data: AbsolutePath
29
+ driverData: string
30
+ driverOutput: string
31
+ }>({
32
+ dataType() {
33
+ return "text"
34
+ },
35
+ toDriver(input) {
36
+ return absolute(input)
37
+ },
38
+ fromDriver(input) {
39
+ return AbsolutePath.make(toPlatform(absolute(input)))
40
+ },
41
+ })
42
+
43
+ // Legacy sessions may persist an empty directory. Keep that existing value
44
+ // readable while normalizing and validating every real directory.
45
+ export const directoryColumn = customType<{
46
+ data: string
47
+ driverData: string
48
+ driverOutput: string
49
+ }>({
50
+ dataType() {
51
+ return "text"
52
+ },
53
+ toDriver(input) {
54
+ return input ? absolute(input) : input
55
+ },
56
+ fromDriver(input) {
57
+ return input ? toPlatform(absolute(input)) : input
58
+ },
59
+ })
60
+
61
+ export const pathColumn = customType<{
62
+ data: string
63
+ driverData: string
64
+ driverOutput: string
65
+ }>({
66
+ dataType() {
67
+ return "text"
68
+ },
69
+ toDriver(input) {
70
+ return storagePath(input)
71
+ },
72
+ fromDriver(input) {
73
+ return storagePath(input)
74
+ },
75
+ })
76
+
77
+ export const absoluteArrayColumn = customType<{
78
+ data: AbsolutePath[]
79
+ driverData: string
80
+ driverOutput: string
81
+ }>({
82
+ dataType() {
83
+ return "text"
84
+ },
85
+ toDriver(input) {
86
+ return JSON.stringify(input.map(absolute))
87
+ },
88
+ fromDriver(input) {
89
+ return (JSON.parse(input) as string[]).map((item) => AbsolutePath.make(toPlatform(absolute(item))))
90
+ },
91
+ })
@@ -0,0 +1,274 @@
1
+ import { Effect } from "effect"
2
+ import type { DatabaseMigration } from "./migration"
3
+
4
+ export default {
5
+ up(tx) {
6
+ return Effect.gen(function* () {
7
+ yield* tx.run(`
8
+ CREATE TABLE \`workspace\` (
9
+ \`id\` text PRIMARY KEY,
10
+ \`type\` text NOT NULL,
11
+ \`name\` text DEFAULT '' NOT NULL,
12
+ \`branch\` text,
13
+ \`directory\` text,
14
+ \`extra\` text,
15
+ \`project_id\` text NOT NULL,
16
+ \`time_used\` integer NOT NULL,
17
+ CONSTRAINT \`fk_workspace_project_id_project_id_fk\` FOREIGN KEY (\`project_id\`) REFERENCES \`project\`(\`id\`) ON DELETE CASCADE
18
+ );
19
+ `)
20
+ yield* tx.run(`
21
+ CREATE TABLE \`data_migration\` (
22
+ \`name\` text PRIMARY KEY,
23
+ \`time_completed\` integer NOT NULL
24
+ );
25
+ `)
26
+ yield* tx.run(`
27
+ CREATE TABLE \`account_state\` (
28
+ \`id\` integer PRIMARY KEY,
29
+ \`active_account_id\` text,
30
+ \`active_org_id\` text,
31
+ CONSTRAINT \`fk_account_state_active_account_id_account_id_fk\` FOREIGN KEY (\`active_account_id\`) REFERENCES \`account\`(\`id\`) ON DELETE SET NULL
32
+ );
33
+ `)
34
+ yield* tx.run(`
35
+ CREATE TABLE \`account\` (
36
+ \`id\` text PRIMARY KEY,
37
+ \`email\` text NOT NULL,
38
+ \`url\` text NOT NULL,
39
+ \`access_token\` text NOT NULL,
40
+ \`refresh_token\` text NOT NULL,
41
+ \`token_expiry\` integer,
42
+ \`time_created\` integer NOT NULL,
43
+ \`time_updated\` integer NOT NULL
44
+ );
45
+ `)
46
+ yield* tx.run(`
47
+ CREATE TABLE \`control_account\` (
48
+ \`email\` text NOT NULL,
49
+ \`url\` text NOT NULL,
50
+ \`access_token\` text NOT NULL,
51
+ \`refresh_token\` text NOT NULL,
52
+ \`token_expiry\` integer,
53
+ \`active\` integer NOT NULL,
54
+ \`time_created\` integer NOT NULL,
55
+ \`time_updated\` integer NOT NULL,
56
+ CONSTRAINT \`control_account_pk\` PRIMARY KEY(\`email\`, \`url\`)
57
+ );
58
+ `)
59
+ yield* tx.run(`
60
+ CREATE TABLE \`credential\` (
61
+ \`id\` text PRIMARY KEY,
62
+ \`integration_id\` text,
63
+ \`label\` text NOT NULL,
64
+ \`value\` text NOT NULL,
65
+ \`connector_id\` text,
66
+ \`method_id\` text,
67
+ \`active\` integer,
68
+ \`time_created\` integer NOT NULL,
69
+ \`time_updated\` integer NOT NULL
70
+ );
71
+ `)
72
+ yield* tx.run(`
73
+ CREATE TABLE \`event_sequence\` (
74
+ \`aggregate_id\` text PRIMARY KEY,
75
+ \`seq\` integer NOT NULL,
76
+ \`owner_id\` text
77
+ );
78
+ `)
79
+ yield* tx.run(`
80
+ CREATE TABLE \`event\` (
81
+ \`id\` text PRIMARY KEY,
82
+ \`aggregate_id\` text NOT NULL,
83
+ \`seq\` integer NOT NULL,
84
+ \`type\` text NOT NULL,
85
+ \`data\` text NOT NULL,
86
+ CONSTRAINT \`fk_event_aggregate_id_event_sequence_aggregate_id_fk\` FOREIGN KEY (\`aggregate_id\`) REFERENCES \`event_sequence\`(\`aggregate_id\`) ON DELETE CASCADE
87
+ );
88
+ `)
89
+ yield* tx.run(`
90
+ CREATE TABLE \`permission\` (
91
+ \`id\` text PRIMARY KEY,
92
+ \`project_id\` text NOT NULL,
93
+ \`action\` text NOT NULL,
94
+ \`resource\` text NOT NULL,
95
+ \`time_created\` integer NOT NULL,
96
+ \`time_updated\` integer NOT NULL,
97
+ CONSTRAINT \`fk_permission_project_id_project_id_fk\` FOREIGN KEY (\`project_id\`) REFERENCES \`project\`(\`id\`) ON DELETE CASCADE
98
+ );
99
+ `)
100
+ yield* tx.run(`
101
+ CREATE TABLE \`project_directory\` (
102
+ \`project_id\` text NOT NULL,
103
+ \`directory\` text NOT NULL,
104
+ \`type\` text,
105
+ \`strategy\` text,
106
+ \`time_created\` integer NOT NULL,
107
+ CONSTRAINT \`project_directory_pk\` PRIMARY KEY(\`project_id\`, \`directory\`),
108
+ CONSTRAINT \`fk_project_directory_project_id_project_id_fk\` FOREIGN KEY (\`project_id\`) REFERENCES \`project\`(\`id\`) ON DELETE CASCADE
109
+ );
110
+ `)
111
+ yield* tx.run(`
112
+ CREATE TABLE \`project\` (
113
+ \`id\` text PRIMARY KEY,
114
+ \`worktree\` text NOT NULL,
115
+ \`vcs\` text,
116
+ \`name\` text,
117
+ \`icon_url\` text,
118
+ \`icon_url_override\` text,
119
+ \`icon_color\` text,
120
+ \`time_created\` integer NOT NULL,
121
+ \`time_updated\` integer NOT NULL,
122
+ \`time_initialized\` integer,
123
+ \`sandboxes\` text NOT NULL,
124
+ \`commands\` text
125
+ );
126
+ `)
127
+ yield* tx.run(`
128
+ CREATE TABLE \`message\` (
129
+ \`id\` text PRIMARY KEY,
130
+ \`session_id\` text NOT NULL,
131
+ \`time_created\` integer NOT NULL,
132
+ \`time_updated\` integer NOT NULL,
133
+ \`data\` text NOT NULL,
134
+ CONSTRAINT \`fk_message_session_id_session_id_fk\` FOREIGN KEY (\`session_id\`) REFERENCES \`session\`(\`id\`) ON DELETE CASCADE
135
+ );
136
+ `)
137
+ yield* tx.run(`
138
+ CREATE TABLE \`part\` (
139
+ \`id\` text PRIMARY KEY,
140
+ \`message_id\` text NOT NULL,
141
+ \`session_id\` text NOT NULL,
142
+ \`time_created\` integer NOT NULL,
143
+ \`time_updated\` integer NOT NULL,
144
+ \`data\` text NOT NULL,
145
+ CONSTRAINT \`fk_part_message_id_message_id_fk\` FOREIGN KEY (\`message_id\`) REFERENCES \`message\`(\`id\`) ON DELETE CASCADE
146
+ );
147
+ `)
148
+ yield* tx.run(`
149
+ CREATE TABLE \`session_context_epoch\` (
150
+ \`session_id\` text PRIMARY KEY,
151
+ \`baseline\` text NOT NULL,
152
+ \`snapshot\` text NOT NULL,
153
+ \`baseline_seq\` integer NOT NULL,
154
+ CONSTRAINT \`fk_session_context_epoch_session_id_session_id_fk\` FOREIGN KEY (\`session_id\`) REFERENCES \`session\`(\`id\`) ON DELETE CASCADE
155
+ );
156
+ `)
157
+ yield* tx.run(`
158
+ CREATE TABLE \`session_input\` (
159
+ \`id\` text PRIMARY KEY,
160
+ \`session_id\` text NOT NULL,
161
+ \`prompt\` text NOT NULL,
162
+ \`delivery\` text NOT NULL,
163
+ \`admitted_seq\` integer NOT NULL,
164
+ \`promoted_seq\` integer,
165
+ \`time_created\` integer NOT NULL,
166
+ CONSTRAINT \`fk_session_input_session_id_session_id_fk\` FOREIGN KEY (\`session_id\`) REFERENCES \`session\`(\`id\`) ON DELETE CASCADE
167
+ );
168
+ `)
169
+ yield* tx.run(`
170
+ CREATE TABLE \`session_message\` (
171
+ \`id\` text PRIMARY KEY,
172
+ \`session_id\` text NOT NULL,
173
+ \`type\` text NOT NULL,
174
+ \`seq\` integer NOT NULL,
175
+ \`time_created\` integer NOT NULL,
176
+ \`time_updated\` integer NOT NULL,
177
+ \`data\` text NOT NULL,
178
+ CONSTRAINT \`fk_session_message_session_id_session_id_fk\` FOREIGN KEY (\`session_id\`) REFERENCES \`session\`(\`id\`) ON DELETE CASCADE
179
+ );
180
+ `)
181
+ yield* tx.run(`
182
+ CREATE TABLE \`session\` (
183
+ \`id\` text PRIMARY KEY,
184
+ \`project_id\` text NOT NULL,
185
+ \`workspace_id\` text,
186
+ \`parent_id\` text,
187
+ \`slug\` text NOT NULL,
188
+ \`directory\` text NOT NULL,
189
+ \`path\` text,
190
+ \`title\` text NOT NULL,
191
+ \`version\` text NOT NULL,
192
+ \`share_url\` text,
193
+ \`summary_additions\` integer,
194
+ \`summary_deletions\` integer,
195
+ \`summary_files\` integer,
196
+ \`summary_diffs\` text,
197
+ \`metadata\` text,
198
+ \`cost\` real DEFAULT 0 NOT NULL,
199
+ \`tokens_input\` integer DEFAULT 0 NOT NULL,
200
+ \`tokens_output\` integer DEFAULT 0 NOT NULL,
201
+ \`tokens_reasoning\` integer DEFAULT 0 NOT NULL,
202
+ \`tokens_cache_read\` integer DEFAULT 0 NOT NULL,
203
+ \`tokens_cache_write\` integer DEFAULT 0 NOT NULL,
204
+ \`revert\` text,
205
+ \`permission\` text,
206
+ \`agent\` text,
207
+ \`model\` text,
208
+ \`time_created\` integer NOT NULL,
209
+ \`time_updated\` integer NOT NULL,
210
+ \`time_compacting\` integer,
211
+ \`time_archived\` integer,
212
+ CONSTRAINT \`fk_session_project_id_project_id_fk\` FOREIGN KEY (\`project_id\`) REFERENCES \`project\`(\`id\`) ON DELETE CASCADE
213
+ );
214
+ `)
215
+ yield* tx.run(`
216
+ CREATE TABLE \`todo\` (
217
+ \`session_id\` text NOT NULL,
218
+ \`content\` text NOT NULL,
219
+ \`status\` text NOT NULL,
220
+ \`priority\` text NOT NULL,
221
+ \`position\` integer NOT NULL,
222
+ \`time_created\` integer NOT NULL,
223
+ \`time_updated\` integer NOT NULL,
224
+ CONSTRAINT \`todo_pk\` PRIMARY KEY(\`session_id\`, \`position\`),
225
+ CONSTRAINT \`fk_todo_session_id_session_id_fk\` FOREIGN KEY (\`session_id\`) REFERENCES \`session\`(\`id\`) ON DELETE CASCADE
226
+ );
227
+ `)
228
+ yield* tx.run(`
229
+ CREATE TABLE \`session_share\` (
230
+ \`session_id\` text PRIMARY KEY,
231
+ \`id\` text NOT NULL,
232
+ \`secret\` text NOT NULL,
233
+ \`url\` text NOT NULL,
234
+ \`time_created\` integer NOT NULL,
235
+ \`time_updated\` integer NOT NULL,
236
+ CONSTRAINT \`fk_session_share_session_id_session_id_fk\` FOREIGN KEY (\`session_id\`) REFERENCES \`session\`(\`id\`) ON DELETE CASCADE
237
+ );
238
+ `)
239
+ yield* tx.run(`CREATE UNIQUE INDEX \`event_aggregate_seq_idx\` ON \`event\` (\`aggregate_id\`,\`seq\`);`)
240
+ yield* tx.run(`CREATE INDEX \`event_aggregate_type_seq_idx\` ON \`event\` (\`aggregate_id\`,\`type\`,\`seq\`);`)
241
+ yield* tx.run(
242
+ `CREATE UNIQUE INDEX \`permission_project_action_resource_idx\` ON \`permission\` (\`project_id\`,\`action\`,\`resource\`);`,
243
+ )
244
+ yield* tx.run(
245
+ `CREATE INDEX \`message_session_time_created_id_idx\` ON \`message\` (\`session_id\`,\`time_created\`,\`id\`);`,
246
+ )
247
+ yield* tx.run(`CREATE INDEX \`part_message_id_id_idx\` ON \`part\` (\`message_id\`,\`id\`);`)
248
+ yield* tx.run(`CREATE INDEX \`part_session_idx\` ON \`part\` (\`session_id\`);`)
249
+ yield* tx.run(
250
+ `CREATE INDEX \`session_input_session_pending_delivery_seq_idx\` ON \`session_input\` (\`session_id\`,\`promoted_seq\`,\`delivery\`,\`admitted_seq\`);`,
251
+ )
252
+ yield* tx.run(
253
+ `CREATE UNIQUE INDEX \`session_input_session_admitted_seq_idx\` ON \`session_input\` (\`session_id\`,\`admitted_seq\`);`,
254
+ )
255
+ yield* tx.run(
256
+ `CREATE UNIQUE INDEX \`session_input_session_promoted_seq_idx\` ON \`session_input\` (\`session_id\`,\`promoted_seq\`);`,
257
+ )
258
+ yield* tx.run(
259
+ `CREATE UNIQUE INDEX \`session_message_session_seq_idx\` ON \`session_message\` (\`session_id\`,\`seq\`);`,
260
+ )
261
+ yield* tx.run(
262
+ `CREATE INDEX \`session_message_session_type_seq_idx\` ON \`session_message\` (\`session_id\`,\`type\`,\`seq\`);`,
263
+ )
264
+ yield* tx.run(
265
+ `CREATE INDEX \`session_message_session_time_created_id_idx\` ON \`session_message\` (\`session_id\`,\`time_created\`,\`id\`);`,
266
+ )
267
+ yield* tx.run(`CREATE INDEX \`session_message_time_created_idx\` ON \`session_message\` (\`time_created\`);`)
268
+ yield* tx.run(`CREATE INDEX \`session_project_idx\` ON \`session\` (\`project_id\`);`)
269
+ yield* tx.run(`CREATE INDEX \`session_workspace_idx\` ON \`session\` (\`workspace_id\`);`)
270
+ yield* tx.run(`CREATE INDEX \`session_parent_idx\` ON \`session\` (\`parent_id\`);`)
271
+ yield* tx.run(`CREATE INDEX \`todo_session_idx\` ON \`todo\` (\`session_id\`);`)
272
+ })
273
+ },
274
+ } satisfies Omit<DatabaseMigration.Migration, "id">
@@ -0,0 +1,10 @@
1
+ import { integer } from "drizzle-orm/sqlite-core"
2
+
3
+ export const Timestamps = {
4
+ time_created: integer()
5
+ .notNull()
6
+ .$default(() => Date.now()),
7
+ time_updated: integer()
8
+ .notNull()
9
+ .$onUpdate(() => Date.now()),
10
+ }