Dashboard › opencode › Distillation
ad98b0c8-2c60-4e40-8c6e-831af4a6ccaf["lore_tm_v1_1cv7E_m0v0W1s5Diz11P2bPO8XhRiQ_vuP618CdrtI4","lore_tm_v1_oR37K7u2jRvvh0bQmw6oYwNP4CJ6kcSEGQvAwxxtExw","lore_tm_v1_jat2WiqVx9MTT_lQMRLJ2skG7FHRnaOYnjQNsuWOsb8","lore_tm_v1_JqXVn4wLXkDWqfb-06fearHTmvmkqUbh_ZvERXHdHaE","lore_tm_v1_TmBR7jgJrFAK7PdLKg3iylWTG6JIhD4Ay49sL9ph4H8","lore_tm_v1_-N4x23pyJmRpfAeEhyXTQKV7Uccpm3-HLV_Wmw3mMgU","lore_tm_v1_ZSlT20apWb7Y-8p448g3Wni6jnRc93QSn2cUX1-qReU","lore_tm_v1__1m6d7ACY4rKbd-XcI9H10J0GbvRNHTwQcW2_hZq4-M","lore_tm_v1_5x0x0Oq_upVMFpA_3T0-KTAw_xhTOibIJ329JpGrcHU","lore_tm_v1_sjKdOIn2bAdIMXiXZmZI7LWipczM1m3um4FtmGRA1TM","lore_tm_v1_X7JImTjhXPflyRyYxPPq2eB3bKA9yx6LS5vhEDtL0VM","lore_tm_v1_itQ8jxm3wjP82jVGIoNvtJg6QvpRD28Hmu2EKLLKmQY","lore_tm_v1_0_2ilp6Xq7uhoWLmCF3yehsiRIa0vDsHB9xrV72wr9A","lore_tm_v1_97ie0UXpJufhBAP8LGTbJGzLM3RMwGmLdFFjwlSlLeQ","lore_tm_v1_0bgdLnRXZ7jmryhZzwdhJj3qDkoffyiY0hEnMdpcMKY","lore_tm_v1_2gd2bQQdxzrbTaubcO0iOrWfOB_bOR8FaK0OjIo14Qw","lore_tm_v1_wqBF7xH0bQIhi60TQzckJZM6VKHQMD-eryVWAueZ-gs","lore_tm_v1_FryKV3qu57ZMGwxiJ-lV_xAG_ysB6B8oHp3ZvJNKC4g","lore_tm_v1_XmHp-dWyb974m6k0mrz_WdL3GWAOzyWlZxVhFzPWJeM","lore_tm_v1_GpQPfIv1KO32VwZnqq1kWfyS5Leoqa5hWBgNq-Vncl8","lore_tm_v1_R3c87KnGWFAZ8h0f4akjvYnu4KB9bl8Sqo3njJEFSww","lore_tm_v1_Yl2OsOmpZyJIpTMBjb_3rb0rmlxSTzmGliJw-AkM3p8","lore_tm_v1_jjY4_1_mdWx2h0VJMZYlEsN-YsgVMTuWm_zAYLflNPs","lore_tm_v1_dNNdRPIW-2qF20MLZiuE5yMcO65YIOvrv65sT77z3qg","lore_tm_v1_DvLnZgzLJCNdJy72NBjvnVJmE71PfwEiKKmfbwpojzs","lore_tm_v1_HPgb92IcgzUoM8wVkbXyyEpro3UpdX5Tr49W7Jmg_uI","lore_tm_v1_yRd4DUKj3hRn6aZvqgoOZKjwCGP-kRK09uUe2KdNCig","lore_tm_v1_n36kBmOlSsHarqGhxgtJZXlT_hk4NQJlf31hSphStpg","lore_tm_v1_G03el0N6ZX1h1AcGBShMa586YeqFaE6u9wLhqYI7ztg","lore_tm_v1_wZU5bOipW8AoPKb6QF_XsmOFzKSUqvkEeGL6ksFLO4U","lore_tm_v1_zm4tQVTOYsoZ22FItp9SiLj527bLbo5I41eMLokKhms","lore_tm_v1_IKsYnbOBPf84V0FZFaP93WOb20FEXTzLgJxFFsZdsGM","lore_tm_v1_0HL2TpZYC6xey1HuTlbpM6h-FfaZgV9tOQb6mrZpYC0","lore_tm_v1_Ux1fEEvu2lZzp5Jsknlqw2GgIBL2d1e6MHNcnlAc5CI","lore_tm_v1_Zt3rCopsy-N_0kpyhiYHhhuSNpKnaO4ykLRheI_j_wI","lore_tm_v1_iEvbjJomHxfAjYMwczNbhGqbF_GH55zQJF00I_HkhLo","lore_tm_v1_f3R3C9qbt57GiTEnTyAwo_-X7bWiX4h5rx-y0DKfwOA","lore_tm_v1_KfpLYmcbOpd6Dpi7myZFkmTK0ww4qvbG3nXPKHAz6ko","lore_tm_v1_0eMcw1IhmZjn0hOKq13ndGUWIUK0V9kGUSAILC5d-uQ"]
/tmp/opencode/session-recovery-v19-review. The final response must:
file:line evidence.MUST-FIX or CONCERN.MERGE or DO-NOT-MERGE.ab9408c81cc9916177641ae8e9f08624fc27b5b9/tmp/opencode/session-recovery-final-v19.patcha2bce01664538243cb8ba16c6ca8f0364c6f79463ad6677567044a1b3e1e74fe/home/byk/Code/opencode/packages/opencode/dist/server/opencode-server753b05afb86195246b211237ca5b11e26a7c08da863d70a711da2c93ee453c8aAGENTS.md and package guidance; inspect every changed file and only necessary immutable-base context.packages/core/test/session-run-coordinator.test.ts lines 440-463 were not displayed; prior output covered lines 260-439 of 463.01:40 and exact No files found at 01:42). Snapshot capture search found exactly three matches in packages/core/src/snapshot.ts.Step.Started commit/notification interruption, coordinator-cleanup fallback must:
resume:false must persist intent before claim acquisition and must not arm conflicts or recovery-owned inputs../packages/sdk/js/script/build.tsHttpApi changes: run bun run generate from packages/clientsrc/generated or src/generated-effect.sdk-next composes Client, Core, and Server.dev; use dev or origin/dev, not assumed local main.session-recovery, fix-scroll-state, regenerate-sdk.type(scope): summary; allowed types are feat, fix, docs, chore, refactor, test; possible scopes include core, opencode, tui, app, desktop, sdk, plugin.try/catch, any, unnecessary destructuring, reassignment, and else; prefer inference, const, ternaries, early returns, Bun APIs, and flatMap/filter/map.Effect; untrusted JSON should use Schema.UnknownFromJsonString and Schema.decodeUnknownOption.snake_case directly..then(...) import chains.do-not-run-tests-from-root guard).globalThis.* where possible, exercise real implementations, and do not duplicate implementation logic.bun typecheck from package directories; never invoke tsc directly.SessionV2.prompt(...) durably admits one session_input before advisory SessionExecution.wake(sessionID); resume:false is admit-only.SessionExecution remains process-global and Session-ID based. Its local implementation owns the process-local coordinator and discovers placement via SessionStore plus LocationServiceMap.get(session.location) only while draining. No layer takes a Session ID.SessionRunner, model resolution, tool registry, permissions, and filesystem remain Location-scoped. Omitted Location.workspaceID means implicit-local placement.llm.stream(request) per provider turn; reload projected history before durable continuation. Do not bridge through legacy SessionPrompt.loop(...) or an in-memory tool loop.SessionRunCoordinator joins explicit same-session resumes, coalesces prompt wakes, and permits different sessions concurrently.steer is default and promotes at the next safe provider-turn boundary while continuation is needed.queue remains pending until the session would idle, then exactly one queued input is promoted before reevaluating continuation.@opencode-ai/schema <- @opencode-ai/protocol <- @opencode-ai/server.V1. Permanent replacement architecture must not retain V2 names. Current code must not depend on eventual src/v1/.@opencode-ai/protocol and @opencode-ai/sdk-next are current /api/... surfaces.current, shared transitional, or V1-only; V1 emission alone does not justify Protocol/SDK Next exposure. message.updated and message.part.* stay out absent a documented current-client need. One canonical definition per event.PluginID, PluginEvent, PtyInfo, PtyEvent, SessionTodoInfo; use canonical namespace members such as Plugin.ID.export * as SessionMessage from "./session-message".PascalCase; builders/combinators are camelCase; static combinator is statics(...).optional(...); decode-only defaults use Schema.withDecodingDefault(...).Schema.Struct records have same-name interfaces; public contracts are readonly and do not use Schema.mutable(...).Schema.Any; use Schema.Json or Schema.Unknown. Schema.Any is allowed only at documented unsafe compatibility boundaries.create(). Generated schemas validate exact emitted prefixes including _. Do not tighten legacy loose validators without explicit compatibility/migration decisions. Public brands/identifiers must be stable and unique.undefined omission, no accidental current Schema.Any, stable/unique public identifiers, exact facade/Schema identity, and exclusion of V1-only events from current Protocol manifests.export namespace Foo; use flat exports and self-reexports. Multi-sibling directories such as src/session/ and src/config/ must not add barrel index.ts.Effect.gen, Effect.fn("Domain.method"), Effect.fnUntraced, Effect.callback, Effect.void, DateTime.nowAsDate, Schema.Class, Schema.brand, Schema.TaggedErrorClass, and Schema.Defect; directly yield typed errors for early failure.makeRuntime from src/effect/run-service.ts; project/directory state uses InstanceState from src/effect/instance-state.ts.InstanceState.make; cleanup uses finalizers/acquire-release; background consumers use Effect.forkScoped; nonblocking initialization forks InstanceState.get(state) at call site.Effect.fork/Effect.forkDaemon; use Effect.forkIn(scope).FileSystem, ChildProcessSpawner, HttpClient, Path, Config, Clock, DateTime) over ad hoc platform APIs.Effect.repeat/Effect.schedule with Effect.forkScoped.Effect.cached, not manually stored Fiber | undefined or Promise | undefined.EffectBridge.HttpApiBuilder.group(...); SSE uses HttpServerResponse.stream(...) and HttpApiSchema.asText({ contentType: "text/event-stream" }); declared raw/WebSocket routes use handleRaw(...); HttpRouter.use(...) is only for undeclared routes such as UI fallback.Effect.provideService(...) middleware is only for request-derived context.Schema.ErrorClass; built-in HttpApiError.* only when its empty/tagged body is intended. SDK-visible message errors need exact API schemas. Translate expected domain errors at handler boundaries; domain/storage layers remain free of HttpApi types.src/system-context; context-source producers stay with observed domains; Session owns history selection and context-epoch persistence./tmp/opencode/session-recovery-final-v19.patch is 11,174 lines, exactly 34 diff --git sections. Changed paths and numstat:
packages/client/src/generated/types.ts +72/-0packages/core/schema.json +567/-48packages/core/src/database/migration.gen.ts +1/-0packages/core/src/database/migration/20260914170650_session-recovery.ts +62/-0packages/core/src/database/schema.gen.ts +52/-1packages/core/src/session.ts +6/-4packages/core/src/session/compaction.ts +31/-16packages/core/src/session/context-epoch.ts +54/-34packages/core/src/session/execution/local.ts +200/-19packages/core/src/session/input.ts +391/-31packages/core/src/session/message-updater.ts +69/-0packages/core/src/session/projector.ts +88/-1packages/core/src/session/recovery.ts +504/-0packages/core/src/session/run-coordinator.ts +30/-5packages/core/src/session/runner/index.ts +4/-0packages/core/src/session/runner/llm.ts +358/-104packages/core/src/session/runner/publish-llm-event.ts +111/-48packages/core/src/session/sql.ts +88/-1packages/core/test/database-migration.test.ts +66/-1packages/core/test/session-execution-local.test.ts +352/-0packages/core/test/session-projector.test.ts +2771/-3packages/core/test/session-prompt.test.ts +247/-25packages/core/test/session-run-coordinator.test.ts +45/-0packages/core/test/session-runner-recorded.test.ts +5/-10packages/core/test/session-runner-tool-events.test.ts +46/-7packages/core/test/session-runner.test.ts +1184/-58packages/opencode/src/server/routes/instance/httpapi/server.ts +2/-1packages/schema/src/session-event.ts +43/-1packages/schema/test/event-manifest.test.ts +8/-5packages/sdk/js/src/v2/gen/types.gen.ts +190/-0packages/sdk/openapi.json +657/-44packages/server/src/routes.ts +2/-0packages/core/src/session/execution/claim.ts +112/-0packages/core/src/session/recovery-id.ts +6/-0/tmp/opencode/session-recovery-v19-review/AGENTS.mdpackages/app/AGENTS.mdpackages/ui/AGENTS.mdpackages/opencode/AGENTS.mdpackages/desktop/AGENTS.mdpackages/opencode/src/session/llm/AGENTS.mdpackages/app/e2e/AGENTS.mdpackages/session-ui/AGENTS.mdpackages/schema/AGENTS.mdpackages/opencode/src/server/routes/instance/httpapi/AGENTS.mdpackages/opencode/test/AGENTS.mdpackages/opencode/test/server/AGENTS.mdpackages/app/e2e/performance/AGENTS.mdpackages/effect-drizzle-sqlite/AGENTS.mdpackages/llm/AGENTS.mdpackages/codemode/AGENTS.mdpackages/stats/AGENTS.mdpackages/core/src/tool/AGENTS.md.git, .github/, .opencode/, AGENTS.md, artifacts/, bun.lock, package.json, packages/, patches/, pnpm-lock.yaml, pnpm-workspace.yaml, specs/, and tsconfig.json.session_recovery, assistant_message_id, wake_attempts, wake_pending, and session_execution_recovery_scan_idx.wake_pending as integer DEFAULT true NOT NULL.session_execution.assistant_seq defaults to -1; session foreign keys use ON DELETE CASCADE.index("session_execution_owner_idx").on(table.owner_id).session_input_session_promoted_seq_idx on (session_id, promoted_seq)session_message_session_type_seq_idx on (session_id, type, seq)session_message_time_created_idx on (time_created)session_recovery_wake_pending_error_attempts_created_execution_idx on (wake_pending, recovery_error, wake_attempts, time_created, execution_id)permission_project_action_resource_idx, unique on (project_id, action, resource)part_message_id_id_idx on (message_id, id)todo_session_idx on (session_id)packages/core/schema.json has prevIds containing d4ff43d2-c4f9-442c-bada-a7d488b42fd2.packages/core/script/migration.ts fixed paths:
packages/core/schema.jsonpackages/core/src/database/migrationpackages/core/src/database/migration.gen.tspackages/core/src/database/schema.gen.ts--check, string --name.opencode-core-migration- temp output, generates incremental/full schemas, permits at most one new migration, writes formatted migration TS, updates snapshot/schema/registry, and removes temp output in finally.--check errors:
Core schema has ungenerated database migrations. Run \bun script/migration.ts` from packages/core.`Current database schema is stale. Run \bun script/migration.ts` from packages/core.`Database migration registry is stale. Run \bun script/migration.ts` from packages/core.`Expected one full schema migration, found ${generated.length}.--> statement-breakpoint; generated migrations use Effect, DatabaseMigration, and yield* tx.run(...).Promise.all.typescript and estree, semi: false, printWidth: 120.packages/core/src/session/execution/claim.ts defines claims by exact sessionID, executionID, and ownerID; matching also requires expires_at > now.SESSION_EXECUTION_LEASE_MS must exceed maximum deployment clock skew plus one renewal interval. executionID fences a node immediately after takeover.SessionExecutionClaim.update():
expires_at by SESSION_EXECUTION_LEASE_MS."cancelled" only from "cancelling"."cancelling" from any phase except "cancelled"."cancelling" and "cancelled".renew(), settleCancellation(), and clear() require a live exact claim and die with new SessionExecutionClaim.Lost(claim) if no row changes.transaction() first calls update(db, claim) inside db.transaction(..., { behavior: "immediate" }); DB failures are converted via Effect.orDie.packages/core/src/session/execution/local.ts:
activeClaims: Map<SessionSchema.ID, SessionExecutionClaim.Claim>."ready" with latest assistant sequence or -1, using .onConflictDoNothing() in an immediate transaction.wake_pending = true and recovery_error IS NULL, ordered by time_created, then execution_id, and passes continuation_message_id as recoveryInputID.leaseDuration / 3."unknown", and "continue" states, clearing eligible others.runner.run({ ...claim, force, recoveryInputID }) under locations.get(session.location).Database.node, EventV2.node, SessionStore.node, and LocationServiceMap.node."cancelled" clears immediately."cancelling" dies with Interrupted Session settlement failed: ${claim.sessionID}."cancelled" and clears assistant_message_id.SessionEvent.Step.Interrupted with { type: "unknown", message: "Provider Step outcome unknown after interruption" }, atomically commits settleCancellation(...), then clears.interrupt(sessionID) marks active claim "cancelling", interrupts coordinator with settlement cleanup, and concurrently renews every leaseDuration / 3. A SessionExecutionClaim.Lost defect is suppressed only when no current execution row remains.beginCancellationSettlement: (commit: () => Effect.Effect<void>) =>.activeClaims.get(sessionID).SessionExecutionTable.owner_id with recoveryClaim.ownerID.SessionRunCoordinator.Coordinator<Key, E> exposes active, run, wake, and interrupt.done, optional owner, optional exit, pendingWake, and stopping.run(key) starts forced work if idle, joins if active, and waits/retries if stopping.wake(key) sets/coalesces pendingWake, or starts non-forced work if idle.Deferred.interrupt(key, cleanup) marks stopping, clears old pending wake, interrupts owner, runs cleanup, then removes entry or starts a successor for work registered during stopping.Interrupted Session execution did not settle if owner recorded no exit and propagates cleanup failure after internal settlement.const interrupt = (key: Key, cleanup = Effect.void): Effect.Effect<void> =>.packages/core/test/session-run-coordinator.test.ts:260-283: wake during cleanup produces exactly two runs.:285-328: cleanup defect (new Error("cleanup defect")) still finalizes internal interruption and starts queued successor; exit contains a die; active becomes []; runs equal 2.:330-364: explicit resume during cleanup starts forced successor; forces are [false, true].:366-394: wake racing with failure starts exactly one follow-up; original failure remains visible.:396-415: interrupting a joined waiter does not cancel/duplicate underlying run; runs equal 1.:417-438: different keys run concurrently.RecoveryPhase: ["ready", "unknown", "continue"].Phase: ["ready", "safe", "unknown", "continue", "cancelling", "cancelled"]."cancelling" or "cancelled"."safe" is explicit in phase selection.updateExecution({ assistant_message_id: assistantMessageID, assistant_seq: assistantSeq }).updateExecution({ phase: "safe", assistant_message_id: null }).recovery.assistant_message_id and rejects mismatched assistant?.sessionID !== recovery.session_id.Effect.catchDefect(...).SessionExecutionTable, SessionInputTable, SessionMessageTable, SessionRecoveryTable, SessionExecutionClaim, and SessionEvent.assistant_seq, clears recovery claims using SessionExecutionClaim.clear(db, recoveryClaim), and processes work sequentially with Effect.forEach(..., { discard: true, concurrency: 1 }).wake_pending, recovery_error, wake_attempts, time_created, execution_id, and continuation_message_id; recovery rows join inputs on continuation ID.BATCH_SIZE - retriedOrdinary.length - freshOrdinary.length.Effect.repeat(Schedule.spaced("10 seconds")).!input.requestExecution returns { admitted: stored, shouldWake: false }.SessionInput.admit checks isRecoveryInput(db, input.id) and dies with new LifecycleConflict({ id: input.id }) if a recovery continuation enters the normal path.requestExecution, timeCreated, and wake state.SessionRecovery.BATCH_SIZE; one assertion expects SessionRecovery.BATCH_SIZE * 2 wakes.recoverySessions[0]."malformed-recovery-row", owner "dead", and assistant_seq: -1.[{ attempts: 2 }, { attempts: 2 }].expect(yield* Fiber.await(stale)).toMatchObject({ _tag: "Failure" }).SessionV2.ID.make("ses_recovery_identity_other").AFTER UPDATE ON session_inputtransfer_cancellation_recovery_ownerNEW.type = 'session.next.step.recovered.1'TestClock by "40 seconds".Project.ID.global, worktree AbsolutePath.make("/project"), sandboxes: [].SessionInputTable rows by session ID.readonly durable?: { readonly aggregateID: string readonly seq: number readonly version: number}
{ aggregateID, after? }.durable.aggregate data field.strictOwner, rejects rows whose stored ownerID differs.pubsub.all on teardown.EventV2.SubscriberOverflow.packages/core/src/session/projector.ts:
Prompted requires durable metadata and projects promotedSeq = event.durable.seq.PromptAdmitted projects admittedSeq = event.durable.seq; defaults requestExecution with ?? false.Step.Recovered requires durable sequence and computes continuation ID via continuation(event.data.executionID).Recovery execution identity conflict: ${event.data.executionID}.Recovery target is not the latest assistant: ${event.data.assistantMessageID}Recovery target is not an assistant: ${event.data.assistantMessageID}Prompt.make({ text: "continue" }), requestExecution: false, admittedSeq: event.durable.seq, then inserts recovery with wake_pending: true; .onConflictDoNothing() noninsert is treated as identity conflict.revert.files; cleared sets revert: null; committed resolves boundary and deletes later messages. Missing boundary dies with Revert boundary message not found: ${event.data.messageID}.EventV2 from ../../event in recovery-related code.if (input.beforeStream) yield* input.beforeStream() immediately before streaming.Semaphore.makeUnsafe(1).withPermit."ContinueAfterOverflowCompaction" and handles defect.transition._tag === "ContinueAfterOverflowCompaction".compaction.compactAfterOverflow.stream._tag === "Success" && !publisher.hasProviderError().packages/core/src/session/runner/publish-llm-event.ts emits SessionEvent.Step.Started.{ type: "unknown", message }.{ type: "unknown", message: "Provider Step ended without settlement" }."Provider Step outcome unknown after interruption" and unsettled-tool text "Provider did not return a tool result".structured only while tool status is "running"; otherwise {}.updateOwnedAssistant(event.data.assistantMessageID, ...).NEW.type = 'session.next.tool.failed.1' and query "session.next.step.ended.2".LLMEvent.textEnd({ id: "text-final" }) and LLMEvent.stepFinish({ index: 0, reason: "tool-calls" }).declined_with_finalizer, blocked_with_finalizer, call ID call-blocked-finalizer.runner.run({ sessionID, force: true, executionID, ownerID: "test" }).pipe(Effect.forkChild).Deferred.await(stepCommitted) and direct inserts into SessionExecutionTable.modelResolveHook resets to Effect.void.session.context(sessionID) with find and filter.Deferred.makeUnsafe<void>() and Scope.make().30_000.msg_execution_local_existing has sequence 7.prepareOnce(db, events, context, sessionID, claim).pipe(Effect.withSpan("SessionContextEpoch.prepare")).packages/core/src/snapshot.ts:
capture appears exactly at line 49 (interface), line 129 (implementation), line 241 (disabled implementation).location.vcs?.type === "git" and snapshots config is not false.git.tree.capture with current scope, ignores source, and max untracked size 2 * 1024 * 1024; logs "failed to capture snapshot" and returns undefined on failure.git.repo.create({ worktree, gitDirectory, seed: source }); errors map through failure("capture", cause).files/diff compare Git.TreeID.make(...), use git.tree.files, and exclude source-repository ignored paths.FSUtil.contains; escaping paths produce Path escapes the project: ${file}.preview rejects disabled state with "Snapshots are disabled", captures only requested files with the same 2 MiB untracked limit, then calls git.tree.preview(...).SessionNextStepRecovered and SessionNextPromptExecutionRequested; union includes SessionNextStepRecovered.session.next.text.started.1session.next.prompt.execution_requested#/components/schemas/SessionNextStepRecovered and references LLMProviderMetadata.sessionID, assistantMessageID, executionID, seq, and message IDs matching ^msg_.SyncEventSessionNextToolInputStarted and changes prior required fields ["timestamp", "sessionID", "assistantMessageID", "textID"].describe("public event manifest", ...) coverage was updated.packages/core/package.json: private ESM @opencode-ai/core version 1.18.30, MIT."db": "bun drizzle-kit""migration": "bun run script/migration.ts""fix-node-pty": "bun run script/fix-node-pty.ts""test": "bun test --only-failures""typecheck": "tsgo --noEmit""opencode" β ./bin/opencode../effect/layer-node./effect/app-node./session/runner./system-context./* β ./src/*.ts#sqlite: Bun/default .bun.ts, Node .node.ts#pty: Bun/default .bun.ts, Node .node.ts#fff: Bun/default .bun.ts, Node .node.ts1.0.17, Amazon Bedrock 4.0.166, Anthropic 3.0.111, Azure 3.0.93, Cerebras 2.0.41, Cohere 3.0.27, DeepInfra 2.0.41, Gateway 3.0.191, Google 3.0.73, Google Vertex 4.0.181, Groq 3.0.31, Mistral 3.0.51, OpenAI 3.0.88, OpenAI Compatible 2.0.41, Perplexity 3.0.26, Provider 3.0.16, Provider Utils 4.0.51, TogetherAI 2.0.41, Vercel 2.0.39, xAI 3.0.102, OpenRouter 2.9.0, AI Gateway 3.2.0, GitLab 6.15.0, Venice 2.1.1.3.1057.0, @ff-labs/fff-bun@0.9.4, Arborist 9.4.0, npm config 10.8.1, OpenTelemetry API 1.9.0, async-hooks 2.6.1, OTLP HTTP 0.214.0, trace base 2.6.1, Parcel watcher 2.5.1, Photon 0.3.4, bun-pty 0.4.8, fuzzysort 3.1.0, glob 13.0.5, google-auth-library 10.5.0, gray-matter 4.0.3, htmlparser2 8.0.2, immer 11.1.4, ignore 7.0.5, jsonc-parser 3.3.1, mime-types 3.0.2, minimatch 10.2.5, npm-package-arg 13.0.2, semver ^7.6.3, turndown 7.2.0, which 6.0.1, xdg-basedir 5.1.0.drizzle-orm override is "catalog:".@parcel/watcher-* packages at 2.5.1, and @opencode-ai/http-recorder@workspace:*.MERGE/DO-NOT-MERGE.SessionExecutionClaim and SessionExecutionLocal; user reiterated expired claims never renew.No files found.packages/core/package.json, scripts, exports, conditional imports, dependencies, and migration generator/checker implementation.