import { ThreadId } from "@t3tools/contracts";import { describe, expect, it } from "@effect/vitest";import * as Effect from "effect/Effect";import * as Layer from "effect/Layer"; import { PrimaryConnectionTarget, type PreparedConnection } from "../connection/model.ts";import { remoteHttpClientLayer } from "../rpc/http.ts";import { boundedThreadSnapshotLoaderLayer } from "./boundedThreadSnapshotHttp.ts";import { ThreadSnapshotLoader } from "./threadSnapshotHttp.ts"; const TARGET = new PrimaryConnectionTarget({ environmentId: "environment-bounded" as never, label: "Bounded", httpBaseUrl: "https://environment.example.test", wsBaseUrl: "wss://environment.example.test",}); const PREPARED: PreparedConnection = { environmentId: TARGET.environmentId, label: TARGET.label, httpBaseUrl: TARGET.httpBaseUrl, socketUrl: TARGET.wsBaseUrl, httpAuthorization: null, target: TARGET,}; const THREAD_ID = ThreadId.make("thread-bounded");const NOW = "2026-06-20T00:00:00.000Z"; const FULL_SNAPSHOT_BODY = { snapshotSequence: 9, projection: { thread: { createdBy: "user", creationSource: "web", id: String(THREAD_ID), projectId: "project-1", title: "Full fallback thread", providerInstanceId: "codex", modelSelection: { instanceId: "codex", model: "gpt-5" }, runtimeMode: "full-access", interactionMode: "default", branch: null, worktreePath: null, activeProviderThreadId: null, lineage: { parentThreadId: null, relationshipToParent: null, rootThreadId: String(THREAD_ID), }, forkedFrom: null, createdAt: NOW, updatedAt: NOW, archivedAt: null, deletedAt: null, settledOverride: null, settledAt: null, }, runs: [], attempts: [], nodes: [], subagents: [], providerSessions: [], providerThreads: [], providerTurns: [], runtimeRequests: [], messages: [], plans: [], turnItems: [], checkpointScopes: [], checkpoints: [], contextHandoffs: [], contextTransfers: [], visibleTurnItems: [], updatedAt: NOW, },}; describe("boundedThreadSnapshotLoader", () => { it.effect("falls back to full HTTP snapshot when bounded returns a plain route 404", () => { const fetchFn = ((input: RequestInfo | URL) => { const url = String(input); if (url.includes(`/api/orchestration/threads/${THREAD_ID}/bounded`)) { // Generic HTML/route 404: not a structured thread_not_found payload. return Promise.resolve( new Response("Not Found", { status: 404, headers: { "content-type": "text/plain" }, }), ); } expect(url).toContain(`/api/orchestration/threads/${THREAD_ID}`); expect(url.includes("/bounded")).toBe(false); return Promise.resolve( new Response(JSON.stringify(FULL_SNAPSHOT_BODY), { status: 200, headers: { "content-type": "application/json" }, }), ); }) satisfies typeof fetch; return Effect.gen(function* () { const loader = yield* ThreadSnapshotLoader; const result = yield* loader.load(PREPARED, THREAD_ID); expect(result._tag).toBe("present"); if (result._tag === "present") { expect(result.snapshot.snapshotSequence).toBe(9); expect(result.snapshot.projection.thread.title).toBe("Full fallback thread"); expect(result.history).toBeUndefined(); } }).pipe( Effect.provide( Layer.provide(boundedThreadSnapshotLoaderLayer, remoteHttpClientLayer(fetchFn)), ), ); }); it.effect("treats structured EnvironmentResourceNotFoundError from bounded as missing", () => { const fetchFn = ((input: RequestInfo | URL) => { const url = String(input); expect(url).toContain(`/api/orchestration/threads/${THREAD_ID}/bounded`); return Promise.resolve( Response.json( { _tag: "EnvironmentResourceNotFoundError", code: "not_found", reason: "thread_not_found", traceId: "trace-bounded-missing", }, { status: 404 }, ), ); }) satisfies typeof fetch; return Effect.gen(function* () { const loader = yield* ThreadSnapshotLoader; const result = yield* loader.load(PREPARED, THREAD_ID); expect(result).toEqual({ _tag: "missing" }); }).pipe( Effect.provide( Layer.provide(boundedThreadSnapshotLoaderLayer, remoteHttpClientLayer(fetchFn)), ), ); }); it.effect("treats structured missing from full fallback as missing", () => { let fullCalls = 0; const fetchFn = ((input: RequestInfo | URL) => { const url = String(input); if (url.includes("/bounded")) { return Promise.resolve( new Response("Not Found", { status: 404, headers: { "content-type": "text/plain" }, }), ); } fullCalls += 1; return Promise.resolve( Response.json( { _tag: "EnvironmentResourceNotFoundError", code: "not_found", reason: "thread_not_found", traceId: "trace-full-missing", }, { status: 404 }, ), ); }) satisfies typeof fetch; return Effect.gen(function* () { const loader = yield* ThreadSnapshotLoader; const result = yield* loader.load(PREPARED, THREAD_ID); expect(result).toEqual({ _tag: "missing" }); expect(fullCalls).toBe(1); }).pipe( Effect.provide( Layer.provide(boundedThreadSnapshotLoaderLayer, remoteHttpClientLayer(fetchFn)), ), ); }); it.effect( "uses socket fallback directly when the bounded endpoint has a transient failure", () => { let fullCalls = 0; const fetchFn = ((input: RequestInfo | URL) => { const url = String(input); if (url.includes("/bounded")) { return Promise.resolve(new Response("Service Unavailable", { status: 503 })); } fullCalls += 1; return Promise.resolve( new Response(JSON.stringify(FULL_SNAPSHOT_BODY), { status: 200, headers: { "content-type": "application/json" }, }), ); }) satisfies typeof fetch; return Effect.gen(function* () { const loader = yield* ThreadSnapshotLoader; const result = yield* loader.load(PREPARED, THREAD_ID); expect(result).toEqual({ _tag: "unavailable" }); expect(fullCalls).toBe(0); }).pipe( Effect.provide( Layer.provide(boundedThreadSnapshotLoaderLayer, remoteHttpClientLayer(fetchFn)), ), ); }, );});
import { ThreadId } from "@t3tools/contracts";
import { describe, expect, it } from "@effect/vitest";
import * as Effect from "effect/Effect";
import * as Layer from "effect/Layer";
import { PrimaryConnectionTarget, type PreparedConnection } from "../connection/model.ts";
import { remoteHttpClientLayer } from "../rpc/http.ts";
import { boundedThreadSnapshotLoaderLayer } from "./boundedThreadSnapshotHttp.ts";
import { ThreadSnapshotLoader } from "./threadSnapshotHttp.ts";
const TARGET = new PrimaryConnectionTarget({
environmentId: "environment-bounded" as never,
label: "Bounded",
httpBaseUrl: "https://environment.example.test",
wsBaseUrl: "wss://environment.example.test",
});
const PREPARED: PreparedConnection = {
environmentId: TARGET.environmentId,
label: TARGET.label,
httpBaseUrl: TARGET.httpBaseUrl,
socketUrl: TARGET.wsBaseUrl,
httpAuthorization: null,
target: TARGET,
};
const THREAD_ID = ThreadId.make("thread-bounded");
const NOW = "2026-06-20T00:00:00.000Z";
const FULL_SNAPSHOT_BODY = {
snapshotSequence: 9,
projection: {
thread: {
createdBy: "user",
creationSource: "web",
id: String(THREAD_ID),
projectId: "project-1",
title: "Full fallback thread",
providerInstanceId: "codex",
modelSelection: { instanceId: "codex", model: "gpt-5" },
runtimeMode: "full-access",
interactionMode: "default",
branch: null,
worktreePath: null,
activeProviderThreadId: null,
lineage: {
parentThreadId: null,
relationshipToParent: null,
rootThreadId: String(THREAD_ID),
},
forkedFrom: null,
createdAt: NOW,
updatedAt: NOW,
archivedAt: null,
deletedAt: null,
settledOverride: null,
settledAt: null,
},
runs: [],
attempts: [],
nodes: [],
subagents: [],
providerSessions: [],
providerThreads: [],
providerTurns: [],
runtimeRequests: [],
messages: [],
plans: [],
turnItems: [],
checkpointScopes: [],
checkpoints: [],
contextHandoffs: [],
contextTransfers: [],
visibleTurnItems: [],
updatedAt: NOW,
},
};
describe("boundedThreadSnapshotLoader", () => {
it.effect("falls back to full HTTP snapshot when bounded returns a plain route 404", () => {
const fetchFn = ((input: RequestInfo | URL) => {
const url = String(input);
if (url.includes(`/api/orchestration/threads/${THREAD_ID}/bounded`)) {
// Generic HTML/route 404: not a structured thread_not_found payload.
return Promise.resolve(
new Response("Not Found", {
status: 404,
headers: { "content-type": "text/plain" },
}),
);
}
expect(url).toContain(`/api/orchestration/threads/${THREAD_ID}`);
expect(url.includes("/bounded")).toBe(false);
return Promise.resolve(
new Response(JSON.stringify(FULL_SNAPSHOT_BODY), {
status: 200,
headers: { "content-type": "application/json" },
}),
);
}) satisfies typeof fetch;
return Effect.gen(function* () {
const loader = yield* ThreadSnapshotLoader;
const result = yield* loader.load(PREPARED, THREAD_ID);
expect(result._tag).toBe("present");
if (result._tag === "present") {
expect(result.snapshot.snapshotSequence).toBe(9);
expect(result.snapshot.projection.thread.title).toBe("Full fallback thread");
expect(result.history).toBeUndefined();
}
}).pipe(
Effect.provide(
Layer.provide(boundedThreadSnapshotLoaderLayer, remoteHttpClientLayer(fetchFn)),
),
);
});
it.effect("treats structured EnvironmentResourceNotFoundError from bounded as missing", () => {
const fetchFn = ((input: RequestInfo | URL) => {
const url = String(input);
expect(url).toContain(`/api/orchestration/threads/${THREAD_ID}/bounded`);
return Promise.resolve(
Response.json(
{
_tag: "EnvironmentResourceNotFoundError",
code: "not_found",
reason: "thread_not_found",
traceId: "trace-bounded-missing",
},
{ status: 404 },
),
);
}) satisfies typeof fetch;
return Effect.gen(function* () {
const loader = yield* ThreadSnapshotLoader;
const result = yield* loader.load(PREPARED, THREAD_ID);
expect(result).toEqual({ _tag: "missing" });
}).pipe(
Effect.provide(
Layer.provide(boundedThreadSnapshotLoaderLayer, remoteHttpClientLayer(fetchFn)),
),
);
});
it.effect("treats structured missing from full fallback as missing", () => {
let fullCalls = 0;
const fetchFn = ((input: RequestInfo | URL) => {
const url = String(input);
if (url.includes("/bounded")) {
return Promise.resolve(
new Response("Not Found", {
status: 404,
headers: { "content-type": "text/plain" },
}),
);
}
fullCalls += 1;
return Promise.resolve(
Response.json(
{
_tag: "EnvironmentResourceNotFoundError",
code: "not_found",
reason: "thread_not_found",
traceId: "trace-full-missing",
},
{ status: 404 },
),
);
}) satisfies typeof fetch;
return Effect.gen(function* () {
const loader = yield* ThreadSnapshotLoader;
const result = yield* loader.load(PREPARED, THREAD_ID);
expect(result).toEqual({ _tag: "missing" });
expect(fullCalls).toBe(1);
}).pipe(
Effect.provide(
Layer.provide(boundedThreadSnapshotLoaderLayer, remoteHttpClientLayer(fetchFn)),
),
);
});
it.effect(
"uses socket fallback directly when the bounded endpoint has a transient failure",
() => {
let fullCalls = 0;
const fetchFn = ((input: RequestInfo | URL) => {
const url = String(input);
if (url.includes("/bounded")) {
return Promise.resolve(new Response("Service Unavailable", { status: 503 }));
}
fullCalls += 1;
return Promise.resolve(
new Response(JSON.stringify(FULL_SNAPSHOT_BODY), {
status: 200,
headers: { "content-type": "application/json" },
}),
);
}) satisfies typeof fetch;
return Effect.gen(function* () {
const loader = yield* ThreadSnapshotLoader;
const result = yield* loader.load(PREPARED, THREAD_ID);
expect(result).toEqual({ _tag: "unavailable" });
expect(fullCalls).toBe(0);
}).pipe(
Effect.provide(
Layer.provide(boundedThreadSnapshotLoaderLayer, remoteHttpClientLayer(fetchFn)),
),
);
},
);
});