@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.
- package/bin/neurocode +199 -0
- package/bunfig.toml +2 -0
- package/drizzle.config.ts +10 -0
- package/package.json +131 -0
- package/schema.json +2071 -0
- package/script/fix-node-pty.ts +28 -0
- package/script/migration.ts +196 -0
- package/src/account/sql.ts +39 -0
- package/src/account.ts +101 -0
- package/src/agent.ts +111 -0
- package/src/aisdk.ts +235 -0
- package/src/background-job.ts +365 -0
- package/src/catalog.ts +301 -0
- package/src/command.ts +64 -0
- package/src/config/agent.ts +25 -0
- package/src/config/attachments.ts +15 -0
- package/src/config/command.ts +12 -0
- package/src/config/compaction.ts +15 -0
- package/src/config/experimental.ts +18 -0
- package/src/config/formatter.ts +12 -0
- package/src/config/lsp.ts +18 -0
- package/src/config/markdown.ts +36 -0
- package/src/config/mcp.ts +48 -0
- package/src/config/plugin/agent.ts +179 -0
- package/src/config/plugin/command.ts +83 -0
- package/src/config/plugin/external.ts +91 -0
- package/src/config/plugin/provider.ts +113 -0
- package/src/config/plugin/reference.ts +70 -0
- package/src/config/plugin/skill.ts +50 -0
- package/src/config/plugin.ts +13 -0
- package/src/config/provider.ts +71 -0
- package/src/config/reference.ts +22 -0
- package/src/config/tool-output.ts +9 -0
- package/src/config/watcher.ts +7 -0
- package/src/config.ts +227 -0
- package/src/control-plane/move-session.ts +148 -0
- package/src/control-plane/workspace.sql.ts +20 -0
- package/src/credential/sql.ts +14 -0
- package/src/credential.ts +138 -0
- package/src/cross-spawn-spawner.ts +507 -0
- package/src/data-migration.sql.ts +6 -0
- package/src/database/database.ts +57 -0
- package/src/database/migration/20260127222353_familiar_lady_ursula.ts +107 -0
- package/src/database/migration/20260211171708_add_project_commands.ts +11 -0
- package/src/database/migration/20260213144116_wakeful_the_professor.ts +23 -0
- package/src/database/migration/20260225215848_workspace.ts +19 -0
- package/src/database/migration/20260227213759_add_session_workspace_id.ts +12 -0
- package/src/database/migration/20260228203230_blue_harpoon.ts +30 -0
- package/src/database/migration/20260303231226_add_workspace_fields.ts +15 -0
- package/src/database/migration/20260309230000_move_org_to_state.ts +15 -0
- package/src/database/migration/20260312043431_session_message_cursor.ts +16 -0
- package/src/database/migration/20260323234822_events.ts +26 -0
- package/src/database/migration/20260410174513_workspace-name.ts +29 -0
- package/src/database/migration/20260413175956_chief_energizer.ts +24 -0
- package/src/database/migration/20260423070820_add_icon_url_override.ts +14 -0
- package/src/database/migration/20260427172553_slow_nightmare.ts +30 -0
- package/src/database/migration/20260428004200_add_session_path.ts +11 -0
- package/src/database/migration/20260501142318_next_venus.ts +12 -0
- package/src/database/migration/20260504145000_add_sync_owner.ts +11 -0
- package/src/database/migration/20260507164347_add_workspace_time.ts +11 -0
- package/src/database/migration/20260510033149_session_usage.ts +56 -0
- package/src/database/migration/20260511000411_data_migration_state.ts +16 -0
- package/src/database/migration/20260511173437_session-metadata.ts +16 -0
- package/src/database/migration/20260601010001_normalize_storage_paths.ts +22 -0
- package/src/database/migration/20260601202201_amazing_prowler.ts +11 -0
- package/src/database/migration/20260602002951_lowly_union_jack.ts +24 -0
- package/src/database/migration/20260602182828_add_project_directories.ts +20 -0
- package/src/database/migration/20260603001617_session_message_projection_indexes.ts +19 -0
- package/src/database/migration/20260603040000_session_message_projection_order.ts +19 -0
- package/src/database/migration/20260603141458_session_input_inbox.ts +25 -0
- package/src/database/migration/20260603160727_jittery_ezekiel_stane.ts +20 -0
- package/src/database/migration/20260604172448_event_sourced_session_input.ts +47 -0
- package/src/database/migration/20260605003541_add_session_context_snapshot.ts +21 -0
- package/src/database/migration/20260605042240_add_context_epoch_agent.ts +11 -0
- package/src/database/migration/20260611035744_credential.ts +25 -0
- package/src/database/migration/20260611192811_lush_chimera.ts +25 -0
- package/src/database/migration/20260612174303_project_dir_strategy.ts +29 -0
- package/src/database/migration/20260622142730_simplify_session_context_epoch.ts +13 -0
- package/src/database/migration/20260622170816_reset_v2_session_state.ts +17 -0
- package/src/database/migration/20260622202450_simplify_session_input.ts +17 -0
- package/src/database/migration.gen.ts +44 -0
- package/src/database/migration.ts +81 -0
- package/src/database/path.ts +91 -0
- package/src/database/schema.gen.ts +274 -0
- package/src/database/schema.sql.ts +10 -0
- package/src/database/sqlite.bun.ts +183 -0
- package/src/database/sqlite.node.ts +178 -0
- package/src/database/sqlite.ts +8 -0
- package/src/effect/app-node-builder.ts +23 -0
- package/src/effect/app-node-platform.ts +18 -0
- package/src/effect/app-node.ts +14 -0
- package/src/effect/dfdf +1 -0
- package/src/effect/keyed-mutex.ts +45 -0
- package/src/effect/layer-node.ts +333 -0
- package/src/effect/memo-map.ts +3 -0
- package/src/effect/runtime.ts +21 -0
- package/src/effect/service-use.ts +43 -0
- package/src/event/sql.ts +25 -0
- package/src/event.ts +638 -0
- package/src/file-mutation.ts +207 -0
- package/src/file.ts +6 -0
- package/src/filesystem/fff.bun.ts +140 -0
- package/src/filesystem/fff.node.ts +138 -0
- package/src/filesystem/ignore.ts +67 -0
- package/src/filesystem/protected.ts +53 -0
- package/src/filesystem/search.ts +239 -0
- package/src/filesystem/watcher.ts +140 -0
- package/src/filesystem.ts +118 -0
- package/src/flag/flag.ts +78 -0
- package/src/fs-util.ts +274 -0
- package/src/git.ts +987 -0
- package/src/github-copilot/README.md +5 -0
- package/src/github-copilot/chat/convert-to-openai-compatible-chat-messages.ts +170 -0
- package/src/github-copilot/chat/get-response-metadata.ts +15 -0
- package/src/github-copilot/chat/map-openai-compatible-finish-reason.ts +19 -0
- package/src/github-copilot/chat/openai-compatible-api-types.ts +64 -0
- package/src/github-copilot/chat/openai-compatible-chat-language-model.ts +815 -0
- package/src/github-copilot/chat/openai-compatible-chat-options.ts +28 -0
- package/src/github-copilot/chat/openai-compatible-metadata-extractor.ts +44 -0
- package/src/github-copilot/chat/openai-compatible-prepare-tools.ts +83 -0
- package/src/github-copilot/copilot-provider.ts +100 -0
- package/src/github-copilot/openai-compatible-error.ts +27 -0
- package/src/github-copilot/responses/convert-to-openai-responses-input.ts +335 -0
- package/src/github-copilot/responses/map-openai-responses-finish-reason.ts +22 -0
- package/src/github-copilot/responses/openai-config.ts +18 -0
- package/src/github-copilot/responses/openai-error.ts +22 -0
- package/src/github-copilot/responses/openai-responses-api-types.ts +214 -0
- package/src/github-copilot/responses/openai-responses-language-model.ts +1770 -0
- package/src/github-copilot/responses/openai-responses-prepare-tools.ts +173 -0
- package/src/github-copilot/responses/openai-responses-settings.ts +1 -0
- package/src/github-copilot/responses/tool/code-interpreter.ts +87 -0
- package/src/github-copilot/responses/tool/file-search.ts +127 -0
- package/src/github-copilot/responses/tool/image-generation.ts +114 -0
- package/src/github-copilot/responses/tool/local-shell.ts +64 -0
- package/src/github-copilot/responses/tool/web-search-preview.ts +103 -0
- package/src/github-copilot/responses/tool/web-search.ts +102 -0
- package/src/global.ts +87 -0
- package/src/id/id.ts +47 -0
- package/src/image/photon.ts +94 -0
- package/src/image.ts +81 -0
- package/src/installation/version.ts +8 -0
- package/src/instruction-context.ts +101 -0
- package/src/integration/connection.ts +12 -0
- package/src/integration.ts +520 -0
- package/src/location-mutation.ts +162 -0
- package/src/location-service-map.ts +18 -0
- package/src/location-services.ts +115 -0
- package/src/location.ts +39 -0
- package/src/markdown.d.ts +4 -0
- package/src/model.ts +41 -0
- package/src/models-dev.ts +260 -0
- package/src/npm-config.ts +40 -0
- package/src/npm.ts +269 -0
- package/src/oauth/page.ts +276 -0
- package/src/observability/logging.ts +71 -0
- package/src/observability/otlp.ts +79 -0
- package/src/observability/shared.ts +1 -0
- package/src/observability.ts +24 -0
- package/src/patch.ts +197 -0
- package/src/permission/saved.ts +79 -0
- package/src/permission/sql.ts +20 -0
- package/src/permission.ts +310 -0
- package/src/plugin/agent.ts +206 -0
- package/src/plugin/command/initialize.txt +65 -0
- package/src/plugin/command/review.txt +100 -0
- package/src/plugin/command.ts +25 -0
- package/src/plugin/host.ts +219 -0
- package/src/plugin/internal.ts +153 -0
- package/src/plugin/layer-map.example.ts +94 -0
- package/src/plugin/models-dev.ts +183 -0
- package/src/plugin/promise.ts +93 -0
- package/src/plugin/provider/alibaba.ts +15 -0
- package/src/plugin/provider/amazon-bedrock.ts +126 -0
- package/src/plugin/provider/anthropic.ts +27 -0
- package/src/plugin/provider/azure.ts +82 -0
- package/src/plugin/provider/cerebras.ts +26 -0
- package/src/plugin/provider/cloudflare-ai-gateway.ts +81 -0
- package/src/plugin/provider/cloudflare-workers-ai.ts +81 -0
- package/src/plugin/provider/cohere.ts +15 -0
- package/src/plugin/provider/deepinfra.ts +15 -0
- package/src/plugin/provider/dynamic.ts +31 -0
- package/src/plugin/provider/gateway.ts +15 -0
- package/src/plugin/provider/github-copilot.ts +52 -0
- package/src/plugin/provider/gitlab.ts +65 -0
- package/src/plugin/provider/google-vertex.ts +173 -0
- package/src/plugin/provider/google.ts +15 -0
- package/src/plugin/provider/groq.ts +15 -0
- package/src/plugin/provider/kilo.ts +21 -0
- package/src/plugin/provider/llmgateway.ts +26 -0
- package/src/plugin/provider/mistral.ts +15 -0
- package/src/plugin/provider/nvidia.ts +22 -0
- package/src/plugin/provider/openai-compatible.ts +17 -0
- package/src/plugin/provider/openai.ts +292 -0
- package/src/plugin/provider/opencode.ts +311 -0
- package/src/plugin/provider/openrouter.ts +36 -0
- package/src/plugin/provider/perplexity.ts +15 -0
- package/src/plugin/provider/sap-ai-core.ts +46 -0
- package/src/plugin/provider/snowflake-cortex.ts +89 -0
- package/src/plugin/provider/togetherai.ts +15 -0
- package/src/plugin/provider/venice.ts +15 -0
- package/src/plugin/provider/vercel.ts +27 -0
- package/src/plugin/provider/xai.ts +22 -0
- package/src/plugin/provider/zenmux.ts +21 -0
- package/src/plugin/provider.ts +71 -0
- package/src/plugin/skill/customize-neurocode.md +452 -0
- package/src/plugin/skill.ts +31 -0
- package/src/plugin/variant.ts +39 -0
- package/src/plugin.ts +167 -0
- package/src/policy.ts +49 -0
- package/src/process.ts +261 -0
- package/src/project/copy-strategies.ts +35 -0
- package/src/project/copy.ts +292 -0
- package/src/project/directories.ts +158 -0
- package/src/project/schema.ts +16 -0
- package/src/project/sql.ts +35 -0
- package/src/project.ts +136 -0
- package/src/provider.ts +25 -0
- package/src/pty/protocol.ts +37 -0
- package/src/pty/pty.bun.ts +26 -0
- package/src/pty/pty.node.ts +29 -0
- package/src/pty/pty.ts +25 -0
- package/src/pty/schema.ts +1 -0
- package/src/pty/ticket.ts +56 -0
- package/src/pty.ts +318 -0
- package/src/public-event-manifest.ts +7 -0
- package/src/question.ts +153 -0
- package/src/reference/guidance.ts +69 -0
- package/src/reference.ts +125 -0
- package/src/repository-cache.ts +259 -0
- package/src/repository.ts +214 -0
- package/src/ripgrep/binary.ts +132 -0
- package/src/ripgrep.ts +281 -0
- package/src/schema.ts +79 -0
- package/src/session/compaction.ts +241 -0
- package/src/session/context-epoch.ts +174 -0
- package/src/session/error.ts +24 -0
- package/src/session/event.ts +2 -0
- package/src/session/execution/local.ts +46 -0
- package/src/session/execution.ts +34 -0
- package/src/session/history.ts +101 -0
- package/src/session/info.ts +50 -0
- package/src/session/input.ts +288 -0
- package/src/session/message-updater.ts +397 -0
- package/src/session/message.ts +2 -0
- package/src/session/projector.ts +458 -0
- package/src/session/prompt.ts +1 -0
- package/src/session/revert.ts +121 -0
- package/src/session/run-coordinator.ts +104 -0
- package/src/session/runner/index.ts +28 -0
- package/src/session/runner/llm.ts +432 -0
- package/src/session/runner/max-steps.ts +16 -0
- package/src/session/runner/model.ts +218 -0
- package/src/session/runner/publish-llm-event.ts +423 -0
- package/src/session/runner/to-llm-message.ts +171 -0
- package/src/session/schema.ts +9 -0
- package/src/session/sql.ts +176 -0
- package/src/session/store.ts +63 -0
- package/src/session/todo.ts +78 -0
- package/src/session.ts +486 -0
- package/src/share/sql.ts +13 -0
- package/src/shell.ts +226 -0
- package/src/skill/discovery.ts +213 -0
- package/src/skill/guidance.ts +76 -0
- package/src/skill.ts +132 -0
- package/src/snapshot.ts +266 -0
- package/src/state.ts +128 -0
- package/src/system-context/builtins.ts +50 -0
- package/src/system-context/index.ts +320 -0
- package/src/system-context/registry.ts +49 -0
- package/src/tool/AGENTS.md +59 -0
- package/src/tool/application-tools.ts +57 -0
- package/src/tool/apply-patch.ts +219 -0
- package/src/tool/bash.ts +207 -0
- package/src/tool/builtins.ts +48 -0
- package/src/tool/edit.ts +223 -0
- package/src/tool/glob.ts +105 -0
- package/src/tool/grep.ts +137 -0
- package/src/tool/http-body.ts +30 -0
- package/src/tool/question.ts +94 -0
- package/src/tool/read-filesystem.ts +366 -0
- package/src/tool/read.ts +117 -0
- package/src/tool/registry.ts +147 -0
- package/src/tool/skill.ts +109 -0
- package/src/tool/todowrite.ts +62 -0
- package/src/tool/tool.ts +162 -0
- package/src/tool/tools.ts +13 -0
- package/src/tool/webfetch.ts +218 -0
- package/src/tool/websearch.ts +260 -0
- package/src/tool/write.ts +101 -0
- package/src/tool-output-store.ts +211 -0
- package/src/util/array.ts +10 -0
- package/src/util/binary.ts +41 -0
- package/src/util/effect-flock.ts +284 -0
- package/src/util/encode.ts +51 -0
- package/src/util/error.ts +70 -0
- package/src/util/flock.ts +358 -0
- package/src/util/glob.ts +34 -0
- package/src/util/hash.ts +11 -0
- package/src/util/identifier.ts +1 -0
- package/src/util/iife.ts +3 -0
- package/src/util/lazy.ts +11 -0
- package/src/util/module.ts +10 -0
- package/src/util/path.ts +37 -0
- package/src/util/retry.ts +42 -0
- package/src/util/slug.ts +74 -0
- package/src/util/token.ts +5 -0
- package/src/util/which.ts +14 -0
- package/src/util/wildcard.ts +14 -0
- package/src/v1/config/agent.ts +89 -0
- package/src/v1/config/attachment.ts +25 -0
- package/src/v1/config/command.ts +13 -0
- package/src/v1/config/config.ts +192 -0
- package/src/v1/config/console-state.ts +16 -0
- package/src/v1/config/error.ts +39 -0
- package/src/v1/config/formatter.ts +13 -0
- package/src/v1/config/layout.ts +6 -0
- package/src/v1/config/lsp.ts +80 -0
- package/src/v1/config/mcp.ts +63 -0
- package/src/v1/config/migrate.ts +254 -0
- package/src/v1/config/permission.ts +50 -0
- package/src/v1/config/plugin.ts +9 -0
- package/src/v1/config/provider-options.ts +227 -0
- package/src/v1/config/provider.ts +121 -0
- package/src/v1/config/server.ts +19 -0
- package/src/v1/config/skills.ts +13 -0
- package/src/v1/permission.ts +33 -0
- package/src/v1/session.ts +68 -0
- package/src/v2-schema.ts +3 -0
- package/src/workspace.ts +6 -0
- package/sst-env.d.ts +10 -0
- package/test/agent.test.ts +131 -0
- package/test/application-tools.test.ts +287 -0
- package/test/background-job.test.ts +106 -0
- package/test/catalog.test.ts +353 -0
- package/test/command.test.ts +56 -0
- package/test/config/agent.test.ts +349 -0
- package/test/config/command.test.ts +83 -0
- package/test/config/config.test.ts +798 -0
- package/test/config/fixtures/plugin/directory-plugin.ts +13 -0
- package/test/config/plugin.test.ts +248 -0
- package/test/config/provider-options.test.ts +224 -0
- package/test/config/provider.test.ts +269 -0
- package/test/config/skill.test.ts +80 -0
- package/test/credential.test.ts +36 -0
- package/test/database-migration.test.ts +644 -0
- package/test/effect/cross-spawn-spawner.test.ts +426 -0
- package/test/effect/keyed-mutex.test.ts +73 -0
- package/test/effect/layer-node/layer-node-types.test.ts +143 -0
- package/test/effect/layer-node/layer-node.test.ts +261 -0
- package/test/effect/layer-node/node-build.test.ts +125 -0
- package/test/effect/observability.test.ts +109 -0
- package/test/event.test.ts +1124 -0
- package/test/file-mutation.test.ts +368 -0
- package/test/filesystem/filesystem.test.ts +387 -0
- package/test/filesystem/ignore.test.ts +10 -0
- package/test/filesystem/search.test.ts +44 -0
- package/test/filesystem/watcher.test.ts +266 -0
- package/test/fixture/effect-flock-worker.ts +60 -0
- package/test/fixture/flock-worker.ts +72 -0
- package/test/fixture/git.ts +49 -0
- package/test/fixture/location.ts +26 -0
- package/test/fixture/tmpdir.ts +25 -0
- package/test/fixtures/recordings/session-runner/openai-chat-streams-text.json +27 -0
- package/test/git.test.ts +164 -0
- package/test/github-copilot/convert-to-copilot-messages.test.ts +523 -0
- package/test/github-copilot/copilot-chat-model.test.ts +592 -0
- package/test/github-copilot/openai-responses-language-model.test.ts +206 -0
- package/test/global.test.ts +16 -0
- package/test/instruction-context.test.ts +323 -0
- package/test/integration.test.ts +349 -0
- package/test/legacy-event-schema.test.ts +16 -0
- package/test/lib/effect.ts +53 -0
- package/test/lib/tool.ts +20 -0
- package/test/location-filesystem.test.ts +69 -0
- package/test/location-layer.test.ts +226 -0
- package/test/location-mutation.test.ts +178 -0
- package/test/location.test.ts +42 -0
- package/test/model.test.ts +23 -0
- package/test/models.test.ts +290 -0
- package/test/move-session.test.ts +235 -0
- package/test/npm-config.test.ts +51 -0
- package/test/npm.test.ts +84 -0
- package/test/oauth-page.test.ts +15 -0
- package/test/patch.test.ts +68 -0
- package/test/permission.test.ts +315 -0
- package/test/plugin/command.test.ts +47 -0
- package/test/plugin/fixture.ts +52 -0
- package/test/plugin/fixtures/config-effect-plugin.ts +15 -0
- package/test/plugin/fixtures/config-promise-plugin.ts +13 -0
- package/test/plugin/fixtures/invalid-plugin.ts +1 -0
- package/test/plugin/fixtures/models-dev.json +14 -0
- package/test/plugin/fixtures/provider-factory.ts +9 -0
- package/test/plugin/host.ts +303 -0
- package/test/plugin/models-dev.test.ts +170 -0
- package/test/plugin/promise.test.ts +67 -0
- package/test/plugin/provider-alibaba.test.ts +92 -0
- package/test/plugin/provider-amazon-bedrock.test.ts +622 -0
- package/test/plugin/provider-anthropic.test.ts +94 -0
- package/test/plugin/provider-azure-cognitive-services.test.ts +199 -0
- package/test/plugin/provider-azure.test.ts +293 -0
- package/test/plugin/provider-cerebras.test.ts +136 -0
- package/test/plugin/provider-cloudflare-ai-gateway.test.ts +426 -0
- package/test/plugin/provider-cloudflare-workers-ai.test.ts +279 -0
- package/test/plugin/provider-cohere.test.ts +123 -0
- package/test/plugin/provider-deepinfra.test.ts +159 -0
- package/test/plugin/provider-dynamic.test.ts +184 -0
- package/test/plugin/provider-gateway.test.ts +115 -0
- package/test/plugin/provider-github-copilot.test.ts +278 -0
- package/test/plugin/provider-gitlab.test.ts +308 -0
- package/test/plugin/provider-google-vertex-anthropic.test.ts +264 -0
- package/test/plugin/provider-google-vertex.test.ts +387 -0
- package/test/plugin/provider-google.test.ts +80 -0
- package/test/plugin/provider-groq.test.ts +121 -0
- package/test/plugin/provider-kilo.test.ts +99 -0
- package/test/plugin/provider-llmgateway.test.ts +80 -0
- package/test/plugin/provider-mistral.test.ts +129 -0
- package/test/plugin/provider-nvidia.test.ts +97 -0
- package/test/plugin/provider-openai-compatible.test.ts +107 -0
- package/test/plugin/provider-openai.test.ts +176 -0
- package/test/plugin/provider-opencode.test.ts +423 -0
- package/test/plugin/provider-openrouter.test.ts +113 -0
- package/test/plugin/provider-perplexity.test.ts +122 -0
- package/test/plugin/provider-sap-ai-core.test.ts +159 -0
- package/test/plugin/provider-snowflake-cortex.test.ts +261 -0
- package/test/plugin/provider-togetherai.test.ts +129 -0
- package/test/plugin/provider-venice.test.ts +115 -0
- package/test/plugin/provider-vercel.test.ts +83 -0
- package/test/plugin/provider-xai.test.ts +125 -0
- package/test/plugin/provider-zenmux.test.ts +110 -0
- package/test/plugin/skill.test.ts +25 -0
- package/test/plugin/variant.test.ts +67 -0
- package/test/plugin.test.ts +71 -0
- package/test/policy.test.ts +85 -0
- package/test/preload.ts +5 -0
- package/test/process/process.test.ts +368 -0
- package/test/project-copy.test.ts +400 -0
- package/test/project-directories.test.ts +61 -0
- package/test/project.test.ts +221 -0
- package/test/provider-mistral.test.ts +282 -0
- package/test/provider-xai-responses.test.ts +32 -0
- package/test/pty/info-schema.test.ts +32 -0
- package/test/pty/protocol.test.ts +27 -0
- package/test/pty/pty-session.test.ts +240 -0
- package/test/pty/ticket.test.ts +62 -0
- package/test/question.test.ts +114 -0
- package/test/reference-guidance.test.ts +76 -0
- package/test/reference.test.ts +78 -0
- package/test/repository-cache.test.ts +153 -0
- package/test/repository.test.ts +71 -0
- package/test/ripgrep.test.ts +65 -0
- package/test/session-compaction.test.ts +27 -0
- package/test/session-create.test.ts +425 -0
- package/test/session-history.test.ts +165 -0
- package/test/session-projector.test.ts +533 -0
- package/test/session-prompt.test.ts +584 -0
- package/test/session-run-coordinator.test.ts +418 -0
- package/test/session-runner-message.test.ts +501 -0
- package/test/session-runner-model.test.ts +347 -0
- package/test/session-runner-recorded.test.ts +193 -0
- package/test/session-runner-tool-events.test.ts +136 -0
- package/test/session-runner-tool-registry.test.ts +452 -0
- package/test/session-runner.test.ts +3365 -0
- package/test/session-todo.test.ts +94 -0
- package/test/session-tool-progress.test.ts +158 -0
- package/test/shared-schema.test.ts +206 -0
- package/test/shell.test.ts +108 -0
- package/test/skill/guidance.test.ts +144 -0
- package/test/skill-discovery.test.ts +165 -0
- package/test/skill.test.ts +125 -0
- package/test/snapshot.test.ts +178 -0
- package/test/state.test.ts +115 -0
- package/test/system-context/builtins.test.ts +129 -0
- package/test/system-context/index.test.ts +307 -0
- package/test/system-context/registry.test.ts +114 -0
- package/test/tool-apply-patch.test.ts +436 -0
- package/test/tool-bash.test.ts +437 -0
- package/test/tool-edit.test.ts +434 -0
- package/test/tool-output-store.test.ts +247 -0
- package/test/tool-question.test.ts +162 -0
- package/test/tool-read-filesystem.test.ts +118 -0
- package/test/tool-read.test.ts +674 -0
- package/test/tool-skill.test.ts +149 -0
- package/test/tool-todowrite.test.ts +125 -0
- package/test/tool-webfetch.test.ts +281 -0
- package/test/tool-websearch.test.ts +316 -0
- package/test/tool-write.test.ts +305 -0
- package/test/util/effect-flock.test.ts +392 -0
- package/test/util/flock.test.ts +428 -0
- package/test/util/which.test.ts +100 -0
- package/tsconfig.json +7 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { Effect } from "effect"
|
|
2
|
+
import type { DatabaseMigration } from "../migration"
|
|
3
|
+
|
|
4
|
+
export default {
|
|
5
|
+
id: "20260213144116_wakeful_the_professor",
|
|
6
|
+
up(tx) {
|
|
7
|
+
return Effect.gen(function* () {
|
|
8
|
+
yield* tx.run(`
|
|
9
|
+
CREATE TABLE \`control_account\` (
|
|
10
|
+
\`email\` text NOT NULL,
|
|
11
|
+
\`url\` text NOT NULL,
|
|
12
|
+
\`access_token\` text NOT NULL,
|
|
13
|
+
\`refresh_token\` text NOT NULL,
|
|
14
|
+
\`token_expiry\` integer,
|
|
15
|
+
\`active\` integer NOT NULL,
|
|
16
|
+
\`time_created\` integer NOT NULL,
|
|
17
|
+
\`time_updated\` integer NOT NULL,
|
|
18
|
+
CONSTRAINT \`control_account_pk\` PRIMARY KEY(\`email\`, \`url\`)
|
|
19
|
+
);
|
|
20
|
+
`)
|
|
21
|
+
})
|
|
22
|
+
},
|
|
23
|
+
} satisfies DatabaseMigration.Migration
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Effect } from "effect"
|
|
2
|
+
import type { DatabaseMigration } from "../migration"
|
|
3
|
+
|
|
4
|
+
export default {
|
|
5
|
+
id: "20260225215848_workspace",
|
|
6
|
+
up(tx) {
|
|
7
|
+
return Effect.gen(function* () {
|
|
8
|
+
yield* tx.run(`
|
|
9
|
+
CREATE TABLE \`workspace\` (
|
|
10
|
+
\`id\` text PRIMARY KEY,
|
|
11
|
+
\`branch\` text,
|
|
12
|
+
\`project_id\` text NOT NULL,
|
|
13
|
+
\`config\` text NOT NULL,
|
|
14
|
+
CONSTRAINT \`fk_workspace_project_id_project_id_fk\` FOREIGN KEY (\`project_id\`) REFERENCES \`project\`(\`id\`) ON DELETE CASCADE
|
|
15
|
+
);
|
|
16
|
+
`)
|
|
17
|
+
})
|
|
18
|
+
},
|
|
19
|
+
} satisfies DatabaseMigration.Migration
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Effect } from "effect"
|
|
2
|
+
import type { DatabaseMigration } from "../migration"
|
|
3
|
+
|
|
4
|
+
export default {
|
|
5
|
+
id: "20260227213759_add_session_workspace_id",
|
|
6
|
+
up(tx) {
|
|
7
|
+
return Effect.gen(function* () {
|
|
8
|
+
yield* tx.run(`ALTER TABLE \`session\` ADD \`workspace_id\` text;`)
|
|
9
|
+
yield* tx.run(`CREATE INDEX \`session_workspace_idx\` ON \`session\` (\`workspace_id\`);`)
|
|
10
|
+
})
|
|
11
|
+
},
|
|
12
|
+
} satisfies DatabaseMigration.Migration
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { Effect } from "effect"
|
|
2
|
+
import type { DatabaseMigration } from "../migration"
|
|
3
|
+
|
|
4
|
+
export default {
|
|
5
|
+
id: "20260228203230_blue_harpoon",
|
|
6
|
+
up(tx) {
|
|
7
|
+
return Effect.gen(function* () {
|
|
8
|
+
yield* tx.run(`
|
|
9
|
+
CREATE TABLE \`account\` (
|
|
10
|
+
\`id\` text PRIMARY KEY,
|
|
11
|
+
\`email\` text NOT NULL,
|
|
12
|
+
\`url\` text NOT NULL,
|
|
13
|
+
\`access_token\` text NOT NULL,
|
|
14
|
+
\`refresh_token\` text NOT NULL,
|
|
15
|
+
\`token_expiry\` integer,
|
|
16
|
+
\`selected_org_id\` text,
|
|
17
|
+
\`time_created\` integer NOT NULL,
|
|
18
|
+
\`time_updated\` integer NOT NULL
|
|
19
|
+
);
|
|
20
|
+
`)
|
|
21
|
+
yield* tx.run(`
|
|
22
|
+
CREATE TABLE \`account_state\` (
|
|
23
|
+
\`id\` integer PRIMARY KEY NOT NULL,
|
|
24
|
+
\`active_account_id\` text,
|
|
25
|
+
FOREIGN KEY (\`active_account_id\`) REFERENCES \`account\`(\`id\`) ON UPDATE no action ON DELETE set null
|
|
26
|
+
);
|
|
27
|
+
`)
|
|
28
|
+
})
|
|
29
|
+
},
|
|
30
|
+
} satisfies DatabaseMigration.Migration
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Effect } from "effect"
|
|
2
|
+
import type { DatabaseMigration } from "../migration"
|
|
3
|
+
|
|
4
|
+
export default {
|
|
5
|
+
id: "20260303231226_add_workspace_fields",
|
|
6
|
+
up(tx) {
|
|
7
|
+
return Effect.gen(function* () {
|
|
8
|
+
yield* tx.run(`ALTER TABLE \`workspace\` ADD \`type\` text NOT NULL;`)
|
|
9
|
+
yield* tx.run(`ALTER TABLE \`workspace\` ADD \`name\` text;`)
|
|
10
|
+
yield* tx.run(`ALTER TABLE \`workspace\` ADD \`directory\` text;`)
|
|
11
|
+
yield* tx.run(`ALTER TABLE \`workspace\` ADD \`extra\` text;`)
|
|
12
|
+
yield* tx.run(`ALTER TABLE \`workspace\` DROP COLUMN \`config\`;`)
|
|
13
|
+
})
|
|
14
|
+
},
|
|
15
|
+
} satisfies DatabaseMigration.Migration
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Effect } from "effect"
|
|
2
|
+
import type { DatabaseMigration } from "../migration"
|
|
3
|
+
|
|
4
|
+
export default {
|
|
5
|
+
id: "20260309230000_move_org_to_state",
|
|
6
|
+
up(tx) {
|
|
7
|
+
return Effect.gen(function* () {
|
|
8
|
+
yield* tx.run(`ALTER TABLE \`account_state\` ADD \`active_org_id\` text;`)
|
|
9
|
+
yield* tx.run(
|
|
10
|
+
`UPDATE \`account_state\` SET \`active_org_id\` = (SELECT \`selected_org_id\` FROM \`account\` WHERE \`account\`.\`id\` = \`account_state\`.\`active_account_id\`);`,
|
|
11
|
+
)
|
|
12
|
+
yield* tx.run(`ALTER TABLE \`account\` DROP COLUMN \`selected_org_id\`;`)
|
|
13
|
+
})
|
|
14
|
+
},
|
|
15
|
+
} satisfies DatabaseMigration.Migration
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Effect } from "effect"
|
|
2
|
+
import type { DatabaseMigration } from "../migration"
|
|
3
|
+
|
|
4
|
+
export default {
|
|
5
|
+
id: "20260312043431_session_message_cursor",
|
|
6
|
+
up(tx) {
|
|
7
|
+
return Effect.gen(function* () {
|
|
8
|
+
yield* tx.run(`DROP INDEX IF EXISTS \`message_session_idx\`;`)
|
|
9
|
+
yield* tx.run(`DROP INDEX IF EXISTS \`part_message_idx\`;`)
|
|
10
|
+
yield* tx.run(
|
|
11
|
+
`CREATE INDEX \`message_session_time_created_id_idx\` ON \`message\` (\`session_id\`,\`time_created\`,\`id\`);`,
|
|
12
|
+
)
|
|
13
|
+
yield* tx.run(`CREATE INDEX \`part_message_id_id_idx\` ON \`part\` (\`message_id\`,\`id\`);`)
|
|
14
|
+
})
|
|
15
|
+
},
|
|
16
|
+
} satisfies DatabaseMigration.Migration
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Effect } from "effect"
|
|
2
|
+
import type { DatabaseMigration } from "../migration"
|
|
3
|
+
|
|
4
|
+
export default {
|
|
5
|
+
id: "20260323234822_events",
|
|
6
|
+
up(tx) {
|
|
7
|
+
return Effect.gen(function* () {
|
|
8
|
+
yield* tx.run(`
|
|
9
|
+
CREATE TABLE \`event_sequence\` (
|
|
10
|
+
\`aggregate_id\` text PRIMARY KEY,
|
|
11
|
+
\`seq\` integer NOT NULL
|
|
12
|
+
);
|
|
13
|
+
`)
|
|
14
|
+
yield* tx.run(`
|
|
15
|
+
CREATE TABLE \`event\` (
|
|
16
|
+
\`id\` text PRIMARY KEY,
|
|
17
|
+
\`aggregate_id\` text NOT NULL,
|
|
18
|
+
\`seq\` integer NOT NULL,
|
|
19
|
+
\`type\` text NOT NULL,
|
|
20
|
+
\`data\` text NOT NULL,
|
|
21
|
+
CONSTRAINT \`fk_event_aggregate_id_event_sequence_aggregate_id_fk\` FOREIGN KEY (\`aggregate_id\`) REFERENCES \`event_sequence\`(\`aggregate_id\`) ON DELETE CASCADE
|
|
22
|
+
);
|
|
23
|
+
`)
|
|
24
|
+
})
|
|
25
|
+
},
|
|
26
|
+
} satisfies DatabaseMigration.Migration
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { Effect } from "effect"
|
|
2
|
+
import type { DatabaseMigration } from "../migration"
|
|
3
|
+
|
|
4
|
+
export default {
|
|
5
|
+
id: "20260410174513_workspace-name",
|
|
6
|
+
up(tx) {
|
|
7
|
+
return Effect.gen(function* () {
|
|
8
|
+
yield* tx.run(`PRAGMA foreign_keys=OFF;`)
|
|
9
|
+
yield* tx.run(`
|
|
10
|
+
CREATE TABLE \`__new_workspace\` (
|
|
11
|
+
\`id\` text PRIMARY KEY,
|
|
12
|
+
\`type\` text NOT NULL,
|
|
13
|
+
\`name\` text DEFAULT '' NOT NULL,
|
|
14
|
+
\`branch\` text,
|
|
15
|
+
\`directory\` text,
|
|
16
|
+
\`extra\` text,
|
|
17
|
+
\`project_id\` text NOT NULL,
|
|
18
|
+
CONSTRAINT \`fk_workspace_project_id_project_id_fk\` FOREIGN KEY (\`project_id\`) REFERENCES \`project\`(\`id\`) ON DELETE CASCADE
|
|
19
|
+
);
|
|
20
|
+
`)
|
|
21
|
+
yield* tx.run(
|
|
22
|
+
`INSERT INTO \`__new_workspace\`(\`id\`, \`type\`, \`branch\`, \`name\`, \`directory\`, \`extra\`, \`project_id\`) SELECT \`id\`, \`type\`, \`branch\`, \`name\`, \`directory\`, \`extra\`, \`project_id\` FROM \`workspace\`;`,
|
|
23
|
+
)
|
|
24
|
+
yield* tx.run(`DROP TABLE \`workspace\`;`)
|
|
25
|
+
yield* tx.run(`ALTER TABLE \`__new_workspace\` RENAME TO \`workspace\`;`)
|
|
26
|
+
yield* tx.run(`PRAGMA foreign_keys=ON;`)
|
|
27
|
+
})
|
|
28
|
+
},
|
|
29
|
+
} satisfies DatabaseMigration.Migration
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { Effect } from "effect"
|
|
2
|
+
import type { DatabaseMigration } from "../migration"
|
|
3
|
+
|
|
4
|
+
export default {
|
|
5
|
+
id: "20260413175956_chief_energizer",
|
|
6
|
+
up(tx) {
|
|
7
|
+
return Effect.gen(function* () {
|
|
8
|
+
yield* tx.run(`
|
|
9
|
+
CREATE TABLE \`session_entry\` (
|
|
10
|
+
\`id\` text PRIMARY KEY,
|
|
11
|
+
\`session_id\` text NOT NULL,
|
|
12
|
+
\`type\` text NOT NULL,
|
|
13
|
+
\`time_created\` integer NOT NULL,
|
|
14
|
+
\`time_updated\` integer NOT NULL,
|
|
15
|
+
\`data\` text NOT NULL,
|
|
16
|
+
CONSTRAINT \`fk_session_entry_session_id_session_id_fk\` FOREIGN KEY (\`session_id\`) REFERENCES \`session\`(\`id\`) ON DELETE CASCADE
|
|
17
|
+
);
|
|
18
|
+
`)
|
|
19
|
+
yield* tx.run(`CREATE INDEX \`session_entry_session_idx\` ON \`session_entry\` (\`session_id\`);`)
|
|
20
|
+
yield* tx.run(`CREATE INDEX \`session_entry_session_type_idx\` ON \`session_entry\` (\`session_id\`,\`type\`);`)
|
|
21
|
+
yield* tx.run(`CREATE INDEX \`session_entry_time_created_idx\` ON \`session_entry\` (\`time_created\`);`)
|
|
22
|
+
})
|
|
23
|
+
},
|
|
24
|
+
} satisfies DatabaseMigration.Migration
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Effect } from "effect"
|
|
2
|
+
import type { DatabaseMigration } from "../migration"
|
|
3
|
+
|
|
4
|
+
export default {
|
|
5
|
+
id: "20260423070820_add_icon_url_override",
|
|
6
|
+
up(tx) {
|
|
7
|
+
return Effect.gen(function* () {
|
|
8
|
+
yield* tx.run(`
|
|
9
|
+
ALTER TABLE \`project\` ADD \`icon_url_override\` text;
|
|
10
|
+
UPDATE \`project\` SET \`icon_url_override\` = \`icon_url\` WHERE \`icon_url\` IS NOT NULL;
|
|
11
|
+
`)
|
|
12
|
+
})
|
|
13
|
+
},
|
|
14
|
+
} satisfies DatabaseMigration.Migration
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { Effect } from "effect"
|
|
2
|
+
import type { DatabaseMigration } from "../migration"
|
|
3
|
+
|
|
4
|
+
export default {
|
|
5
|
+
id: "20260427172553_slow_nightmare",
|
|
6
|
+
up(tx) {
|
|
7
|
+
return Effect.gen(function* () {
|
|
8
|
+
yield* tx.run(`
|
|
9
|
+
CREATE TABLE \`session_message\` (
|
|
10
|
+
\`id\` text PRIMARY KEY,
|
|
11
|
+
\`session_id\` text NOT NULL,
|
|
12
|
+
\`type\` text NOT NULL,
|
|
13
|
+
\`time_created\` integer NOT NULL,
|
|
14
|
+
\`time_updated\` integer NOT NULL,
|
|
15
|
+
\`data\` text NOT NULL,
|
|
16
|
+
CONSTRAINT \`fk_session_message_session_id_session_id_fk\` FOREIGN KEY (\`session_id\`) REFERENCES \`session\`(\`id\`) ON DELETE CASCADE
|
|
17
|
+
);
|
|
18
|
+
`)
|
|
19
|
+
yield* tx.run(`DROP INDEX IF EXISTS \`session_entry_session_idx\`;`)
|
|
20
|
+
yield* tx.run(`DROP INDEX IF EXISTS \`session_entry_session_type_idx\`;`)
|
|
21
|
+
yield* tx.run(`DROP INDEX IF EXISTS \`session_entry_time_created_idx\`;`)
|
|
22
|
+
yield* tx.run(`CREATE INDEX \`session_message_session_idx\` ON \`session_message\` (\`session_id\`);`)
|
|
23
|
+
yield* tx.run(
|
|
24
|
+
`CREATE INDEX \`session_message_session_type_idx\` ON \`session_message\` (\`session_id\`,\`type\`);`,
|
|
25
|
+
)
|
|
26
|
+
yield* tx.run(`CREATE INDEX \`session_message_time_created_idx\` ON \`session_message\` (\`time_created\`);`)
|
|
27
|
+
yield* tx.run(`DROP TABLE \`session_entry\`;`)
|
|
28
|
+
})
|
|
29
|
+
},
|
|
30
|
+
} satisfies DatabaseMigration.Migration
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Effect } from "effect"
|
|
2
|
+
import type { DatabaseMigration } from "../migration"
|
|
3
|
+
|
|
4
|
+
export default {
|
|
5
|
+
id: "20260428004200_add_session_path",
|
|
6
|
+
up(tx) {
|
|
7
|
+
return Effect.gen(function* () {
|
|
8
|
+
yield* tx.run(`ALTER TABLE \`session\` ADD \`path\` text;`)
|
|
9
|
+
})
|
|
10
|
+
},
|
|
11
|
+
} satisfies DatabaseMigration.Migration
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Effect } from "effect"
|
|
2
|
+
import type { DatabaseMigration } from "../migration"
|
|
3
|
+
|
|
4
|
+
export default {
|
|
5
|
+
id: "20260501142318_next_venus",
|
|
6
|
+
up(tx) {
|
|
7
|
+
return Effect.gen(function* () {
|
|
8
|
+
yield* tx.run(`ALTER TABLE \`session\` ADD \`agent\` text;`)
|
|
9
|
+
yield* tx.run(`ALTER TABLE \`session\` ADD \`model\` text;`)
|
|
10
|
+
})
|
|
11
|
+
},
|
|
12
|
+
} satisfies DatabaseMigration.Migration
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Effect } from "effect"
|
|
2
|
+
import type { DatabaseMigration } from "../migration"
|
|
3
|
+
|
|
4
|
+
export default {
|
|
5
|
+
id: "20260504145000_add_sync_owner",
|
|
6
|
+
up(tx) {
|
|
7
|
+
return Effect.gen(function* () {
|
|
8
|
+
yield* tx.run(`ALTER TABLE \`event_sequence\` ADD \`owner_id\` text;`)
|
|
9
|
+
})
|
|
10
|
+
},
|
|
11
|
+
} satisfies DatabaseMigration.Migration
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Effect } from "effect"
|
|
2
|
+
import type { DatabaseMigration } from "../migration"
|
|
3
|
+
|
|
4
|
+
export default {
|
|
5
|
+
id: "20260507164347_add_workspace_time",
|
|
6
|
+
up(tx) {
|
|
7
|
+
return Effect.gen(function* () {
|
|
8
|
+
yield* tx.run(`ALTER TABLE \`workspace\` ADD \`time_used\` integer NOT NULL DEFAULT 0;`)
|
|
9
|
+
})
|
|
10
|
+
},
|
|
11
|
+
} satisfies DatabaseMigration.Migration
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { Effect } from "effect"
|
|
2
|
+
import type { DatabaseMigration } from "../migration"
|
|
3
|
+
|
|
4
|
+
export default {
|
|
5
|
+
id: "20260510033149_session_usage",
|
|
6
|
+
up(tx) {
|
|
7
|
+
return Effect.gen(function* () {
|
|
8
|
+
yield* tx.run(`ALTER TABLE \`session\` ADD \`cost\` real DEFAULT 0 NOT NULL;`)
|
|
9
|
+
yield* tx.run(`ALTER TABLE \`session\` ADD \`tokens_input\` integer DEFAULT 0 NOT NULL;`)
|
|
10
|
+
yield* tx.run(`ALTER TABLE \`session\` ADD \`tokens_output\` integer DEFAULT 0 NOT NULL;`)
|
|
11
|
+
yield* tx.run(`ALTER TABLE \`session\` ADD \`tokens_reasoning\` integer DEFAULT 0 NOT NULL;`)
|
|
12
|
+
yield* tx.run(`ALTER TABLE \`session\` ADD \`tokens_cache_read\` integer DEFAULT 0 NOT NULL;`)
|
|
13
|
+
yield* tx.run(`ALTER TABLE \`session\` ADD \`tokens_cache_write\` integer DEFAULT 0 NOT NULL;`)
|
|
14
|
+
yield* tx.run(`
|
|
15
|
+
UPDATE session
|
|
16
|
+
SET
|
|
17
|
+
cost = coalesce((
|
|
18
|
+
SELECT sum(coalesce(json_extract(message.data, '$.cost'), 0))
|
|
19
|
+
FROM message
|
|
20
|
+
WHERE message.session_id = session.id
|
|
21
|
+
AND json_extract(message.data, '$.role') = 'assistant'
|
|
22
|
+
), 0),
|
|
23
|
+
tokens_input = coalesce((
|
|
24
|
+
SELECT sum(coalesce(json_extract(message.data, '$.tokens.input'), 0))
|
|
25
|
+
FROM message
|
|
26
|
+
WHERE message.session_id = session.id
|
|
27
|
+
AND json_extract(message.data, '$.role') = 'assistant'
|
|
28
|
+
), 0),
|
|
29
|
+
tokens_output = coalesce((
|
|
30
|
+
SELECT sum(coalesce(json_extract(message.data, '$.tokens.output'), 0))
|
|
31
|
+
FROM message
|
|
32
|
+
WHERE message.session_id = session.id
|
|
33
|
+
AND json_extract(message.data, '$.role') = 'assistant'
|
|
34
|
+
), 0),
|
|
35
|
+
tokens_reasoning = coalesce((
|
|
36
|
+
SELECT sum(coalesce(json_extract(message.data, '$.tokens.reasoning'), 0))
|
|
37
|
+
FROM message
|
|
38
|
+
WHERE message.session_id = session.id
|
|
39
|
+
AND json_extract(message.data, '$.role') = 'assistant'
|
|
40
|
+
), 0),
|
|
41
|
+
tokens_cache_read = coalesce((
|
|
42
|
+
SELECT sum(coalesce(json_extract(message.data, '$.tokens.cache.read'), 0))
|
|
43
|
+
FROM message
|
|
44
|
+
WHERE message.session_id = session.id
|
|
45
|
+
AND json_extract(message.data, '$.role') = 'assistant'
|
|
46
|
+
), 0),
|
|
47
|
+
tokens_cache_write = coalesce((
|
|
48
|
+
SELECT sum(coalesce(json_extract(message.data, '$.tokens.cache.write'), 0))
|
|
49
|
+
FROM message
|
|
50
|
+
WHERE message.session_id = session.id
|
|
51
|
+
AND json_extract(message.data, '$.role') = 'assistant'
|
|
52
|
+
), 0)
|
|
53
|
+
`)
|
|
54
|
+
})
|
|
55
|
+
},
|
|
56
|
+
} satisfies DatabaseMigration.Migration
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Effect } from "effect"
|
|
2
|
+
import type { DatabaseMigration } from "../migration"
|
|
3
|
+
|
|
4
|
+
export default {
|
|
5
|
+
id: "20260511000411_data_migration_state",
|
|
6
|
+
up(tx) {
|
|
7
|
+
return Effect.gen(function* () {
|
|
8
|
+
yield* tx.run(`
|
|
9
|
+
CREATE TABLE \`data_migration\` (
|
|
10
|
+
\`name\` text PRIMARY KEY,
|
|
11
|
+
\`time_completed\` integer NOT NULL
|
|
12
|
+
);
|
|
13
|
+
`)
|
|
14
|
+
})
|
|
15
|
+
},
|
|
16
|
+
} satisfies DatabaseMigration.Migration
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Effect } from "effect"
|
|
2
|
+
import type { DatabaseMigration } from "../migration"
|
|
3
|
+
|
|
4
|
+
export default {
|
|
5
|
+
id: "20260511173437_session-metadata",
|
|
6
|
+
up(tx) {
|
|
7
|
+
return Effect.gen(function* () {
|
|
8
|
+
// This column briefly shipped again under 20260530232709_lovely_romulus.
|
|
9
|
+
if (
|
|
10
|
+
(yield* tx.all<{ name: string }>(`PRAGMA table_info(\`session\`)`)).some((column) => column.name === "metadata")
|
|
11
|
+
)
|
|
12
|
+
return
|
|
13
|
+
yield* tx.run(`ALTER TABLE \`session\` ADD \`metadata\` text;`)
|
|
14
|
+
})
|
|
15
|
+
},
|
|
16
|
+
} satisfies DatabaseMigration.Migration
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Effect } from "effect"
|
|
2
|
+
import type { DatabaseMigration } from "../migration"
|
|
3
|
+
|
|
4
|
+
export default {
|
|
5
|
+
id: "20260601010001_normalize_storage_paths",
|
|
6
|
+
up(tx) {
|
|
7
|
+
return Effect.gen(function* () {
|
|
8
|
+
yield* tx.run(
|
|
9
|
+
`UPDATE project SET worktree = REPLACE(worktree, char(92), '/') WHERE worktree GLOB '[A-Za-z]:' || char(92) || '*' OR worktree LIKE char(92) || char(92) || '%';`,
|
|
10
|
+
)
|
|
11
|
+
yield* tx.run(
|
|
12
|
+
`UPDATE project SET sandboxes = REPLACE(sandboxes, char(92) || char(92), '/') WHERE instr(sandboxes, char(92)) > 0 AND (worktree GLOB '[A-Za-z]:*' OR worktree LIKE '//%');`,
|
|
13
|
+
)
|
|
14
|
+
yield* tx.run(
|
|
15
|
+
`UPDATE session SET directory = REPLACE(directory, char(92), '/') WHERE directory GLOB '[A-Za-z]:' || char(92) || '*' OR directory LIKE char(92) || char(92) || '%';`,
|
|
16
|
+
)
|
|
17
|
+
yield* tx.run(
|
|
18
|
+
`UPDATE session SET path = REPLACE(path, char(92), '/') WHERE path IS NOT NULL AND instr(path, char(92)) > 0 AND (directory GLOB '[A-Za-z]:*' OR directory LIKE '//%');`,
|
|
19
|
+
)
|
|
20
|
+
})
|
|
21
|
+
},
|
|
22
|
+
} satisfies DatabaseMigration.Migration
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Effect } from "effect"
|
|
2
|
+
import type { DatabaseMigration } from "../migration"
|
|
3
|
+
|
|
4
|
+
export default {
|
|
5
|
+
id: "20260601202201_amazing_prowler",
|
|
6
|
+
up(tx) {
|
|
7
|
+
return Effect.gen(function* () {
|
|
8
|
+
yield* tx.run(`DROP TABLE \`permission\`;`)
|
|
9
|
+
})
|
|
10
|
+
},
|
|
11
|
+
} satisfies DatabaseMigration.Migration
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { Effect } from "effect"
|
|
2
|
+
import type { DatabaseMigration } from "../migration"
|
|
3
|
+
|
|
4
|
+
export default {
|
|
5
|
+
id: "20260602002951_lowly_union_jack",
|
|
6
|
+
up(tx) {
|
|
7
|
+
return Effect.gen(function* () {
|
|
8
|
+
yield* tx.run(`
|
|
9
|
+
CREATE TABLE \`permission\` (
|
|
10
|
+
\`id\` text PRIMARY KEY,
|
|
11
|
+
\`project_id\` text NOT NULL,
|
|
12
|
+
\`action\` text NOT NULL,
|
|
13
|
+
\`resource\` text NOT NULL,
|
|
14
|
+
\`time_created\` integer NOT NULL,
|
|
15
|
+
\`time_updated\` integer NOT NULL,
|
|
16
|
+
CONSTRAINT \`fk_permission_project_id_project_id_fk\` FOREIGN KEY (\`project_id\`) REFERENCES \`project\`(\`id\`) ON DELETE CASCADE
|
|
17
|
+
);
|
|
18
|
+
`)
|
|
19
|
+
yield* tx.run(
|
|
20
|
+
`CREATE UNIQUE INDEX \`permission_project_action_resource_idx\` ON \`permission\` (\`project_id\`,\`action\`,\`resource\`);`,
|
|
21
|
+
)
|
|
22
|
+
})
|
|
23
|
+
},
|
|
24
|
+
} satisfies DatabaseMigration.Migration
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Effect } from "effect"
|
|
2
|
+
import type { DatabaseMigration } from "../migration"
|
|
3
|
+
|
|
4
|
+
export default {
|
|
5
|
+
id: "20260602182828_add_project_directories",
|
|
6
|
+
up(tx) {
|
|
7
|
+
return Effect.gen(function* () {
|
|
8
|
+
yield* tx.run(`
|
|
9
|
+
CREATE TABLE \`project_directory\` (
|
|
10
|
+
\`project_id\` text NOT NULL,
|
|
11
|
+
\`directory\` text NOT NULL,
|
|
12
|
+
\`type\` text NOT NULL,
|
|
13
|
+
\`time_created\` integer NOT NULL,
|
|
14
|
+
CONSTRAINT \`project_directory_pk\` PRIMARY KEY(\`project_id\`, \`directory\`),
|
|
15
|
+
CONSTRAINT \`fk_project_directory_project_id_project_id_fk\` FOREIGN KEY (\`project_id\`) REFERENCES \`project\`(\`id\`) ON DELETE CASCADE
|
|
16
|
+
);
|
|
17
|
+
`)
|
|
18
|
+
})
|
|
19
|
+
},
|
|
20
|
+
} satisfies DatabaseMigration.Migration
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Effect } from "effect"
|
|
2
|
+
import type { DatabaseMigration } from "../migration"
|
|
3
|
+
|
|
4
|
+
export default {
|
|
5
|
+
id: "20260603001617_session_message_projection_indexes",
|
|
6
|
+
up(tx) {
|
|
7
|
+
return Effect.gen(function* () {
|
|
8
|
+
yield* tx.run(`DROP INDEX IF EXISTS \`session_message_session_idx\`;`)
|
|
9
|
+
yield* tx.run(`DROP INDEX IF EXISTS \`session_message_session_type_idx\`;`)
|
|
10
|
+
yield* tx.run(`CREATE INDEX \`event_aggregate_seq_idx\` ON \`event\` (\`aggregate_id\`,\`seq\`);`)
|
|
11
|
+
yield* tx.run(
|
|
12
|
+
`CREATE INDEX \`session_message_session_time_created_id_idx\` ON \`session_message\` (\`session_id\`,\`time_created\`,\`id\`);`,
|
|
13
|
+
)
|
|
14
|
+
yield* tx.run(
|
|
15
|
+
`CREATE INDEX \`session_message_session_type_time_created_id_idx\` ON \`session_message\` (\`session_id\`,\`type\`,\`time_created\`,\`id\`);`,
|
|
16
|
+
)
|
|
17
|
+
})
|
|
18
|
+
},
|
|
19
|
+
} satisfies DatabaseMigration.Migration
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Effect } from "effect"
|
|
2
|
+
import type { DatabaseMigration } from "../migration"
|
|
3
|
+
|
|
4
|
+
export default {
|
|
5
|
+
id: "20260603040000_session_message_projection_order",
|
|
6
|
+
up(tx) {
|
|
7
|
+
return Effect.gen(function* () {
|
|
8
|
+
// Pre-launch Session projections were written before durable event persistence
|
|
9
|
+
// became unconditional, so they cannot be assigned truthful aggregate order.
|
|
10
|
+
yield* tx.run(`DELETE FROM \`session_message\`;`)
|
|
11
|
+
yield* tx.run(`ALTER TABLE \`session_message\` ADD COLUMN \`seq\` integer NOT NULL;`)
|
|
12
|
+
yield* tx.run(`DROP INDEX IF EXISTS \`session_message_session_type_time_created_id_idx\`;`)
|
|
13
|
+
yield* tx.run(`CREATE INDEX \`session_message_session_seq_idx\` ON \`session_message\` (\`session_id\`,\`seq\`);`)
|
|
14
|
+
yield* tx.run(
|
|
15
|
+
`CREATE INDEX \`session_message_session_type_seq_idx\` ON \`session_message\` (\`session_id\`,\`type\`,\`seq\`);`,
|
|
16
|
+
)
|
|
17
|
+
})
|
|
18
|
+
},
|
|
19
|
+
} satisfies DatabaseMigration.Migration
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { Effect } from "effect"
|
|
2
|
+
import type { DatabaseMigration } from "../migration"
|
|
3
|
+
|
|
4
|
+
export default {
|
|
5
|
+
id: "20260603141458_session_input_inbox",
|
|
6
|
+
up(tx) {
|
|
7
|
+
return Effect.gen(function* () {
|
|
8
|
+
yield* tx.run(`
|
|
9
|
+
CREATE TABLE \`session_input\` (
|
|
10
|
+
\`seq\` integer PRIMARY KEY AUTOINCREMENT,
|
|
11
|
+
\`id\` text NOT NULL UNIQUE,
|
|
12
|
+
\`session_id\` text NOT NULL,
|
|
13
|
+
\`prompt\` text NOT NULL,
|
|
14
|
+
\`delivery\` text NOT NULL,
|
|
15
|
+
\`promoted_seq\` integer,
|
|
16
|
+
\`time_created\` integer NOT NULL,
|
|
17
|
+
CONSTRAINT \`fk_session_input_session_id_session_id_fk\` FOREIGN KEY (\`session_id\`) REFERENCES \`session\`(\`id\`) ON DELETE CASCADE
|
|
18
|
+
);
|
|
19
|
+
`)
|
|
20
|
+
yield* tx.run(
|
|
21
|
+
`CREATE INDEX \`session_input_session_pending_seq_idx\` ON \`session_input\` (\`session_id\`,\`promoted_seq\`,\`seq\`);`,
|
|
22
|
+
)
|
|
23
|
+
})
|
|
24
|
+
},
|
|
25
|
+
} satisfies DatabaseMigration.Migration
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Effect } from "effect"
|
|
2
|
+
import type { DatabaseMigration } from "../migration"
|
|
3
|
+
|
|
4
|
+
export default {
|
|
5
|
+
id: "20260603160727_jittery_ezekiel_stane",
|
|
6
|
+
up(tx) {
|
|
7
|
+
return Effect.gen(function* () {
|
|
8
|
+
yield* tx.run(`DROP INDEX IF EXISTS \`session_input_session_pending_seq_idx\`;`)
|
|
9
|
+
yield* tx.run(
|
|
10
|
+
`CREATE INDEX IF NOT EXISTS \`event_aggregate_type_seq_idx\` ON \`event\` (\`aggregate_id\`,\`type\`,\`seq\`);`,
|
|
11
|
+
)
|
|
12
|
+
yield* tx.run(
|
|
13
|
+
`CREATE INDEX IF NOT EXISTS \`session_input_session_pending_delivery_seq_idx\` ON \`session_input\` (\`session_id\`,\`promoted_seq\`,\`delivery\`,\`seq\`);`,
|
|
14
|
+
)
|
|
15
|
+
yield* tx.run(
|
|
16
|
+
`CREATE INDEX IF NOT EXISTS \`session_message_session_time_created_id_idx\` ON \`session_message\` (\`session_id\`,\`time_created\`,\`id\`);`,
|
|
17
|
+
)
|
|
18
|
+
})
|
|
19
|
+
},
|
|
20
|
+
} satisfies DatabaseMigration.Migration
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { Effect } from "effect"
|
|
2
|
+
import type { DatabaseMigration } from "../migration"
|
|
3
|
+
|
|
4
|
+
export default {
|
|
5
|
+
id: "20260604172448_event_sourced_session_input",
|
|
6
|
+
up(tx) {
|
|
7
|
+
return Effect.gen(function* () {
|
|
8
|
+
yield* tx.run(`DELETE FROM \`session_input\`;`)
|
|
9
|
+
yield* tx.run(`DELETE FROM \`session_message\`;`)
|
|
10
|
+
yield* tx.run(`DELETE FROM \`event\`;`)
|
|
11
|
+
yield* tx.run(`DELETE FROM \`event_sequence\`;`)
|
|
12
|
+
yield* tx.run(`UPDATE \`session\` SET \`workspace_id\` = NULL;`)
|
|
13
|
+
yield* tx.run(`DELETE FROM \`workspace\`;`)
|
|
14
|
+
yield* tx.run(`DROP INDEX IF EXISTS \`event_aggregate_seq_idx\`;`)
|
|
15
|
+
yield* tx.run(`CREATE UNIQUE INDEX \`event_aggregate_seq_idx\` ON \`event\` (\`aggregate_id\`,\`seq\`);`)
|
|
16
|
+
yield* tx.run(`DROP INDEX IF EXISTS \`session_message_session_seq_idx\`;`)
|
|
17
|
+
yield* tx.run(
|
|
18
|
+
`CREATE UNIQUE INDEX \`session_message_session_seq_idx\` ON \`session_message\` (\`session_id\`,\`seq\`);`,
|
|
19
|
+
)
|
|
20
|
+
yield* tx.run(`PRAGMA foreign_keys=OFF;`)
|
|
21
|
+
yield* tx.run(`
|
|
22
|
+
CREATE TABLE \`__new_session_input\` (
|
|
23
|
+
\`id\` text PRIMARY KEY,
|
|
24
|
+
\`session_id\` text NOT NULL,
|
|
25
|
+
\`prompt\` text NOT NULL,
|
|
26
|
+
\`delivery\` text NOT NULL,
|
|
27
|
+
\`admitted_seq\` integer NOT NULL,
|
|
28
|
+
\`promoted_seq\` integer,
|
|
29
|
+
\`time_created\` integer NOT NULL,
|
|
30
|
+
CONSTRAINT \`fk_session_input_session_id_session_id_fk\` FOREIGN KEY (\`session_id\`) REFERENCES \`session\`(\`id\`) ON DELETE CASCADE
|
|
31
|
+
);
|
|
32
|
+
`)
|
|
33
|
+
yield* tx.run(`DROP TABLE \`session_input\`;`)
|
|
34
|
+
yield* tx.run(`ALTER TABLE \`__new_session_input\` RENAME TO \`session_input\`;`)
|
|
35
|
+
yield* tx.run(`PRAGMA foreign_keys=ON;`)
|
|
36
|
+
yield* tx.run(
|
|
37
|
+
`CREATE INDEX \`session_input_session_pending_delivery_seq_idx\` ON \`session_input\` (\`session_id\`,\`promoted_seq\`,\`delivery\`,\`admitted_seq\`);`,
|
|
38
|
+
)
|
|
39
|
+
yield* tx.run(
|
|
40
|
+
`CREATE UNIQUE INDEX \`session_input_session_admitted_seq_idx\` ON \`session_input\` (\`session_id\`,\`admitted_seq\`);`,
|
|
41
|
+
)
|
|
42
|
+
yield* tx.run(
|
|
43
|
+
`CREATE UNIQUE INDEX \`session_input_session_promoted_seq_idx\` ON \`session_input\` (\`session_id\`,\`promoted_seq\`);`,
|
|
44
|
+
)
|
|
45
|
+
})
|
|
46
|
+
},
|
|
47
|
+
} satisfies DatabaseMigration.Migration
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Effect } from "effect"
|
|
2
|
+
import type { DatabaseMigration } from "../migration"
|
|
3
|
+
|
|
4
|
+
export default {
|
|
5
|
+
id: "20260605003541_add_session_context_snapshot",
|
|
6
|
+
up(tx) {
|
|
7
|
+
return Effect.gen(function* () {
|
|
8
|
+
yield* tx.run(`
|
|
9
|
+
CREATE TABLE \`session_context_epoch\` (
|
|
10
|
+
\`session_id\` text PRIMARY KEY,
|
|
11
|
+
\`baseline\` text NOT NULL,
|
|
12
|
+
\`snapshot\` text NOT NULL,
|
|
13
|
+
\`baseline_seq\` integer NOT NULL,
|
|
14
|
+
\`replacement_seq\` integer,
|
|
15
|
+
\`revision\` integer DEFAULT 0 NOT NULL,
|
|
16
|
+
CONSTRAINT \`fk_session_context_epoch_session_id_session_id_fk\` FOREIGN KEY (\`session_id\`) REFERENCES \`session\`(\`id\`) ON DELETE CASCADE
|
|
17
|
+
);
|
|
18
|
+
`)
|
|
19
|
+
})
|
|
20
|
+
},
|
|
21
|
+
} satisfies DatabaseMigration.Migration
|