History

feat(orchestration): bound thread history and resume payloads

- Add paginated thread history with bounded snapshots and replay limits - Trim oversized wire payloads and support progressive mobile history loading

Julius Marminge committed 3 months ago

Commit 7d42d311 parent e3883a943 files · +4239 −211Browse files

Showing the changes to packages/client-runtime/src/state/threadHistoryHttp.ts (1 of 43 files). Show all

Unified · Split

packages/client-runtime/src/state/threadHistoryHttp.ts+45−0
@@ -0,0 +1,45 @@
1+import type { ThreadId } from "@t3tools/contracts";
2+import * as Effect from "effect/Effect";
3+import * as Option from "effect/Option";
4+
5+import type { PreparedConnection } from "../connection/model.ts";
6+import { environmentEndpointUrl } from "../environment/endpoint.ts";
7+import { ManagedRelayDpopSigner } from "../relay/managedRelay.ts";
8+import { executeEnvironmentHttpRequest, makeEnvironmentHttpApiClient } from "../rpc/http.ts";
9+import { buildEnvironmentAuthHeaders, withEnvironmentCredentials } from "./environmentHttpAuth.ts";
10+
11+const DEFAULT_THREAD_HISTORY_TIMEOUT_MS = 6_000;
12+
13+export const fetchEnvironmentThreadHistoryPage = Effect.fn(
14+ "clientRuntime.state.fetchEnvironmentThreadHistoryPage",
15+)(function* (input: {
16+ readonly prepared: PreparedConnection;
17+ readonly threadId: ThreadId;
18+ readonly cursor: string;
19+ readonly signer: Option.Option<ManagedRelayDpopSigner["Service"]>;
20+ readonly timeoutMs?: number;
21+}) {
22+ const requestUrl = environmentEndpointUrl(
23+ input.prepared.httpBaseUrl,
24+ `/api/orchestration/threads/${input.threadId}/history`,
25+ );
26+ const client = yield* makeEnvironmentHttpApiClient(input.prepared.httpBaseUrl);
27+ const headers = yield* buildEnvironmentAuthHeaders(
28+ input.prepared.httpAuthorization,
29+ "GET",
30+ requestUrl,
31+ input.signer,
32+ );
33+ return yield* executeEnvironmentHttpRequest(
34+ requestUrl,
35+ input.timeoutMs ?? DEFAULT_THREAD_HISTORY_TIMEOUT_MS,
36+ withEnvironmentCredentials(
37+ input.prepared.httpAuthorization,
38+ client.orchestration.threadHistoryPage({
39+ params: { threadId: input.threadId },
40+ query: { cursor: input.cursor },
41+ headers,
42+ }),
43+ ),
44+ );
45+});