Dashboard › opencode › Session 0Grbjx9dOi2s
0Grbjx9dOi2sheF9OFinal read-only narrow audit in /home/byk/Code/opencode; no recall; no edits/tests/build/commit/services. Inspect current files. Verify two prior blockers are closed: (1) exact resume:true retry of an already-promoted prompt cannot wake/execute an unrelated resume:false input across normal, defect, and concurrent paths; SessionInput.admit shouldWake semantics and regression adequacy. (2) checked-in packages/sdk/openapi.json and packages/sdk/js generated contracts include optional PromptAdmitted.requestExecution and PromptExecutionRequested in public/durable/sync unions as required. Also check no public generated artifact obviously omitted. Return findings with exact file:line and sequence, or PASS with residual gaps. Never empty.
Found 65 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/core/test/session-runner.test.ts:
Line 705: requestExecution: true,
/home/byk/Code/opencode/packages/core/test/session-projector.test.ts:
Line 633: requestExecution: true,
Line 880: requestExecution: false,
Line 1356: ...
<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/test/session-prompt.test.ts</path>
<type>file</type>
<content>
340: prompt: Prompt.make({ text: "Promote this prompt" }),
341: })
342: yield* SessionInput.promoteSteers(db, events, sessionID, Number.MAX_SAFE_INTEGER)
343: yield* session.prompt({
344: sessionID,
345: id: pendingID,
346: prompt: Prompt.make({ text: "Keep this prompt pending" }),
347: resume: false,
348: })
349: wakeCalls.length = 0
350:
351: yield* session.prompt({
352: sessionID,
353: id: messageID,
354: prompt: Prompt.make({ text: "Promote this prompt" }),
355: resume: true,
356: })
357:
358: expect(wakeCalls).toEqual([])
359: expect(yield* db.select().from(SessionInputTable).where(eq(SessionInputTable.id, messageID)).get()).toMatchObject(
360: {
361: promoted_seq: 1,
362: wake_pending: false,
363: },
364: ...
<path>/home/byk/Code/opencode/packages/core/test/session-prompt.test.ts</path>
<type>file</type>
<content>
260: prompt: Prompt.make({ text: "Fix the failing tests" }),
261: resume: false,
262: })
263:
264: executionCalls.length = 0
265: wakeCalls.length = 0
266: yield* session.resume(sessionID)
267:
268: expect(yield* session.messages({ sessionID })).toEqual([])
269: expect(yield* admitted(message.id)).not.toHaveProperty("promotedSeq")
270: expect(executionCalls).toEqual([sessionID])
271: expect(wakeCalls).toEqual([])
272: }),
273: )
274:
275: it.effect("records distinct messages when the ID is omitted", () =>
276: Effect.gen(function* () {
277: yield* setup
278: const session = yield* SessionV2.Service
279: const input = { sessionID, prompt: Prompt.make({ text: "Fix the failing tests" }), resume: false }
280:
281: const first = yield* session.prompt(input)
282: const second = ...
Found 52 matches
/home/byk/Code/opencode/packages/core/test/session-execution-local.test.ts:
Line 151: yield* execution.resume(sessionID).pipe(Effect.catchDefect(() => Effect.void))
/home/byk/Code/opencode/packages/core/test/session-runner.test.ts:
Line 149: defect: Tool.make({
Line 153: execute: () => Effect.die("unexpected tool defect"),
Line 972: expect(requests[0]?.tools.map((tool) => tool.name)).toEqual(["echo", "defect"])
Line 1856: expect(requests[0]?.tools.map((tool) => tool.name)).toEqual(["echo", "defect"])
Line 2935: const defect = new Error("fail after prompt promotion")
Line 2937: yield* events.project(SessionEvent.Prompted, () => (fail ? Effect.die(defect) : Effect.void))
Line 2940: expect(yield* session.resume(sessionID).pipe(Effect.catchDefect(Effect.succeed))).toBe(defect)
Line 2956: it.effect("does not strand a committed promotion when a post-commit listener defects", () =>
Line 3154: ...
<path>/home/byk/Code/opencode/packages/core/src/session.ts</path>
<type>file</type>
<content>
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: }),
338: message: Effect.fn("V2Session.message")(function* (input) {
339: const stored = yield* store.message(input.messageID)
340: return stored?.sessionID === input.sessionID ? stored.message : undefined
341: }),
342: context: Effect.fn("V2Session.context")(function* (sessionID) {
343: yield* result.get(sessionID)
344: return yield* store.context(sessionID)
345: }),
346: events: (input) ...
<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 ...
<path>/home/byk/Code/opencode/packages/core/src/session/input.ts</path>
<type>file</type>
<content>
232: export const projectPrompted = Effect.fn("SessionInput.projectPrompted")(function* (
233: db: DatabaseService,
234: input: {
235: readonly id: SessionMessage.ID
236: readonly sessionID: SessionSchema.ID
237: readonly prompt: Prompt
238: readonly delivery: Delivery
239: readonly timeCreated: DateTime.Utc
240: readonly promotedSeq: number
241: },
242: ) {
243: const updated = yield* db
244: .update(SessionInputTable)
245: .set({ promoted_seq: input.promotedSeq, wake_pending: false })
246: .where(
247: and(
248: eq(SessionInputTable.id, input.id),
249: eq(SessionInputTable.session_id, input.sessionID),
250: isNull(SessionInputTable.promoted_seq),
251: ),
252: )
253: .returning()
254: .get()
255: .pipe(Effect.orDie)
256: if (updated) {
257: const stored = fromRow(updated)
258: if ...
No files found
/home/byk/Code/opencode/packages/core/src/event.ts
Found 13 matches
/home/byk/Code/opencode/packages/core/src/event.ts:
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 357: (wake) => PubSub.publish(wake, undefined),
Line 369: function publishEvent<D extends Definition>(definition: D, event: Payload<D>, commit?: PublishOptions["commit"]) {
Line 414: if (typed) yield* PubSub.publish(typed, event)
Line 415: yield* PubSub.publish(pubsub.all, event)
Line 419: function publish<D extends Definition>(definition: D, data: Data<D>, options?: PublishOptions) {
Line 427: return yield* publishEvent(
Line 443: options?: { readonly publish?: boolean; readonly ownerID?: string; readonly strictOwner?: boolean },
...
<path>/home/byk/Code/opencode/packages/core/src/event.ts</path>
<type>file</type>
<content>
340: id: event.id,
341: aggregate_id: aggregateID,
342: seq,
343: type: versionedType(definition.type, durable.version),
344: data: encoded,
345: },
346: ])
347: .run()
348: .pipe(Effect.orDie)
349: return { aggregateID, seq }
350: }),
351: { behavior: "immediate" },
352: )
353: .pipe(Effect.orDie)
354: if (committed) {
355: yield* Effect.forEach(
356: pubsub.durable.get(committed.aggregateID) ?? [],
357: (wake) => PubSub.publish(wake, ...
<path>/home/byk/Code/opencode/packages/core/src/event.ts</path>
<type>file</type>
<content>
245: .from(EventSequenceTable)
246: .where(eq(EventSequenceTable.aggregate_id, aggregateID))
247: .get()
248: .pipe(Effect.orDie)
249: const latest = row?.seq ?? -1
250: const encoded = Schema.encodeUnknownSync(definition.data)(event.data) as Record<
251: string,
252: unknown
253: >
254: if (input?.strictOwner && row?.ownerID && row.ownerID !== input.ownerID) {
255: yield* Effect.die(
256: new InvalidDurableEventError({
257: type: event.type,
258: message: `Replay owner mismatch for aggregate ${aggregateID}: ...
<path>/home/byk/Code/opencode/packages/schema/src/session-event.ts</path>
<type>file</type>
<content>
80: ...Base,
81: location: Location.Ref,
82: subdirectory: RelativePath.pipe(optional),
83: },
84: })
85: export type Moved = typeof Moved.Type
86:
87: export const Prompted = Event.define({
88: type: "session.next.prompted",
89: ...options,
90: schema: PromptFields,
91: })
92: export type Prompted = typeof Prompted.Type
93:
94: export const PromptAdmitted = Event.define({
95: type: "session.next.prompt.admitted",
96: ...options,
97: schema: {
98: ...PromptFields,
99: requestExecution: Schema.Boolean.pipe(optional),
100: },
101: })
102: export type PromptAdmitted = typeof PromptAdmitted.Type
103:
104: export const PromptExecutionRequested = Event.define({
105: type: "session.next.prompt.execution_requested",
106: ...options,
107: schema: {
108: ...Base,
109: messageID: SessionMessage.ID,
110: },
111: })
112: export type ...
<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: ...
<path>/home/byk/Code/opencode/packages/schema/src/session-event.ts</path> <type>file</type> <content> 518: export const Definitions = Event.inventory( 519: AgentSwitched, 520: ModelSwitched, 521: Moved, 522: Prompted, 523: PromptAdmitted, 524: PromptExecutionRequested, 525: ContextUpdated, 526: Synthetic, 527: Shell.Started, 528: Shell.Ended, 529: Step.Started, 530: Step.Ended, 531: Step.Failed, 532: Step.Interrupted, 533: Step.Recovered, 534: Text.Started, 535: Text.Delta, 536: Text.Ended, 537: Reasoning.Started, 538: Reasoning.Delta, 539: Reasoning.Ended, 540: Tool.Input.Started, 541: Tool.Input.Delta, 542: Tool.Input.Ended, 543: Tool.Called, 544: Tool.Progress, 545: Tool.Success, 546: Tool.Failed, 547: Retried, 548: Compaction.Started, 549: Compaction.Delta, 550: Compaction.Ended, 551: RevertEvent.Staged, 552: RevertEvent.Cleared, 553: RevertEvent.Committed, 554: ) 555: 556: export const Durable = ...
/home/byk/Code/opencode/packages/sdk/js/src/v2/gen/sdk.gen.ts /home/byk/Code/opencode/packages/sdk/js/src/v2/gen/client.gen.ts /home/byk/Code/opencode/packages/sdk/js/src/v2/gen/types.gen.ts /home/byk/Code/opencode/packages/sdk/js/src/v2/gen/client/utils.gen.ts /home/byk/Code/opencode/packages/sdk/js/src/v2/gen/client/types.gen.ts /home/byk/Code/opencode/packages/sdk/js/src/v2/gen/client/client.gen.ts /home/byk/Code/opencode/packages/sdk/js/src/v2/gen/core/utils.gen.ts /home/byk/Code/opencode/packages/sdk/js/src/v2/gen/core/types.gen.ts /home/byk/Code/opencode/packages/sdk/js/src/v2/gen/core/serverSentEvents.gen.ts /home/byk/Code/opencode/packages/sdk/js/src/v2/gen/core/queryKeySerializer.gen.ts /home/byk/Code/opencode/packages/sdk/js/src/v2/gen/core/pathSerializer.gen.ts /home/byk/Code/opencode/packages/sdk/js/src/v2/gen/core/params.gen.ts /home/byk/Code/opencode/packages/sdk/js/src/v2/gen/core/bodySerializer.gen.ts /home/byk/Code/opencode/packages/sdk/js/src/v2/gen/core/auth.gen.ts /...
/home/byk/Code/opencode/packages/client/src/generated/types.ts /home/byk/Code/opencode/packages/client/src/generated/index.ts /home/byk/Code/opencode/packages/client/src/generated/client.ts /home/byk/Code/opencode/packages/client/src/generated/client-error.ts /home/byk/Code/opencode/packages/client/src/generated/.httpapi-codegen.json /home/byk/Code/opencode/packages/client/src/generated-effect/index.ts /home/byk/Code/opencode/packages/client/src/generated-effect/client.ts /home/byk/Code/opencode/packages/client/src/generated-effect/client-error.ts /home/byk/Code/opencode/packages/client/src/generated-effect/.httpapi-codegen.json
No files found
<path>/home/byk/Code/opencode/packages/client/src/generated/types.ts</path>
<type>file</type>
<content>
1: import type { OpenCodeEventEncoded } from "@opencode-ai/protocol/groups/event"
2:
3: export type JsonValue =
4: | null
5: | boolean
6: | number
7: | string
8: | ReadonlyArray<JsonValue>
9: | { readonly [key: string]: JsonValue }
10:
11: export type UnauthorizedError = { readonly _tag: "UnauthorizedError"; readonly message: string }
12: export const isUnauthorizedError = (value: unknown): value is UnauthorizedError =>
13: typeof value === "object" && value !== null && "_tag" in value && value["_tag"] === "UnauthorizedError"
14:
15: export type InvalidRequestError = {
16: readonly _tag: "InvalidRequestError"
17: readonly message: string
18: readonly kind?: string | undefined
19: readonly field?: string | undefined
20: }
21: export const isInvalidRequestError = (value: unknown): value is InvalidRequestError =>
22: typeof value === "object" && value !== ...
Found 4 matches
/home/byk/Code/opencode/packages/protocol/src/groups/event.ts:
Line 56: export type OpenCodeEventEncoded = typeof OpenCodeEvent.Encoded
/home/byk/Code/opencode/packages/protocol/src/groups/session.ts:
Line 23: import { SessionEvent } from "@opencode-ai/schema/session-event"
Line 311: data: Schema.Array(SessionEvent.Durable),
Line 332: success: HttpApiSchema.StreamSse({ data: SessionEvent.Durable }),
<path>/home/byk/Code/opencode/packages/protocol/src/groups/event.ts</path>
<type>file</type>
<content>
1: import { Event } from "@opencode-ai/schema/event"
2: import { EventManifest } from "@opencode-ai/schema/event-manifest"
3: import { Location } from "@opencode-ai/schema/location"
4: import type { Definition } from "@opencode-ai/schema/event"
5: import { Schema } from "effect"
6: import { HttpApiEndpoint, HttpApiGroup, HttpApiSchema, OpenApi } from "effect/unstable/httpapi"
7:
8: const fields = {
9: id: Event.ID,
10: metadata: Schema.optional(Schema.Record(Schema.String, Schema.Unknown)),
11: durable: Schema.optional(Schema.Struct({ aggregateID: Schema.String, seq: Schema.Int, version: Schema.Int })),
12: location: Schema.optional(Location.Ref),
13: }
14:
15: const schema = <const Definitions extends ReadonlyArray<Definition>>(definitions: Definitions) =>
16: Schema.Union([
17: ...definitions,
18: ...(definitions.some((definition) => definition.type === ...
<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: ...
<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>
Found 4 matches /home/byk/Code/opencode/packages/sdk/openapi.json: Line 17919: "enum": ["session.next.prompt.execution_requested"] Line 25740: "enum": ["session.next.prompt.execution_requested.1"] Line 28622: "enum": ["session.next.prompt.execution_requested"] Line 34831: "enum": ["session.next.prompt.execution_requested"]
<path>/home/byk/Code/opencode/packages/sdk/openapi.json</path>
<type>file</type>
<content>
17865: "additionalProperties": false
17866: },
17867: {
17868: "type": "object",
17869: "properties": {
17870: "id": {
17871: "type": "string",
17872: "pattern": "^evt_"
17873: },
17874: "type": {
17875: "type": "string",
17876: "enum": ["session.next.prompt.admitted"]
17877: },
17878: "properties": {
17879: "type": "object",
17880: "properties": {
17881: "timestamp": {
17882: "type": "number"
17883: },
17884: "sessionID": {
17885: "type": "string",
17886: "pattern": ...
<path>/home/byk/Code/opencode/packages/sdk/openapi.json</path>
<type>file</type>
<content>
17780: },
17781: "model": {
17782: "$ref": "#/components/schemas/ModelRef"
17783: }
17784: },
17785: "required": ["timestamp", "sessionID", "messageID", "model"],
17786: "additionalProperties": false
17787: }
17788: },
17789: "required": ["id", "type", "properties"],
17790: "additionalProperties": false
17791: },
17792: {
17793: "type": "object",
17794: "properties": {
17795: "id": {
17796: "type": "string",
17797: "pattern": "^evt_"
17798: },
17799: "type": {
17800: "type": "string",
17801: ...
Found 2 matches
/home/byk/Code/opencode/packages/sdk/openapi.json:
Line 15261: "Event": {
Line 24152: "V2Event": {
<path>/home/byk/Code/opencode/packages/sdk/openapi.json</path>
<type>file</type>
<content>
15250: "x-codeSamples": [
15251: {
15252: "lang": "js",
15253: "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.pty.connect({\n ...\n})"
15254: }
15255: ]
15256: }
15257: }
15258: },
15259: "components": {
15260: "schemas": {
15261: "Event": {
15262: "anyOf": [
15263: {
15264: "$ref": "#/components/schemas/EventModels-devRefreshed"
15265: },
15266: {
15267: "$ref": "#/components/schemas/EventIntegrationUpdated"
15268: },
15269: {
15270: "$ref": "#/components/schemas/EventIntegrationConnectionUpdated"
15271: },
15272: {
15273: "$ref": "#/components/schemas/EventCatalogUpdated"
15274: },
15275: ...
<path>/home/byk/Code/opencode/packages/sdk/openapi.json</path>
<type>file</type>
<content>
23785: },
23786: "message": {
23787: "type": "string"
23788: },
23789: "ref": {
23790: "type": "string"
23791: }
23792: },
23793: "required": ["_tag", "message"],
23794: "additionalProperties": false
23795: },
23796: "SessionDurableEvent": {
23797: "oneOf": [
23798: {
23799: "$ref": "#/components/schemas/SessionNextAgentSwitched"
23800: },
23801: {
23802: "$ref": "#/components/schemas/SessionNextModelSwitched"
23803: },
23804: {
23805: "$ref": "#/components/schemas/SessionNextMoved"
23806: },
23807: {
23808: "$ref": "#/components/schemas/SessionNextPrompted"
23809: },
23810: {
23811: "$ref": ...
<path>/home/byk/Code/opencode/packages/sdk/openapi.json</path>
<type>file</type>
<content>
24145: "required": ["sessionID", "requestID"],
24146: "additionalProperties": false
24147: }
24148: },
24149: "required": ["id", "type", "data"],
24150: "additionalProperties": false
24151: },
24152: "V2Event": {
24153: "anyOf": [
24154: {
24155: "$ref": "#/components/schemas/Models-devRefreshed"
24156: },
24157: {
24158: "$ref": "#/components/schemas/IntegrationUpdated"
24159: },
24160: {
24161: "$ref": "#/components/schemas/IntegrationConnectionUpdated"
24162: },
24163: {
24164: "$ref": "#/components/schemas/CatalogUpdated"
24165: },
24166: {
24167: "$ref": "#/components/schemas/SessionCreated"
24168: },
24169: {
24170: "$ref": ...
<path>/home/byk/Code/opencode/packages/sdk/openapi.json</path>
<type>file</type>
<content>
25645: "type": "string",
25646: "enum": ["steer", "queue"]
25647: }
25648: },
25649: "required": ["timestamp", "sessionID", "messageID", "prompt", "delivery"],
25650: "additionalProperties": false
25651: }
25652: },
25653: "required": ["type", "id", "seq", "aggregateID", "data"],
25654: "additionalProperties": false
25655: }
25656: },
25657: "required": ["type", "id", "syncEvent"],
25658: "additionalProperties": false
25659: },
25660: "SyncEventSessionNextPromptAdmitted": {
25661: "type": "object",
25662: "properties": {
25663: "type": {
25664: "type": "string",
25665: "enum": ["sync"]
25666: },
25667: "id": {
25668: ...
<path>/home/byk/Code/opencode/packages/sdk/openapi.json</path>
<type>file</type>
<content>
25724: "SyncEventSessionNextPromptExecution_requested": {
25725: "type": "object",
25726: "properties": {
25727: "type": {
25728: "type": "string",
25729: "enum": ["sync"]
25730: },
25731: "id": {
25732: "type": "string",
25733: "pattern": "^evt_"
25734: },
25735: "syncEvent": {
25736: "type": "object",
25737: "properties": {
25738: "type": {
25739: "type": "string",
25740: "enum": ["session.next.prompt.execution_requested.1"]
25741: },
25742: "id": {
25743: "type": "string",
25744: "pattern": "^evt_"
25745: },
25746: "seq": {
25747: "type": "number"
25748: },
25749: ...
Found 2 matches
/home/byk/Code/opencode/packages/sdk/openapi.json:
Line 20580: "$ref": "#/components/schemas/SyncEventSessionNextPromptExecution_requested"
Line 25724: "SyncEventSessionNextPromptExecution_requested": {
<path>/home/byk/Code/opencode/packages/sdk/openapi.json</path>
<type>file</type>
<content>
20535: }
20536: },
20537: "required": ["id", "type", "properties"],
20538: "additionalProperties": false
20539: },
20540: {
20541: "$ref": "#/components/schemas/EventServerInstanceDisposed"
20542: },
20543: {
20544: "$ref": "#/components/schemas/SyncEventSessionCreated"
20545: },
20546: {
20547: "$ref": "#/components/schemas/SyncEventSessionUpdated"
20548: },
20549: {
20550: "$ref": "#/components/schemas/SyncEventSessionDeleted"
20551: },
20552: {
20553: "$ref": "#/components/schemas/SyncEventMessageUpdated"
20554: },
20555: {
20556: "$ref": ...
<path>/home/byk/Code/opencode/packages/sdk/openapi.json</path>
<type>file</type>
<content>
20470: "required": ["name"],
20471: "additionalProperties": false
20472: }
20473: },
20474: "required": ["id", "type", "properties"],
20475: "additionalProperties": false
20476: },
20477: {
20478: "type": "object",
20479: "properties": {
20480: "id": {
20481: "type": "string",
20482: "pattern": "^evt_"
20483: },
20484: "type": {
20485: "type": "string",
20486: "enum": ["worktree.failed"]
20487: },
20488: "properties": {
20489: "type": "object",
20490: "properties": {
20491: "message": {
20492: ...
<path>/home/byk/Code/opencode/packages/sdk/openapi.json</path>
<type>file</type>
<content>
28535: "enum": ["steer", "queue"]
28536: }
28537: },
28538: "required": ["timestamp", "sessionID", "messageID", "prompt", "delivery"],
28539: "additionalProperties": false
28540: }
28541: },
28542: "required": ["id", "type", "data"],
28543: "additionalProperties": false
28544: },
28545: "SessionNextPromptAdmitted": {
28546: "type": "object",
28547: "properties": {
28548: "id": {
28549: "type": "string",
28550: "pattern": "^evt_"
28551: },
28552: "metadata": {
28553: "type": "object"
28554: },
28555: "type": {
28556: "type": "string",
28557: "enum": ["session.next.prompt.admitted"]
28558: },
28559: "durable": {
28560: "type": ...
<path>/home/byk/Code/opencode/packages/sdk/openapi.json</path>
<type>file</type>
<content>
28640: "location": {
28641: "$ref": "#/components/schemas/LocationRef"
28642: },
28643: "data": {
28644: "type": "object",
28645: "properties": {
28646: "timestamp": {
28647: "type": "number"
28648: },
28649: "sessionID": {
28650: "type": "string",
28651: "pattern": "^ses"
28652: },
28653: "messageID": {
28654: "type": "string",
28655: "pattern": "^msg_"
28656: }
28657: },
28658: "required": ["timestamp", "sessionID", "messageID"],
28659: "additionalProperties": false
28660: }
28661: },
28662: "required": ["id", "type", "data"],
28663: "additionalProperties": false
28664: },
28665: ...
<path>/home/byk/Code/opencode/packages/sdk/openapi.json</path>
<type>file</type>
<content>
34765: "$ref": "#/components/schemas/Prompt"
34766: },
34767: "delivery": {
34768: "type": "string",
34769: "enum": ["steer", "queue"]
34770: }
34771: },
34772: "required": ["timestamp", "sessionID", "messageID", "prompt", "delivery"],
34773: "additionalProperties": false
34774: }
34775: },
34776: "required": ["id", "type", "properties"],
34777: "additionalProperties": false
34778: },
34779: "EventSessionNextPromptAdmitted": {
34780: "type": "object",
34781: "properties": {
34782: "id": {
34783: "type": "string",
34784: "pattern": "^evt_"
34785: },
34786: "type": {
34787: "type": "string",
34788: "enum": ...
<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: ...
<path>/home/byk/Code/opencode/packages/sdk/js/src/v2/gen/types.gen.ts</path>
<type>file</type>
<content>
845: id: string
846: type: "session.next.moved"
847: properties: {
848: timestamp: number
849: sessionID: string
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?: ...
<path>/home/byk/Code/opencode/packages/sdk/js/src/v2/gen/types.gen.ts</path>
<type>file</type>
<content>
760: id: string
761: type: "catalog.updated"
762: properties: {
763: [key: string]: unknown
764: }
765: }
766: | {
767: id: string
768: type: "session.created"
769: properties: {
770: sessionID: string
771: info: Session
772: }
773: }
774: | {
775: id: string
776: type: "session.updated"
777: properties: {
778: sessionID: string
779: info: Session
780: }
781: }
782: | {
783: id: string
784: type: "session.deleted"
785: properties: {
786: sessionID: string
787: info: Session
788: }
789: }
790: | {
791: id: string
792: type: "message.updated"
793: properties: {
794: sessionID: string
795: info: Message
796: ...
<path>/home/byk/Code/opencode/packages/sdk/js/src/v2/gen/types.gen.ts</path>
<type>file</type>
<content>
700: * Display text (1-5 words, concise)
701: */
702: label: string
703: /**
704: * Explanation of choice
705: */
706: description: string
707: }
708:
709: export type QuestionInfo = {
710: /**
711: * Complete question
712: */
713: question: string
714: /**
715: * Very short label (max 30 chars)
716: */
717: header: string
718: /**
719: * Available choices
720: */
721: options: Array<QuestionOption>
722: multiple?: boolean
723: custom?: boolean
724: }
725:
726: export type QuestionTool = {
727: messageID: string
728: callID: string
729: }
730:
731: export type QuestionAnswer = Array<string>
732:
733: export type GlobalEvent = {
734: directory: string
735: project?: string
736: workspace?: string
737: payload:
738: | {
739: id: string
740: type: "models-dev.refreshed"
741: properties: ...
<path>/home/byk/Code/opencode/packages/sdk/js/src/v2/gen/types.gen.ts</path>
<type>file</type>
<content>
1625: type: "server.connected"
1626: properties: {
1627: [key: string]: unknown
1628: }
1629: }
1630: | {
1631: id: string
1632: type: "global.disposed"
1633: properties: {
1634: [key: string]: unknown
1635: }
1636: }
1637: | EventServerInstanceDisposed
1638: | SyncEventSessionCreated
1639: | SyncEventSessionUpdated
1640: | SyncEventSessionDeleted
1641: | SyncEventMessageUpdated
1642: | SyncEventMessageRemoved
1643: | SyncEventMessagePartUpdated
1644: | SyncEventMessagePartRemoved
1645: | SyncEventSessionNextAgentSwitched
1646: | SyncEventSessionNextModelSwitched
1647: | SyncEventSessionNextMoved
1648: | SyncEventSessionNextPrompted
1649: | SyncEventSessionNextPromptAdmitted
1650: | SyncEventSessionNextPromptExecutionRequested
1651: ...
<path>/home/byk/Code/opencode/packages/sdk/js/src/v2/gen/types.gen.ts</path>
<type>file</type>
<content>
1590: name: string
1591: }
1592: }
1593: | {
1594: id: string
1595: type: "workspace.failed"
1596: properties: {
1597: message: string
1598: }
1599: }
1600: | {
1601: id: string
1602: type: "workspace.status"
1603: properties: {
1604: workspaceID: string
1605: status: "connected" | "connecting" | "disconnected" | "error"
1606: }
1607: }
1608: | {
1609: id: string
1610: type: "worktree.ready"
1611: properties: {
1612: name: string
1613: branch?: string
1614: }
1615: }
1616: | {
1617: id: string
1618: type: "worktree.failed"
1619: properties: {
1620: message: string
1621: }
1622: }
1623: | {
1624: id: string
1625: ...
<path>/home/byk/Code/opencode/packages/sdk/js/src/v2/gen/types.gen.ts</path>
<type>file</type>
<content>
2768: sessionID: string
2769: messageID: string
2770: message: string
2771: }
2772:
2773: export type UnknownError1 = {
2774: _tag: "UnknownError"
2775: message: string
2776: ref?: string
2777: }
2778:
2779: export type SessionDurableEvent =
2780: | SessionNextAgentSwitched
2781: | SessionNextModelSwitched
2782: | SessionNextMoved
2783: | SessionNextPrompted
2784: | SessionNextPromptAdmitted
2785: | SessionNextPromptExecutionRequested
2786: | SessionNextContextUpdated
2787: | SessionNextSynthetic
2788: | SessionNextShellStarted
2789: | SessionNextShellEnded
2790: | SessionNextStepStarted
2791: | SessionNextStepEnded
2792: | SessionNextStepFailed
2793: | SessionNextStepInterrupted
2794: | SessionNextStepRecovered
2795: | SessionNextTextStarted
2796: | SessionNextTextEnded
2797: | SessionNextToolInputStarted
2798: | ...
<path>/home/byk/Code/opencode/packages/sdk/js/src/v2/gen/types.gen.ts</path>
<type>file</type>
<content>
3400: id: string
3401: syncEvent: {
3402: type: "session.next.prompted.1"
3403: id: string
3404: seq: number
3405: aggregateID: string
3406: data: {
3407: timestamp: number
3408: sessionID: string
3409: messageID: string
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 ...
<path>/home/byk/Code/opencode/packages/sdk/js/src/v2/gen/types.gen.ts</path>
<type>file</type>
<content>
4325: metadata?: {
4326: [key: string]: unknown
4327: }
4328: type: "session.next.prompted"
4329: durable?: {
4330: aggregateID: string
4331: seq: number
4332: version: number
4333: }
4334: location?: LocationRef
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: ...
<path>/home/byk/Code/opencode/packages/sdk/js/src/v2/gen/types.gen.ts</path>
<type>file</type>
<content>
6438: location: LocationRef
6439: subdirectory?: string
6440: }
6441: }
6442:
6443: export type EventSessionNextPrompted = {
6444: id: string
6445: type: "session.next.prompted"
6446: properties: {
6447: timestamp: number
6448: sessionID: string
6449: messageID: string
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: ...
<path>/home/byk/Code/opencode/packages/sdk/js/package.json</path>
<type>file</type>
<content>
1: {
2: "$schema": "https://json.schemastore.org/package.json",
3: "name": "@opencode-ai/sdk",
4: "version": "1.18.30",
5: "type": "module",
6: "license": "MIT",
7: "scripts": {
8: "test": "bun test",
9: "typecheck": "tsgo --noEmit",
10: "build": "bun ./script/build.ts"
11: },
12: "exports": {
13: ".": "./src/index.ts",
14: "./client": "./src/client.ts",
15: "./server": "./src/server.ts",
16: "./v2": "./src/v2/index.ts",
17: "./v2/client": "./src/v2/client.ts",
18: "./v2/gen/client": "./src/v2/gen/client/index.ts",
19: "./v2/server": "./src/v2/server.ts",
20: "./v2/types": "./src/v2/gen/types.gen.ts"
21: },
22: "files": [
23: "dist"
24: ],
25: "devDependencies": {
26: "@hey-api/openapi-ts": "0.90.10",
27: "@tsconfig/node22": "catalog:",
28: "@types/cross-spawn": "catalog:",
29: "@types/node": ...
<path>/home/byk/Code/opencode/packages/sdk/js/script/build.ts</path>
<type>file</type>
<content>
1: #!/usr/bin/env bun
2: import { fileURLToPath } from "url"
3:
4: const dir = fileURLToPath(new URL("..", import.meta.url))
5: process.chdir(dir)
6:
7: import { $ } from "bun"
8: import path from "path"
9:
10: import { createClient } from "@hey-api/openapi-ts"
11:
12: const opencode = path.resolve(dir, "../../opencode")
13:
14: await $`bun dev generate > ${dir}/openapi.json`.cwd(opencode)
15:
16: const document = (await Bun.file("./openapi.json").json()) as {
17: components?: { schemas?: Record<string, unknown> }
18: [key: string]: unknown
19: }
20: const schemas = document.components?.schemas
21: if (schemas) {
22: const reachable = new Set<string>()
23: const visit = (value: unknown) => {
24: if (Array.isArray(value)) {
25: value.forEach(visit)
26: return
27: }
28: if (typeof value !== "object" || value === null) return
29: for (const [key, ...
<path>/home/byk/Code/opencode/packages/sdk/js/src/v2/index.ts</path>
<type>file</type>
<content>
1: export * from "./client.js"
2: export * from "./server.js"
3:
4: import { createOpencodeClient } from "./client.js"
5: import { createOpencodeServer } from "./server.js"
6: import type { ServerOptions } from "./server.js"
7:
8: export * as data from "./data.js"
9:
10: export async function createOpencode(options?: ServerOptions) {
11: const server = await createOpencodeServer({
12: ...options,
13: })
14:
15: const client = createOpencodeClient({
16: baseUrl: server.url,
17: })
18:
19: return {
20: client,
21: server,
22: }
23: }
(End of file - total 23 lines)
</content>
<path>/home/byk/Code/opencode/packages/sdk/js/src/v2/client.ts</path>
<type>file</type>
<content>
1: export * from "./gen/types.gen.js"
2: export type { FileSystemEntry as LocationFileSystemEntry } from "./gen/types.gen.js"
3:
4: import { createClient } from "./gen/client/client.gen.js"
5: import { type Config } from "./gen/client/types.gen.js"
6: import { OpencodeClient } from "./gen/sdk.gen.js"
7: import { wrapClientError } from "../error-interceptor.js"
8: export { type Config as OpencodeClientConfig, OpencodeClient }
9:
10: function pick(value: string | null, fallback?: string, encode?: (value: string) => string) {
11: if (!value) return
12: if (!fallback) return value
13: if (value === fallback) return fallback
14: if (encode && value === encode(fallback)) return fallback
15: return value
16: }
17:
18: function rewrite(request: Request, values: { directory?: string; workspace?: string }) {
19: if (request.method !== "GET" && request.method !== "HEAD") return ...
No files found
<path>/home/byk/Code/opencode/packages/client/src/generated-effect/client.ts</path>
<type>file</type>
<content>
1: // Generated by @opencode-ai/httpapi-codegen. Do not edit.
2: import { Effect, Stream, Schema } from "effect"
3: import { Sse } from "effect/unstable/encoding"
4: import { HttpClientError } from "effect/unstable/http"
5: import { HttpApiClient } from "effect/unstable/httpapi"
6: import { ClientApi } from "../contract"
7: import { ClientError } from "./client-error"
8:
9: type RawClient = HttpApiClient.ForApi<typeof ClientApi>
10:
11: const mapClientError = <E>(error: E) =>
12: HttpClientError.isHttpClientError(error) || Schema.isSchemaError(error) || Sse.Retry.is(error)
13: ? new ClientError({ cause: error })
14: : error
15:
16: const Endpoint0_0 = (raw: RawClient["server.health"]) => () =>
17: raw["health.get"]({}).pipe(Effect.mapError(mapClientError))
18:
19: const adaptGroup0 = (raw: RawClient["server.health"]) => ({ get: Endpoint0_0(raw) })
20:
21: ...
<path>/home/byk/Code/opencode/packages/schema/test/event-manifest.test.ts</path>
<type>file</type>
<content>
35: expect(EventManifest.Latest.get("session.next.step.ended")).toBe(SessionEvent.Step.Ended)
36: expect(EventManifest.Latest.get("todo.updated")).toBe(SessionTodo.Event.Updated)
37: expect(EventManifest.Latest.get("project.updated")).toBe(Project.Event.Updated)
38: expect(Project.Event.Definitions).toEqual([Project.Event.Updated])
39: expect(FileSystem.Event.Definitions).toEqual([FileSystem.Event.Edited])
40: expect(Integration.Event.Definitions).toEqual([Integration.Event.Updated, Integration.Event.ConnectionUpdated])
41: expect(Permission.Event.Definitions).toEqual([Permission.Event.Asked, Permission.Event.Replied])
42: expect(Reference.Event.Definitions).toEqual([Reference.Event.Updated])
43: expect(EventManifest.Latest.has("ide.installed")).toBe(false)
44: expect(IdeEvent.Definitions).toEqual([IdeEvent.Installed])
45: ...
No files found
<path>/home/byk/Code/opencode/packages/core/src/session/projector.ts</path>
<type>file</type>
<content>
360: yield* SessionInput.projectPrompted(db, {
361: id: event.data.messageID,
362: sessionID: event.data.sessionID,
363: prompt: event.data.prompt,
364: delivery: event.data.delivery,
365: timeCreated: event.data.timestamp,
366: promotedSeq: event.durable.seq,
367: })
368: yield* run(db, event)
369: }),
370: )
371: yield* events.project(SessionEvent.PromptAdmitted, (event) =>
372: Effect.gen(function* () {
373: if (event.durable === undefined) return yield* Effect.die("Durable Session event is missing aggregate sequence")
374: yield* SessionInput.projectAdmitted(db, {
375: admittedSeq: event.durable.seq,
376: id: event.data.messageID,
377: sessionID: event.data.sessionID,
378: prompt: event.data.prompt,
379: ...
Both prior blockers are closed by the current files.
SessionInput.admit derives shouldWake from the retried input, not Session-wide pending work (packages/core/src/session/input.ts:54-59).requestExecution queries the exact (messageID, sessionID) row and returns false when that input is promoted (packages/core/src/session/input.ts:108-120).packages/core/src/session/input.ts:209-229), and the final exact-row reread returns false after promotion (packages/core/src/session/input.ts:151-169).packages/core/src/session/input.ts:88-99).SessionV2.prompt calls execution.wake only when this returned value is true (packages/core/src/session.ts:368-384).Therefore an already-promoted exact retry cannot treat an unrelated pending resume:false input as execution intent.
The focused regression creates that exact unrelated-input condition and asserts no wake plus unchanged rows (packages/core/test/session-prompt.test.ts:330-371). Concurrent execution-request deduplication is also covered (packages/core/test/session-prompt.test.ts:440-485).
packages/sdk/openapi.json contains:
packages/sdk/openapi.json:15309-15313, packages/sdk/openapi.json:24200-24204).packages/sdk/openapi.json:23811-23815).packages/sdk/openapi.json:20577-20580).requestExecution in public/durable/sync forms (packages/sdk/openapi.json:17899-17903, packages/sdk/openapi.json:25660-25714, packages/sdk/openapi.json:28545-28604, packages/sdk/openapi.json:34779-34816).PromptExecutionRequested forms (packages/sdk/openapi.json:17910-17941, packages/sdk/openapi.json:25724-25776, ...Date: Sep 15, 2026 * 🟡 (22:51) Generated `SessionNextPromptExecutionRequested` in `packages/sdk/js/src/v2/gen/types.gen.ts:4366-4383` has `id: string`, optional arbitrary `metadata`, type `"session.next.prompt.execution_requested"`, optional durable metadata (`aggregateID: string`, `seq: number`, `version: number`), optional `location?: LocationRef`, and data fields `timestamp: number`, `session…
Date: Sep 15, 2026 * 🟡 (22:41) The generated `V2Event` union in `packages/sdk/openapi.json:24152-24229` includes `$ref` entries in order for `SessionNextPrompted`, `SessionNextPromptAdmitted`, `SessionNextPromptExecution_requested`, `SessionNextContextUpdated`, `SessionNextSynthetic`, `SessionNextShellStarted`, `SessionNextShellEnded`, `SessionNextStepStarted`, `SessionNextStepEnded`, `SessionNe…
Date: Sep 15, 2026 * 🟡 (22:39) `packages/schema/src/durable-event-manifest.ts:7-10` defines `SessionDurable` with `definitions: Event.durable(SessionEvent.DurableDefinitions)` and `schema: SessionEvent.Durable`. * 🟡 (22:39) `packages/schema/src/durable-event-manifest.ts:12-15` defines the combined `Durable` manifest from durable-filtered `SessionV1.Event.Definitions` followed by all `SessionEve…
Date: Sep 15, 2026 * 🟡 (22:36) Inspection of durable replay in `packages/core/src/event.ts:245-353` showed replay ownership and divergence handling: `strictOwner` with a conflicting stored `ownerID` dies with `InvalidDurableEventError`; replay at `input.seq <= latest` is accepted only when stored `id`, versioned event type, and encoded data all match exactly, and may claim a previously null owne…
Date: Sep 15, 2026 * 🔴 (22:34) User established the regression requirement: “never arms durable wake for a conflicting execution retry.” In `packages/core/test/session-prompt.test.ts:514-553`, reusing `messageID` with a different prompt and `resume: true` must return `Session.PromptConflictError`, leave `wake_pending: false`, record `0` `SessionEvent.PromptExecutionRequested` events before and a…
Date: Sep 15, 2026 * 🟡 (22:32) Read-only search found 65 matches for `PromptAdmitted`, `requestExecution`, and `PromptExecutionRequested` across schema, core implementation/tests, checked-in OpenAPI, and generated JS SDK artifacts in `/home/byk/Code/opencode`. * 🟡 (22:32) `packages/schema/src/session-event.ts` defines `PromptAdmitted` at lines 94-102 with optional `requestExecution: Schema.Bool…
Date: Sep 15, 2026 * 🔴 [requested-review] (22:29) User requested a final narrow read-only audit of the current files in `/home/byk/Code/opencode`, with no recall and no edits, tests, builds, commits, or service operations. * 🟡 (22:29) User asked to verify blocker 1 is closed: an exact `resume:true` retry of an already-promoted prompt must not wake or execute an unrelated `resume:false` input ac…