latest snapshot

This commit is contained in:
James Long 2026-07-05 00:23:05 +00:00
commit 78b8207c5e
20 changed files with 824 additions and 28 deletions

View file

@ -1,6 +1,7 @@
import type { OpenCodeClient } from "@opencode-ai/client/promise"
import type { OpencodeClient, V2Event } from "@opencode-ai/sdk/v2"
import { createGlobalEmitter } from "@solid-primitives/event-bus"
import { SimulationEventStream } from "@opencode-ai/simulation/frontend/event-stream"
import { onCleanup, onMount } from "solid-js"
import { createStore } from "solid-js/store"
import { createSimpleContext } from "./helper"
@ -46,7 +47,9 @@ export const { use: useSDK, provider: SDKProvider } = createSimpleContext({
void (async () => {
let attempt = 0
while (!abort.signal.aborted && !controller.signal.aborted) {
await SimulationEventStream.beforeConnect(controller.signal)
const connection = new AbortController()
const detachSimulation = SimulationEventStream.attach(connection)
const cancel = () => connection.abort(controller.signal.reason)
const timeout = setTimeout(
() => connection.abort(new Error("Timed out connecting to server")),
@ -81,6 +84,7 @@ export const { use: useSDK, provider: SDKProvider } = createSimpleContext({
})()
.catch((error) => error)
.finally(() => {
detachSimulation()
clearTimeout(timeout)
controller.signal.removeEventListener("abort", cancel)
})

View file

@ -357,6 +357,60 @@ test("tracks session status from active sessions and execution events", async ()
}
})
test("clears stale running status after reconnect", async () => {
const events = createEventStream()
let activeRequests = 0
const calls = createFetch((url) => {
if (url.pathname === "/api/session/active") {
activeRequests++
return json({ data: {}, watermarks: {} })
}
}, events)
let data!: ReturnType<typeof useData>
function Probe() {
data = useData()
return <box />
}
const app = await testRender(() => (
<TestTuiContexts>
<SDKProvider client={createClient(calls.fetch)} api={createApi(calls.fetch)}>
<ProjectProvider>
<DataProvider>
<Probe />
</DataProvider>
</ProjectProvider>
</SDKProvider>
</TestTuiContexts>
))
try {
await wait(() => data.connection.status() === "connected")
emitEvent(events, {
id: "evt_reconnect_step_started",
created: 0,
type: "step.started",
durable: durable("session-reconnect"),
data: {
sessionID: "session-reconnect",
assistantMessageID: "message-reconnect",
agent: "build",
model: { id: "model", providerID: "provider" },
},
})
await wait(() => data.session.status("session-reconnect") === "running")
events.disconnect()
await wait(() => data.connection.status() === "connecting")
await wait(() => data.connection.status() === "connected", 4000)
await wait(() => activeRequests >= 2)
expect(data.session.status("session-reconnect")).toBe("idle")
} finally {
app.renderer.destroy()
}
})
test("refreshes integrations after integration updates", async () => {
const events = createEventStream()
const requests = { integration: 0, model: 0, provider: 0 }