@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,89 @@
1
+ export * as ConfigAgentV1 from "./agent"
2
+
3
+ import { Schema, SchemaGetter } from "effect"
4
+ import { PositiveInt } from "../../schema"
5
+ import { ConfigPermissionV1 } from "./permission"
6
+
7
+ const Color = Schema.Union([
8
+ Schema.String.check(Schema.isPattern(/^#[0-9a-fA-F]{6}$/)),
9
+ Schema.Literals(["primary", "secondary", "accent", "success", "warning", "error", "info"]),
10
+ ])
11
+
12
+ const AgentSchema = Schema.StructWithRest(
13
+ Schema.Struct({
14
+ model: Schema.optional(Schema.String),
15
+ variant: Schema.optional(Schema.String).annotate({
16
+ description: "Default model variant for this agent (applies only when using the agent's configured model).",
17
+ }),
18
+ temperature: Schema.optional(Schema.Finite),
19
+ top_p: Schema.optional(Schema.Finite),
20
+ prompt: Schema.optional(Schema.String),
21
+ tools: Schema.optional(Schema.Record(Schema.String, Schema.Boolean)).annotate({
22
+ description: "@deprecated Use 'permission' field instead",
23
+ }),
24
+ disable: Schema.optional(Schema.Boolean),
25
+ description: Schema.optional(Schema.String).annotate({ description: "Description of when to use the agent" }),
26
+ mode: Schema.optional(Schema.Literals(["subagent", "primary", "all"])),
27
+ hidden: Schema.optional(Schema.Boolean).annotate({
28
+ description: "Hide this subagent from the @ autocomplete menu (default: false, only applies to mode: subagent)",
29
+ }),
30
+ options: Schema.optional(Schema.Record(Schema.String, Schema.Any)),
31
+ color: Schema.optional(Color).annotate({
32
+ description: "Hex color code (e.g., #FF5733) or theme color (e.g., primary)",
33
+ }),
34
+ steps: Schema.optional(PositiveInt).annotate({
35
+ description: "Maximum number of agentic iterations before forcing text-only response",
36
+ }),
37
+ maxSteps: Schema.optional(PositiveInt).annotate({ description: "@deprecated Use 'steps' field instead." }),
38
+ permission: Schema.optional(ConfigPermissionV1.Info),
39
+ }),
40
+ [Schema.Record(Schema.String, Schema.Any)],
41
+ )
42
+
43
+ const KNOWN_KEYS = new Set([
44
+ "name",
45
+ "model",
46
+ "variant",
47
+ "prompt",
48
+ "description",
49
+ "temperature",
50
+ "top_p",
51
+ "mode",
52
+ "hidden",
53
+ "color",
54
+ "steps",
55
+ "maxSteps",
56
+ "options",
57
+ "permission",
58
+ "disable",
59
+ "tools",
60
+ ])
61
+
62
+ const normalize = (agent: Schema.Schema.Type<typeof AgentSchema>): Schema.Schema.Type<typeof AgentSchema> => {
63
+ const options: Record<string, unknown> = { ...agent.options }
64
+ for (const [key, value] of Object.entries(agent)) {
65
+ if (!KNOWN_KEYS.has(key)) options[key] = value
66
+ }
67
+
68
+ const permission: ConfigPermissionV1.Info = {}
69
+ for (const [tool, enabled] of Object.entries(agent.tools ?? {})) {
70
+ const action = enabled ? "allow" : "deny"
71
+ if (tool === "write" || tool === "edit" || tool === "patch") {
72
+ permission.edit = action
73
+ continue
74
+ }
75
+ permission[tool] = action
76
+ }
77
+ globalThis.Object.assign(permission, agent.permission)
78
+
79
+ const steps = agent.steps ?? agent.maxSteps
80
+ return { ...agent, options, permission, ...(steps !== undefined ? { steps } : {}) }
81
+ }
82
+
83
+ export const Info = AgentSchema.pipe(
84
+ Schema.decodeTo(AgentSchema, {
85
+ decode: SchemaGetter.transform(normalize),
86
+ encode: SchemaGetter.passthrough({ strict: false }),
87
+ }),
88
+ ).annotate({ identifier: "AgentConfig" })
89
+ export type Info = Schema.Schema.Type<typeof Info>
@@ -0,0 +1,25 @@
1
+ export * as ConfigAttachmentV1 from "./attachment"
2
+
3
+ import { Schema } from "effect"
4
+ import { PositiveInt } from "../../schema"
5
+
6
+ export const Image = Schema.Struct({
7
+ auto_resize: Schema.optional(Schema.Boolean).annotate({
8
+ description: "Resize images before sending them to the model when they exceed configured limits (default: true)",
9
+ }),
10
+ max_width: Schema.optional(PositiveInt).annotate({
11
+ description: "Maximum image width before resizing or rejecting the attachment (default: 2000)",
12
+ }),
13
+ max_height: Schema.optional(PositiveInt).annotate({
14
+ description: "Maximum image height before resizing or rejecting the attachment (default: 2000)",
15
+ }),
16
+ max_base64_bytes: Schema.optional(PositiveInt).annotate({
17
+ description: "Maximum base64 payload bytes for an image attachment (default: 5242880)",
18
+ }),
19
+ }).annotate({ identifier: "ImageAttachmentConfig" })
20
+ export type Image = Schema.Schema.Type<typeof Image>
21
+
22
+ export const Info = Schema.Struct({
23
+ image: Schema.optional(Image).annotate({ description: "Image attachment configuration" }),
24
+ }).annotate({ identifier: "AttachmentConfig" })
25
+ export type Info = Schema.Schema.Type<typeof Info>
@@ -0,0 +1,13 @@
1
+ export * as ConfigCommandV1 from "./command"
2
+
3
+ import { Schema } from "effect"
4
+
5
+ export const Info = Schema.Struct({
6
+ template: Schema.String,
7
+ description: Schema.optional(Schema.String),
8
+ agent: Schema.optional(Schema.String),
9
+ model: Schema.optional(Schema.String),
10
+ variant: Schema.optional(Schema.String),
11
+ subtask: Schema.optional(Schema.Boolean),
12
+ })
13
+ export type Info = Schema.Schema.Type<typeof Info>
@@ -0,0 +1,192 @@
1
+ export * as ConfigV1 from "./config"
2
+
3
+ import { Schema } from "effect"
4
+ import { NonNegativeInt, PositiveInt, type DeepMutable } from "../../schema"
5
+ import { ConfigExperimental } from "../../config/experimental"
6
+ import { ConfigReference } from "../../config/reference"
7
+ import { ConfigAgentV1 } from "./agent"
8
+ import { ConfigAttachmentV1 } from "./attachment"
9
+ import { ConfigCommandV1 } from "./command"
10
+ import { ConfigFormatterV1 } from "./formatter"
11
+ import { ConfigLayoutV1 } from "./layout"
12
+ import { ConfigLSPV1 } from "./lsp"
13
+ import { ConfigMCPV1 } from "./mcp"
14
+ import { ConfigPermissionV1 } from "./permission"
15
+ import { ConfigPluginV1 } from "./plugin"
16
+ import { ConfigProviderV1 } from "./provider"
17
+ import { ConfigServerV1 } from "./server"
18
+ import { ConfigSkillsV1 } from "./skills"
19
+
20
+ export type Layout = ConfigLayoutV1.Layout
21
+
22
+ export const WellKnown = Schema.Struct({
23
+ config: Schema.optional(Schema.Json),
24
+ remote_config: Schema.optional(Schema.Json),
25
+ })
26
+
27
+ const LogLevelRef = Schema.Literals(["DEBUG", "INFO", "WARN", "ERROR"]).annotate({
28
+ identifier: "LogLevel",
29
+ description: "Log level",
30
+ })
31
+
32
+ export const Info = Schema.Struct({
33
+ $schema: Schema.optional(Schema.String).annotate({
34
+ description: "JSON schema reference for configuration validation",
35
+ }),
36
+ shell: Schema.optional(Schema.String).annotate({ description: "Default shell to use for terminal and bash tool" }),
37
+ logLevel: Schema.optional(LogLevelRef).annotate({ description: "Log level" }),
38
+ server: Schema.optional(ConfigServerV1.Server).annotate({
39
+ description: "Server configuration for neurocode serve and web commands",
40
+ }),
41
+ command: Schema.optional(Schema.Record(Schema.String, ConfigCommandV1.Info)).annotate({
42
+ description: "Command configuration, see https://neurocode.ai/docs/commands",
43
+ }),
44
+ skills: Schema.optional(ConfigSkillsV1.Info).annotate({ description: "Additional skill folder paths" }),
45
+ references: Schema.optional(ConfigReference.Info).annotate({
46
+ description: "Named git or local directory references",
47
+ }),
48
+ reference: Schema.optional(ConfigReference.Info).annotate({
49
+ description: "@deprecated Use 'references' field instead. Named git or local directory references",
50
+ }),
51
+ watcher: Schema.optional(Schema.Struct({ ignore: Schema.optional(Schema.mutable(Schema.Array(Schema.String))) })),
52
+ snapshot: Schema.optional(Schema.Boolean).annotate({
53
+ description:
54
+ "Enable or disable snapshot tracking. When false, filesystem snapshots are not recorded and undoing or reverting will not undo/redo file changes. Defaults to true.",
55
+ }),
56
+ plugin: Schema.optional(Schema.mutable(Schema.Array(ConfigPluginV1.Spec))),
57
+ share: Schema.optional(Schema.Literals(["manual", "auto", "disabled"])).annotate({
58
+ description:
59
+ "Control sharing behavior:'manual' allows manual sharing via commands, 'auto' enables automatic sharing, 'disabled' disables all sharing",
60
+ }),
61
+ autoshare: Schema.optional(Schema.Boolean).annotate({
62
+ description: "@deprecated Use 'share' field instead. Share newly created sessions automatically",
63
+ }),
64
+ autoupdate: Schema.optional(Schema.Union([Schema.Boolean, Schema.Literal("notify")])).annotate({
65
+ description:
66
+ "Automatically update to the latest version. Set to true to auto-update, false to disable, or 'notify' to show update notifications",
67
+ }),
68
+ disabled_providers: Schema.optional(Schema.mutable(Schema.Array(Schema.String))).annotate({
69
+ description: "Disable providers that are loaded automatically",
70
+ }),
71
+ enabled_providers: Schema.optional(Schema.mutable(Schema.Array(Schema.String))).annotate({
72
+ description: "When set, ONLY these providers will be enabled. All other providers will be ignored",
73
+ }),
74
+ model: Schema.optional(Schema.String).annotate({
75
+ description: "Model to use in the format of provider/model, eg anthropic/claude-2",
76
+ }),
77
+ small_model: Schema.optional(Schema.String).annotate({
78
+ description: "Small model to use for tasks like title generation in the format of provider/model",
79
+ }),
80
+ default_agent: Schema.optional(Schema.String).annotate({
81
+ description:
82
+ "Default agent to use when none is specified. Must be a primary agent. Falls back to 'build' if not set or if the specified agent is invalid.",
83
+ }),
84
+ subagent_depth: Schema.optional(NonNegativeInt).annotate({
85
+ description: "Maximum subagent nesting depth. Defaults to 1, which prevents subagents from launching subagents.",
86
+ }),
87
+ username: Schema.optional(Schema.String).annotate({
88
+ description: "Custom username to display in conversations instead of system username",
89
+ }),
90
+ mode: Schema.optional(
91
+ Schema.StructWithRest(
92
+ Schema.Struct({ build: Schema.optional(ConfigAgentV1.Info), plan: Schema.optional(ConfigAgentV1.Info) }),
93
+ [Schema.Record(Schema.String, ConfigAgentV1.Info)],
94
+ ),
95
+ ).annotate({ description: "@deprecated Use `agent` field instead." }),
96
+ agent: Schema.optional(
97
+ Schema.StructWithRest(
98
+ Schema.Struct({
99
+ plan: Schema.optional(ConfigAgentV1.Info),
100
+ build: Schema.optional(ConfigAgentV1.Info),
101
+ general: Schema.optional(ConfigAgentV1.Info),
102
+ explore: Schema.optional(ConfigAgentV1.Info),
103
+ title: Schema.optional(ConfigAgentV1.Info),
104
+ summary: Schema.optional(ConfigAgentV1.Info),
105
+ compaction: Schema.optional(ConfigAgentV1.Info),
106
+ }),
107
+ [Schema.Record(Schema.String, ConfigAgentV1.Info)],
108
+ ),
109
+ ).annotate({ description: "Agent configuration, see https://neurocode.ai/docs/agents" }),
110
+ provider: Schema.optional(Schema.Record(Schema.String, ConfigProviderV1.Info)).annotate({
111
+ description: "Custom provider configurations and model overrides",
112
+ }),
113
+ mcp: Schema.optional(
114
+ Schema.Record(Schema.String, Schema.Union([ConfigMCPV1.Info, Schema.Struct({ enabled: Schema.Boolean })])),
115
+ ).annotate({ description: "MCP (Model Context Protocol) server configurations" }),
116
+ formatter: Schema.optional(ConfigFormatterV1.Info).annotate({
117
+ description:
118
+ "Enable or configure formatters. Omit or set to false to disable, true to enable built-ins, or an object to enable built-ins with overrides.",
119
+ }),
120
+ lsp: Schema.optional(ConfigLSPV1.Info).annotate({
121
+ description:
122
+ "Enable or configure LSP servers. Omit or set to false to disable, true to enable built-ins, or an object to enable built-ins with overrides.",
123
+ }),
124
+ instructions: Schema.optional(Schema.mutable(Schema.Array(Schema.String))).annotate({
125
+ description: "Additional instruction files or patterns to include",
126
+ }),
127
+ layout: Schema.optional(ConfigLayoutV1.Layout).annotate({ description: "@deprecated Always uses stretch layout." }),
128
+ permission: Schema.optional(ConfigPermissionV1.Info),
129
+ tools: Schema.optional(Schema.Record(Schema.String, Schema.Boolean)),
130
+ attachment: Schema.optional(ConfigAttachmentV1.Info).annotate({
131
+ description: "Attachment processing configuration, including image size limits and resizing behavior",
132
+ }),
133
+ enterprise: Schema.optional(
134
+ Schema.Struct({ url: Schema.optional(Schema.String).annotate({ description: "Enterprise URL" }) }),
135
+ ),
136
+ tool_output: Schema.optional(
137
+ Schema.Struct({
138
+ max_lines: Schema.optional(PositiveInt).annotate({
139
+ description: "Maximum lines of tool output before it is truncated and saved to disk (default: 2000)",
140
+ }),
141
+ max_bytes: Schema.optional(PositiveInt).annotate({
142
+ description: "Maximum bytes of tool output before it is truncated and saved to disk (default: 51200)",
143
+ }),
144
+ }),
145
+ ).annotate({
146
+ description:
147
+ "Thresholds for truncating tool output. When output exceeds either limit, the full text is written to the truncation directory and a preview is returned.",
148
+ }),
149
+ compaction: Schema.optional(
150
+ Schema.Struct({
151
+ auto: Schema.optional(Schema.Boolean).annotate({
152
+ description: "Enable automatic compaction when context is full (default: true)",
153
+ }),
154
+ prune: Schema.optional(Schema.Boolean).annotate({
155
+ description: "Enable pruning of old tool outputs (default: false)",
156
+ }),
157
+ tail_turns: Schema.optional(NonNegativeInt).annotate({
158
+ description:
159
+ "Number of recent user turns, including their following assistant/tool responses, to keep verbatim during compaction (default: 2)",
160
+ }),
161
+ preserve_recent_tokens: Schema.optional(NonNegativeInt).annotate({
162
+ description: "Maximum number of tokens from recent turns to preserve verbatim after compaction",
163
+ }),
164
+ reserved: Schema.optional(NonNegativeInt).annotate({
165
+ description: "Token buffer for compaction. Leaves enough window to avoid overflow during compaction.",
166
+ }),
167
+ }),
168
+ ),
169
+ experimental: Schema.optional(
170
+ Schema.Struct({
171
+ disable_paste_summary: Schema.optional(Schema.Boolean),
172
+ batch_tool: Schema.optional(Schema.Boolean).annotate({ description: "Enable the batch tool" }),
173
+ openTelemetry: Schema.optional(Schema.Boolean).annotate({
174
+ description: "Enable OpenTelemetry spans for AI SDK calls (using the 'experimental_telemetry' flag)",
175
+ }),
176
+ primary_tools: Schema.optional(Schema.mutable(Schema.Array(Schema.String))).annotate({
177
+ description: "Tools that should only be available to primary agents.",
178
+ }),
179
+ continue_loop_on_deny: Schema.optional(Schema.Boolean).annotate({
180
+ description: "Continue the agent loop when a tool call is denied",
181
+ }),
182
+ mcp_timeout: Schema.optional(PositiveInt).annotate({
183
+ description: "Timeout in milliseconds for model context protocol (MCP) requests",
184
+ }),
185
+ policies: Schema.optional(Schema.mutable(Schema.Array(ConfigExperimental.Policy))).annotate({
186
+ description: "Policy statements applied to supported resources, such as provider access",
187
+ }),
188
+ }),
189
+ ),
190
+ }).annotate({ identifier: "Config" })
191
+
192
+ export type Info = DeepMutable<Schema.Schema.Type<typeof Info>>
@@ -0,0 +1,16 @@
1
+ export * as ConfigConsoleStateV1 from "./console-state"
2
+
3
+ import { Schema } from "effect"
4
+ import { NonNegativeInt } from "../../schema"
5
+
6
+ export class ConsoleState extends Schema.Class<ConsoleState>("ConsoleState")({
7
+ consoleManagedProviders: Schema.mutable(Schema.Array(Schema.String)),
8
+ activeOrgName: Schema.optional(Schema.String),
9
+ switchableOrgCount: NonNegativeInt,
10
+ }) {}
11
+
12
+ export const emptyConsoleState: ConsoleState = ConsoleState.make({
13
+ consoleManagedProviders: [],
14
+ activeOrgName: undefined,
15
+ switchableOrgCount: 0,
16
+ })
@@ -0,0 +1,39 @@
1
+ export * as ConfigErrorV1 from "./error"
2
+
3
+ import { Schema } from "effect"
4
+ import { NamedError } from "../../util/error"
5
+
6
+ const Issue = Schema.StructWithRest(
7
+ Schema.Struct({
8
+ message: Schema.String,
9
+ path: Schema.Array(Schema.String),
10
+ }),
11
+ [Schema.Record(Schema.String, Schema.Unknown)],
12
+ )
13
+
14
+ export const JsonError = NamedError.create("ConfigJsonError", {
15
+ path: Schema.String,
16
+ message: Schema.optional(Schema.String),
17
+ })
18
+
19
+ export const InvalidError = NamedError.create("ConfigInvalidError", {
20
+ path: Schema.String,
21
+ issues: Schema.optional(Schema.Array(Issue)),
22
+ message: Schema.optional(Schema.String),
23
+ })
24
+
25
+ export const FrontmatterError = NamedError.create("ConfigFrontmatterError", {
26
+ path: Schema.String,
27
+ message: Schema.String,
28
+ })
29
+
30
+ export const DirectoryTypoError = NamedError.create("ConfigDirectoryTypoError", {
31
+ path: Schema.String,
32
+ dir: Schema.String,
33
+ suggestion: Schema.String,
34
+ })
35
+
36
+ export const RemoteAuthError = NamedError.create("ConfigRemoteAuthError", {
37
+ url: Schema.String,
38
+ remote: Schema.String,
39
+ })
@@ -0,0 +1,13 @@
1
+ export * as ConfigFormatterV1 from "./formatter"
2
+
3
+ import { Schema } from "effect"
4
+
5
+ export const Entry = Schema.Struct({
6
+ disabled: Schema.optional(Schema.Boolean),
7
+ command: Schema.optional(Schema.mutable(Schema.Array(Schema.String))),
8
+ environment: Schema.optional(Schema.Record(Schema.String, Schema.String)),
9
+ extensions: Schema.optional(Schema.mutable(Schema.Array(Schema.String))),
10
+ })
11
+
12
+ export const Info = Schema.Union([Schema.Boolean, Schema.Record(Schema.String, Entry)])
13
+ export type Info = Schema.Schema.Type<typeof Info>
@@ -0,0 +1,6 @@
1
+ export * as ConfigLayoutV1 from "./layout"
2
+
3
+ import { Schema } from "effect"
4
+
5
+ export const Layout = Schema.Literals(["auto", "stretch"]).annotate({ identifier: "LayoutConfig" })
6
+ export type Layout = Schema.Schema.Type<typeof Layout>
@@ -0,0 +1,80 @@
1
+ export * as ConfigLSPV1 from "./lsp"
2
+
3
+ import { Schema } from "effect"
4
+
5
+ export const Disabled = Schema.Struct({
6
+ disabled: Schema.Literal(true),
7
+ }).pipe((schema) => schema)
8
+
9
+ export const Entry = Schema.Union([
10
+ Disabled,
11
+ Schema.Struct({
12
+ command: Schema.mutable(Schema.Array(Schema.String)),
13
+ extensions: Schema.optional(Schema.mutable(Schema.Array(Schema.String))),
14
+ disabled: Schema.optional(Schema.Boolean),
15
+ env: Schema.optional(Schema.Record(Schema.String, Schema.String)),
16
+ initialization: Schema.optional(Schema.Record(Schema.String, Schema.Unknown)),
17
+ }),
18
+ ]).pipe((schema) => schema)
19
+
20
+ // Keep this list aligned with the builtin servers in neurocode's LSP runtime.
21
+ // Custom servers must declare extensions because the runtime cannot infer them.
22
+ export const builtinServerIds = [
23
+ "deno",
24
+ "typescript",
25
+ "vue",
26
+ "eslint",
27
+ "oxlint",
28
+ "biome",
29
+ "gopls",
30
+ "ruby-lsp",
31
+ "ty",
32
+ "pyright",
33
+ "elixir-ls",
34
+ "zls",
35
+ "csharp",
36
+ "razor",
37
+ "fsharp",
38
+ "sourcekit-lsp",
39
+ "rust",
40
+ "clangd",
41
+ "svelte",
42
+ "astro",
43
+ "jdtls",
44
+ "kotlin-ls",
45
+ "yaml-ls",
46
+ "lua-ls",
47
+ "php intelephense",
48
+ "prisma",
49
+ "dart",
50
+ "ocaml-lsp",
51
+ "bash",
52
+ "terraform",
53
+ "texlab",
54
+ "dockerfile",
55
+ "gleam",
56
+ "clojure-lsp",
57
+ "nixd",
58
+ "tinymist",
59
+ "haskell-language-server",
60
+ "julials",
61
+ ]
62
+
63
+ export const requiresExtensionsForCustomServers = Schema.makeFilter<
64
+ boolean | Record<string, Schema.Schema.Type<typeof Entry>>
65
+ >((data) => {
66
+ if (typeof data === "boolean") return undefined
67
+ const ids = new Set(builtinServerIds)
68
+ const ok = Object.entries(data).every(([id, config]) => {
69
+ if ("disabled" in config && config.disabled) return true
70
+ if (ids.has(id)) return true
71
+ return "extensions" in config && Boolean(config.extensions)
72
+ })
73
+ return ok ? undefined : "For custom LSP servers, 'extensions' array is required."
74
+ })
75
+
76
+ export const Info = Schema.Union([Schema.Boolean, Schema.Record(Schema.String, Entry)])
77
+ .check(requiresExtensionsForCustomServers)
78
+ .pipe((schema) => schema)
79
+
80
+ export type Info = Schema.Schema.Type<typeof Info>
@@ -0,0 +1,63 @@
1
+ export * as ConfigMCPV1 from "./mcp"
2
+
3
+ import { Schema } from "effect"
4
+ import { PositiveInt } from "../../schema"
5
+
6
+ export const Local = Schema.Struct({
7
+ type: Schema.Literal("local").annotate({ description: "Type of MCP server connection" }),
8
+ command: Schema.mutable(Schema.Array(Schema.String)).annotate({
9
+ description: "Command and arguments to run the MCP server",
10
+ }),
11
+ cwd: Schema.optional(Schema.String).annotate({
12
+ description: "Working directory for the MCP server process. Relative paths resolve from the workspace directory.",
13
+ }),
14
+ environment: Schema.optional(Schema.Record(Schema.String, Schema.String)).annotate({
15
+ description: "Environment variables to set when running the MCP server",
16
+ }),
17
+ enabled: Schema.optional(Schema.Boolean).annotate({
18
+ description: "Enable or disable the MCP server on startup",
19
+ }),
20
+ timeout: Schema.optional(PositiveInt).annotate({
21
+ description: "Timeout in ms for MCP server requests. Defaults to 5000 (5 seconds) if not specified.",
22
+ }),
23
+ }).annotate({ identifier: "McpLocalConfig" })
24
+ export type Local = Schema.Schema.Type<typeof Local>
25
+
26
+ export const OAuth = Schema.Struct({
27
+ clientId: Schema.optional(Schema.String).annotate({
28
+ description: "OAuth client ID. If not provided, dynamic client registration (RFC 7591) will be attempted.",
29
+ }),
30
+ clientSecret: Schema.optional(Schema.String).annotate({
31
+ description: "OAuth client secret (if required by the authorization server)",
32
+ }),
33
+ scope: Schema.optional(Schema.String).annotate({ description: "OAuth scopes to request during authorization" }),
34
+ callbackPort: Schema.optional(Schema.Int.check(Schema.isBetween({ minimum: 1, maximum: 65535 }))).annotate({
35
+ description:
36
+ "Port for the local OAuth callback server (default: 19876). Shorthand for redirectUri when only the port needs changing. Ignored if redirectUri is set.",
37
+ }),
38
+ redirectUri: Schema.optional(Schema.String).annotate({
39
+ description: "OAuth redirect URI (default: http://127.0.0.1:19876/mcp/oauth/callback).",
40
+ }),
41
+ }).annotate({ identifier: "McpOAuthConfig" })
42
+ export type OAuth = Schema.Schema.Type<typeof OAuth>
43
+
44
+ export const Remote = Schema.Struct({
45
+ type: Schema.Literal("remote").annotate({ description: "Type of MCP server connection" }),
46
+ url: Schema.String.annotate({ description: "URL of the remote MCP server" }),
47
+ enabled: Schema.optional(Schema.Boolean).annotate({
48
+ description: "Enable or disable the MCP server on startup",
49
+ }),
50
+ headers: Schema.optional(Schema.Record(Schema.String, Schema.String)).annotate({
51
+ description: "Headers to send with the request",
52
+ }),
53
+ oauth: Schema.optional(Schema.Union([OAuth, Schema.Literal(false)])).annotate({
54
+ description: "OAuth authentication configuration for the MCP server. Set to false to disable OAuth auto-detection.",
55
+ }),
56
+ timeout: Schema.optional(PositiveInt).annotate({
57
+ description: "Timeout in ms for MCP server requests. Defaults to 5000 (5 seconds) if not specified.",
58
+ }),
59
+ }).annotate({ identifier: "McpRemoteConfig" })
60
+ export type Remote = Schema.Schema.Type<typeof Remote>
61
+
62
+ export const Info = Schema.Union([Local, Remote]).annotate({ discriminator: "type" })
63
+ export type Info = Schema.Schema.Type<typeof Info>