From d2c99ba97c21e46c5dd92f10e27bfbf954f45c2a Mon Sep 17 00:00:00 2001 From: James Long Date: Fri, 7 Aug 2026 15:34:36 -0400 Subject: [PATCH] chore: improve incremental typecheck performance (#40925) Co-authored-by: exe.dev user --- packages/app/tsconfig.json | 3 +- packages/core/package.json | 2 +- packages/core/script/migration.ts | 16 +++++---- packages/core/src/codemode/instructions.ts | 2 +- packages/core/src/database/migration.gen.ts | 4 +-- .../20260127222353_familiar_lady_ursula.ts | 6 ++-- .../20260211171708_add_project_commands.ts | 6 ++-- .../20260213144116_wakeful_the_professor.ts | 6 ++-- .../migration/20260225215848_workspace.ts | 6 ++-- ...20260227213759_add_session_workspace_id.ts | 6 ++-- .../migration/20260228203230_blue_harpoon.ts | 6 ++-- .../20260303231226_add_workspace_fields.ts | 6 ++-- .../20260309230000_move_org_to_state.ts | 6 ++-- .../20260312043431_session_message_cursor.ts | 6 ++-- .../migration/20260323234822_events.ts | 6 ++-- .../20260410174513_workspace-name.ts | 6 ++-- .../20260413175956_chief_energizer.ts | 6 ++-- .../20260423070820_add_icon_url_override.ts | 6 ++-- .../20260427172553_slow_nightmare.ts | 6 ++-- .../20260428004200_add_session_path.ts | 6 ++-- .../migration/20260501142318_next_venus.ts | 6 ++-- .../20260504145000_add_sync_owner.ts | 6 ++-- .../20260507164347_add_workspace_time.ts | 6 ++-- .../migration/20260510033149_session_usage.ts | 6 ++-- .../20260511000411_data_migration_state.ts | 6 ++-- .../20260511173437_session-metadata.ts | 6 ++-- .../20260601010001_normalize_storage_paths.ts | 6 ++-- .../20260601202201_amazing_prowler.ts | 6 ++-- .../20260602002951_lowly_union_jack.ts | 6 ++-- .../20260602182828_add_project_directories.ts | 6 ++-- ...1617_session_message_projection_indexes.ts | 6 ++-- ...040000_session_message_projection_order.ts | 6 ++-- .../20260603141458_session_input_inbox.ts | 6 ++-- .../20260603160727_jittery_ezekiel_stane.ts | 6 ++-- ...60604172448_event_sourced_session_input.ts | 6 ++-- ...0605003541_add_session_context_snapshot.ts | 6 ++-- .../20260605042240_add_context_epoch_agent.ts | 6 ++-- .../migration/20260611035744_credential.ts | 6 ++-- .../migration/20260611192811_lush_chimera.ts | 6 ++-- .../20260612174303_project_dir_strategy.ts | 6 ++-- ...22142730_simplify_session_context_epoch.ts | 6 ++-- .../20260622170816_reset_v2_session_state.ts | 6 ++-- .../20260622202450_simplify_session_input.ts | 6 ++-- .../20260804233008_loose_psylocke.ts | 6 ++-- ...0260805200742_import_legacy_credentials.ts | 6 ++-- packages/core/src/database/schema.gen.ts | 6 ++-- packages/core/src/instruction-discovery.ts | 2 +- packages/core/src/instructions/builtins.ts | 2 +- packages/core/src/instructions/index.ts | 14 ++++---- packages/core/src/mcp/instructions.ts | 2 +- packages/core/src/reference/instructions.ts | 2 +- packages/core/src/session/context.ts | 2 +- packages/core/src/session/history.ts | 4 +-- .../core/src/session/instruction-entry.ts | 2 +- .../core/src/session/instruction-state.ts | 12 +++---- packages/core/src/skill/instructions.ts | 2 +- packages/core/src/util/error.ts | 2 +- packages/core/test/instruction-state.test.ts | 2 +- packages/core/test/lib/instructions.ts | 4 +-- packages/core/tsconfig.json | 13 +++++-- packages/core/tsconfig.tests.json | 11 ++++++ .../src/sqlite-core/effect/delete.ts | 20 +++++------ .../src/sqlite-core/effect/insert.ts | 26 +++++++------- .../src/sqlite-core/effect/query.ts | 4 +-- .../src/sqlite-core/effect/select.ts | 36 +++++++++---------- .../src/sqlite-core/effect/update.ts | 30 ++++++++-------- packages/enterprise/package.json | 2 +- packages/enterprise/tsconfig.json | 3 +- packages/plugin/src/effect/tool.ts | 2 +- packages/sdk-next/package.json | 2 +- packages/sdk-next/tsconfig.json | 3 +- packages/server/package.json | 2 +- packages/server/tsconfig.json | 3 +- packages/session-ui/package.json | 2 +- packages/session-ui/tsconfig.json | 3 +- packages/simulation/package.json | 2 +- packages/simulation/tsconfig.json | 3 +- packages/tui/package.json | 2 +- packages/tui/tsconfig.json | 3 +- turbo.json | 21 +++++++++++ 80 files changed, 326 insertions(+), 192 deletions(-) create mode 100644 packages/core/tsconfig.tests.json diff --git a/packages/app/tsconfig.json b/packages/app/tsconfig.json index e2a27dd5d8a..03256d1ba96 100644 --- a/packages/app/tsconfig.json +++ b/packages/app/tsconfig.json @@ -22,5 +22,6 @@ } }, "include": ["src", "package.json"], - "exclude": ["dist", "ts-dist"] + "exclude": ["dist", "ts-dist"], + "references": [{ "path": "../core" }] } diff --git a/packages/core/package.json b/packages/core/package.json index 408a8ef0f2e..91df924d94c 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -11,7 +11,7 @@ "fix-node-pty": "bun run script/fix-node-pty.ts", "benchmark:location": "bun run script/benchmark-location.ts", "test": "bun test --only-failures", - "typecheck": "tsgo --noEmit" + "typecheck": "tsgo -b tsconfig.json tsconfig.tests.json" }, "bin": { "opencode": "./bin/opencode" diff --git a/packages/core/script/migration.ts b/packages/core/script/migration.ts index e709111ab4d..c5575d9c5b5 100644 --- a/packages/core/script/migration.ts +++ b/packages/core/script/migration.ts @@ -132,14 +132,16 @@ function renderMigration(name: string, sql: string) { return `import { Effect } from "effect" import type { DatabaseMigration } from "../migration" -export default { +const migration: DatabaseMigration.Migration = { id: ${JSON.stringify(name)}, up(tx) { return Effect.gen(function* () { ${renderStatements(sql)} }) }, -} satisfies DatabaseMigration.Migration +} + +export default migration ` } @@ -147,13 +149,15 @@ function renderSchema(sql: string) { return `import { Effect } from "effect" import type { DatabaseMigration } from "./migration" -export default { +const schema: Omit = { up(tx) { return Effect.gen(function* () { ${renderStatements(sql)} }) }, -} satisfies Omit +} + +export default schema ` } @@ -191,10 +195,10 @@ async function formatTypescript(input: string) { function renderRegistry(names: string[]) { return `import type { DatabaseMigration } from "./migration" -export const migrations = ( +export const migrations: DatabaseMigration.Migration[] = ( await Promise.all([ ${names.map((name) => ` import("./migration/${name}"),`).join("\n")} ]) -).map((module) => module.default) satisfies DatabaseMigration.Migration[] +).map((module) => module.default) ` } diff --git a/packages/core/src/codemode/instructions.ts b/packages/core/src/codemode/instructions.ts index 50c432fb339..2c364e8226e 100644 --- a/packages/core/src/codemode/instructions.ts +++ b/packages/core/src/codemode/instructions.ts @@ -126,7 +126,7 @@ ${render(current)}` const key = Instructions.Key.make("core/codemode") const codec = Schema.toCodecJson(CodeModeCatalog.Summary) -export const make = (entries?: ReadonlyArray): Instructions.Instructions => { +export const make = (entries?: ReadonlyArray): Instructions.List => { const catalog = entries === undefined ? Instructions.removed : CodeModeCatalog.summarize(entries) return Instructions.make({ key, diff --git a/packages/core/src/database/migration.gen.ts b/packages/core/src/database/migration.gen.ts index a247e95b29a..e1f722570a3 100644 --- a/packages/core/src/database/migration.gen.ts +++ b/packages/core/src/database/migration.gen.ts @@ -1,6 +1,6 @@ import type { DatabaseMigration } from "./migration" -export const migrations = ( +export const migrations: DatabaseMigration.Migration[] = ( await Promise.all([ import("./migration/20260127222353_familiar_lady_ursula"), import("./migration/20260211171708_add_project_commands"), @@ -43,4 +43,4 @@ export const migrations = ( import("./migration/20260804233008_loose_psylocke"), import("./migration/20260805200742_import_legacy_credentials"), ]) -).map((module) => module.default) satisfies DatabaseMigration.Migration[] +).map((module) => module.default) diff --git a/packages/core/src/database/migration/20260127222353_familiar_lady_ursula.ts b/packages/core/src/database/migration/20260127222353_familiar_lady_ursula.ts index 468a7103fb3..d1ca7aa3fa8 100644 --- a/packages/core/src/database/migration/20260127222353_familiar_lady_ursula.ts +++ b/packages/core/src/database/migration/20260127222353_familiar_lady_ursula.ts @@ -1,7 +1,7 @@ import { Effect } from "effect" import type { DatabaseMigration } from "../migration" -export default { +const migration: DatabaseMigration.Migration = { id: "20260127222353_familiar_lady_ursula", up(tx) { return Effect.gen(function* () { @@ -104,4 +104,6 @@ export default { yield* tx.run(`CREATE INDEX \`todo_session_idx\` ON \`todo\` (\`session_id\`);`) }) }, -} satisfies DatabaseMigration.Migration +} + +export default migration diff --git a/packages/core/src/database/migration/20260211171708_add_project_commands.ts b/packages/core/src/database/migration/20260211171708_add_project_commands.ts index d31a533db3c..35a3514964f 100644 --- a/packages/core/src/database/migration/20260211171708_add_project_commands.ts +++ b/packages/core/src/database/migration/20260211171708_add_project_commands.ts @@ -1,11 +1,13 @@ import { Effect } from "effect" import type { DatabaseMigration } from "../migration" -export default { +const migration: DatabaseMigration.Migration = { id: "20260211171708_add_project_commands", up(tx) { return Effect.gen(function* () { yield* tx.run(`ALTER TABLE \`project\` ADD \`commands\` text;`) }) }, -} satisfies DatabaseMigration.Migration +} + +export default migration diff --git a/packages/core/src/database/migration/20260213144116_wakeful_the_professor.ts b/packages/core/src/database/migration/20260213144116_wakeful_the_professor.ts index 8077182d939..b2bcbd32222 100644 --- a/packages/core/src/database/migration/20260213144116_wakeful_the_professor.ts +++ b/packages/core/src/database/migration/20260213144116_wakeful_the_professor.ts @@ -1,7 +1,7 @@ import { Effect } from "effect" import type { DatabaseMigration } from "../migration" -export default { +const migration: DatabaseMigration.Migration = { id: "20260213144116_wakeful_the_professor", up(tx) { return Effect.gen(function* () { @@ -20,4 +20,6 @@ export default { `) }) }, -} satisfies DatabaseMigration.Migration +} + +export default migration diff --git a/packages/core/src/database/migration/20260225215848_workspace.ts b/packages/core/src/database/migration/20260225215848_workspace.ts index cc816951ef9..6533cf8310a 100644 --- a/packages/core/src/database/migration/20260225215848_workspace.ts +++ b/packages/core/src/database/migration/20260225215848_workspace.ts @@ -1,7 +1,7 @@ import { Effect } from "effect" import type { DatabaseMigration } from "../migration" -export default { +const migration: DatabaseMigration.Migration = { id: "20260225215848_workspace", up(tx) { return Effect.gen(function* () { @@ -16,4 +16,6 @@ export default { `) }) }, -} satisfies DatabaseMigration.Migration +} + +export default migration diff --git a/packages/core/src/database/migration/20260227213759_add_session_workspace_id.ts b/packages/core/src/database/migration/20260227213759_add_session_workspace_id.ts index 430407156df..8a3daee333d 100644 --- a/packages/core/src/database/migration/20260227213759_add_session_workspace_id.ts +++ b/packages/core/src/database/migration/20260227213759_add_session_workspace_id.ts @@ -1,7 +1,7 @@ import { Effect } from "effect" import type { DatabaseMigration } from "../migration" -export default { +const migration: DatabaseMigration.Migration = { id: "20260227213759_add_session_workspace_id", up(tx) { return Effect.gen(function* () { @@ -9,4 +9,6 @@ export default { yield* tx.run(`CREATE INDEX \`session_workspace_idx\` ON \`session\` (\`workspace_id\`);`) }) }, -} satisfies DatabaseMigration.Migration +} + +export default migration diff --git a/packages/core/src/database/migration/20260228203230_blue_harpoon.ts b/packages/core/src/database/migration/20260228203230_blue_harpoon.ts index 83e2978f707..ec41680b2b7 100644 --- a/packages/core/src/database/migration/20260228203230_blue_harpoon.ts +++ b/packages/core/src/database/migration/20260228203230_blue_harpoon.ts @@ -1,7 +1,7 @@ import { Effect } from "effect" import type { DatabaseMigration } from "../migration" -export default { +const migration: DatabaseMigration.Migration = { id: "20260228203230_blue_harpoon", up(tx) { return Effect.gen(function* () { @@ -27,4 +27,6 @@ export default { `) }) }, -} satisfies DatabaseMigration.Migration +} + +export default migration diff --git a/packages/core/src/database/migration/20260303231226_add_workspace_fields.ts b/packages/core/src/database/migration/20260303231226_add_workspace_fields.ts index 380e9cc68bf..bf4e0d3ec9c 100644 --- a/packages/core/src/database/migration/20260303231226_add_workspace_fields.ts +++ b/packages/core/src/database/migration/20260303231226_add_workspace_fields.ts @@ -1,7 +1,7 @@ import { Effect } from "effect" import type { DatabaseMigration } from "../migration" -export default { +const migration: DatabaseMigration.Migration = { id: "20260303231226_add_workspace_fields", up(tx) { return Effect.gen(function* () { @@ -12,4 +12,6 @@ export default { yield* tx.run(`ALTER TABLE \`workspace\` DROP COLUMN \`config\`;`) }) }, -} satisfies DatabaseMigration.Migration +} + +export default migration diff --git a/packages/core/src/database/migration/20260309230000_move_org_to_state.ts b/packages/core/src/database/migration/20260309230000_move_org_to_state.ts index bf39f3e5bf6..71328fbfded 100644 --- a/packages/core/src/database/migration/20260309230000_move_org_to_state.ts +++ b/packages/core/src/database/migration/20260309230000_move_org_to_state.ts @@ -1,7 +1,7 @@ import { Effect } from "effect" import type { DatabaseMigration } from "../migration" -export default { +const migration: DatabaseMigration.Migration = { id: "20260309230000_move_org_to_state", up(tx) { return Effect.gen(function* () { @@ -12,4 +12,6 @@ export default { yield* tx.run(`ALTER TABLE \`account\` DROP COLUMN \`selected_org_id\`;`) }) }, -} satisfies DatabaseMigration.Migration +} + +export default migration diff --git a/packages/core/src/database/migration/20260312043431_session_message_cursor.ts b/packages/core/src/database/migration/20260312043431_session_message_cursor.ts index 1603c3fa739..d6ef6797d48 100644 --- a/packages/core/src/database/migration/20260312043431_session_message_cursor.ts +++ b/packages/core/src/database/migration/20260312043431_session_message_cursor.ts @@ -1,7 +1,7 @@ import { Effect } from "effect" import type { DatabaseMigration } from "../migration" -export default { +const migration: DatabaseMigration.Migration = { id: "20260312043431_session_message_cursor", up(tx) { return Effect.gen(function* () { @@ -13,4 +13,6 @@ export default { yield* tx.run(`CREATE INDEX \`part_message_id_id_idx\` ON \`part\` (\`message_id\`,\`id\`);`) }) }, -} satisfies DatabaseMigration.Migration +} + +export default migration diff --git a/packages/core/src/database/migration/20260323234822_events.ts b/packages/core/src/database/migration/20260323234822_events.ts index 2b1996fbacc..747ac79c0bb 100644 --- a/packages/core/src/database/migration/20260323234822_events.ts +++ b/packages/core/src/database/migration/20260323234822_events.ts @@ -1,7 +1,7 @@ import { Effect } from "effect" import type { DatabaseMigration } from "../migration" -export default { +const migration: DatabaseMigration.Migration = { id: "20260323234822_events", up(tx) { return Effect.gen(function* () { @@ -23,4 +23,6 @@ export default { `) }) }, -} satisfies DatabaseMigration.Migration +} + +export default migration diff --git a/packages/core/src/database/migration/20260410174513_workspace-name.ts b/packages/core/src/database/migration/20260410174513_workspace-name.ts index 18483e1cf08..371027a92bc 100644 --- a/packages/core/src/database/migration/20260410174513_workspace-name.ts +++ b/packages/core/src/database/migration/20260410174513_workspace-name.ts @@ -1,7 +1,7 @@ import { Effect } from "effect" import type { DatabaseMigration } from "../migration" -export default { +const migration: DatabaseMigration.Migration = { id: "20260410174513_workspace-name", up(tx) { return Effect.gen(function* () { @@ -26,4 +26,6 @@ export default { yield* tx.run(`PRAGMA foreign_keys=ON;`) }) }, -} satisfies DatabaseMigration.Migration +} + +export default migration diff --git a/packages/core/src/database/migration/20260413175956_chief_energizer.ts b/packages/core/src/database/migration/20260413175956_chief_energizer.ts index a03477e09e3..8c04cfc3f2b 100644 --- a/packages/core/src/database/migration/20260413175956_chief_energizer.ts +++ b/packages/core/src/database/migration/20260413175956_chief_energizer.ts @@ -1,7 +1,7 @@ import { Effect } from "effect" import type { DatabaseMigration } from "../migration" -export default { +const migration: DatabaseMigration.Migration = { id: "20260413175956_chief_energizer", up(tx) { return Effect.gen(function* () { @@ -21,4 +21,6 @@ export default { yield* tx.run(`CREATE INDEX \`session_entry_time_created_idx\` ON \`session_entry\` (\`time_created\`);`) }) }, -} satisfies DatabaseMigration.Migration +} + +export default migration diff --git a/packages/core/src/database/migration/20260423070820_add_icon_url_override.ts b/packages/core/src/database/migration/20260423070820_add_icon_url_override.ts index 20b1f9163a4..08795ec9349 100644 --- a/packages/core/src/database/migration/20260423070820_add_icon_url_override.ts +++ b/packages/core/src/database/migration/20260423070820_add_icon_url_override.ts @@ -1,7 +1,7 @@ import { Effect } from "effect" import type { DatabaseMigration } from "../migration" -export default { +const migration: DatabaseMigration.Migration = { id: "20260423070820_add_icon_url_override", up(tx) { return Effect.gen(function* () { @@ -11,4 +11,6 @@ export default { `) }) }, -} satisfies DatabaseMigration.Migration +} + +export default migration diff --git a/packages/core/src/database/migration/20260427172553_slow_nightmare.ts b/packages/core/src/database/migration/20260427172553_slow_nightmare.ts index 32e67decf3a..4e0246c0fbf 100644 --- a/packages/core/src/database/migration/20260427172553_slow_nightmare.ts +++ b/packages/core/src/database/migration/20260427172553_slow_nightmare.ts @@ -1,7 +1,7 @@ import { Effect } from "effect" import type { DatabaseMigration } from "../migration" -export default { +const migration: DatabaseMigration.Migration = { id: "20260427172553_slow_nightmare", up(tx) { return Effect.gen(function* () { @@ -27,4 +27,6 @@ export default { yield* tx.run(`DROP TABLE \`session_entry\`;`) }) }, -} satisfies DatabaseMigration.Migration +} + +export default migration diff --git a/packages/core/src/database/migration/20260428004200_add_session_path.ts b/packages/core/src/database/migration/20260428004200_add_session_path.ts index a60ef377fc2..0b7648eba60 100644 --- a/packages/core/src/database/migration/20260428004200_add_session_path.ts +++ b/packages/core/src/database/migration/20260428004200_add_session_path.ts @@ -1,11 +1,13 @@ import { Effect } from "effect" import type { DatabaseMigration } from "../migration" -export default { +const migration: DatabaseMigration.Migration = { id: "20260428004200_add_session_path", up(tx) { return Effect.gen(function* () { yield* tx.run(`ALTER TABLE \`session\` ADD \`path\` text;`) }) }, -} satisfies DatabaseMigration.Migration +} + +export default migration diff --git a/packages/core/src/database/migration/20260501142318_next_venus.ts b/packages/core/src/database/migration/20260501142318_next_venus.ts index 6c5b078f8fa..84dd1f396e8 100644 --- a/packages/core/src/database/migration/20260501142318_next_venus.ts +++ b/packages/core/src/database/migration/20260501142318_next_venus.ts @@ -1,7 +1,7 @@ import { Effect } from "effect" import type { DatabaseMigration } from "../migration" -export default { +const migration: DatabaseMigration.Migration = { id: "20260501142318_next_venus", up(tx) { return Effect.gen(function* () { @@ -9,4 +9,6 @@ export default { yield* tx.run(`ALTER TABLE \`session\` ADD \`model\` text;`) }) }, -} satisfies DatabaseMigration.Migration +} + +export default migration diff --git a/packages/core/src/database/migration/20260504145000_add_sync_owner.ts b/packages/core/src/database/migration/20260504145000_add_sync_owner.ts index 33e85549145..d0ce08cd519 100644 --- a/packages/core/src/database/migration/20260504145000_add_sync_owner.ts +++ b/packages/core/src/database/migration/20260504145000_add_sync_owner.ts @@ -1,11 +1,13 @@ import { Effect } from "effect" import type { DatabaseMigration } from "../migration" -export default { +const migration: DatabaseMigration.Migration = { id: "20260504145000_add_sync_owner", up(tx) { return Effect.gen(function* () { yield* tx.run(`ALTER TABLE \`event_sequence\` ADD \`owner_id\` text;`) }) }, -} satisfies DatabaseMigration.Migration +} + +export default migration diff --git a/packages/core/src/database/migration/20260507164347_add_workspace_time.ts b/packages/core/src/database/migration/20260507164347_add_workspace_time.ts index df7e90fc931..dbd5102ce73 100644 --- a/packages/core/src/database/migration/20260507164347_add_workspace_time.ts +++ b/packages/core/src/database/migration/20260507164347_add_workspace_time.ts @@ -1,11 +1,13 @@ import { Effect } from "effect" import type { DatabaseMigration } from "../migration" -export default { +const migration: DatabaseMigration.Migration = { id: "20260507164347_add_workspace_time", up(tx) { return Effect.gen(function* () { yield* tx.run(`ALTER TABLE \`workspace\` ADD \`time_used\` integer NOT NULL DEFAULT 0;`) }) }, -} satisfies DatabaseMigration.Migration +} + +export default migration diff --git a/packages/core/src/database/migration/20260510033149_session_usage.ts b/packages/core/src/database/migration/20260510033149_session_usage.ts index 5dcd1f658e7..85c30e83bef 100644 --- a/packages/core/src/database/migration/20260510033149_session_usage.ts +++ b/packages/core/src/database/migration/20260510033149_session_usage.ts @@ -1,7 +1,7 @@ import { Effect } from "effect" import type { DatabaseMigration } from "../migration" -export default { +const migration: DatabaseMigration.Migration = { id: "20260510033149_session_usage", up(tx) { return Effect.gen(function* () { @@ -53,4 +53,6 @@ export default { `) }) }, -} satisfies DatabaseMigration.Migration +} + +export default migration diff --git a/packages/core/src/database/migration/20260511000411_data_migration_state.ts b/packages/core/src/database/migration/20260511000411_data_migration_state.ts index 7ff0b661891..8f2aafa1ffc 100644 --- a/packages/core/src/database/migration/20260511000411_data_migration_state.ts +++ b/packages/core/src/database/migration/20260511000411_data_migration_state.ts @@ -1,7 +1,7 @@ import { Effect } from "effect" import type { DatabaseMigration } from "../migration" -export default { +const migration: DatabaseMigration.Migration = { id: "20260511000411_data_migration_state", up(tx) { return Effect.gen(function* () { @@ -13,4 +13,6 @@ export default { `) }) }, -} satisfies DatabaseMigration.Migration +} + +export default migration diff --git a/packages/core/src/database/migration/20260511173437_session-metadata.ts b/packages/core/src/database/migration/20260511173437_session-metadata.ts index 413f086671d..aac8e14a29e 100644 --- a/packages/core/src/database/migration/20260511173437_session-metadata.ts +++ b/packages/core/src/database/migration/20260511173437_session-metadata.ts @@ -1,7 +1,7 @@ import { Effect } from "effect" import type { DatabaseMigration } from "../migration" -export default { +const migration: DatabaseMigration.Migration = { id: "20260511173437_session-metadata", up(tx) { return Effect.gen(function* () { @@ -13,4 +13,6 @@ export default { yield* tx.run(`ALTER TABLE \`session\` ADD \`metadata\` text;`) }) }, -} satisfies DatabaseMigration.Migration +} + +export default migration diff --git a/packages/core/src/database/migration/20260601010001_normalize_storage_paths.ts b/packages/core/src/database/migration/20260601010001_normalize_storage_paths.ts index f3764e6aa6c..b2e39c12686 100644 --- a/packages/core/src/database/migration/20260601010001_normalize_storage_paths.ts +++ b/packages/core/src/database/migration/20260601010001_normalize_storage_paths.ts @@ -1,7 +1,7 @@ import { Effect } from "effect" import type { DatabaseMigration } from "../migration" -export default { +const migration: DatabaseMigration.Migration = { id: "20260601010001_normalize_storage_paths", up(tx) { return Effect.gen(function* () { @@ -19,4 +19,6 @@ export default { ) }) }, -} satisfies DatabaseMigration.Migration +} + +export default migration diff --git a/packages/core/src/database/migration/20260601202201_amazing_prowler.ts b/packages/core/src/database/migration/20260601202201_amazing_prowler.ts index 84b619d2fc3..917decc756d 100644 --- a/packages/core/src/database/migration/20260601202201_amazing_prowler.ts +++ b/packages/core/src/database/migration/20260601202201_amazing_prowler.ts @@ -1,11 +1,13 @@ import { Effect } from "effect" import type { DatabaseMigration } from "../migration" -export default { +const migration: DatabaseMigration.Migration = { id: "20260601202201_amazing_prowler", up(tx) { return Effect.gen(function* () { yield* tx.run(`DROP TABLE \`permission\`;`) }) }, -} satisfies DatabaseMigration.Migration +} + +export default migration diff --git a/packages/core/src/database/migration/20260602002951_lowly_union_jack.ts b/packages/core/src/database/migration/20260602002951_lowly_union_jack.ts index 6c75b52acc7..4069ef57cfb 100644 --- a/packages/core/src/database/migration/20260602002951_lowly_union_jack.ts +++ b/packages/core/src/database/migration/20260602002951_lowly_union_jack.ts @@ -1,7 +1,7 @@ import { Effect } from "effect" import type { DatabaseMigration } from "../migration" -export default { +const migration: DatabaseMigration.Migration = { id: "20260602002951_lowly_union_jack", up(tx) { return Effect.gen(function* () { @@ -21,4 +21,6 @@ export default { ) }) }, -} satisfies DatabaseMigration.Migration +} + +export default migration diff --git a/packages/core/src/database/migration/20260602182828_add_project_directories.ts b/packages/core/src/database/migration/20260602182828_add_project_directories.ts index a1200fd3640..a37ff305d24 100644 --- a/packages/core/src/database/migration/20260602182828_add_project_directories.ts +++ b/packages/core/src/database/migration/20260602182828_add_project_directories.ts @@ -1,7 +1,7 @@ import { Effect } from "effect" import type { DatabaseMigration } from "../migration" -export default { +const migration: DatabaseMigration.Migration = { id: "20260602182828_add_project_directories", up(tx) { return Effect.gen(function* () { @@ -17,4 +17,6 @@ export default { `) }) }, -} satisfies DatabaseMigration.Migration +} + +export default migration diff --git a/packages/core/src/database/migration/20260603001617_session_message_projection_indexes.ts b/packages/core/src/database/migration/20260603001617_session_message_projection_indexes.ts index 85b5cd94633..41969cbd97a 100644 --- a/packages/core/src/database/migration/20260603001617_session_message_projection_indexes.ts +++ b/packages/core/src/database/migration/20260603001617_session_message_projection_indexes.ts @@ -1,7 +1,7 @@ import { Effect } from "effect" import type { DatabaseMigration } from "../migration" -export default { +const migration: DatabaseMigration.Migration = { id: "20260603001617_session_message_projection_indexes", up(tx) { return Effect.gen(function* () { @@ -16,4 +16,6 @@ export default { ) }) }, -} satisfies DatabaseMigration.Migration +} + +export default migration diff --git a/packages/core/src/database/migration/20260603040000_session_message_projection_order.ts b/packages/core/src/database/migration/20260603040000_session_message_projection_order.ts index 1f3a43bcced..a8c6d276cd2 100644 --- a/packages/core/src/database/migration/20260603040000_session_message_projection_order.ts +++ b/packages/core/src/database/migration/20260603040000_session_message_projection_order.ts @@ -1,7 +1,7 @@ import { Effect } from "effect" import type { DatabaseMigration } from "../migration" -export default { +const migration: DatabaseMigration.Migration = { id: "20260603040000_session_message_projection_order", up(tx) { return Effect.gen(function* () { @@ -16,4 +16,6 @@ export default { ) }) }, -} satisfies DatabaseMigration.Migration +} + +export default migration diff --git a/packages/core/src/database/migration/20260603141458_session_input_inbox.ts b/packages/core/src/database/migration/20260603141458_session_input_inbox.ts index 329ab15c08b..927d336f002 100644 --- a/packages/core/src/database/migration/20260603141458_session_input_inbox.ts +++ b/packages/core/src/database/migration/20260603141458_session_input_inbox.ts @@ -1,7 +1,7 @@ import { Effect } from "effect" import type { DatabaseMigration } from "../migration" -export default { +const migration: DatabaseMigration.Migration = { id: "20260603141458_session_input_inbox", up(tx) { return Effect.gen(function* () { @@ -22,4 +22,6 @@ export default { ) }) }, -} satisfies DatabaseMigration.Migration +} + +export default migration diff --git a/packages/core/src/database/migration/20260603160727_jittery_ezekiel_stane.ts b/packages/core/src/database/migration/20260603160727_jittery_ezekiel_stane.ts index bcfc1afdd68..6fe158b50bf 100644 --- a/packages/core/src/database/migration/20260603160727_jittery_ezekiel_stane.ts +++ b/packages/core/src/database/migration/20260603160727_jittery_ezekiel_stane.ts @@ -1,7 +1,7 @@ import { Effect } from "effect" import type { DatabaseMigration } from "../migration" -export default { +const migration: DatabaseMigration.Migration = { id: "20260603160727_jittery_ezekiel_stane", up(tx) { return Effect.gen(function* () { @@ -17,4 +17,6 @@ export default { ) }) }, -} satisfies DatabaseMigration.Migration +} + +export default migration diff --git a/packages/core/src/database/migration/20260604172448_event_sourced_session_input.ts b/packages/core/src/database/migration/20260604172448_event_sourced_session_input.ts index 24a31bfae14..6b374d328ea 100644 --- a/packages/core/src/database/migration/20260604172448_event_sourced_session_input.ts +++ b/packages/core/src/database/migration/20260604172448_event_sourced_session_input.ts @@ -1,7 +1,7 @@ import { Effect } from "effect" import type { DatabaseMigration } from "../migration" -export default { +const migration: DatabaseMigration.Migration = { id: "20260604172448_event_sourced_session_input", up(tx) { return Effect.gen(function* () { @@ -44,4 +44,6 @@ export default { ) }) }, -} satisfies DatabaseMigration.Migration +} + +export default migration diff --git a/packages/core/src/database/migration/20260605003541_add_session_context_snapshot.ts b/packages/core/src/database/migration/20260605003541_add_session_context_snapshot.ts index d1648969dda..255090dc31c 100644 --- a/packages/core/src/database/migration/20260605003541_add_session_context_snapshot.ts +++ b/packages/core/src/database/migration/20260605003541_add_session_context_snapshot.ts @@ -1,7 +1,7 @@ import { Effect } from "effect" import type { DatabaseMigration } from "../migration" -export default { +const migration: DatabaseMigration.Migration = { id: "20260605003541_add_session_context_snapshot", up(tx) { return Effect.gen(function* () { @@ -18,4 +18,6 @@ export default { `) }) }, -} satisfies DatabaseMigration.Migration +} + +export default migration diff --git a/packages/core/src/database/migration/20260605042240_add_context_epoch_agent.ts b/packages/core/src/database/migration/20260605042240_add_context_epoch_agent.ts index cefd6ca037a..5d3e1e38515 100644 --- a/packages/core/src/database/migration/20260605042240_add_context_epoch_agent.ts +++ b/packages/core/src/database/migration/20260605042240_add_context_epoch_agent.ts @@ -1,11 +1,13 @@ import { Effect } from "effect" import type { DatabaseMigration } from "../migration" -export default { +const migration: DatabaseMigration.Migration = { id: "20260605042240_add_context_epoch_agent", up(tx) { return Effect.gen(function* () { yield* tx.run(`ALTER TABLE \`session_context_epoch\` ADD \`agent\` text DEFAULT 'build' NOT NULL;`) }) }, -} satisfies DatabaseMigration.Migration +} + +export default migration diff --git a/packages/core/src/database/migration/20260611035744_credential.ts b/packages/core/src/database/migration/20260611035744_credential.ts index 80df43cdf58..28a1b6e9e80 100644 --- a/packages/core/src/database/migration/20260611035744_credential.ts +++ b/packages/core/src/database/migration/20260611035744_credential.ts @@ -1,7 +1,7 @@ import { Effect } from "effect" import type { DatabaseMigration } from "../migration" -export default { +const migration: DatabaseMigration.Migration = { id: "20260611035744_credential", up(tx) { return Effect.gen(function* () { @@ -22,4 +22,6 @@ export default { ) }) }, -} satisfies DatabaseMigration.Migration +} + +export default migration diff --git a/packages/core/src/database/migration/20260611192811_lush_chimera.ts b/packages/core/src/database/migration/20260611192811_lush_chimera.ts index 306b10d5327..c5b8cb70aec 100644 --- a/packages/core/src/database/migration/20260611192811_lush_chimera.ts +++ b/packages/core/src/database/migration/20260611192811_lush_chimera.ts @@ -1,7 +1,7 @@ import { Effect } from "effect" import type { DatabaseMigration } from "../migration" -export default { +const migration: DatabaseMigration.Migration = { id: "20260611192811_lush_chimera", up(tx) { return Effect.gen(function* () { @@ -22,4 +22,6 @@ export default { `) }) }, -} satisfies DatabaseMigration.Migration +} + +export default migration diff --git a/packages/core/src/database/migration/20260612174303_project_dir_strategy.ts b/packages/core/src/database/migration/20260612174303_project_dir_strategy.ts index 1f09c40a707..46b1eb03693 100644 --- a/packages/core/src/database/migration/20260612174303_project_dir_strategy.ts +++ b/packages/core/src/database/migration/20260612174303_project_dir_strategy.ts @@ -1,7 +1,7 @@ import { Effect } from "effect" import type { DatabaseMigration } from "../migration" -export default { +const migration: DatabaseMigration.Migration = { id: "20260612174303_project_dir_strategy", up(tx) { return Effect.gen(function* () { @@ -26,4 +26,6 @@ export default { yield* tx.run(`PRAGMA foreign_keys=ON;`) }) }, -} satisfies DatabaseMigration.Migration +} + +export default migration diff --git a/packages/core/src/database/migration/20260622142730_simplify_session_context_epoch.ts b/packages/core/src/database/migration/20260622142730_simplify_session_context_epoch.ts index 1520bac4c14..5b44695c732 100644 --- a/packages/core/src/database/migration/20260622142730_simplify_session_context_epoch.ts +++ b/packages/core/src/database/migration/20260622142730_simplify_session_context_epoch.ts @@ -1,7 +1,7 @@ import { Effect } from "effect" import type { DatabaseMigration } from "../migration" -export default { +const migration: DatabaseMigration.Migration = { id: "20260622142730_simplify_session_context_epoch", up(tx) { return Effect.gen(function* () { @@ -10,4 +10,6 @@ export default { yield* tx.run(`ALTER TABLE \`session_context_epoch\` DROP COLUMN \`revision\`;`) }) }, -} satisfies DatabaseMigration.Migration +} + +export default migration diff --git a/packages/core/src/database/migration/20260622170816_reset_v2_session_state.ts b/packages/core/src/database/migration/20260622170816_reset_v2_session_state.ts index 9b4bb8fe504..a91556112fb 100644 --- a/packages/core/src/database/migration/20260622170816_reset_v2_session_state.ts +++ b/packages/core/src/database/migration/20260622170816_reset_v2_session_state.ts @@ -1,7 +1,7 @@ import { Effect } from "effect" import type { DatabaseMigration } from "../migration" -export default { +const migration: DatabaseMigration.Migration = { id: "20260622170816_reset_v2_session_state", up(tx) { return Effect.gen(function* () { @@ -12,4 +12,6 @@ export default { yield* tx.run(`DELETE FROM \`event_sequence\`;`) }) }, -} satisfies DatabaseMigration.Migration +} + +export default migration diff --git a/packages/core/src/database/migration/20260622202450_simplify_session_input.ts b/packages/core/src/database/migration/20260622202450_simplify_session_input.ts index 0b5ddd1bfde..70f82ab8797 100644 --- a/packages/core/src/database/migration/20260622202450_simplify_session_input.ts +++ b/packages/core/src/database/migration/20260622202450_simplify_session_input.ts @@ -1,7 +1,7 @@ import { Effect } from "effect" import type { DatabaseMigration } from "../migration" -export default { +const migration: DatabaseMigration.Migration = { id: "20260622202450_simplify_session_input", up(tx) { return Effect.gen(function* () { @@ -14,4 +14,6 @@ export default { yield* tx.run(`DELETE FROM \`workspace\`;`) }) }, -} satisfies DatabaseMigration.Migration +} + +export default migration diff --git a/packages/core/src/database/migration/20260804233008_loose_psylocke.ts b/packages/core/src/database/migration/20260804233008_loose_psylocke.ts index 9d4bf064087..e1c423fb458 100644 --- a/packages/core/src/database/migration/20260804233008_loose_psylocke.ts +++ b/packages/core/src/database/migration/20260804233008_loose_psylocke.ts @@ -1,7 +1,7 @@ import { Effect } from "effect" import type { DatabaseMigration } from "../migration" -export default { +const migration: DatabaseMigration.Migration = { id: "20260804233008_loose_psylocke", up(tx) { return Effect.gen(function* () { @@ -135,4 +135,6 @@ export default { yield* tx.run(`DROP TABLE \`session_input\`;`) }) }, -} satisfies DatabaseMigration.Migration +} + +export default migration diff --git a/packages/core/src/database/migration/20260805200742_import_legacy_credentials.ts b/packages/core/src/database/migration/20260805200742_import_legacy_credentials.ts index 38d95517e68..05ddc4ef141 100644 --- a/packages/core/src/database/migration/20260805200742_import_legacy_credentials.ts +++ b/packages/core/src/database/migration/20260805200742_import_legacy_credentials.ts @@ -30,12 +30,14 @@ const decodeJson = Schema.decodeUnknownOption(Schema.UnknownFromJsonString) const decodeValue = Schema.decodeUnknownOption(LegacyValue) const wellKnownSourcesKey = "wellknown:sources" -export default { +const migration: DatabaseMigration.Migration = { id: "20260805200742_import_legacy_credentials", up(tx) { return importLegacyCredentials(tx, path.join(Global.Path.data, "auth.json")) }, -} satisfies DatabaseMigration.Migration +} + +export default migration export function importLegacyCredentials(tx: Parameters[0], filepath: string) { return Effect.gen(function* () { diff --git a/packages/core/src/database/schema.gen.ts b/packages/core/src/database/schema.gen.ts index 8625d63e51a..d7aafe69ca3 100644 --- a/packages/core/src/database/schema.gen.ts +++ b/packages/core/src/database/schema.gen.ts @@ -1,7 +1,7 @@ import { Effect } from "effect" import type { DatabaseMigration } from "./migration" -export default { +const schema: Omit = { up(tx) { return Effect.gen(function* () { yield* tx.run(` @@ -248,4 +248,6 @@ export default { ) }) }, -} satisfies Omit +} + +export default schema diff --git a/packages/core/src/instruction-discovery.ts b/packages/core/src/instruction-discovery.ts index 834d1e0cc00..d5d0137a2ce 100644 --- a/packages/core/src/instruction-discovery.ts +++ b/packages/core/src/instruction-discovery.ts @@ -18,7 +18,7 @@ const Files = Schema.Array(File) const key = Instructions.Key.make("core/instructions") export interface Interface { - readonly load: () => Effect.Effect + readonly load: () => Effect.Effect } export const Options = Schema.Struct({ diff --git a/packages/core/src/instructions/builtins.ts b/packages/core/src/instructions/builtins.ts index af3c4cc9e5e..3259d5a7d12 100644 --- a/packages/core/src/instructions/builtins.ts +++ b/packages/core/src/instructions/builtins.ts @@ -8,7 +8,7 @@ import { SessionSchema } from "../session/schema" import { Instructions } from "./index" export interface Interface { - readonly load: (sessionID: SessionSchema.ID) => Effect.Effect + readonly load: (sessionID: SessionSchema.ID) => Effect.Effect } export class Service extends Context.Service()("@opencode/InstructionBuiltIns") {} diff --git a/packages/core/src/instructions/index.ts b/packages/core/src/instructions/index.ts index d7af2a78a37..85bd2111123 100644 --- a/packages/core/src/instructions/index.ts +++ b/packages/core/src/instructions/index.ts @@ -53,7 +53,7 @@ export declare namespace Source { } /** Ordered sources; identical values render identical bytes. */ -export type Instructions = ReadonlyArray +export type List = ReadonlyArray export type ReadResult = ReadonlyArray<{ readonly key: Key @@ -82,10 +82,10 @@ export class DuplicateKeyError extends Schema.TaggedErrorClass(source: Source.Definition): Instructions { +export function make(source: Source.Definition): List { const decode = Schema.decodeUnknownOption(source.codec) const encode = Schema.encodeSync(source.codec) const initial = (value: A) => requireText(source.key, "initial", source.render.initial(value)) @@ -121,7 +121,7 @@ export function make(source: Source.Definition): Instructions { ] } -export function combine(values: ReadonlyArray): Instructions { +export function combine(values: ReadonlyArray): List { const sources = values.flat() const keys = new Set() for (const source of sources) { @@ -131,7 +131,7 @@ export function combine(values: ReadonlyArray): Instructions { return sources } -export function read(value: Instructions): Effect.Effect { +export function read(value: List): Effect.Effect { return Effect.forEach( value, (source) => source.read.pipe(Effect.map((observed) => ({ key: source.key, value: observed }))), @@ -158,7 +158,7 @@ export function diff(observed: ReadResult, previous?: Values): Effect.Effect>) { +export function renderInitial(value: List, values: Readonly>) { return render( value.flatMap((source) => { if (!Object.hasOwn(values, source.key)) return [] @@ -169,7 +169,7 @@ export function renderInitial(value: Instructions, values: Readonly>, delta: Readonly>>, ) { diff --git a/packages/core/src/mcp/instructions.ts b/packages/core/src/mcp/instructions.ts index 198272f59d2..474a99dc5ed 100644 --- a/packages/core/src/mcp/instructions.ts +++ b/packages/core/src/mcp/instructions.ts @@ -55,7 +55,7 @@ const update = (previous: ReadonlyArray, current: ReadonlyArray Effect.Effect + readonly load: (agent: Agent.Selection) => Effect.Effect } export class Service extends Context.Service()("@opencode/McpInstructions") {} diff --git a/packages/core/src/reference/instructions.ts b/packages/core/src/reference/instructions.ts index 34801bde10b..463314e97ac 100644 --- a/packages/core/src/reference/instructions.ts +++ b/packages/core/src/reference/instructions.ts @@ -54,7 +54,7 @@ const update = (previous: ReadonlyArray, current: ReadonlyA } export interface Interface { - readonly load: () => Effect.Effect + readonly load: () => Effect.Effect } export class Service extends Context.Service()("@opencode/ReferenceInstructions") {} diff --git a/packages/core/src/session/context.ts b/packages/core/src/session/context.ts index d4936bd2c5b..225ca0cf2b5 100644 --- a/packages/core/src/session/context.ts +++ b/packages/core/src/session/context.ts @@ -25,7 +25,7 @@ import { SessionStore } from "./store" export interface Selection { readonly session: SessionSchema.Info readonly agent: Agent.Selection & { readonly info: Agent.Info } - readonly instructions: Instructions.Instructions + readonly instructions: Instructions.List readonly tools: Tool.Snapshot } diff --git a/packages/core/src/session/history.ts b/packages/core/src/session/history.ts index 8aacf032af3..d2b024c276e 100644 --- a/packages/core/src/session/history.ts +++ b/packages/core/src/session/history.ts @@ -74,7 +74,7 @@ export const load = Effect.fn("SessionHistory.load")(function* (db: DatabaseServ export const entriesForRunner = Effect.fn("SessionHistory.entriesForRunner")(function* ( db: DatabaseService, sessionID: SessionSchema.ID, - instructions: Instructions.Instructions, + instructions: Instructions.List, ) { return yield* db .transaction(() => @@ -92,7 +92,7 @@ export const entriesForRunner = Effect.fn("SessionHistory.entriesForRunner")(fun export const preview = Effect.fn("SessionHistory.preview")(function* ( db: DatabaseService, sessionID: SessionSchema.ID, - instructions: Instructions.Instructions, + instructions: Instructions.List, ) { const observed = yield* Instructions.read(instructions) return yield* db diff --git a/packages/core/src/session/instruction-entry.ts b/packages/core/src/session/instruction-entry.ts index 5fca262da00..f7151215ab2 100644 --- a/packages/core/src/session/instruction-entry.ts +++ b/packages/core/src/session/instruction-entry.ts @@ -25,7 +25,7 @@ export interface Interface { }) => Effect.Effect readonly remove: (input: { readonly sessionID: SessionSchema.ID; readonly key: Key }) => Effect.Effect /** Produces one Instructions source per stored entry, keyed `api/`. */ - readonly load: (sessionID: SessionSchema.ID) => Effect.Effect + readonly load: (sessionID: SessionSchema.ID) => Effect.Effect } export class Service extends Context.Service()("@opencode/InstructionEntry") {} diff --git a/packages/core/src/session/instruction-state.ts b/packages/core/src/session/instruction-state.ts index c366b592591..9415899892c 100644 --- a/packages/core/src/session/instruction-state.ts +++ b/packages/core/src/session/instruction-state.ts @@ -20,7 +20,7 @@ export interface Observation extends Instructions.Admission { export const observe = Effect.fn("InstructionState.observe")(function* ( db: DatabaseService, - instructions: Instructions.Instructions, + instructions: Instructions.List, sessionID: SessionSchema.ID, ): Effect.fn.Return { const [observed, stored] = yield* Effect.all([Instructions.read(instructions), find(db, sessionID)], { @@ -38,7 +38,7 @@ export const observe = Effect.fn("InstructionState.observe")(function* ( export const commit = Effect.fn("InstructionState.commit")(function* ( db: DatabaseService, bus: Bus.Interface, - instructions: Instructions.Instructions, + instructions: Instructions.List, observation: Observation, ) { if (!observation.initial && Object.keys(observation.delta).length === 0) return @@ -62,7 +62,7 @@ export const commit = Effect.fn("InstructionState.commit")(function* ( const renderUpdateText = Effect.fnUntraced(function* ( db: DatabaseService, - instructions: Instructions.Instructions, + instructions: Instructions.List, observation: Observation, ) { const replaced = Object.entries(observation.previous).filter(([key]) => Object.hasOwn(observation.delta, key)) @@ -77,7 +77,7 @@ const renderUpdateText = Effect.fnUntraced(function* ( export const prepare = Effect.fn("InstructionState.prepare")(function* ( db: DatabaseService, bus: Bus.Interface, - instructions: Instructions.Instructions, + instructions: Instructions.List, sessionID: SessionSchema.ID, ) { yield* commit(db, bus, instructions, yield* observe(db, instructions, sessionID)) @@ -162,7 +162,7 @@ export const reset = Effect.fn("InstructionState.reset")(function* (db: Database export const initial = Effect.fn("InstructionState.initial")(function* ( db: DatabaseService, sessionID: SessionSchema.ID, - instructions: Instructions.Instructions, + instructions: Instructions.List, ) { const state = yield* find(db, sessionID) if (!state) return yield* Effect.die(new Error(`Instruction state not found during assembly: ${sessionID}`)) @@ -181,7 +181,7 @@ export const current = Effect.fn("InstructionState.current")(function* ( export const preview = Effect.fn("InstructionState.preview")(function* ( db: DatabaseService, sessionID: SessionSchema.ID, - instructions: Instructions.Instructions, + instructions: Instructions.List, observed: Instructions.ReadResult, ) { const state = yield* find(db, sessionID) diff --git a/packages/core/src/skill/instructions.ts b/packages/core/src/skill/instructions.ts index 382987c0249..468227aaeea 100644 --- a/packages/core/src/skill/instructions.ts +++ b/packages/core/src/skill/instructions.ts @@ -57,7 +57,7 @@ const update = (previous: ReadonlyArray, current: ReadonlyArray Effect.Effect + readonly load: (agent: Agent.Selection) => Effect.Effect } export class Service extends Context.Service()("@opencode/SkillInstructions") {} diff --git a/packages/core/src/util/error.ts b/packages/core/src/util/error.ts index 5fe41e1cff9..889af4bfb65 100644 --- a/packages/core/src/util/error.ts +++ b/packages/core/src/util/error.ts @@ -22,7 +22,7 @@ export abstract class NamedError extends Error { return NamedError.createSchemaClass(name, Schema.isSchema(data) ? data : Schema.Struct(data)) } - private static createSchemaClass(name: Name, data: DataSchema) { + public static createSchemaClass(name: Name, data: DataSchema) { const schema = Schema.Struct({ name: Schema.Literal(name), data, diff --git a/packages/core/test/instruction-state.test.ts b/packages/core/test/instruction-state.test.ts index fdb4bd56baf..5a56609ee62 100644 --- a/packages/core/test/instruction-state.test.ts +++ b/packages/core/test/instruction-state.test.ts @@ -68,7 +68,7 @@ const instructionEvents = (db: Database.Interface["db"], sessionID: SessionSchem .all() .pipe(Effect.orDie) -const preview = (db: Database.Interface["db"], sessionID: SessionSchema.ID, instructions: Instructions.Instructions) => +const preview = (db: Database.Interface["db"], sessionID: SessionSchema.ID, instructions: Instructions.List) => Instructions.read(instructions).pipe( Effect.flatMap((observed) => InstructionState.preview(db, sessionID, instructions, observed)), ) diff --git a/packages/core/test/lib/instructions.ts b/packages/core/test/lib/instructions.ts index ca4efa22ca9..e7a0f6b7236 100644 --- a/packages/core/test/lib/instructions.ts +++ b/packages/core/test/lib/instructions.ts @@ -10,7 +10,7 @@ export const state = (values: Readonly>): State => ( const hashes = (values: Readonly>): Instructions.Values => Object.fromEntries(Object.entries(values).map(([key, value]) => [key, Instructions.hash(value)])) -export const readInitial = (instructions: Instructions.Instructions) => +export const readInitial = (instructions: Instructions.List) => Effect.gen(function* () { const admission = yield* Instructions.read(instructions).pipe(Effect.flatMap(Instructions.diff)) const current = state( @@ -23,7 +23,7 @@ export const readInitial = (instructions: Instructions.Instructions) => return { ...current, text: Instructions.renderInitial(instructions, current.values) } }) -export const readUpdate = (instructions: Instructions.Instructions, previous: State) => +export const readUpdate = (instructions: Instructions.List, previous: State) => Effect.gen(function* () { const admission = yield* Instructions.read(instructions).pipe( Effect.flatMap((observed) => Instructions.diff(observed, hashes(previous.values))), diff --git a/packages/core/tsconfig.json b/packages/core/tsconfig.json index fe5c4d217b2..6b43fb38cc8 100644 --- a/packages/core/tsconfig.json +++ b/packages/core/tsconfig.json @@ -2,6 +2,15 @@ "$schema": "https://json.schemastore.org/tsconfig", "extends": "@tsconfig/bun/tsconfig.json", "compilerOptions": { - "noUncheckedIndexedAccess": false - } + "composite": true, + "declaration": true, + "emitDeclarationOnly": true, + "incremental": true, + "noEmit": false, + "noUncheckedIndexedAccess": false, + "outDir": "node_modules/.ts-dist/source", + "rootDir": "src", + "tsBuildInfoFile": "node_modules/.ts-dist/source.tsbuildinfo" + }, + "include": ["src"] } diff --git a/packages/core/tsconfig.tests.json b/packages/core/tsconfig.tests.json new file mode 100644 index 00000000000..6cba522694c --- /dev/null +++ b/packages/core/tsconfig.tests.json @@ -0,0 +1,11 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "extends": "@tsconfig/bun/tsconfig.json", + "compilerOptions": { + "incremental": true, + "noUncheckedIndexedAccess": false, + "tsBuildInfoFile": "node_modules/.ts-dist/tests.tsbuildinfo" + }, + "include": ["drizzle.config.ts", "script", "test"], + "references": [{ "path": "./tsconfig.json" }] +} diff --git a/packages/effect-drizzle-sqlite/src/sqlite-core/effect/delete.ts b/packages/effect-drizzle-sqlite/src/sqlite-core/effect/delete.ts index 15e90d19746..616e5ad249c 100644 --- a/packages/effect-drizzle-sqlite/src/sqlite-core/effect/delete.ts +++ b/packages/effect-drizzle-sqlite/src/sqlite-core/effect/delete.ts @@ -110,12 +110,12 @@ export type SQLiteEffectDelete< export type AnySQLiteEffectDelete = SQLiteEffectDeleteBase export interface SQLiteEffectDeleteBase< - TTable extends SQLiteTable, - TRunResult, - TReturning extends Record | undefined = undefined, - TDynamic extends boolean = false, + out TTable extends SQLiteTable, + out TRunResult, + out TReturning extends Record | undefined = undefined, + out TDynamic extends boolean = false, _TExcludedMethods extends string = never, - TEffectHKT extends QueryEffectHKTBase = QueryEffectHKTBase, + out TEffectHKT extends QueryEffectHKTBase = QueryEffectHKTBase, > extends RunnableQuery, SQLWrapper, Effect.Effect< @@ -137,12 +137,12 @@ export interface SQLiteEffectDeleteBase< } export class SQLiteEffectDeleteBase< - TTable extends SQLiteTable, - TRunResult, - TReturning extends Record | undefined = undefined, - TDynamic extends boolean = false, + out TTable extends SQLiteTable, + out TRunResult, + out TReturning extends Record | undefined = undefined, + out TDynamic extends boolean = false, _TExcludedMethods extends string = never, - TEffectHKT extends QueryEffectHKTBase = QueryEffectHKTBase, + out TEffectHKT extends QueryEffectHKTBase = QueryEffectHKTBase, > implements RunnableQuery, SQLWrapper { diff --git a/packages/effect-drizzle-sqlite/src/sqlite-core/effect/insert.ts b/packages/effect-drizzle-sqlite/src/sqlite-core/effect/insert.ts index f85dc244756..904aa4a0767 100644 --- a/packages/effect-drizzle-sqlite/src/sqlite-core/effect/insert.ts +++ b/packages/effect-drizzle-sqlite/src/sqlite-core/effect/insert.ts @@ -126,9 +126,9 @@ export type SQLiteEffectInsert< export type AnySQLiteEffectInsert = SQLiteEffectInsertBase export class SQLiteEffectInsertBuilder< - TTable extends SQLiteTable, - TRunResult, - TEffectHKT extends QueryEffectHKTBase = QueryEffectHKTBase, + in out TTable extends SQLiteTable, + out TRunResult, + out TEffectHKT extends QueryEffectHKTBase = QueryEffectHKTBase, > { static readonly [entityKind]: string = "SQLiteEffectInsertBuilder" @@ -194,12 +194,12 @@ export class SQLiteEffectInsertBuilder< } export interface SQLiteEffectInsertBase< - TTable extends SQLiteTable, - TRunResult, - TReturning = undefined, - TDynamic extends boolean = false, + in out TTable extends SQLiteTable, + out TRunResult, + out TReturning = undefined, + out TDynamic extends boolean = false, _TExcludedMethods extends string = never, - TEffectHKT extends QueryEffectHKTBase = QueryEffectHKTBase, + out TEffectHKT extends QueryEffectHKTBase = QueryEffectHKTBase, > extends SQLWrapper, RunnableQuery, Effect.Effect< @@ -221,12 +221,12 @@ export interface SQLiteEffectInsertBase< } export class SQLiteEffectInsertBase< - TTable extends SQLiteTable, - TRunResult, - TReturning = undefined, - TDynamic extends boolean = false, + in out TTable extends SQLiteTable, + out TRunResult, + out TReturning = undefined, + out TDynamic extends boolean = false, _TExcludedMethods extends string = never, - TEffectHKT extends QueryEffectHKTBase = QueryEffectHKTBase, + out TEffectHKT extends QueryEffectHKTBase = QueryEffectHKTBase, > implements RunnableQuery, SQLWrapper { diff --git a/packages/effect-drizzle-sqlite/src/sqlite-core/effect/query.ts b/packages/effect-drizzle-sqlite/src/sqlite-core/effect/query.ts index 4676039e550..1f6b1ece0c3 100644 --- a/packages/effect-drizzle-sqlite/src/sqlite-core/effect/query.ts +++ b/packages/effect-drizzle-sqlite/src/sqlite-core/effect/query.ts @@ -19,9 +19,9 @@ import type { SQLiteTable } from "drizzle-orm/sqlite-core/table" import type { SQLiteEffectPreparedQuery, SQLiteEffectSession } from "./session" export class SQLiteEffectRelationalQueryBuilder< - TSchema extends TablesRelationalConfig, + out TSchema extends TablesRelationalConfig, TFields extends TableRelationalConfig, - TEffectHKT extends QueryEffectHKTBase = QueryEffectHKTBase, + out TEffectHKT extends QueryEffectHKTBase = QueryEffectHKTBase, > { static readonly [entityKind]: string = "SQLiteEffectRelationalQueryBuilderV2" diff --git a/packages/effect-drizzle-sqlite/src/sqlite-core/effect/select.ts b/packages/effect-drizzle-sqlite/src/sqlite-core/effect/select.ts index 0127fb09ae8..b2fffeca3cd 100644 --- a/packages/effect-drizzle-sqlite/src/sqlite-core/effect/select.ts +++ b/packages/effect-drizzle-sqlite/src/sqlite-core/effect/select.ts @@ -152,18 +152,18 @@ export interface SQLiteEffectSelectHKT = TTableName extends string + out TTableName extends string | undefined, + out TRunResult, + out TSelection extends ColumnsSelection, + out TSelectMode extends SelectMode = "single", + out TNullabilityMap extends Record = TTableName extends string ? Record : {}, - TDynamic extends boolean = false, + out TDynamic extends boolean = false, TExcludedMethods extends string = never, - TResult extends any[] = SelectResult[], - TSelectedFields extends ColumnsSelection = BuildSubquerySelection, - TEffectHKT extends QueryEffectHKTBase = QueryEffectHKTBase, + out TResult extends any[] = SelectResult[], + out TSelectedFields extends ColumnsSelection = BuildSubquerySelection, + out TEffectHKT extends QueryEffectHKTBase = QueryEffectHKTBase, > extends SQLiteSelectQueryBuilderBase< SQLiteEffectSelectHKT, TTableName, @@ -180,18 +180,18 @@ export interface SQLiteEffectSelectBase< Effect.Effect {} export class SQLiteEffectSelectBase< - TTableName extends string | undefined, - TRunResult, - TSelection extends ColumnsSelection, - TSelectMode extends SelectMode = "single", - TNullabilityMap extends Record = TTableName extends string + out TTableName extends string | undefined, + out TRunResult, + out TSelection extends ColumnsSelection, + out TSelectMode extends SelectMode = "single", + out TNullabilityMap extends Record = TTableName extends string ? Record : {}, - TDynamic extends boolean = false, + out TDynamic extends boolean = false, TExcludedMethods extends string = never, - TResult extends any[] = SelectResult[], - TSelectedFields extends ColumnsSelection = BuildSubquerySelection, - TEffectHKT extends QueryEffectHKTBase = QueryEffectHKTBase, + out TResult extends any[] = SelectResult[], + out TSelectedFields extends ColumnsSelection = BuildSubquerySelection, + out TEffectHKT extends QueryEffectHKTBase = QueryEffectHKTBase, > extends SQLiteSelectQueryBuilderBase< SQLiteEffectSelectHKT, diff --git a/packages/effect-drizzle-sqlite/src/sqlite-core/effect/update.ts b/packages/effect-drizzle-sqlite/src/sqlite-core/effect/update.ts index 369e08e878e..741b18b2e54 100644 --- a/packages/effect-drizzle-sqlite/src/sqlite-core/effect/update.ts +++ b/packages/effect-drizzle-sqlite/src/sqlite-core/effect/update.ts @@ -158,9 +158,9 @@ export type SQLiteEffectUpdateJoinFn = < ) => T export class SQLiteEffectUpdateBuilder< - TTable extends SQLiteTable, - TRunResult, - TEffectHKT extends QueryEffectHKTBase = QueryEffectHKTBase, + in out TTable extends SQLiteTable, + out TRunResult, + out TEffectHKT extends QueryEffectHKTBase = QueryEffectHKTBase, > { static readonly [entityKind]: string = "SQLiteEffectUpdateBuilder" @@ -193,13 +193,13 @@ export class SQLiteEffectUpdateBuilder< } export interface SQLiteEffectUpdateBase< - TTable extends SQLiteTable = SQLiteTable, - TRunResult = unknown, - TFrom extends SQLiteTable | Subquery | SQLiteViewBase | SQL | undefined = undefined, - TReturning = undefined, - TDynamic extends boolean = false, + out TTable extends SQLiteTable = SQLiteTable, + out TRunResult = unknown, + out TFrom extends SQLiteTable | Subquery | SQLiteViewBase | SQL | undefined = undefined, + out TReturning = undefined, + out TDynamic extends boolean = false, _TExcludedMethods extends string = never, - TEffectHKT extends QueryEffectHKTBase = QueryEffectHKTBase, + out TEffectHKT extends QueryEffectHKTBase = QueryEffectHKTBase, > extends SQLWrapper, RunnableQuery, Effect.Effect< @@ -222,13 +222,13 @@ export interface SQLiteEffectUpdateBase< } export class SQLiteEffectUpdateBase< - TTable extends SQLiteTable = SQLiteTable, - TRunResult = unknown, - TFrom extends SQLiteTable | Subquery | SQLiteViewBase | SQL | undefined = undefined, - TReturning = undefined, - TDynamic extends boolean = false, + out TTable extends SQLiteTable = SQLiteTable, + out TRunResult = unknown, + out TFrom extends SQLiteTable | Subquery | SQLiteViewBase | SQL | undefined = undefined, + out TReturning = undefined, + out TDynamic extends boolean = false, _TExcludedMethods extends string = never, - TEffectHKT extends QueryEffectHKTBase = QueryEffectHKTBase, + out TEffectHKT extends QueryEffectHKTBase = QueryEffectHKTBase, > implements RunnableQuery, SQLWrapper { diff --git a/packages/enterprise/package.json b/packages/enterprise/package.json index 8ebc71d0601..0a18be668c9 100644 --- a/packages/enterprise/package.json +++ b/packages/enterprise/package.json @@ -5,7 +5,7 @@ "type": "module", "license": "MIT", "scripts": { - "typecheck": "tsgo --noEmit", + "typecheck": "tsgo -b", "dev": "vite dev", "build": "vite build", "build:cloudflare": "OPENCODE_DEPLOYMENT_TARGET=cloudflare vite build", diff --git a/packages/enterprise/tsconfig.json b/packages/enterprise/tsconfig.json index eafea7e4f08..0d3949506ae 100644 --- a/packages/enterprise/tsconfig.json +++ b/packages/enterprise/tsconfig.json @@ -16,5 +16,6 @@ "paths": { "~/*": ["./src/*"] } - } + }, + "references": [{ "path": "../core" }] } diff --git a/packages/plugin/src/effect/tool.ts b/packages/plugin/src/effect/tool.ts index 28320552abc..0a23a15a792 100644 --- a/packages/plugin/src/effect/tool.ts +++ b/packages/plugin/src/effect/tool.ts @@ -4,7 +4,7 @@ import type { Session } from "@opencode-ai/schema/session" import type { SessionMessage } from "@opencode-ai/schema/session-message" import type { Hooks, Transform } from "./registration.js" -interface ToolDraft { +export interface ToolDraft { add< Input extends Tool.ValueSchema, Output extends Tool.ValueSchema | undefined, diff --git a/packages/sdk-next/package.json b/packages/sdk-next/package.json index 8ef199b6802..604eb22b144 100644 --- a/packages/sdk-next/package.json +++ b/packages/sdk-next/package.json @@ -9,7 +9,7 @@ }, "scripts": { "test": "bun test --timeout 5000", - "typecheck": "tsgo --noEmit" + "typecheck": "tsgo -b" }, "dependencies": { "@opencode-ai/client": "workspace:*", diff --git a/packages/sdk-next/tsconfig.json b/packages/sdk-next/tsconfig.json index 00ef1254685..51e05ad7553 100644 --- a/packages/sdk-next/tsconfig.json +++ b/packages/sdk-next/tsconfig.json @@ -4,5 +4,6 @@ "compilerOptions": { "lib": ["ESNext", "DOM", "DOM.Iterable"], "noUncheckedIndexedAccess": false - } + }, + "references": [{ "path": "../core" }] } diff --git a/packages/server/package.json b/packages/server/package.json index 1b4717ca013..861c5f8385c 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -10,7 +10,7 @@ }, "scripts": { "test": "bun test --only-failures", - "typecheck": "tsgo --noEmit" + "typecheck": "tsgo -b" }, "dependencies": { "@effect/platform-node": "catalog:", diff --git a/packages/server/tsconfig.json b/packages/server/tsconfig.json index 00ef1254685..51e05ad7553 100644 --- a/packages/server/tsconfig.json +++ b/packages/server/tsconfig.json @@ -4,5 +4,6 @@ "compilerOptions": { "lib": ["ESNext", "DOM", "DOM.Iterable"], "noUncheckedIndexedAccess": false - } + }, + "references": [{ "path": "../core" }] } diff --git a/packages/session-ui/package.json b/packages/session-ui/package.json index ad5945a43ce..95dbc64790a 100644 --- a/packages/session-ui/package.json +++ b/packages/session-ui/package.json @@ -25,7 +25,7 @@ "./v2/prompt-input/types": "./src/v2/components/prompt-input/types.ts" }, "scripts": { - "typecheck": "tsgo --noEmit", + "typecheck": "tsgo -b", "test": "bun test src --only-failures" }, "devDependencies": { diff --git a/packages/session-ui/tsconfig.json b/packages/session-ui/tsconfig.json index b234c74822c..f34c43bbe65 100644 --- a/packages/session-ui/tsconfig.json +++ b/packages/session-ui/tsconfig.json @@ -15,5 +15,6 @@ "strict": true, "types": ["vite/client", "bun"] }, - "exclude": ["**/*.stories.*", "**/*.mdx"] + "exclude": ["**/*.stories.*", "**/*.mdx"], + "references": [{ "path": "../core" }] } diff --git a/packages/simulation/package.json b/packages/simulation/package.json index 23a7d4836e2..36b9cbdce85 100644 --- a/packages/simulation/package.json +++ b/packages/simulation/package.json @@ -14,7 +14,7 @@ "./recording": "./src/recording.ts" }, "scripts": { - "typecheck": "tsgo --noEmit" + "typecheck": "tsgo -b" }, "dependencies": { "@fontsource/commit-mono": "5.2.5", diff --git a/packages/simulation/tsconfig.json b/packages/simulation/tsconfig.json index 00ef1254685..51e05ad7553 100644 --- a/packages/simulation/tsconfig.json +++ b/packages/simulation/tsconfig.json @@ -4,5 +4,6 @@ "compilerOptions": { "lib": ["ESNext", "DOM", "DOM.Iterable"], "noUncheckedIndexedAccess": false - } + }, + "references": [{ "path": "../core" }] } diff --git a/packages/tui/package.json b/packages/tui/package.json index 215bd69a89b..78bf36202a9 100644 --- a/packages/tui/package.json +++ b/packages/tui/package.json @@ -7,7 +7,7 @@ "license": "MIT", "scripts": { "test": "bun test --timeout 30000 --only-failures", - "typecheck": "tsgo --noEmit" + "typecheck": "tsgo -b" }, "exports": { ".": "./src/index.tsx", diff --git a/packages/tui/tsconfig.json b/packages/tui/tsconfig.json index ac9f4c63f78..8fe159743b3 100644 --- a/packages/tui/tsconfig.json +++ b/packages/tui/tsconfig.json @@ -6,5 +6,6 @@ "jsxImportSource": "@opentui/solid", "lib": ["ESNext", "DOM", "DOM.Iterable"], "noUncheckedIndexedAccess": false - } + }, + "references": [{ "path": "../core" }] } diff --git a/turbo.json b/turbo.json index cd139edb2ee..d3438cc0560 100644 --- a/turbo.json +++ b/turbo.json @@ -4,6 +4,27 @@ "globalPassThroughEnv": ["CI", "OPENCODE_DISABLE_SHARE"], "tasks": { "typecheck": {}, + "@opencode-ai/app#typecheck": { + "dependsOn": ["@opencode-ai/core#typecheck"] + }, + "@opencode-ai/enterprise#typecheck": { + "dependsOn": ["@opencode-ai/core#typecheck"] + }, + "@opencode-ai/sdk-next#typecheck": { + "dependsOn": ["@opencode-ai/core#typecheck"] + }, + "@opencode-ai/server#typecheck": { + "dependsOn": ["@opencode-ai/core#typecheck"] + }, + "@opencode-ai/session-ui#typecheck": { + "dependsOn": ["@opencode-ai/core#typecheck"] + }, + "@opencode-ai/simulation#typecheck": { + "dependsOn": ["@opencode-ai/core#typecheck"] + }, + "@opencode-ai/tui#typecheck": { + "dependsOn": ["@opencode-ai/core#typecheck"] + }, "build": { "dependsOn": [], "outputs": ["dist/**"]