| @@ -54,6 +54,7 @@ const runtimeMock = { · 53 unmodified lines |
| 54 | state: { | 54 | state: { |
| 55 | startCalls: [] as string[], | 55 | startCalls: [] as string[], |
| 56 | sessionCreateUrls: [] as string[], | 56 | sessionCreateUrls: [] as string[], |
| | 57 | sessionCreateInputs: [] as Array<Record<string, unknown>>, |
| 57 | authHeaders: [] as Array<string | null>, | 58 | authHeaders: [] as Array<string | null>, |
| 58 | abortCalls: [] as string[], | 59 | abortCalls: [] as string[], |
| 59 | closeCalls: [] as string[], | 60 | closeCalls: [] as string[], |
| @@ -67,6 +68,7 @@ const runtimeMock = { · 7 unmodified lines |
| 67 | reset() { | 68 | reset() { |
| 68 | this.state.startCalls.length = 0; | 69 | this.state.startCalls.length = 0; |
| 69 | this.state.sessionCreateUrls.length = 0; | 70 | this.state.sessionCreateUrls.length = 0; |
| | 71 | this.state.sessionCreateInputs.length = 0; |
| 70 | this.state.authHeaders.length = 0; | 72 | this.state.authHeaders.length = 0; |
| 71 | this.state.abortCalls.length = 0; | 73 | this.state.abortCalls.length = 0; |
| 72 | this.state.closeCalls.length = 0; | 74 | this.state.closeCalls.length = 0; |
| @@ -122,8 +124,9 @@ const OpenCodeRuntimeTestDouble: OpenCodeRuntimeShape = { · 49 unmodified lines |
| 122 | createOpenCodeSdkClient: ({ baseUrl, serverPassword }) => | 124 | createOpenCodeSdkClient: ({ baseUrl, serverPassword }) => |
| 123 | ({ | 125 | ({ |
| 124 | session: { | 126 | session: { |
| 125 | create: async () => { | 127 | create: async (input: Record<string, unknown>) => { |
| 126 | runtimeMock.state.sessionCreateUrls.push(baseUrl); | 128 | runtimeMock.state.sessionCreateUrls.push(baseUrl); |
| | 129 | runtimeMock.state.sessionCreateInputs.push(input); |
| 127 | runtimeMock.state.authHeaders.push( | 130 | runtimeMock.state.authHeaders.push( |
| 128 | serverPassword ? `Basic ${btoa(`opencode:${serverPassword}`)}` : null, | 131 | serverPassword ? `Basic ${btoa(`opencode:${serverPassword}`)}` : null, |
| 129 | ); | 132 | ); |
| @@ -765,6 +768,47 @@ it.layer(OpenCodeAdapterTestLayer)("OpenCodeAdapterLive", (it) => { · 635 unmodified lines |
| 765 | }), | 768 | }), |
| 766 | ); | 769 | ); |
| 767 | | 770 | |
| | 771 | it.effect("lets OpenCode own session title generation and emits title metadata updates", () => |
| | 772 | Effect.gen(function* () { |
| | 773 | const adapter = yield* OpenCodeAdapter; |
| | 774 | const threadId = asThreadId("thread-opencode-title-sync"); |
| | 775 | runtimeMock.state.subscribedEvents = [ |
| | 776 | { |
| | 777 | type: "session.updated", |
| | 778 | properties: { |
| | 779 | info: { |
| | 780 | id: "http://127.0.0.1:9999/session", |
| | 781 | title: "Investigate OpenCode title sync", |
| | 782 | }, |
| | 783 | }, |
| | 784 | }, |
| | 785 | ]; |
| | 786 | |
| | 787 | const eventsFiber = yield* adapter.streamEvents.pipe( |
| | 788 | Stream.filter((event) => event.threadId === threadId), |
| | 789 | Stream.take(3), |
| | 790 | Stream.runCollect, |
| | 791 | Effect.forkChild, |
| | 792 | ); |
| | 793 | |
| | 794 | yield* adapter.startSession({ |
| | 795 | provider: ProviderDriverKind.make("opencode"), |
| | 796 | threadId, |
| | 797 | runtimeMode: "full-access", |
| | 798 | }); |
| | 799 | |
| | 800 | const events = Array.from(yield* Fiber.join(eventsFiber).pipe(Effect.timeout("1 second"))); |
| | 801 | NodeAssert.equal(runtimeMock.state.sessionCreateInputs.length, 1); |
| | 802 | NodeAssert.equal("title" in (runtimeMock.state.sessionCreateInputs[0] ?? {}), false); |
| | 803 | |
| | 804 | const metadataUpdated = events.find((event) => event.type === "thread.metadata.updated"); |
| | 805 | NodeAssert.ok(metadataUpdated); |
| | 806 | if (metadataUpdated.type === "thread.metadata.updated") { |
| | 807 | NodeAssert.equal(metadataUpdated.payload.name, "Investigate OpenCode title sync"); |
| | 808 | } |
| | 809 | }), |
| | 810 | ); |
| | 811 | |
| 768 | it.effect("writes provider-native observability records using the session thread id", () => | 812 | it.effect("writes provider-native observability records using the session thread id", () => |
| 769 | Effect.gen(function* () { | 813 | Effect.gen(function* () { |
| 770 | const nativeEvents: Array<{ | 814 | const nativeEvents: Array<{ |