DashboardopencodeSession 0yQsI8yzvBca

Session 0yQsI8yzvBca

Full ID: 0yQsI8yzvBcadHhkC
Messages: 59
Distillations: 4
Time range: 2026-09-15 21:44:58 — 2026-09-15 21:56:49

Conversation (59 messages)

Read-only final audit in /home/byk/Code/opencode; do not use lore/recall; do not edit/test/build/commit/touch services. Inspect current files directly. Focus narrowly on durable ordinary wake intent changes: PromptAdmitted optional requestExecution backward compatibility at v1, explicit booleans for new admissions, exact resume:false->true retry via PromptExecutionRequested, deterministic event id and concurrent idempotence, conflicts, replay order/idempotence, post-promotion exact retry, recovery redrive, public event/SDK inventory. Check interactions with EventV2 projection registration keyed by logical type and versioned replay. Return findings with exact file:line and concrete sequence, or PASS plus residual risk/gaps. Never return empty.

gateway · 2026-09-15 21:44:58
result
/home/byk/Code/opencode/AGENTS.md
/home/byk/Code/opencode/packages/codemode/AGENTS.md
/home/byk/Code/opencode/packages/session-ui/AGENTS.md
/home/byk/Code/opencode/packages/effect-drizzle-sqlite/AGENTS.md
/home/byk/Code/opencode/packages/schema/AGENTS.md
/home/byk/Code/opencode/packages/llm/AGENTS.md
/home/byk/Code/opencode/packages/ui/AGENTS.md
/home/byk/Code/opencode/packages/stats/AGENTS.md
/home/byk/Code/opencode/packages/core/src/tool/AGENTS.md
/home/byk/Code/opencode/packages/desktop/AGENTS.md
/home/byk/Code/opencode/packages/opencode/AGENTS.md
/home/byk/Code/opencode/packages/opencode/test/AGENTS.md
/home/byk/Code/opencode/packages/opencode/test/server/AGENTS.md
/home/byk/Code/opencode/packages/opencode/src/session/llm/AGENTS.md
/home/byk/Code/opencode/packages/opencode/src/server/routes/instance/httpapi/AGENTS.md
/home/byk/Code/opencode/packages/app/AGENTS.md
/home/byk/Code/opencode/packages/app/e2e/AGENTS.md
/home/byk/Code/opencode/packages/app/e2e/performance/AGENTS.md
gateway · 2026-09-15 21:45:27
result
/home/byk/Code/opencode/CONTRIBUTING.md
gateway · 2026-09-15 21:45:34
result
Found 59 matches
/home/byk/Code/opencode/packages/schema/test/event-manifest.test.ts:
  Line 53:       SessionEvent.PromptExecutionRequested,


/home/byk/Code/opencode/packages/schema/src/session-event.ts:
  Line 94: export const PromptAdmitted = Event.define({

  Line 99:     requestExecution: Schema.Boolean.pipe(optional),

  Line 102: export type PromptAdmitted = typeof PromptAdmitted.Type

  Line 104: export const PromptExecutionRequested = Event.define({

  Line 112: export type PromptExecutionRequested = typeof PromptExecutionRequested.Type

  Line 489:   PromptAdmitted,

  Line 490:   PromptExecutionRequested,

  Line 523:   PromptAdmitted,

  Line 524:   PromptExecutionRequested,


/home/byk/Code/opencode/packages/sdk/js/src/v2/gen/types.gen.ts:
  Line 23:   | EventSessionNextPromptAdmitted

  Line 24:   | EventSessionNextPromptExecutionRequested

  Line 874:           requestExecution?: boolean

  Line 1649:     | SyncEventSessionNextPromptAdmitted

  Line 1650:     | ...
gateway · 2026-09-15 21:45:39
result
<path>/home/byk/Code/opencode/AGENTS.md</path>
<type>file</type>
<content>
1: - To regenerate the legacy JavaScript SDK, run `./packages/sdk/js/script/build.ts`.
2: - After changing the public Protocol or Server `HttpApi`, run `bun run generate` from `packages/client`. Do not edit `src/generated` or `src/generated-effect` directly.
3: - Keep runtime dependencies directed from Schema to Core and Protocol, then from Core and Protocol to Server. Client runtime code may depend on Schema and Protocol but never Core or Server; `sdk-next` composes Client, Core, and Server.
4: - The default branch in this repo is `dev`.
5: - Local `main` ref may not exist; use `dev` or `origin/dev` for diffs.
6: 
7: ## Branch Names
8: 
9: Use a short branch name of at most three words, separated by hyphens. Do not use slashes or type prefixes such as `feat/` or `fix/`.
10: 
11: Examples: `session-recovery`, `fix-scroll-state`, `regenerate-sdk`. ...
gateway · 2026-09-15 21:47:18
result
<path>/home/byk/Code/opencode/CONTRIBUTING.md</path>
<type>file</type>
<content>
1: # Contributing to OpenCode
2: 
3: We want to make it easy for you to contribute to OpenCode. Here are the most common type of changes that get merged:
4: 
5: - Bug fixes
6: - Additional LSPs / Formatters
7: - Improvements to LLM performance
8: - Support for new providers
9: - Fixes for environment-specific quirks
10: - Missing standard behavior
11: - Documentation improvements
12: 
13: However, any UI or core product feature must go through a design review with the core team before implementation.
14: 
15: If you are unsure if a PR would be accepted, feel free to ask a maintainer or look for issues with any of the following labels:
16: 
17: - [`help wanted`](https://github.com/anomalyco/opencode/issues?q=is%3Aissue%20state%3Aopen%20label%3Ahelp-wanted)
18: - [`good first issue`](https://github.com/anomalyco/opencode/issues?q=is%3Aissue%20state%3Aopen%20label%3A%22good%20first%20issue%22)
19: - ...
gateway · 2026-09-15 21:47:34
result
<path>/home/byk/Code/opencode/packages/schema/AGENTS.md</path>
<type>file</type>
<content>
1: # Schema Package Guide
2: 
3: `@opencode-ai/schema` owns browser-safe wire and storage contracts shared by protocol, server, core, and generated SDKs. Keep runtime behavior, service layers, side effects, and host-local implementation details in the domain package that owns them.
4: 
5: ## Package Boundary
6: 
7: - Preserve the dependency direction: `@opencode-ai/schema <- @opencode-ai/protocol <- @opencode-ai/server`.
8: - Schema values should be serializable contract definitions, not service implementations or runtime registries.
9: - A domain may keep a minimal public wire contract here when SDK generation needs it, but do not move the broader runtime model into Schema just because an event is public. `plugin.added` is the current example: Schema may own the minimum browser-safe event payload, while plugin runtime behavior stays outside Schema. ...
gateway · 2026-09-15 21:47:46
result
<path>/home/byk/Code/opencode/package.json</path>
<type>file</type>
<content>
1: {
2:   "$schema": "https://json.schemastore.org/package.json",
3:   "name": "opencode",
4:   "description": "AI-powered development tool",
5:   "private": true,
6:   "type": "module",
7:   "packageManager": "bun@1.3.14",
8:   "scripts": {
9:     "dev": "bun run --cwd packages/opencode src/index.ts",
10:     "dev:desktop": "bun --cwd packages/desktop dev",
11:     "dev:web": "bun --cwd packages/app dev",
12:     "dev:console": "ulimit -n 10240 2>/dev/null; bun run --cwd packages/console/app dev",
13:     "dev:stats": "bun sst shell --stage=production -- bun run --cwd packages/stats/app dev",
14:     "dev:storybook": "bun --cwd packages/storybook storybook",
15:     "lint": "oxlint",
16:     "typecheck": "bun turbo typecheck",
17:     "upgrade-opentui": "bun run script/upgrade-opentui.ts",
18:     "postinstall": "bun run --cwd packages/core fix-node-pty",
19:     "prepare": "husky",
20:     "random": "echo ...
gateway · 2026-09-15 21:47:50
result
<path>/home/byk/Code/opencode/packages/schema/src/session-event.ts</path>
<type>file</type>
<content>
1: export * as SessionEvent from "./session-event"
2: 
3: import { Schema } from "effect"
4: import { optional } from "./schema"
5: import { Event } from "./event"
6: import { ProviderMetadata, ToolContent } from "./llm"
7: import { Delivery } from "./session-delivery"
8: import { Model } from "./model"
9: import { DateTimeUtcFromMillis, NonNegativeInt, RelativePath } from "./schema"
10: import { FileAttachment, Prompt } from "./prompt"
11: import { SessionID } from "./session-id"
12: import { Location } from "./location"
13: import { SessionMessage } from "./session-message"
14: import { Revert } from "./revert"
15: 
16: export { FileAttachment }
17: 
18: export const Source = Schema.Struct({
19:   start: NonNegativeInt,
20:   end: NonNegativeInt,
21:   text: Schema.String,
22: }).annotate({
23:   identifier: "session.next.event.source",
24: })
25: export interface Source extends ...
gateway · 2026-09-15 21:48:11
result
<path>/home/byk/Code/opencode/packages/schema/src/session-event.ts</path>
<type>file</type>
<content>
460:       ...Base,
461:       messageID: SessionMessage.ID,
462:       reason: Started.data.fields.reason,
463:       text: Schema.String,
464:       recent: Schema.String,
465:     },
466:   })
467:   export type Ended = typeof Ended.Type
468: }
469: 
470: export namespace RevertEvent {
471:   export const Staged = Event.define({
472:     type: "session.next.revert.staged",
473:     ...options,
474:     schema: { ...Base, revert: Revert.State },
475:   })
476:   export const Cleared = Event.define({ type: "session.next.revert.cleared", ...options, schema: Base })
477:   export const Committed = Event.define({
478:     type: "session.next.revert.committed",
479:     ...options,
480:     schema: { ...Base, messageID: SessionMessage.ID },
481:   })
482: }
483: 
484: export const DurableDefinitions = Event.inventory(
485:   AgentSwitched,
486:   ModelSwitched,
487:   Moved,
488:   ...
gateway · 2026-09-15 21:48:16
result
<path>/home/byk/Code/opencode/packages/core/src/session/input.ts</path>
<type>file</type>
<content>
1: export * as SessionInput from "./input"
2: 
3: import { and, asc, eq, isNull, lte } from "drizzle-orm"
4: import { DateTime, Effect, Schema } from "effect"
5: import { Admitted, Delivery } from "@opencode-ai/schema/session-input"
6: import type { Database } from "../database/database"
7: import { EventV2 } from "../event"
8: import { SessionEvent } from "./event"
9: import { SessionMessage } from "./message"
10: import { Prompt } from "./prompt"
11: import { SessionSchema } from "./schema"
12: import { SessionInputTable, SessionMessageTable, SessionRecoveryTable } from "./sql"
13: 
14: type DatabaseService = Database.Interface["db"]
15: 
16: export { Admitted, Delivery }
17: 
18: const decodePrompt = Schema.decodeUnknownSync(Prompt)
19: const encodePrompt = Schema.encodeSync(Prompt)
20: 
21: export const decode = (value: unknown) => Schema.decodeUnknownOption(Prompt)(value)
22: 
23: ...
gateway · 2026-09-15 21:48:21
result
<path>/home/byk/Code/opencode/packages/core/src/session/input.ts</path>
<type>file</type>
<content>
241: 
242:   yield* db
243:     .insert(SessionInputTable)
244:     .values({
245:       id: input.id,
246:       session_id: input.sessionID,
247:       prompt: encodePrompt(input.prompt),
248:       delivery: input.delivery,
249:       admitted_seq: input.promotedSeq,
250:       promoted_seq: input.promotedSeq,
251:       time_created: DateTime.toEpochMillis(input.timeCreated),
252:     })
253:     .run()
254:     .pipe(Effect.orDie)
255:   yield* settleRecoveryWake(db, input)
256: })
257: 
258: const settleRecoveryWake = (
259:   db: DatabaseService,
260:   input: { readonly id: SessionMessage.ID; readonly sessionID: SessionSchema.ID },
261: ) =>
262:   db
263:     .update(SessionRecoveryTable)
264:     .set({ wake_pending: false })
265:     .where(
266:       and(
267:         eq(SessionRecoveryTable.session_id, input.sessionID),
268:         ...
gateway · 2026-09-15 21:48:26
result
<path>/home/byk/Code/opencode/packages/core/src/session/projector.ts</path>
<type>file</type>
<content>
330:           .run()
331:           .pipe(Effect.orDie)
332:         const previous = row && usage(row.data)
333:         const next = usage(event.data.part)
334:         if (previous) yield* applyUsage(db, row.session_id, previous, -1)
335:         if (next) yield* applyUsage(db, sessionID, next)
336:       }),
337:     )
338:     yield* events.project(SessionEvent.AgentSwitched, (event) =>
339:       db
340:         .update(SessionTable)
341:         .set({ agent: event.data.agent, time_updated: DateTime.toEpochMillis(event.data.timestamp) })
342:         .where(eq(SessionTable.id, event.data.sessionID))
343:         .run()
344:         .pipe(Effect.orDie, Effect.andThen(run(db, event))),
345:     )
346:     yield* events.project(SessionEvent.ModelSwitched, (event) =>
347:       Effect.gen(function* () {
348:         yield* db
349:           .update(SessionTable)
350:           ...
gateway · 2026-09-15 21:48:29
result
<path>/home/byk/Code/opencode/packages/core/src/session.ts</path>
<type>file</type>
<content>
320:         const boundary = anchor
321:           ? order === "asc"
322:             ? gt(SessionMessageTable.seq, anchor.seq)
323:             : lt(SessionMessageTable.seq, anchor.seq)
324:           : undefined
325:         const where = boundary
326:           ? and(eq(SessionMessageTable.session_id, input.sessionID), boundary)
327:           : eq(SessionMessageTable.session_id, input.sessionID)
328:         const query = db
329:           .select()
330:           .from(SessionMessageTable)
331:           .where(where)
332:           .orderBy(order === "asc" ? asc(SessionMessageTable.seq) : desc(SessionMessageTable.seq))
333:         const rows = yield* (input.limit === undefined ? query.all() : query.limit(input.limit).all()).pipe(
334:           Effect.orDie,
335:         )
336:         return yield* Effect.forEach(direction === "previous" ? rows.toReversed() : rows, decode)
337:       ...
gateway · 2026-09-15 21:48:34
result
No files found
gateway · 2026-09-15 21:48:40
result
/home/byk/Code/opencode/packages/core/src/event.ts
/home/byk/Code/opencode/packages/core/src/public-event-manifest.ts
/home/byk/Code/opencode/packages/core/src/session/event.ts
/home/byk/Code/opencode/packages/core/src/session/runner/publish-llm-event.ts
/home/byk/Code/opencode/packages/core/src/database/migration/20260604172448_event_sourced_session_input.ts
/home/byk/Code/opencode/packages/core/src/database/migration/20260323234822_events.ts
gateway · 2026-09-15 21:48:43
result
<path>/home/byk/Code/opencode/packages/core/src/event.ts</path>
<type>file</type>
<content>
1: export * as EventV2 from "./event"
2: 
3: import { Cause, Context, Effect, Layer, Option, PubSub, Queue, Schema, Stream } from "effect"
4: import { Event } from "@opencode-ai/schema/event"
5: import type { Data, Definition, Payload } from "@opencode-ai/schema/event"
6: import { and, asc, eq, gt, inArray } from "drizzle-orm"
7: import { Database } from "./database/database"
8: import { EventSequenceTable, EventTable } from "./event/sql"
9: import { Location } from "./location"
10: import { makeGlobalNode } from "./effect/app-node"
11: import { isDeepStrictEqual } from "node:util"
12: import { Durable } from "@opencode-ai/schema/durable-event-manifest"
13: 
14: export const ID = Event.ID
15: export type ID = import("@opencode-ai/schema/event").ID
16: export type { Data, Definition, Payload } from "@opencode-ai/schema/event"
17: 
18: export type Subscriber<D extends Definition = Definition> = ...
gateway · 2026-09-15 21:48:47
result
<path>/home/byk/Code/opencode/packages/core/src/event.ts</path>
<type>file</type>
<content>
294:                           const seq = input?.seq ?? latest + 1
295:                           if (input && seq !== latest + 1) {
296:                             yield* Effect.die(
297:                               new InvalidDurableEventError({
298:                                 type: event.type,
299:                                 message: `Sequence mismatch for aggregate ${aggregateID}: expected ${latest + 1}, got ${seq}`,
300:                               }),
301:                             )
302:                           }
303:                           const stored = yield* db
304:                             .select({ aggregateID: EventTable.aggregate_id, seq: EventTable.seq })
305:                             .from(EventTable)
306:                             .where(eq(EventTable.id, event.id))
307:                             .get()
308:                             ...
gateway · 2026-09-15 21:48:54
result
<path>/home/byk/Code/opencode/packages/core/src/event.ts</path>
<type>file</type>
<content>
539:       const streamAll = (): Stream.Stream<Payload> => Stream.fromPubSub(pubsub.all)
540: 
541:       const readAfter = (aggregateID: string, after: number) =>
542:         (options?.beforeAggregateRead?.(aggregateID) ?? Effect.void).pipe(
543:           Effect.andThen(
544:             db
545:               .select()
546:               .from(EventTable)
547:               .where(and(eq(EventTable.aggregate_id, aggregateID), gt(EventTable.seq, after)))
548:               .orderBy(asc(EventTable.seq))
549:               .all(),
550:           ),
551:           Effect.orDie,
552:           Effect.map((rows) =>
553:             rows.map((event) =>
554:               decodeSerializedEvent({
555:                 id: event.id,
556:                 aggregateID: event.aggregate_id,
557:                 seq: event.seq,
558:                 type: event.type,
559:                 data: ...
gateway · 2026-09-15 21:48:59
result
<path>/home/byk/Code/opencode/packages/schema/src/event.ts</path>
<type>file</type>
<content>
1: export * as Event from "./event"
2: 
3: import { Schema } from "effect"
4: import { optional } from "./schema"
5: import { ascending } from "./identifier"
6: import { Location } from "./location"
7: import { statics } from "./schema"
8: 
9: export const ID = Schema.String.check(Schema.isStartsWith("evt_")).pipe(
10:   Schema.brand("Event.ID"),
11:   statics((schema) => ({ create: () => schema.make("evt_" + ascending()) })),
12: )
13: export type ID = typeof ID.Type
14: 
15: export type Definition<
16:   Type extends string = string,
17:   DataSchema extends Schema.Codec<unknown, unknown> = Schema.Codec<unknown, unknown>,
18: > = Schema.Top & {
19:   readonly type: Type
20:   readonly durable?: {
21:     readonly version: number
22:     readonly aggregate: string
23:   }
24:   readonly data: DataSchema
25: }
26: 
27: export type Data<D extends Definition> = Schema.Schema.Type<D["data"]>
28: ...
gateway · 2026-09-15 21:49:03
result
<path>/home/byk/Code/opencode/packages/schema/src/durable-event-manifest.ts</path>
<type>file</type>
<content>
1: export * as DurableEventManifest from "./durable-event-manifest"
2: 
3: import { Event } from "./event"
4: import { SessionEvent } from "./session-event"
5: import { SessionV1 } from "./session-v1"
6: 
7: export const SessionDurable = {
8:   definitions: Event.durable(SessionEvent.DurableDefinitions),
9:   schema: SessionEvent.Durable,
10: } as const
11: 
12: export const Durable = Event.durable([
13:   ...SessionV1.Event.Definitions.filter((definition) => definition.durable !== undefined),
14:   ...SessionEvent.DurableDefinitions,
15: ])

(End of file - total 15 lines)
</content>
gateway · 2026-09-15 21:49:07
result
<path>/home/byk/Code/opencode/packages/core/src/public-event-manifest.ts</path>
<type>file</type>
<content>
1: export * as PublicEventManifest from "./public-event-manifest"
2: 
3: import { Event } from "@opencode-ai/schema/event"
4: import { EventManifest } from "@opencode-ai/schema/event-manifest"
5: 
6: export const Definitions = EventManifest.ServerDefinitions
7: export const Latest = Event.latest(Definitions)

(End of file - total 7 lines)
</content>
gateway · 2026-09-15 21:49:11
result
<path>/home/byk/Code/opencode/packages/schema/src/event-manifest.ts</path>
<type>file</type>
<content>
1: export * as EventManifest from "./event-manifest"
2: 
3: import { Catalog } from "./catalog"
4: import { Durable } from "./durable-event-manifest"
5: import { Event } from "./event"
6: import { FileSystem } from "./filesystem"
7: import { FileSystemWatcher } from "./filesystem-watcher"
8: import { InstallationEvent } from "./installation-event"
9: import { Integration } from "./integration"
10: import { LegacyEvent } from "./legacy-event"
11: import { LspEvent } from "./lsp-event"
12: import { McpEvent } from "./mcp-event"
13: import { ModelsDev } from "./models-dev"
14: import { Permission } from "./permission"
15: import { PermissionV1 } from "./permission-v1"
16: import { Plugin } from "./plugin"
17: import { Project } from "./project"
18: import { ProjectDirectories } from "./project-directories"
19: import { Pty } from "./pty"
20: import { Question } from "./question"
21: ...
gateway · 2026-09-15 21:49:19
result
Found 35 matches
/home/byk/Code/opencode/packages/core/src/database/schema.gen.ts:
  Line 180:           \`wake_pending\` integer DEFAULT false NOT NULL,

  Line 204:           \`wake_pending\` integer DEFAULT true NOT NULL,

  Line 293:         `CREATE INDEX \`session_input_wake_pending_promoted_time_created_id_idx\` ON \`session_input\` (\`wake_pending\`,\`promoted_seq\`,\`time_created\`,\`id\`);`,


/home/byk/Code/opencode/packages/core/src/session/recovery.ts:
  Line 152:     .where(and(eq(SessionRecoveryTable.wake_pending, true), isNull(SessionRecoveryTable.recovery_error)))

  Line 223:                 eq(SessionRecoveryTable.wake_pending, true),

  Line 244:                 eq(SessionRecoveryTable.wake_pending, true),

  Line 255:           Effect.logError("Failed to redrive Session recovery", cause).pipe(

  Line 268:     .where(and(eq(SessionInputTable.wake_pending, true), isNull(SessionInputTable.promoted_seq)))

  Line 279:           Effect.logError("Failed to redrive ...
gateway · 2026-09-15 21:49:26
result
<path>/home/byk/Code/opencode/packages/core/src/session/recovery.ts</path>
<type>file</type>
<content>
1: export * as SessionRecovery from "./recovery"
2: 
3: import { and, asc, desc, eq, gt, isNull, lte, sql } from "drizzle-orm"
4: import { Clock, DateTime, Effect, Layer, Option, Schedule, Schema } from "effect"
5: import { Database } from "../database/database"
6: import { makeGlobalNode } from "../effect/app-node"
7: import { EventV2 } from "../event"
8: import { SessionEvent } from "./event"
9: import { SessionExecution } from "./execution"
10: import { SessionProjector } from "./projector"
11: import { SessionExecutionClaim } from "./execution/claim"
12: import { continuation, message } from "./recovery-id"
13: import { Prompt } from "./prompt"
14: import { SessionInput } from "./input"
15: import {
16:   SESSION_EXECUTION_LEASE_MS,
17:   SessionExecutionTable,
18:   SessionInputTable,
19:   SessionRecoveryTable,
20:   SessionMessageTable,
21: } from "./sql"
22: 
23: export const ...
gateway · 2026-09-15 21:49:41
result
<path>/home/byk/Code/opencode/packages/core/src/session/projector.ts</path>
<type>file</type>
<content>
1: export * as SessionProjector from "./projector"
2: 
3: import { and, desc, eq, gt, or, sql } from "drizzle-orm"
4: import { DateTime, Effect, Layer, Schema } from "effect"
5: import { Database } from "../database/database"
6: import { EventV2 } from "../event"
7: import { makeGlobalNode } from "../effect/app-node"
8: import { SessionEvent } from "./event"
9: import { SessionV1 } from "../v1/session"
10: import { WorkspaceTable } from "../control-plane/workspace.sql"
11: import { SessionMessage } from "./message"
12: import { SessionMessageUpdater } from "./message-updater"
13: import { SessionInput } from "./input"
14: import { Prompt } from "./prompt"
15: import { continuation } from "./recovery-id"
16: import { WorkspaceV2 } from "../workspace"
17: import {
18:   MessageTable,
19:   PartTable,
20:   SessionInputTable,
21:   SessionMessageTable,
22:   SessionRecoveryTable,
23:   ...
gateway · 2026-09-15 21:49:50
result
<path>/home/byk/Code/opencode/packages/core/src/session/projector.ts</path>
<type>file</type>
<content>
490:       Effect.gen(function* () {
491:         const boundary = yield* db
492:           .select({ seq: SessionMessageTable.seq })
493:           .from(SessionMessageTable)
494:           .where(
495:             and(
496:               eq(SessionMessageTable.session_id, event.data.sessionID),
497:               eq(SessionMessageTable.id, event.data.messageID),
498:             ),
499:           )
500:           .get()
501:           .pipe(Effect.orDie)
502:         if (!boundary) return yield* Effect.die(`Revert boundary message not found: ${event.data.messageID}`)
503:         yield* db
504:           .delete(SessionMessageTable)
505:           .where(
506:             and(eq(SessionMessageTable.session_id, event.data.sessionID), gt(SessionMessageTable.seq, boundary.seq)),
507:           )
508:           .run()
509:           .pipe(Effect.orDie)
510:         yield* db
511:      ...
gateway · 2026-09-15 21:49:54
result
Found 40 matches
/home/byk/Code/opencode/packages/core/test/session-runner.test.ts:
  Line 411:     yield* events.replayAll(


/home/byk/Code/opencode/packages/core/test/session-projector.test.ts:
  Line 159:       yield* events.replayAll(

  Line 198:       yield* events.replayAll(


/home/byk/Code/opencode/packages/core/test/session-prompt.test.ts:
  Line 115:   yield* events.replayAll(

  Line 367:       yield* events.replay({


/home/byk/Code/opencode/packages/core/test/session-create.test.ts:
  Line 258:         expect(yield* events.replayAll(serialized.slice(0, 2))).toBe(created.id)

  Line 268:         expect(yield* events.replayAll(serialized.slice(2))).toBe(created.id)


/home/byk/Code/opencode/packages/core/test/event.test.ts:
  Line 551:       yield* events.replay({

  Line 570:       yield* events.replay({

  Line 606:           .replay({

  Line 639:       yield* events.replay({

  Line 647:         .replay({

  Line 671:       yield* events.replay({

  Line 687:         ...
gateway · 2026-09-15 21:50:02
result
<path>/home/byk/Code/opencode/packages/core/test/session-prompt.test.ts</path>
<type>file</type>
<content>
1: import { describe, expect } from "bun:test"
2: import { DateTime, Effect, Fiber, Layer, Stream } from "effect"
3: import { asc, eq } from "drizzle-orm"
4: import { Database } from "@opencode-ai/core/database/database"
5: import { AppNodeBuilder } from "@opencode-ai/core/effect/app-node-builder"
6: import { LayerNode } from "@opencode-ai/core/effect/layer-node"
7: import { EventV2 } from "@opencode-ai/core/event"
8: import { EventTable } from "@opencode-ai/core/event/sql"
9: import { SessionEvent } from "@opencode-ai/core/session/event"
10: import { Project } from "@opencode-ai/core/project"
11: import { ProjectTable } from "@opencode-ai/core/project/sql"
12: import { AbsolutePath } from "@opencode-ai/core/schema"
13: import { SessionV2 } from "@opencode-ai/core/session"
14: import { Prompt } from "@opencode-ai/core/session/prompt"
15: import { SessionMessage } from ...
gateway · 2026-09-15 21:50:05
result
<path>/home/byk/Code/opencode/packages/core/test/session-prompt.test.ts</path>
<type>file</type>
<content>
600:       yield* recover()
601:       expect(wakeCalls).toEqual([])
602:     }),
603:   )
604: 
605:   it.effect("returns an exact retry of a legacy projected prompt", () =>
606:     Effect.gen(function* () {
607:       yield* setup
608:       const session = yield* SessionV2.Service
609:       const events = yield* EventV2.Service
610:       const prompt = Prompt.make({ text: "Historical prompt" })
611:       yield* events.publish(SessionEvent.Prompted, {
612:         sessionID,
613:         messageID,
614:         timestamp: yield* DateTime.now,
615:         prompt,
616:         delivery: "steer",
617:       })
618: 
619:       const retried = yield* session.prompt({ id: messageID, sessionID, prompt, resume: false })
620: 
621:       expect(retried).toMatchObject({ id: messageID, prompt: { text: "Historical prompt" } })
622:       expect(yield* ...
gateway · 2026-09-15 21:50:14
result
Found 3 matches
/home/byk/Code/opencode/packages/core/test/session-prompt.test.ts:
  Line 416:       expect(yield* eventCount(EventV2.versionedType(SessionEvent.PromptExecutionRequested.type, 1))).toBe(1)

  Line 483:       expect(yield* eventCount(EventV2.versionedType(SessionEvent.PromptExecutionRequested.type, 1))).toBe(0)

  Line 489:       expect(yield* eventCount(EventV2.versionedType(SessionEvent.PromptExecutionRequested.type, 1))).toBe(0)
gateway · 2026-09-15 21:50:41
result
<path>/home/byk/Code/opencode/packages/core/src/session/execution/local.ts</path>
<type>file</type>
<content>
1: import { and, asc, eq, isNull } from "drizzle-orm"
2: import { Cause, Clock, Duration, Effect, Exit, Layer, Schedule } from "effect"
3: import { Database } from "../../database/database"
4: import { LocationServiceMap } from "../../location-service-map"
5: import { makeGlobalNode } from "../../effect/app-node"
6: import { SessionRunCoordinator } from "../run-coordinator"
7: import { SessionRunner } from "../runner"
8: import { SessionMessage } from "../message"
9: import { SessionSchema } from "../schema"
10: import { SessionStore } from "../store"
11: import { SessionExecution } from "../execution"
12: import { SessionExecutionClaim } from "./claim"
13: import { SESSION_EXECUTION_LEASE_MS, SessionExecutionTable, SessionRecoveryTable } from "../sql"
14: 
15: /** Current-process routing for implicit-local Locations. Future remote placement belongs here. ...
gateway · 2026-09-15 21:50:50
result
Found 34 matches
/home/byk/Code/opencode/packages/core/src/session/recovery.ts:
  Line 152:     .where(and(eq(SessionRecoveryTable.wake_pending, true), isNull(SessionRecoveryTable.recovery_error)))

  Line 223:                 eq(SessionRecoveryTable.wake_pending, true),

  Line 244:                 eq(SessionRecoveryTable.wake_pending, true),

  Line 268:     .where(and(eq(SessionInputTable.wake_pending, true), isNull(SessionInputTable.promoted_seq)))


/home/byk/Code/opencode/packages/core/src/session/projector.ts:
  Line 450:             wake_pending: true,


/home/byk/Code/opencode/packages/core/src/session/sql.ts:
  Line 153:     wake_pending: integer({ mode: "boolean" }).notNull().default(false),

  Line 167:     index("session_input_wake_pending_promoted_time_created_id_idx").on(

  Line 168:       table.wake_pending,

  Line 192:     wake_pending: integer({ mode: "boolean" }).notNull().default(true),


/home/byk/Code/opencode/packages/core/src/session/run-coordinator.ts:
  ...
gateway · 2026-09-15 21:50:54
result
<path>/home/byk/Code/opencode/packages/core/src/session/runner/llm.ts</path>
<type>file</type>
<content>
480:         Effect.catchDefect(
481:           Effect.fnUntraced(function* (defect) {
482:             if (!(defect instanceof TurnTransitionError)) return yield* Effect.die(defect)
483:             yield* Effect.yieldNow
484:             if (defect.transition._tag === "ContinueAfterOverflowCompaction")
485:               return yield* runAfterOverflowCompaction(
486:                 sessionID,
487:                 executionID,
488:                 undefined,
489:                 defect.transition.step,
490:                 ownerID,
491:               )
492:             return yield* runTurn(sessionID, executionID, undefined, defect.transition.step, ownerID)
493:           }),
494:         ),
495:       )
496:     })
497: 
498:     const run = Effect.fn("SessionRunner.run")(function* (input: {
499:       readonly sessionID: SessionSchema.ID
500:       readonly force: boolean
501:  ...
gateway · 2026-09-15 21:51:14
result
Found 7 matches
/home/byk/Code/opencode/packages/core/test/session-runner.test.ts:
  Line 694:       const message = yield* SessionInput.admit(db, events, {


/home/byk/Code/opencode/packages/core/test/session-projector.test.ts:
  Line 629:       yield* SessionInput.admit(db, events, {

  Line 876:       yield* SessionInput.admit(db, events, {

  Line 1354:       const admitted = yield* SessionInput.admit(db, events, {


/home/byk/Code/opencode/packages/core/src/session.ts:
  Line 368:             const admitted = yield* SessionInput.admit(db, events, {


/home/byk/Code/opencode/packages/core/src/session/projector.ts:
  Line 374:         yield* SessionInput.projectAdmitted(db, {

  Line 433:         yield* SessionInput.projectAdmitted(db, {
gateway · 2026-09-15 21:51:17
result
<path>/home/byk/Code/opencode/packages/core/src/database/migration/20260914170650_session-recovery.ts</path>
<type>file</type>
<content>
1: import { Effect } from "effect"
2: import type { DatabaseMigration } from "../migration"
3: 
4: export default {
5:   id: "20260914170650_session-recovery",
6:   up(tx) {
7:     return Effect.gen(function* () {
8:       yield* tx.run(`ALTER TABLE \`session_input\` ADD \`wake_pending\` integer DEFAULT false NOT NULL;`)
9:       yield* tx.run(`
10:         CREATE TABLE \`session_execution\` (
11:           \`id\` text NOT NULL,
12:           \`session_id\` text NOT NULL,
13:           \`owner_id\` text NOT NULL,
14:           \`assistant_message_id\` text,
15:           \`phase\` text NOT NULL,
16:           \`time_created\` integer NOT NULL,
17:           \`expires_at\` integer NOT NULL,
18:           \`recovery_error\` text,
19:           CONSTRAINT \`session_execution_pk\` PRIMARY KEY(\`id\`),
20:           CONSTRAINT ...
gateway · 2026-09-15 21:51:24
result
Found 7 matches
/home/byk/Code/opencode/packages/schema/test/event-manifest.test.ts:
  Line 52:     expect(EventManifest.Durable.get("session.next.prompt.execution_requested.1")).toBe(


/home/byk/Code/opencode/packages/schema/src/session-event.ts:
  Line 105:   type: "session.next.prompt.execution_requested",


/home/byk/Code/opencode/packages/core/src/session/message-updater.ts:
  Line 141:       "session.next.prompt.execution_requested": () => Effect.void,


/home/byk/Code/opencode/packages/sdk/js/src/v2/gen/types.gen.ts:
  Line 879:         type: "session.next.prompt.execution_requested"

  Line 3439:     type: "session.next.prompt.execution_requested.1"

  Line 4371:   type: "session.next.prompt.execution_requested"

  Line 6470:   type: "session.next.prompt.execution_requested"
gateway · 2026-09-15 21:51:29
result
<path>/home/byk/Code/opencode/packages/schema/test/event-manifest.test.ts</path>
<type>file</type>
<content>
1: import { describe, expect, test } from "bun:test"
2: import { FileSystem, Integration, Permission, Project, Reference, Session, Workspace } from "../src"
3: import { EventManifest } from "../src/event-manifest"
4: import { IdeEvent } from "../src/ide-event"
5: import { SessionEvent } from "../src/session-event"
6: import { SessionTodo } from "../src/session-todo"
7: import { SessionV1 } from "../src/session-v1"
8: import { WorkspaceEvent } from "../src/workspace-event"
9: 
10: describe("public event manifest", () => {
11:   test("owns the complete public event surface", () => {
12:     expect(EventManifest.ServerDefinitions.length).toBe(61)
13:     expect(EventManifest.Definitions.length).toBe(91)
14:     expect(SessionV1.Event.Definitions).toEqual([
15:       SessionV1.Event.Created,
16:       SessionV1.Event.Updated,
17:       SessionV1.Event.Deleted,
18:       ...
gateway · 2026-09-15 21:51:41
result
<path>/home/byk/Code/opencode/packages/sdk/js/src/v2/gen/types.gen.ts</path>
<type>file</type>
<content>
850:           location: LocationRef
851:           subdirectory?: string
852:         }
853:       }
854:     | {
855:         id: string
856:         type: "session.next.prompted"
857:         properties: {
858:           timestamp: number
859:           sessionID: string
860:           messageID: string
861:           prompt: Prompt
862:           delivery: "steer" | "queue"
863:         }
864:       }
865:     | {
866:         id: string
867:         type: "session.next.prompt.admitted"
868:         properties: {
869:           timestamp: number
870:           sessionID: string
871:           messageID: string
872:           prompt: Prompt
873:           delivery: "steer" | "queue"
874:           requestExecution?: boolean
875:         }
876:       }
877:     | {
878:         id: string
879:         type: "session.next.prompt.execution_requested"
880:         properties: {
881: ...
gateway · 2026-09-15 21:51:45
result
<path>/home/byk/Code/opencode/packages/sdk/js/src/v2/gen/types.gen.ts</path>
<type>file</type>
<content>
3410:       prompt: Prompt
3411:       delivery: "steer" | "queue"
3412:     }
3413:   }
3414: }
3415: 
3416: export type SyncEventSessionNextPromptAdmitted = {
3417:   type: "sync"
3418:   id: string
3419:   syncEvent: {
3420:     type: "session.next.prompt.admitted.1"
3421:     id: string
3422:     seq: number
3423:     aggregateID: string
3424:     data: {
3425:       timestamp: number
3426:       sessionID: string
3427:       messageID: string
3428:       prompt: Prompt
3429:       delivery: "steer" | "queue"
3430:       requestExecution?: boolean
3431:     }
3432:   }
3433: }
3434: 
3435: export type SyncEventSessionNextPromptExecutionRequested = {
3436:   type: "sync"
3437:   id: string
3438:   syncEvent: {
3439:     type: "session.next.prompt.execution_requested.1"
3440:     id: string
3441:     seq: number
3442:     aggregateID: string
3443:     data: {
3444:       ...
gateway · 2026-09-15 21:51:51
result
<path>/home/byk/Code/opencode/packages/sdk/js/src/v2/gen/types.gen.ts</path>
<type>file</type>
<content>
4335:   data: {
4336:     timestamp: number
4337:     sessionID: string
4338:     messageID: string
4339:     prompt: Prompt
4340:     delivery: "steer" | "queue"
4341:   }
4342: }
4343: 
4344: export type SessionNextPromptAdmitted = {
4345:   id: string
4346:   metadata?: {
4347:     [key: string]: unknown
4348:   }
4349:   type: "session.next.prompt.admitted"
4350:   durable?: {
4351:     aggregateID: string
4352:     seq: number
4353:     version: number
4354:   }
4355:   location?: LocationRef
4356:   data: {
4357:     timestamp: number
4358:     sessionID: string
4359:     messageID: string
4360:     prompt: Prompt
4361:     delivery: "steer" | "queue"
4362:     requestExecution?: boolean
4363:   }
4364: }
4365: 
4366: export type SessionNextPromptExecutionRequested = {
4367:   id: string
4368:   metadata?: {
4369:     [key: string]: unknown
4370:   }
4371:   type: ...
gateway · 2026-09-15 21:52:15
result
<path>/home/byk/Code/opencode/packages/sdk/js/src/v2/gen/types.gen.ts</path>
<type>file</type>
<content>
6450:     prompt: Prompt
6451:     delivery: "steer" | "queue"
6452:   }
6453: }
6454: 
6455: export type EventSessionNextPromptAdmitted = {
6456:   id: string
6457:   type: "session.next.prompt.admitted"
6458:   properties: {
6459:     timestamp: number
6460:     sessionID: string
6461:     messageID: string
6462:     prompt: Prompt
6463:     delivery: "steer" | "queue"
6464:     requestExecution?: boolean
6465:   }
6466: }
6467: 
6468: export type EventSessionNextPromptExecutionRequested = {
6469:   id: string
6470:   type: "session.next.prompt.execution_requested"
6471:   properties: {
6472:     timestamp: number
6473:     sessionID: string
6474:     messageID: string
6475:   }
6476: }
6477: 
6478: export type EventSessionNextContextUpdated = {
6479:   id: string
6480:   type: "session.next.context.updated"
6481:   properties: {
6482:     timestamp: number
6483:     sessionID: ...
gateway · 2026-09-15 21:52:22
result
<path>/home/byk/Code/opencode/packages/core/src/session/message-updater.ts</path>
<type>file</type>
<content>
115:       "session.next.model.switched": (event) => {
116:         return adapter.appendMessage(
117:           SessionMessage.ModelSwitched.make({
118:             id: event.data.messageID,
119:             type: "model-switched",
120:             metadata: event.metadata,
121:             model: event.data.model,
122:             time: { created: event.data.timestamp },
123:           }),
124:         )
125:       },
126:       "session.next.moved": () => Effect.void,
127:       "session.next.prompted": (event) => {
128:         return adapter.appendMessage(
129:           SessionMessage.User.make({
130:             id: event.data.messageID,
131:             type: "user",
132:             metadata: event.metadata,
133:             text: event.data.prompt.text,
134:             files: event.data.prompt.files,
135:             agents: event.data.prompt.agents,
136:            ...
gateway · 2026-09-15 21:52:53
result
<path>/home/byk/Code/opencode/packages/sdk/js/src/v2/gen/types.gen.ts</path>
<type>file</type>
<content>
1: // This file is auto-generated by @hey-api/openapi-ts
2: 
3: export type ClientOptions = {
4:   baseUrl: `${string}://${string}` | (string & {})
5: }
6: 
7: export type Event =
8:   | EventModelsDevRefreshed
9:   | EventIntegrationUpdated
10:   | EventIntegrationConnectionUpdated
11:   | EventCatalogUpdated
12:   | EventSessionCreated
13:   | EventSessionUpdated
14:   | EventSessionDeleted
15:   | EventMessageUpdated
16:   | EventMessageRemoved
17:   | EventMessagePartUpdated
18:   | EventMessagePartRemoved
19:   | EventSessionNextAgentSwitched
20:   | EventSessionNextModelSwitched
21:   | EventSessionNextMoved
22:   | EventSessionNextPrompted
23:   | EventSessionNextPromptAdmitted
24:   | EventSessionNextPromptExecutionRequested
25:   | EventSessionNextContextUpdated
26:   | EventSessionNextSynthetic
27:   | EventSessionNextShellStarted
28:   | EventSessionNextShellEnded
29:   ...
gateway · 2026-09-15 21:52:59
result
Found 2 matches
/home/byk/Code/opencode/packages/core/src/database/migration.gen.ts:
  Line 43:     import("./migration/20260914170650_session-recovery"),


/home/byk/Code/opencode/packages/core/src/database/migration/20260914170650_session-recovery.ts:
  Line 5:   id: "20260914170650_session-recovery",
gateway · 2026-09-15 21:53:22
result
Found 27 matches
/home/byk/Code/opencode/packages/core/test/session-prompt.test.ts:
  Line 344:         wake_pending: true,

  Line 352:         wake_pending: true,

  Line 382:         wake_pending: false,

  Line 403:         wake_pending: false,

  Line 413:         wake_pending: true,

  Line 421:         wake_pending: true,

  Line 425:         wake_pending: true,

  Line 481:         wake_pending: false,

  Line 487:         wake_pending: false,

  Line 597:         wake_pending: false,


/home/byk/Code/opencode/packages/core/test/database-migration.test.ts:
  Line 19: import sessionRecoveryMigration from "@opencode-ai/core/database/migration/20260914170650_session-recovery"

  Line 188:           yield* db.get(sql`SELECT dflt_value AS value FROM pragma_table_info('session_input') WHERE name = 'wake_pending'`),


/home/byk/Code/opencode/packages/core/test/session-runner.test.ts:
  Line 640:       expect(yield* db.select({ pending: SessionRecoveryTable.wake_pending ...
gateway · 2026-09-15 21:53:26
result
<path>/home/byk/Code/opencode/packages/core/test/database-migration.test.ts</path>
<type>file</type>
<content>
150:             sql`SELECT name FROM sqlite_master WHERE type = 'index' AND name IN ('event_aggregate_seq_idx', 'event_aggregate_type_seq_idx', 'session_input_session_pending_seq_idx', 'session_input_session_pending_delivery_seq_idx', 'session_input_session_admitted_seq_idx', 'session_input_session_promoted_seq_idx', 'session_message_session_idx', 'session_message_session_type_idx', 'session_message_session_seq_idx', 'session_message_session_type_seq_idx', 'session_message_session_time_created_id_idx') ORDER BY name`,
151:           ),
152:         ).toEqual([
153:           { name: "event_aggregate_seq_idx" },
154:           { name: "event_aggregate_type_seq_idx" },
155:           { name: "session_input_session_admitted_seq_idx" },
156:           { name: "session_input_session_pending_delivery_seq_idx" },
157:           { name: "session_input_session_promoted_seq_idx" ...
gateway · 2026-09-15 21:53:30
result
<path>/home/byk/Code/opencode/packages/core/test/session-projector.test.ts</path>
<type>file</type>
<content>
600:         ),
601:       )
602: 
603:       expect(wakes).toEqual([])
604:       expect(yield* db.select().from(SessionRecoveryTable).get()).toMatchObject({
605:         recovery_error: "Invalid recovery continuation input",
606:       })
607:     }),
608:   )
609: 
610:   it.effect("redrives durable ordinary input execution intent after a lost advisory wake", () =>
611:     Effect.gen(function* () {
612:       const { db } = yield* Database.Service
613:       const events = yield* EventV2.Service
614:       yield* db
615:         .insert(ProjectTable)
616:         .values({ id: Project.ID.global, worktree: AbsolutePath.make("/project"), sandboxes: [] })
617:         .run()
618:       yield* db
619:         .insert(SessionTable)
620:         .values({
621:           id: sessionID,
622:           project_id: Project.ID.global,
623:           slug: "test",
624:           ...
gateway · 2026-09-15 21:53:46
result
<path>/home/byk/Code/opencode/packages/core/src/session/event.ts</path>
<type>file</type>
<content>
1: export * from "@opencode-ai/schema/session-event"
2: export * as SessionEvent from "@opencode-ai/schema/session-event"

(End of file - total 2 lines)
</content>
gateway · 2026-09-15 21:53:50
result
<path>/home/byk/Code/opencode/packages/sdk/openapi.json</path>
<type>file</type>
<content>
28200:                 "type": "string",
28201:                 "pattern": "^ses"
28202:               },
28203:               "messageID": {
28204:                 "type": "string",
28205:                 "pattern": "^msg_"
28206:               },
28207:               "prompt": {
28208:                 "$ref": "#/components/schemas/Prompt"
28209:               },
28210:               "delivery": {
28211:                 "type": "string",
28212:                 "enum": ["steer", "queue"]
28213:               }
28214:             },
28215:             "required": ["timestamp", "sessionID", "messageID", "prompt", "delivery"],
28216:             "additionalProperties": false
28217:           }
28218:         },
28219:         "required": ["id", "type", "data"],
28220:         "additionalProperties": false
28221:       },
28222:       "SessionNextPromptAdmitted": {
28223:         "type": ...
gateway · 2026-09-15 21:53:58
result
No files found
gateway · 2026-09-15 21:54:16
result
<path>/home/byk/Code/opencode/packages/sdk/openapi.json</path>
<type>file</type>
<content>
34250:             "type": "object",
34251:             "properties": {
34252:               "timestamp": {
34253:                 "type": "number"
34254:               },
34255:               "sessionID": {
34256:                 "type": "string",
34257:                 "pattern": "^ses"
34258:               },
34259:               "messageID": {
34260:                 "type": "string",
34261:                 "pattern": "^msg_"
34262:               },
34263:               "prompt": {
34264:                 "$ref": "#/components/schemas/Prompt"
34265:               },
34266:               "delivery": {
34267:                 "type": "string",
34268:                 "enum": ["steer", "queue"]
34269:               }
34270:             },
34271:             "required": ["timestamp", "sessionID", "messageID", "prompt", "delivery"],
34272:             "additionalProperties": false
34273:           ...
gateway · 2026-09-15 21:54:23
result
<path>/home/byk/Code/opencode/packages/sdk/openapi.json</path>
<type>file</type>
<content>
25475:               },
25476:               "aggregateID": {
25477:                 "type": "string"
25478:               },
25479:               "data": {
25480:                 "type": "object",
25481:                 "properties": {
25482:                   "timestamp": {
25483:                     "type": "number"
25484:                   },
25485:                   "sessionID": {
25486:                     "type": "string",
25487:                     "pattern": "^ses"
25488:                   },
25489:                   "messageID": {
25490:                     "type": "string",
25491:                     "pattern": "^msg_"
25492:                   },
25493:                   "prompt": {
25494:                     "$ref": "#/components/schemas/Prompt"
25495:                   },
25496:                   "delivery": {
25497:                     "type": "string",
25498:                     ...
gateway · 2026-09-15 21:54:46
result
<path>/home/byk/Code/opencode/packages/core/src/session/runner/llm.ts</path>
<type>file</type>
<content>
205:         )
206:         .get()
207:         .pipe(Effect.orDie)
208:       const continuation = execution?.phase === "continue"
209:       yield* updateExecution(continuation ? {} : { phase: "ready", assistant_message_id: null })
210:       const agent = yield* agents.select(session.agent)
211:       const initialized = yield* SessionContextEpoch.initialize(db, loadSystemContext(agent), session.id, claim)
212:       const toolFibers = yield* FiberSet.make<void, ToolOutputStore.Error>()
213:       let needsContinuation = false
214:       let currentStep = step
215:       if (promotion) {
216:         const cutoff = yield* EventV2.latestSequence(db, session.id)
217:         let promoted = 0
218:         if (typeof promotion === "object") {
219:           yield* SessionInput.promoteExact(db, events, session.id, promotion.recoveryInputID, () =>
220:             Effect.gen(function* ...
gateway · 2026-09-15 21:55:16
result
<path>/home/byk/Code/opencode/packages/sdk/openapi.json</path>
<type>file</type>
<content>
15290:           {
15291:             "$ref": "#/components/schemas/EventMessagePartUpdated"
15292:           },
15293:           {
15294:             "$ref": "#/components/schemas/EventMessagePartRemoved"
15295:           },
15296:           {
15297:             "$ref": "#/components/schemas/EventSessionNextAgentSwitched"
15298:           },
15299:           {
15300:             "$ref": "#/components/schemas/EventSessionNextModelSwitched"
15301:           },
15302:           {
15303:             "$ref": "#/components/schemas/EventSessionNextMoved"
15304:           },
15305:           {
15306:             "$ref": "#/components/schemas/EventSessionNextPrompted"
15307:           },
15308:           {
15309:             "$ref": "#/components/schemas/EventSessionNextPromptAdmitted"
15310:           },
15311:           {
15312:             "$ref": ...
gateway · 2026-09-15 21:55:25
result
<path>/home/byk/Code/opencode/packages/sdk/openapi.json</path>
<type>file</type>
<content>
20435:                 "$ref": "#/components/schemas/SyncEventMessageRemoved"
20436:               },
20437:               {
20438:                 "$ref": "#/components/schemas/SyncEventMessagePartUpdated"
20439:               },
20440:               {
20441:                 "$ref": "#/components/schemas/SyncEventMessagePartRemoved"
20442:               },
20443:               {
20444:                 "$ref": "#/components/schemas/SyncEventSessionNextAgentSwitched"
20445:               },
20446:               {
20447:                 "$ref": "#/components/schemas/SyncEventSessionNextModelSwitched"
20448:               },
20449:               {
20450:                 "$ref": "#/components/schemas/SyncEventSessionNextMoved"
20451:               },
20452:               {
20453:                 "$ref": "#/components/schemas/SyncEventSessionNextPrompted"
20454:               },
20455:               ...
gateway · 2026-09-15 21:55:47
result
<path>/home/byk/Code/opencode/packages/sdk/openapi.json</path>
<type>file</type>
<content>
23662:         },
23663:         "required": ["_tag", "message"],
23664:         "additionalProperties": false
23665:       },
23666:       "SessionDurableEvent": {
23667:         "oneOf": [
23668:           {
23669:             "$ref": "#/components/schemas/SessionNextAgentSwitched"
23670:           },
23671:           {
23672:             "$ref": "#/components/schemas/SessionNextModelSwitched"
23673:           },
23674:           {
23675:             "$ref": "#/components/schemas/SessionNextMoved"
23676:           },
23677:           {
23678:             "$ref": "#/components/schemas/SessionNextPrompted"
23679:           },
23680:           {
23681:             "$ref": "#/components/schemas/SessionNextPromptAdmitted"
23682:           },
23683:           {
23684:             "$ref": "#/components/schemas/SessionNextContextUpdated"
23685:           },
23686:           {
23687:             ...
gateway · 2026-09-15 21:55:58
result
/home/byk/Code/opencode/packages/sdk/openapi.json
gateway · 2026-09-15 21:56:49

Findings

High — A post-promotion exact retry can execute an unrelated resume:false prompt

SessionInput.admit calls requestExecution for every exact resume:true retry (packages/core/src/session/input.ts:54-58). If the retried input was already promoted, requestExecution correctly returns without recording new intent (packages/core/src/session/input.ts:106-117).

However, SessionV2.prompt then unconditionally calls execution.wake (packages/core/src/session.ts:381-384). The runner checks for any pending input, regardless of wake_pending (packages/core/src/session/runner/llm.ts:505-509), and promotes that input (packages/core/src/session/runner/llm.ts:518-530, packages/core/src/session/runner/llm.ts:226-232).

Concrete sequence:

  1. Prompt A executes and becomes promoted.
  2. Prompt B is admitted with resume:false.
  3. A client retries A exactly with resume:true.
  4. A cannot gain new durable intent because it is already promoted.
  5. The unconditional advisory wake starts a drain.
  6. The drain finds and executes B, despite B being admitted as resume:false.

A post-promotion exact retry must be a no-op for execution scheduling. Existing coverage tests an unpromoted false → true retry (packages/core/test/session-prompt.test.ts:390-429) and a promoted retry with resume:false (packages/core/test/session-prompt.test.ts:605-623), but not this sequence.

Medium — The checked-in OpenAPI inventory omits the new public contract

The canonical schema defines optional requestExecution at durable version 1 and defines PromptExecutionRequested (packages/schema/src/session-event.ts:94-112). Both events appear in the public inventories (packages/schema/src/session-event.ts:484-490, packages/schema/src/session-event.ts:518-525) and the generated TypeScript SDK correctly includes them (packages/sdk/js/src/v2/gen/types.gen.ts:19-25, packages/sdk/js/src/v2/gen/types.gen.ts:865-884). ...

gpt-5.6-sol · 2026-09-15 21:56:49 · ~755 tokens

Distillations (4)

Gen 0 2026-09-15 22:56:19 · 474 tokens

Date: Sep 15, 2026 * 🟡 (21:49) Inspection of `/home/byk/Code/opencode/packages/core/src/session/recovery.ts:34-140` found execution recovery scans at a captured `scanTime`, processes at most `BATCH_SIZE` candidates, conditionally claims each `SessionExecutionTable` row with an update guarded by its execution ID and lease state, and skips candidates when the conditional update returns no row. Rec…

Gen 0 2026-09-15 22:29:14 · 1721 tokens

Date: Sep 15, 2026 * 🟡 (21:48) Inspection of `/home/byk/Code/opencode/packages/core/src/session/input.ts:241-273` found historical prompt synthesis inserts a fully promoted `SessionInputTable` row with `admitted_seq` and `promoted_seq` both set to `input.promotedSeq`, then calls `settleRecoveryWake(...)`; that helper clears `SessionRecoveryTable.wake_pending` only where `session_id`, `continuati…

Gen 0 2026-09-15 21:49:29 · 1795 tokens

Date: Sep 15, 2026 * 🔴 (21:47) User directed that type checking must use `bun typecheck` from package directories such as `packages/opencode`, never `tsc` directly. * 🔴 (21:47) User stated runtime dependencies must flow from Schema to Core and Protocol, then from Core and Protocol to Server; Client runtime code may depend on Schema and Protocol but never Core or Server; `sdk-next` composes Clie…

Gen 0 2026-09-15 21:48:51 · 1297 tokens

Date: Sep 15, 2026 * 🔴 [requested-review] (21:44) User requested a read-only final audit of `/home/byk/Code/opencode`, requiring direct inspection of current files and prohibiting lore/recall, edits, tests, builds, commits, and touching services. * 🔴 (21:44) User directed that audit responses must never be empty. * 🟡 (21:44) User asked the audit to focus narrowly on durable ordinary wake-inten…