Dashboard › opencode › Session 1XVNV7NI1A7q
1XVNV7NI1A7qLastOPerform an independent, read-only security and integrity review of the exact frozen interrupted-session recovery candidate.
Immutable scope:
Do not edit files, run formatters, start services, or mutate VCS. Read the patch and immutable base/current blobs as needed. First verify both hashes exactly. Review all 32 files for authorization/integrity and adversarial lifecycle failures, with special focus on:
b4b30666f3a5e9a5bcbfe7237b16e113f684568d67b9d360e65c5655e649009f /tmp/opencode/session-recovery-final-v3.patch 2dd8f7fffa4b382799ebfa093932baa6dd7c5f3e896de5553edb14dbccd7b627 /home/byk/Code/opencode/packages/opencode/dist/server/opencode-server dc661f30cb2055ad6248fdc59b14998d834497be commit commit
312 2 packages/core/schema.json 1 0 packages/core/src/database/migration.gen.ts 50 0 packages/core/src/database/migration/20260914170650_session-recovery.ts 40 0 packages/core/src/database/schema.gen.ts 5 4 packages/core/src/session.ts 31 16 packages/core/src/session/compaction.ts 54 34 packages/core/src/session/context-epoch.ts 118 19 packages/core/src/session/execution/local.ts 233 29 packages/core/src/session/input.ts 69 0 packages/core/src/session/message-updater.ts 77 1 packages/core/src/session/projector.ts 370 0 packages/core/src/session/recovery.ts 27 5 packages/core/src/session/run-coordinator.ts 4 0 packages/core/src/session/runner/index.ts 203 86 packages/core/src/session/runner/llm.ts 74 28 packages/core/src/session/runner/publish-llm-event.ts 60 1 packages/core/src/session/sql.ts 63 1 packages/core/test/database-migration.test.ts 239 0 packages/core/test/session-execution-local.test.ts 1423 3 packages/core/test/session-projector.test.ts 247 25 packages/core/test/session-pr...
Your prior response was empty and therefore invalid. This is your one permitted evidence-or-blocker retry. The candidate remains unchanged and the hashes were just reverified:
Complete the original independent read-only security/integrity review now. Do not use Lore recall. Read the canonical patch directly and inspect base blobs or current package files only when needed. Do not edit, test, build, start services, or mutate VCS. You must return substantive evidence: either findings with exact patch/current file:line references or an exact blocker naming the failed tool/path. Classify MUST-FIX, CONCERN, and PASS; explicitly assess closure of prior v2 findings; end exactly MERGE or DO-NOT-MERGE. Empty or progress-only output disqualifies this reviewer.
<path>/home/byk/Code/opencode/packages/core/src/session/execution/claim.ts</path>
<type>file</type>
<content>
1: export * as SessionExecutionClaim from "./claim"
2:
3: import { and, eq, gt } from "drizzle-orm"
4: import { Clock, Effect } from "effect"
5: import type { Database } from "../../database/database"
6: import type { SessionSchema } from "../schema"
7: import { SESSION_EXECUTION_LEASE_MS, SessionExecutionTable } from "../sql"
8:
9: type DatabaseService = Database.Interface["db"]
10:
11: export type Claim = {
12: readonly sessionID: SessionSchema.ID
13: readonly executionID: string
14: readonly ownerID: string
15: }
16:
17: export type Values = Partial<Pick<typeof SessionExecutionTable.$inferInsert, "assistant_message_id" | "phase">>
18:
19: export class Lost extends Error {
20: constructor(readonly claim: Claim) {
21: super(`Session execution claim lost: ${claim.executionID}`)
22: }
23: }
24:
25: const where = (claim: Claim, now: number) =>
26: and(
27: ...
<path>/home/byk/Code/opencode/packages/core/src/session/recovery-id.ts</path>
<type>file</type>
<content>
1: import { SessionMessage } from "./message"
2:
3: export const message = (executionID: string, assistantMessageID?: SessionMessage.ID) =>
4: assistantMessageID ?? SessionMessage.ID.make(`msg_recovery_${executionID}`)
5:
6: export const continuation = (executionID: string) => SessionMessage.ID.make(`msg_recovery_continue_${executionID}`)
(End of file - total 6 lines)
</content>
<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, or, 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 { SessionSchema } from "./schema"
16: import {
17: SESSION_EXECUTION_LEASE_MS,
18: SessionExecutionTable,
19: SessionInputTable,
20: SessionRecoveryTable,
21: ...
<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: ...
<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: ...
<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. ...
<path>/home/byk/Code/opencode/packages/core/src/session/run-coordinator.ts</path>
<type>file</type>
<content>
1: export * as SessionRunCoordinator from "./run-coordinator"
2:
3: import { Deferred, Effect, Exit, Fiber, FiberSet, Scope } from "effect"
4:
5: /** Serializes execution for each key while allowing different keys to run concurrently. */
6: export interface Coordinator<Key, E> {
7: /** Snapshots keys with an execution owned by this coordinator. */
8: readonly active: Effect.Effect<ReadonlySet<Key>>
9: /** Starts execution while idle or joins the active execution. */
10: readonly run: (key: Key) => Effect.Effect<void, E>
11: /** Registers one coalesced follow-up after newly recorded work. */
12: readonly wake: (key: Key) => Effect.Effect<void>
13: /** Stops active execution, runs cleanup, then starts work that arrived while stopping. */
14: readonly interrupt: (key: Key, cleanup?: Effect.Effect<void>) => Effect.Effect<void>
15: }
16:
17: type Entry<E> = {
18: ...
<path>/home/byk/Code/opencode/packages/core/src/session/runner/index.ts</path>
<type>file</type>
<content>
1: export * as SessionRunner from "./index"
2:
3: import type { LLMError } from "@opencode-ai/llm"
4: import { Context, Effect } from "effect"
5: import { SessionSchema } from "../schema"
6: import type { SessionMessage } from "../message"
7: import type { ContextSnapshotDecodeError, MessageDecodeError } from "../error"
8: import { SessionRunnerModel } from "./model"
9: import type { SystemContext } from "../../system-context/index"
10: import type { ToolOutputStore } from "../../tool-output-store"
11:
12: export type RunError =
13: | LLMError
14: | SessionRunnerModel.Error
15: | MessageDecodeError
16: | ContextSnapshotDecodeError
17: | SystemContext.InitializationBlocked
18: | ToolOutputStore.Error
19:
20: /** Runs one local continuation from already-recorded Session history. */
21: export interface Interface {
22: /** Drains eligible durable work. ...
<path>/home/byk/Code/opencode/packages/core/src/session/runner/llm.ts</path>
<type>file</type>
<content>
1: import {
2: LLM,
3: LLMClient,
4: LLMError,
5: LLMEvent,
6: Message,
7: SystemPart,
8: isContextOverflowFailure,
9: type ProviderErrorEvent,
10: } from "@opencode-ai/llm"
11: import { Cause, DateTime, Effect, FiberSet, Layer, Option, Semaphore, Stream } from "effect"
12: import { and, eq } from "drizzle-orm"
13: import { AgentV2 } from "../../agent"
14: import { Config } from "../../config"
15: import { Database } from "../../database/database"
16: import { EventV2 } from "../../event"
17: import { Location } from "../../location"
18: import { ModelV2 } from "../../model"
19: import { PermissionV2 } from "../../permission"
20: import { ProviderV2 } from "../../provider"
21: import { QuestionV2 } from "../../question"
22: import { SystemContext } from "../../system-context/index"
23: import { SystemContextRegistry } from "../../system-context/registry"
24: import ...
<path>/home/byk/Code/opencode/packages/core/src/session/runner/publish-llm-event.ts</path>
<type>file</type>
<content>
1: import { ToolOutput, type LLMEvent, type ProviderMetadata, type ToolResultValue, type Usage } from "@opencode-ai/llm"
2: import { DateTime, Effect } from "effect"
3: import { EventV2 } from "../../event"
4: import { ModelV2 } from "../../model"
5: import { SessionEvent } from "../event"
6: import { SessionMessage } from "../message"
7: import { SessionSchema } from "../schema"
8:
9: type Input = {
10: readonly sessionID: SessionSchema.ID
11: readonly agent: string
12: readonly model: ModelV2.Ref
13: readonly snapshot?: string
14: readonly startCommit: (assistantMessageID: SessionMessage.ID) => Effect.Effect<void>
15: readonly terminalCommit: (assistantMessageID: SessionMessage.ID) => Effect.Effect<void>
16: readonly interruptedCommit: (assistantMessageID: SessionMessage.ID) => Effect.Effect<void>
17: readonly eventCommit: () => ...
<path>/home/byk/Code/opencode/packages/core/src/session/sql.ts</path>
<type>file</type>
<content>
1: import { sql } from "drizzle-orm"
2: import { check, sqliteTable, text, integer, index, primaryKey, real, uniqueIndex } from "drizzle-orm/sqlite-core"
3: import * as DatabasePath from "../database/path"
4: import { ProjectTable } from "../project/sql"
5: import type { SessionMessage } from "./message"
6: import type { Prompt } from "./prompt"
7: import type { SessionInput } from "./input"
8: import type { Snapshot } from "../snapshot"
9: import { PermissionV1 } from "../v1/permission"
10: import { ProjectV2 } from "../project"
11: import type { SessionSchema } from "./schema"
12: import type { MessageID, PartID, SessionV1 } from "../v1/session"
13: import { WorkspaceV2 } from "../workspace"
14: import { Timestamps } from "../database/schema.sql"
15: import type { SystemContext } from "../system-context/index"
16: import { AgentV2 } from "../agent"
17: import type { Revert } from ...
<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 ...
<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 ...
<path>/home/byk/Code/opencode/packages/core/src/session/message-updater.ts</path>
<type>file</type>
<content>
1: import { castDraft, produce, type WritableDraft } from "immer"
2: import { Effect } from "effect"
3: import { SessionEvent } from "./event"
4: import { SessionMessage } from "./message"
5: import { message } from "./recovery-id"
6:
7: export type MemoryState = {
8: messages: SessionMessage.Message[]
9: }
10:
11: export interface Adapter {
12: readonly getCurrentAssistant: () => Effect.Effect<SessionMessage.Assistant | undefined>
13: readonly getAssistant: (messageID: SessionMessage.ID) => Effect.Effect<SessionMessage.Assistant | undefined>
14: readonly getCurrentShell: (callID: string) => Effect.Effect<SessionMessage.Shell | undefined>
15: readonly updateAssistant: (assistant: SessionMessage.Assistant) => Effect.Effect<void>
16: readonly updateShell: (shell: SessionMessage.Shell) => Effect.Effect<void>
17: readonly appendMessage: (message: ...
<path>/home/byk/Code/opencode/packages/core/src/session/compaction.ts</path>
<type>file</type>
<content>
1: export * as SessionCompaction from "./compaction"
2:
3: import { LLM, LLMError, LLMEvent, Message, type LLMRequest, type Model } from "@opencode-ai/llm"
4: import { DateTime, Effect, Stream } from "effect"
5: import type { Config } from "../config"
6: import type { EventV2 } from "../event"
7: import { SessionEvent } from "./event"
8: import { SessionMessage } from "./message"
9: import { SessionSchema } from "./schema"
10: import { Token } from "../util/token"
11:
12: const DEFAULT_BUFFER = 20_000
13: const DEFAULT_KEEP_TOKENS = 8_000
14: const TOOL_OUTPUT_MAX_CHARS = 2_000
15: const SUMMARY_OUTPUT_TOKENS = 4_096
16: const SUMMARY_TEMPLATE = `Output exactly the Markdown structure shown inside <template> and keep the section order unchanged. Do not include the <template> tags in your response. ...
<path>/home/byk/Code/opencode/packages/core/src/session/context-epoch.ts</path>
<type>file</type>
<content>
1: export * as SessionContextEpoch from "./context-epoch"
2:
3: import { eq } from "drizzle-orm"
4: import { DateTime, Effect, Schema } from "effect"
5: import type { Database } from "../database/database"
6: import { EventV2 } from "../event"
7: import { SystemContext } from "../system-context/index"
8: import { ContextSnapshotDecodeError } from "./error"
9: import { SessionEvent } from "./event"
10: import { SessionHistory } from "./history"
11: import { SessionInput } from "./input"
12: import { SessionMessage } from "./message"
13: import { SessionSchema } from "./schema"
14: import { SessionContextEpochTable } from "./sql"
15: import { SessionExecutionClaim } from "./execution/claim"
16:
17: type DatabaseService = Database.Interface["db"]
18:
19: interface Prepared {
20: readonly baseline: string
21: readonly baselineSeq: number
22: }
23:
24: export function ...
<path>/home/byk/Code/opencode/packages/core/src/session.ts</path>
<type>file</type>
<content>
1: export * as SessionV2 from "./session"
2: export * from "./session/schema"
3:
4: import { DateTime, Effect, Layer, Schema, Context, Stream } from "effect"
5: import { ListAnchor } from "@opencode-ai/schema/session"
6: import { and, asc, desc, eq, gt, like, lt, or, type SQL } from "drizzle-orm"
7: import { ProjectV2 } from "./project"
8: import { WorkspaceV2 } from "./workspace"
9: import { ModelV2 } from "./model"
10: import { Location } from "./location"
11: import { SessionMessage } from "./session/message"
12: import { Prompt } from "./session/prompt"
13: import { PromptInput } from "@opencode-ai/schema/prompt-input"
14: import { EventV2 } from "./event"
15: import { Database } from "./database/database"
16: import { SessionProjector } from "./session/projector"
17: import { SessionMessageTable, SessionTable } from "./session/sql"
18: import { SessionSchema } from ...
<path>/home/byk/Code/opencode/packages/core/src/session.ts</path>
<type>file</type>
<content>
418: compact: Effect.fn("V2Session.compact")(function* (input) {
419: yield* result.get(input.sessionID)
420: return yield* new OperationUnavailableError({ operation: "compact" })
421: }),
422: wait: Effect.fn("V2Session.wait")(function* (sessionID) {
423: yield* result.get(sessionID)
424: return yield* new OperationUnavailableError({ operation: "wait" })
425: }),
426: active: execution.active,
427: resume: Effect.fn("V2Session.resume")(function* (sessionID) {
428: yield* result.get(sessionID)
429: yield* execution.resume(sessionID)
430: }),
431: interrupt: Effect.fn("V2Session.interrupt")((sessionID) =>
432: Effect.uninterruptible(execution.interrupt(sessionID)),
433: ),
434: revert: {
435: stage: Effect.fn("V2Session.revert.stage")(function* (input) {
436: ...
Found 55 matches
/home/byk/Code/opencode/packages/core/test/session-runner.test.ts:
Line 396: const replaySessionProjection = (id: SessionV2.ID) =>
Line 411: yield* events.replayAll(
Line 524: yield* replaySessionProjection(sessionID)
Line 645: yield* replaySessionProjection(sessionID)
Line 653: prompt: Prompt.make({ text: "ordinary work after replayed recovery" }),
Line 662: expect(userTexts(requests[1]!)).toContain("ordinary work after replayed recovery")
Line 1093: yield* replaySessionProjection(sessionID)
Line 1323: yield* replaySessionProjection(sessionID)
Line 1395: yield* replaySessionProjection(sessionID)
Line 1657: yield* replaySessionProjection(sessionID)
Line 2089: yield* replaySessionProjection(sessionID)
Line 2121: it.effect("replays durable provider-executed tool results inline in a second-turn request", () =>
Line 2148: yield* replaySessionProjection(sessionID)
...
<path>/home/byk/Code/opencode/packages/core/test/session-projector.test.ts</path>
<type>file</type>
<content>
1: import { describe, expect } from "bun:test"
2: import { DateTime, Deferred, Effect, Exit, Fiber, Schema } from "effect"
3: import { TestClock } from "effect/testing"
4: import { asc, eq, sql } from "drizzle-orm"
5: import { Database } from "@opencode-ai/core/database/database"
6: import { LayerNode } from "@opencode-ai/core/effect/layer-node"
7: import { AppNodeBuilder } from "@opencode-ai/core/effect/app-node-builder"
8: import { EventV2 } from "@opencode-ai/core/event"
9: import { EventTable } from "@opencode-ai/core/event/sql"
10: import { ModelV2 } from "@opencode-ai/core/model"
11: import { Project } from "@opencode-ai/core/project"
12: import { ProjectTable } from "@opencode-ai/core/project/sql"
13: import { ProviderV2 } from "@opencode-ai/core/provider"
14: import { AbsolutePath } from "@opencode-ai/core/schema"
15: import { SessionV2 } from ...
<path>/home/byk/Code/opencode/packages/core/test/session-projector.test.ts</path>
<type>file</type>
<content>
1100: )
1101:
1102: it.effect("bounds each deterministic recovery scan", () =>
1103: Effect.gen(function* () {
1104: const { db } = yield* Database.Service
1105: const ids = Array.from({ length: SessionRecovery.BATCH_SIZE + 1 }, (_, index) =>
1106: SessionV2.ID.make(`ses_recovery_batch_${index.toString().padStart(3, "0")}`),
1107: )
1108: yield* db
1109: .insert(ProjectTable)
1110: .values({ id: Project.ID.global, worktree: AbsolutePath.make("/project"), sandboxes: [] })
1111: .run()
1112: yield* db
1113: .insert(SessionTable)
1114: .values(
1115: ids.map((id) => ({
1116: id,
1117: project_id: Project.ID.global,
1118: slug: id,
1119: directory: "/project",
1120: title: "test",
1121: version: "test",
1122: ...
<path>/home/byk/Code/opencode/packages/core/test/session-execution-local.test.ts</path>
<type>file</type>
<content>
1: import { describe, expect } from "bun:test"
2: import { Deferred, Effect, Exit, Fiber, Scope } from "effect"
3: import { TestClock } from "effect/testing"
4: import { eq } from "drizzle-orm"
5: import { Database } from "@opencode-ai/core/database/database"
6: import { Project } from "@opencode-ai/core/project"
7: import { ProjectTable } from "@opencode-ai/core/project/sql"
8: import { AbsolutePath } from "@opencode-ai/core/schema"
9: import { SessionExecutionLocal } from "@opencode-ai/core/session/execution/local"
10: import { SessionSchema } from "@opencode-ai/core/session/schema"
11: import { SessionExecutionTable, SessionTable } from "@opencode-ai/core/session/sql"
12: import { testEffect } from "./lib/effect"
13:
14: const sessionID = SessionSchema.ID.make("ses_execution_local")
15: const it = testEffect(Database.layerFromPath(":memory:"))
16:
17: const ...
No files found
/home/byk/Code/opencode/packages/core/src/event.ts
Found 36 matches
/home/byk/Code/opencode/packages/core/src/event.ts:
Line 122: /** Local operational projection committed atomically with a new durable event. Not replayed or serialized. */
Line 123: readonly commit?: (seq: number) => Effect.Effect<void>
Line 127: readonly publish: <D extends Definition>(
Line 140: options?: { readonly publish?: boolean; readonly ownerID?: string; readonly strictOwner?: boolean },
Line 144: options?: { readonly publish?: boolean; readonly ownerID?: string; readonly strictOwner?: boolean },
Line 205: function commitDurableEvent(
Line 214: commit?: (seq: number) => Effect.Effect<void>,
Line 239: const committed = yield* db
Line 240: .transaction(
Line 316: const committed = {
Line 321: yield* projector(committed)
Line 323: if (commit) yield* commit(seq)
Line 354: ...
<path>/home/byk/Code/opencode/packages/core/src/event.ts</path>
<type>file</type>
<content>
110: export class SubscriberOverflowError extends Schema.TaggedErrorClass<SubscriberOverflowError>()(
111: "EventV2.SubscriberOverflow",
112: { capacity: Schema.Int },
113: ) {}
114:
115: export const define = Event.define
116: export const versionedType = Event.versionedType
117:
118: export interface PublishOptions {
119: readonly id?: ID
120: readonly metadata?: Record<string, unknown>
121: readonly location?: Location.Ref
122: /** Local operational projection committed atomically with a new durable event. Not replayed or serialized. */
123: readonly commit?: (seq: number) => Effect.Effect<void>
124: }
125:
126: export interface Interface {
127: readonly publish: <D extends Definition>(
128: definition: D,
129: data: Data<D>,
130: options?: PublishOptions,
131: ) => Effect.Effect<Payload<D>>
132: readonly subscribe: <D extends Definition>(definition: D) => ...
No files found
<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>
<path>/home/byk/Code/opencode/packages/server/src/routes.ts</path>
<type>file</type>
<content>
1: import { Database } from "@opencode-ai/core/database/database"
2: import { LayerNode } from "@opencode-ai/core/effect/layer-node"
3: import { httpClient } from "@opencode-ai/core/effect/app-node-platform"
4: import { AppNodeBuilder } from "@opencode-ai/core/effect/app-node-builder"
5: import { EventV2 } from "@opencode-ai/core/event"
6: import { Credential } from "@opencode-ai/core/credential"
7: import { PermissionSaved } from "@opencode-ai/core/permission/saved"
8: import { PtyTicket } from "@opencode-ai/core/pty/ticket"
9: import { SessionV2 } from "@opencode-ai/core/session"
10: import { SessionExecution } from "@opencode-ai/core/session/execution"
11: import { LocationServiceMap } from "@opencode-ai/core/location-service-map"
12: import { SessionExecutionLocal } from "@opencode-ai/core/session/execution/local"
13: import { SessionRecovery } from ...
Found 2 matches
/home/byk/Code/opencode/packages/core/src/v1/config/config.ts:
Line 17: import { ConfigServerV1 } from "./server"
/home/byk/Code/opencode/packages/core/src/v1/config/server.ts:
Line 1: export * as ConfigServerV1 from "./server"
<path>/home/byk/Code/opencode/packages/opencode/src/server/routes/instance/httpapi/server.ts</path>
<type>file</type>
<content>
1: import { Config as EffectConfig, Context, Effect, Layer } from "effect"
2: import { HttpApiBuilder, OpenApi } from "effect/unstable/httpapi"
3: import { HttpClient, HttpMiddleware, HttpRouter, HttpServer, HttpServerResponse } from "effect/unstable/http"
4: import * as Socket from "effect/unstable/socket/Socket"
5: import { FSUtil } from "@opencode-ai/core/fs-util"
6: import * as Observability from "@opencode-ai/core/observability"
7: import { Account } from "@/account/account"
8: import { Agent } from "@/agent/agent"
9: import { Auth } from "@/auth"
10: import { BackgroundJob } from "@/background/job"
11: import { Command } from "@/command"
12: import { Config } from "@/config/config"
13: import { Workspace } from "@/control-plane/workspace"
14: import { Env } from "@/env"
15: import { EventV2Bridge } from "@/event-v2-bridge"
16: import { Format } from ...
<path>/home/byk/Code/opencode/packages/opencode/src/server/routes/instance/httpapi/server.ts</path> <type>file</type> <content> 210: | HttpRouter.Request<"Requires", unknown> 211: | HttpRouter.Request<"GlobalRequires", never> 212: 213: const app = LayerNode.group([ 214: Npm.node, 215: FSUtil.node, 216: Database.node, 217: Auth.node, 218: Account.node, 219: Config.node, 220: Env.node, 221: Git.node, 222: Ripgrep.node, 223: Storage.node, 224: Snapshot.node, 225: Plugin.node, 226: ModelsDev.node, 227: Provider.node, 228: ProviderAuth.node, 229: Agent.node, 230: Skill.node, 231: Discovery.node, 232: Question.node, 233: Permission.node, 234: PermissionSaved.node, 235: Todo.node, 236: Session.node, 237: SessionProjector.node, 238: SessionStatus.node, 239: BackgroundJob.node, 240: RuntimeFlags.node, 241: EventV2Bridge.node, 242: SessionRunState.node, 243: SessionProcessor.node, 244: SessionCompaction.node, 245: ...
<path>/home/byk/Code/opencode/packages/opencode/src/server/routes/instance/httpapi/server.ts</path> <type>file</type> <content> 295: Layer.provide(Layer.succeed(CorsConfig)(corsOptions)), 296: Layer.provide(sessionLocationLayer), 297: Layer.provide(locationLayer), 298: Layer.provide(PtyEnvironment.layer), 299: Layer.provide( 300: AppNodeBuilderV1.build(LayerNode.group([SessionV2.node, SessionRecovery.node]), [ 301: [LocationServiceMap.node, locationServiceMapV2], 302: [SessionExecution.node, SessionExecutionLocal.node], 303: ]), 304: ), 305: Layer.provide(locationServiceMapV2), 306: 307: Layer.provide(AppNodeBuilderV1.build(app)), 308: // Must stay last: layers provided later in this pipe build beneath earlier ones, 309: // so Observability must come after every service graph. Otherwise eagerly forked 310: // fibers (e.g. ...
Found 1 matches /home/byk/Code/opencode/packages/core/src/session/runner/llm.ts: Line 51: * `SessionPrompt` monolith. Implement the unchecked items in small reviewed slices:
<path>/home/byk/Code/opencode/packages/core/src/database/migration.gen.ts</path>
<type>file</type>
<content>
1: import type { DatabaseMigration } from "./migration"
2:
3: export const migrations = (
4: await Promise.all([
5: import("./migration/20260127222353_familiar_lady_ursula"),
6: import("./migration/20260211171708_add_project_commands"),
7: import("./migration/20260213144116_wakeful_the_professor"),
8: import("./migration/20260225215848_workspace"),
9: import("./migration/20260227213759_add_session_workspace_id"),
10: import("./migration/20260228203230_blue_harpoon"),
11: import("./migration/20260303231226_add_workspace_fields"),
12: import("./migration/20260309230000_move_org_to_state"),
13: import("./migration/20260312043431_session_message_cursor"),
14: import("./migration/20260323234822_events"),
15: import("./migration/20260410174513_workspace-name"),
16: import("./migration/20260413175956_chief_energizer"),
17: ...
Found 15 matches
/home/byk/Code/opencode/packages/core/src/database/schema.gen.ts:
Line 158: CREATE TABLE \`session_execution\` (
Line 167: CONSTRAINT \`session_execution_pk\` PRIMARY KEY(\`id\`),
Line 168: CONSTRAINT \`fk_session_execution_session_id_session_id_fk\` FOREIGN KEY (\`session_id\`) REFERENCES \`session\`(\`id\`) ON DELETE CASCADE,
Line 169: CONSTRAINT "session_execution_phase_check" CHECK("phase" IN ('ready', 'safe', 'unknown', 'continue'))
Line 180: \`wake_pending\` integer DEFAULT false NOT NULL,
Line 198: CREATE TABLE \`session_recovery\` (
Line 204: \`wake_pending\` integer DEFAULT true NOT NULL,
Line 207: CONSTRAINT \`session_recovery_pk\` PRIMARY KEY(\`execution_id\`),
Line 208: CONSTRAINT \`fk_session_recovery_session_id_session_id_fk\` FOREIGN KEY (\`session_id\`) REFERENCES \`session\`(\`id\`) ON DELETE CASCADE,
Line 209: CONSTRAINT ...
Found 20 matches
/home/byk/Code/opencode/packages/sdk/openapi.json:
Line 17899: "requestExecution": {
Line 17919: "enum": ["session.next.prompt.execution_requested"]
Line 18289: "enum": ["session.next.step.recovered"]
Line 18301: "executionID": {
Line 18313: "required": ["timestamp", "sessionID", "executionID", "phase"],
Line 25709: "requestExecution": {
Line 25740: "enum": ["session.next.prompt.execution_requested.1"]
Line 26299: "enum": ["session.next.step.recovered.1"]
Line 26321: "executionID": {
Line 26333: "required": ["timestamp", "sessionID", "executionID", "phase"],
Line 28599: "requestExecution": {
Line 28622: "enum": ["session.next.prompt.execution_requested"]
Line 29190: "enum": ["session.next.step.recovered"]
...
Found 16 matches /home/byk/Code/opencode/packages/sdk/js/src/v2/gen/types.gen.ts: Line 874: requestExecution?: boolean Line 879: type: "session.next.prompt.execution_requested" Line 983: type: "session.next.step.recovered" Line 987: executionID: string Line 3430: requestExecution?: boolean Line 3439: type: "session.next.prompt.execution_requested.1" Line 3606: type: "session.next.step.recovered.1" Line 3613: executionID: string Line 4362: requestExecution?: boolean Line 4371: type: "session.next.prompt.execution_requested" Line 4565: type: "session.next.step.recovered" Line 4575: executionID: string Line 6464: requestExecution?: boolean Line 6470: type: "session.next.prompt.execution_requested" Line 6583: type: "session.next.step.recovered" Line 6587: executionID: string
<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: ...
<path>/home/byk/Code/opencode/packages/core/test/database-migration.test.ts</path>
<type>file</type>
<content>
1: import { describe, expect, test } from "bun:test"
2: import { $ } from "bun"
3: import { fileURLToPath } from "url"
4: import path from "path"
5: import { SqliteClient } from "@effect/sql-sqlite-bun"
6: import { EffectDrizzleSqlite } from "@opencode-ai/effect-drizzle-sqlite"
7: import { Effect, Exit, Layer } from "effect"
8: import { eq, inArray, sql } from "drizzle-orm"
9: import { DatabaseMigration } from "@opencode-ai/core/database/migration"
10: import { migrations } from "@opencode-ai/core/database/migration.gen"
11: import workspaceNameMigration from "@opencode-ai/core/database/migration/20260410174513_workspace-name"
12: import sessionUsageMigration from "@opencode-ai/core/database/migration/20260510033149_session_usage"
13: import normalizeStoragePathsMigration from "@opencode-ai/core/database/migration/20260601010001_normalize_storage_paths"
14: import ...
Found 24 matches
/home/byk/Code/opencode/packages/core/test/session-runner.test.ts:
Line 598: it.effect("redrives only the synthetic recovery continuation", () =>
Line 731: it.effect("never dispatches a provider after ownership changes", () =>
Line 757: it.effect("never publishes streamed output after ownership changes", () =>
Line 784: it.effect("never starts a local tool after ownership changes", () =>
Line 824: it.effect("never fails interrupted tools after ownership changes", () =>
Line 1013: it.effect("interrupts a source Location runner after a Session moves", () =>
Line 1521: it.effect("recovers the continuation committed with Compaction.Ended", () =>
Line 1665: it.effect("persists a second context overflow after one recovery", () =>
Line 1688: it.effect("recovers once from a raw context overflow failure", () =>
Line 1716: it.effect("publishes the original overflow when recovery summarization fails", () =>
Line 1736: ...
<path>/home/byk/Code/opencode/packages/core/test/session-runner.test.ts</path>
<type>file</type>
<content>
560: Stream.fromIterable(fixture.partialEvents),
561: Stream.fromEffect(Deferred.succeed(streamed, undefined)).pipe(Stream.flatMap(() => Stream.never)),
562: )
563:
564: const runner = yield* SessionRunner.Service
565: yield* insertExecution(sessionID)
566: const fiber = yield* runner.run({ sessionID, force: true, executionID, ownerID: "test" }).pipe(Effect.forkChild)
567: yield* Deferred.await(streamed)
568: yield* Fiber.interrupt(fiber)
569: const { db } = yield* Database.Service
570: expect(
571: yield* db
572: .select({ id: SessionExecutionTable.id })
573: .from(SessionExecutionTable)
574: .where(eq(SessionExecutionTable.session_id, sessionID))
575: .get(),
576: ).toBeUndefined()
577: expect(
578: (yield* db.select({ type: EventTable.type }).from(EventTable).all()).some((event) ...
<path>/home/byk/Code/opencode/packages/core/test/session-runner.test.ts</path>
<type>file</type>
<content>
3220: requests.length = 0
3221: responses = [
3222: [
3223: LLMEvent.stepStart({ index: 0 }),
3224: LLMEvent.toolCall({ id: "call-blocked", name: "blocked", input: {} }),
3225: LLMEvent.stepFinish({ index: 0, reason: "tool-calls" }),
3226: LLMEvent.finish({ reason: "tool-calls" }),
3227: ],
3228: [
3229: LLMEvent.stepStart({ index: 0 }),
3230: LLMEvent.stepFinish({ index: 0, reason: "stop" }),
3231: LLMEvent.finish({ reason: "stop" }),
3232: ],
3233: ]
3234:
3235: yield* session.resume(sessionID)
3236:
3237: expect(requests).toHaveLength(2)
3238: expect(yield* session.context(sessionID)).toMatchObject([
3239: { type: "user", text: "Call blocked" },
3240: {
3241: type: "assistant",
3242: content: [
3243: ...
Found 17 matches
/home/byk/Code/opencode/packages/core/test/session-prompt.test.ts:
Line 140: it.effect("exposes the execution registry", () =>
Line 147: it.effect("delegates execution continuation through SessionExecution", () =>
Line 254: it.effect("resumes through a recorded message without appending another prompt", () =>
Line 310: it.effect("wakes execution when an exact prompt retry recovers a committed message", () =>
Line 330: it.effect("never wakes execution when retrying an already promoted prompt", () =>
Line 374: it.effect("durably records execution intent before advisory wake", () =>
Line 408: it.effect("replays historical prompt admission without execution intent as admit-only", () =>
Line 440: it.effect("turns an admit-only exact retry into durable execution intent", () =>
Line 489: it.effect("rejects reuse of one ID with a different prompt", () =>
Line 514: it.effect("never arms durable wake for a conflicting execution ...
<path>/home/byk/Code/opencode/packages/core/test/session-prompt.test.ts</path>
<type>file</type>
<content>
120: type: event.type,
121: data: event.data,
122: })),
123: )
124: })
125:
126: const recover = () =>
127: SessionRecovery.recover().pipe(
128: Effect.provideService(
129: SessionExecution.Service,
130: SessionExecution.Service.of({
131: active: Effect.succeed(new Set()),
132: resume: () => Effect.void,
133: interrupt: () => Effect.void,
134: wake: (id) => Effect.sync(() => wakeCalls.push(id)).pipe(Effect.asVoid),
135: }),
136: ),
137: )
138:
139: describe("SessionV2.prompt", () => {
140: it.effect("exposes the execution registry", () =>
141: Effect.gen(function* () {
142: activeSessions.add(sessionID)
143: expect(Array.from(yield* (yield* SessionV2.Service).active)).toEqual([sessionID])
144: }).pipe(Effect.ensuring(Effect.sync(() => activeSessions.clear()))),
145: )
146: ...
Found 1 matches
/home/byk/Code/opencode/packages/schema/src/session-message.ts:
Line 12: export const ID = Schema.String.check(Schema.isStartsWith("msg_")).pipe(
<path>/home/byk/Code/opencode/packages/schema/src/session-message.ts</path>
<type>file</type>
<content>
1: export * as SessionMessage from "./session-message"
2:
3: import { Schema } from "effect"
4: import { optional } from "./schema"
5: import { ProviderMetadata, ToolContent } from "./llm"
6: import { Model } from "./model"
7: import { FileAttachment, Prompt } from "./prompt"
8: import { DateTimeUtcFromMillis, RelativePath, statics } from "./schema"
9: import { SessionID } from "./session-id"
10: import { ascending } from "./identifier"
11:
12: export const ID = Schema.String.check(Schema.isStartsWith("msg_")).pipe(
13: Schema.brand("Session.Message.ID"),
14: statics((schema) => ({ create: () => schema.make("msg_" + ascending()) })),
15: )
16: export type ID = typeof ID.Type
17:
18: export interface UnknownError extends Schema.Schema.Type<typeof UnknownError> {}
19: export const UnknownError = Schema.Struct({
20: type: Schema.Literal("unknown"),
21: message: ...
/tmp/opencode/session-recovery-final-v2.patch /tmp/opencode/session-recovery-final.patch /tmp/opencode/session-recovery-final-v3.patch /tmp/opencode/session-recovery-full.patch
Found 55 matches /tmp/opencode/session-recovery-final-v2.patch: Line 118: + "name": "recovery_error", Line 212: + "name": "recovery_error", Line 444: + \`recovery_error\` text, Line 458: + \`recovery_error\` text, Line 494: + \`recovery_error\` text, Line 523: + \`recovery_error\` text, Line 992: + isNull(SessionRecoveryTable.recovery_error), Line 995: + .orderBy(asc(SessionRecoveryTable.time_created), asc(SessionRecoveryTable.execution_id)) Line 1218: + SessionEvent.PromptExecutionRequested, Line 1380: + isNull(SessionRecoveryTable.execution_id), Line 1449: + isNull(SessionRecoveryTable.execution_id), Line 1609: + yield* events.project(SessionEvent.PromptExecutionRequested, (event) => Line 1632: + eq(SessionRecoveryTable.execution_id, event.data.executionID), Line 1740: + .where(and(lte(SessionExecutionTable.expires_at, scanTime), ...
...output truncated...
Full output saved to: /home/byk/.local/share/opencode/tool-output/tool_0a7bc7c7b001rCxj2imCrXHdih
})
-diff --git a/packages/core/src/session/execution/claim.ts b/packages/core/src/session/execution/claim.ts
-new file mode 100644
-index 0000000000..5c458a549c
---- /dev/null
-+++ b/packages/core/src/session/execution/claim.ts
-@@ -0,0 +1,66 @@
-+export * as SessionExecutionClaim from "./claim"
-+
-+import { and, eq, gt } from "drizzle-orm"
-+import { Clock, Effect } from "effect"
-+import type { Database } from "../../database/database"
-+import type { SessionSchema } from "../schema"
-+import { SESSION_EXECUTION_LEASE_MS, SessionExecutionTable } from "../sql"
-+
-+type DatabaseService = Database.Interface["db"]
-+
-+export type Claim = {
-+ readonly sessionID: SessionSchema.ID
-+ readonly executionID: string
-+ readonly ownerID: string
-+}
-+
-+export type Values = Partial<Pick<typeof SessionExecutionTable.$inferInsert, "assistant_message_id" | ...
<path>/home/byk/.local/share/opencode/tool-output/tool_0a7bc7c7b001rCxj2imCrXHdih</path>
<type>file</type>
<content>
1: diff --git a/tmp/opencode/session-recovery-final-v2.patch b/tmp/opencode/session-recovery-final-v3.patch
2: index 073a602a32..9ceacf0137 100644
3: --- a/tmp/opencode/session-recovery-final-v2.patch
4: +++ b/tmp/opencode/session-recovery-final-v3.patch
5: @@ -1,7 +1,7 @@
6: diff --git a/packages/core/schema.json b/packages/core/schema.json
7: -index d0eeeebd5c..dad07b6ce6 100644
8: +index d0eeeebd5c419b02287413e8e521fefcbc3c4f27..dad07b6ce6bdb941c0bde9bc7224749dedfc6a39 100644
9: --- a/packages/core/schema.json
10: +++ b/packages/core/schema.json
11: @@ -1,8 +1,8 @@
12: {
13: "version": "7",
14: @@ -406,11 +406,11 @@ index d0eeeebd5c..dad07b6ce6 100644
15: + "table": "session_execution"
16: }
17: ],
18: "renames": []
19: diff --git a/packages/core/src/database/migration.gen.ts b/packages/core/src/database/migration.gen.ts
20: -index ...
/tmp/opencode/session-recovery-final-v2.patch
Found 5 matches /home/byk/Code/opencode/packages/core/schema.json: Line 1872: "name": "session_recovery_pk", Line 2121: "name": "session_execution_session_idx", Line 2223: "name": "session_input_wake_pending_promoted_time_created_id_idx", Line 2313: "name": "session_recovery_continuation_message_idx", Line 2375: "name": "session_execution_phase_check",
<path>/home/byk/Code/opencode/packages/core/schema.json</path>
<type>file</type>
<content>
1800: "name": "fk_session_recovery_assistant_message_id_session_message_id_fk",
1801: "entityType": "fks",
1802: "table": "session_recovery"
1803: },
1804: {
1805: "columns": ["continuation_message_id"],
1806: "tableTo": "session_input",
1807: "columnsTo": ["id"],
1808: "onUpdate": "NO ACTION",
1809: "onDelete": "CASCADE",
1810: "nameExplicit": false,
1811: "name": "fk_session_recovery_continuation_message_id_session_input_id_fk",
1812: "entityType": "fks",
1813: "table": "session_recovery"
1814: },
1815: {
1816: "columns": ["project_id"],
1817: "tableTo": "project",
1818: "columnsTo": ["id"],
1819: "onUpdate": "NO ACTION",
1820: "onDelete": "CASCADE",
1821: "nameExplicit": false,
1822: "name": "fk_session_project_id_project_id_fk",
1823: "entityType": ...
Found 9 matches
/home/byk/Code/opencode/packages/schema/src/session-event.ts:
Line 94: export const PromptAdmitted = Event.define({
Line 102: export type PromptAdmitted = typeof PromptAdmitted.Type
Line 484: export const DurableDefinitions = Event.inventory(
Line 489: PromptAdmitted,
Line 499: Step.Recovered,
Line 518: export const Definitions = Event.inventory(
Line 523: PromptAdmitted,
Line 533: Step.Recovered,
Line 556: export const Durable = Schema.Union(DurableDefinitions, { mode: "oneOf" })
<path>/home/byk/Code/opencode/packages/schema/src/session-event.ts</path>
<type>file</type>
<content>
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: Prompted,
489: PromptAdmitted,
490: PromptExecutionRequested,
491: ContextUpdated,
492: Synthetic,
493: Shell.Started,
494: Shell.Ended,
495: Step.Started,
496: Step.Ended,
497: Step.Failed,
498: Step.Interrupted,
499: ...
<path>/home/byk/Code/opencode/packages/core/src/session/projector.ts</path>
<type>file</type>
<content>
481: yield* events.project(SessionEvent.RevertEvent.Cleared, (event) =>
482: db
483: .update(SessionTable)
484: .set({ revert: null, time_updated: DateTime.toEpochMillis(event.data.timestamp) })
485: .where(eq(SessionTable.id, event.data.sessionID))
486: .run()
487: .pipe(Effect.orDie, Effect.asVoid),
488: )
489: yield* events.project(SessionEvent.RevertEvent.Committed, (event) =>
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: ...
<path>/home/byk/Code/opencode/packages/core/test/session-runner.test.ts</path>
<type>file</type>
<content>
980:
981: it.effect("retries the first provider turn after system context becomes available", () =>
982: Effect.gen(function* () {
983: yield* setup
984: const session = yield* SessionV2.Service
985: const { db } = yield* Database.Service
986: const messageID = SessionMessage.ID.create()
987: systemUnavailable = true
988: yield* session.prompt({ id: messageID, sessionID, prompt: Prompt.make({ text: "First" }), resume: false })
989: requests.length = 0
990:
991: const exit = yield* session.resume(sessionID).pipe(Effect.exit)
992:
993: expect(Exit.isFailure(exit)).toBe(true)
994: if (Exit.isFailure(exit)) expect(Cause.squash(exit.cause)).toBeInstanceOf(SystemContext.InitializationBlocked)
995: expect(requests).toHaveLength(0)
996: expect(yield* SessionInput.hasPending(db, sessionID, ...
Found 1 matches
/home/byk/Code/opencode/packages/core/src/control-plane/move-session.ts:
Line 106: yield* events.publish(SessionEvent.Moved, {
<path>/home/byk/Code/opencode/packages/core/src/control-plane/move-session.ts</path>
<type>file</type>
<content>
70: Service,
71: Effect.gen(function* () {
72: const git = yield* Git.Service
73: const events = yield* EventV2.Service
74: const project = yield* ProjectV2.Service
75: const sessions = yield* SessionStore.Service
76:
77: const moveSession = Effect.fn("MoveSession.moveSession")(function* (input: Input) {
78: const current = yield* sessions.get(input.sessionID)
79: if (!current) return yield* new SessionV2.NotFoundError({ sessionID: input.sessionID })
80: const directory = AbsolutePath.make(input.destination.directory)
81: if (current.location.directory === directory) return
82:
83: const source = yield* project.resolve(current.location.directory)
84: const destination = yield* project.resolve(directory)
85: if (current.projectID !== destination.id) {
86: return yield* new ...
Found 21 matches
/home/byk/Code/opencode/packages/core/test/move-session.test.ts:
Line 94: yield* MoveSession.Service.use((service) =>
Line 95: service.moveSession({ sessionID, destination: { directory: moved }, moveChanges: true }),
Line 148: yield* MoveSession.Service.use((service) =>
Line 149: service.moveSession({ sessionID, destination: { directory: destination }, moveChanges: true }),
Line 214: yield* MoveSession.Service.use((service) =>
Line 215: service.moveSession({ sessionID, destination: { directory: moved }, moveChanges: true }),
/home/byk/Code/opencode/packages/opencode/test/server/httpapi-global.test.ts:
Line 33: Layer.provide(Layer.mock(MoveSession.Service)({})),
/home/byk/Code/opencode/packages/opencode/test/cli/run/footer.menu.test.ts:
Line 22: Array.from({ length: 6 }).forEach(() => state.menu.move(1))
Line 35: Array.from({ length: 13 }).forEach(() => state.menu.move(1))
Line 36: ...
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 415: 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: ...
<path>/home/byk/Code/opencode/packages/opencode/src/server/routes/instance/httpapi/handlers/sync.ts</path>
<type>file</type>
<content>
1: import { Workspace } from "@/control-plane/workspace"
2: import * as InstanceState from "@/effect/instance-state"
3: import { Session } from "@/session/session"
4: import { Database } from "@opencode-ai/core/database/database"
5: import { EventV2 } from "@opencode-ai/core/event"
6: import { EventV2Bridge } from "@/event-v2-bridge"
7: import { EventTable } from "@opencode-ai/core/event/sql"
8: import { asc } from "drizzle-orm"
9: import { and } from "drizzle-orm"
10: import { eq } from "drizzle-orm"
11: import { lte } from "drizzle-orm"
12: import { not } from "drizzle-orm"
13: import { or } from "drizzle-orm"
14: import { Effect, Scope } from "effect"
15: import { HttpApiBuilder, HttpApiError } from "effect/unstable/httpapi"
16: import { InstanceHttpApi } from "../api"
17: import { HistoryPayload, ReplayPayload, SessionPayload } from ...