import {z} from 'zod' export type GetApiApiV1ConversationsConversationIdFindWindowArgs = {conversationId: string, sequence: number}; export type GetApiApiV1ConversationsConversationIdFindWindowOptions = {baseUrl?: string | undefined, fetch?: typeof fetch | undefined}; export const conversationAccountPayload = z.object({authFailureId: z.string().optional(), authMode: z.string().optional(), authVerifiedAt: z.string().nullable().optional(), authenticationState: z.enum(["unknown", "required", "authenticated"]).optional(), lastAuthFailureAt: z.string().nullable().optional(), lastAuthFailureReason: z.string().optional(), planLabel: z.string().optional(), reauthReason: z.string().optional(), reauthRequiredAt: z.string().nullable().optional()}); export const conversationActivityResponse = z.object({activityKind: z.enum(["command", "file_change", "plan", "reasoning", "approval", "usage", "error", "system", "mcp_tool", "auto_review", "user_input", "ao_action"]), createdAt: z.string(), detail: z.record(z.string(), z.unknown()).optional(), id: z.string(), kind: z.literal("activity"), providerItemId: z.string().optional(), requestId: z.string().optional(), revision: z.number().int(), sequence: z.number().int(), status: z.enum(["running", "completed", "recovered", "failed", "cancelled", "pending", "resolved"]), summary: z.string(), turnId: z.string().optional()}); export const domainConversationBatchedDelivery = z.object({deliveredWithTurnId: z.string(), steerActivityId: z.string().optional(), turnId: z.string()}); export const conversationBranchMaterializationResponse = z.object({replayTruncated: z.boolean(), strategy: z.enum(["native", "approximate_context"])}); export const conversationBranchPointResponse = z.object({nextBranchId: z.string().optional(), position: z.number().int(), previousBranchId: z.string().optional(), total: z.number().int(), turnId: z.string()}); export const conversationMCPServerPayload = z.object({error: z.string().optional(), failureReason: z.string().optional(), name: z.string(), status: z.string()}); export const chatFileReferenceLine = z.object({kind: z.enum(["context", "add", "del"]), newNo: z.number().int().nullable(), oldNo: z.number().int().nullable(), side: z.enum(["file", "old", "new"]).optional(), text: z.string()}); export const chatFileReferenceSource = z.object({kind: z.enum(["workspace", "pull_request", "artifact"]), number: z.number().int().optional(), snapshot: z.string().optional(), url: z.string().optional()}); export const conversationFileReferenceRequest = z.object({commitSha: z.string().optional(), endLine: z.number().int(), endSide: z.enum(["file", "old", "new"]).optional(), fileFingerprint: z.string().optional(), hostId: z.string().optional(), id: z.string(), line: z.number().int(), lines: z.array(chatFileReferenceLine), order: z.number().int().optional(), path: z.string(), previousPath: z.string().optional(), scope: z.string().optional(), sessionId: z.string(), side: z.enum(["file", "old", "new"]), source: chatFileReferenceSource, truncated: z.boolean(), workspaceVersion: z.string().optional()}); export const conversationContentSummaryResponse = z.object({annotationId: z.string().optional(), annotationOrder: z.number().int().optional(), fileReference: conversationFileReferenceRequest.optional(), mimeType: z.string().optional(), name: z.string().optional(), sourceConversationId: z.string().optional(), sourceMessageId: z.string().optional(), sourceRevision: z.number().int().optional(), text: z.string().optional(), type: z.string(), uri: z.string().optional()}); export const conversationMessageResponse = z.object({authoredByUser: z.boolean().optional(), clientMessageId: z.string().optional(), content: z.array(conversationContentSummaryResponse).optional(), continuation: z.boolean().optional(), createdAt: z.string(), editAvailable: z.boolean(), id: z.string(), kind: z.literal("message"), origin: z.enum(["human", "automation", "daemon", "provider"]), revision: z.number().int(), role: z.enum(["user", "assistant"]), senderDisplayName: z.string().optional(), senderProjectId: z.string().optional(), senderSessionId: z.string().optional(), sequence: z.number().int(), streaming: z.boolean(), text: z.string(), turnId: z.string().optional()}); export const conversationModelReroutePayload = z.object({at: z.string(), fromModel: z.string().optional(), providerTurnId: z.string().optional(), reason: z.string().optional(), toModel: z.string()}); export const conversationRateLimitsPayload = z.object({planLabel: z.string().optional(), primaryResetsInSeconds: z.number().int().optional(), primaryUsedPercent: z.number(), secondaryResetsInSeconds: z.number().int().optional(), secondaryUsedPercent: z.number(), title: z.string().optional()}); export const conversationTurnSettingsPayload = z.object({approvalMode: z.enum(["default", "accept-edits", "auto", "bypass-permissions"]).optional(), autoCompactWindow: z.enum(["200k", "1m"]).optional(), fastMode: z.boolean().optional(), model: z.string().optional(), planMode: z.boolean().optional(), reasoningEffort: z.string().optional()}); export const conversationThreadStatePayload = z.object({archivedAt: z.string().nullable().optional(), closedAt: z.string().nullable().optional(), status: z.enum(["active", "idle", "not_loaded", "system_error", "closed"]).optional(), waitingOn: z.array(z.string()).optional()}); export const conversationDiffFileResponse = z.object({additions: z.number().int(), deletions: z.number().int(), oldPath: z.string().optional(), path: z.string(), rolledBack: z.boolean().optional(), status: z.enum(["added", "modified", "deleted", "renamed"])}); export const conversationTurnDiffResponse = z.object({files: z.array(conversationDiffFileResponse), truncated: z.boolean().optional()}); export const conversationPlanStepResponse = z.object({status: z.enum(["pending", "in_progress", "completed"]), text: z.string()}); export const conversationPlanResponse = z.object({explanation: z.string().optional(), spansTurns: z.boolean().optional(), steps: z.array(conversationPlanStepResponse), superseded: z.boolean().optional()}); export const conversationUsageLimitResponse = z.object({autoResume: z.boolean(), resetsAt: z.string().nullable().optional(), resumeError: z.string().optional()}); export const conversationTurnResponse = z.object({completedAt: z.string().nullable().optional(), diff: conversationTurnDiffResponse.optional(), errorMessage: z.string().optional(), failureCode: z.literal("provider_key_missing").optional(), hasHumanPrompt: z.boolean().optional(), hasRetryAttempt: z.boolean().optional(), id: z.string(), plan: conversationPlanResponse.optional(), providerTurnId: z.string().optional(), requestedAt: z.string(), retryOfTurnId: z.string().optional(), rolledBack: z.boolean().optional(), startedAt: z.string().nullable().optional(), state: z.enum(["queued", "running", "completed", "recovered", "interrupted", "failed", "cancelled"]), usageLimit: conversationUsageLimitResponse.optional()}); export const conversationUsagePayload = z.object({cachedTokens: z.number().int(), contextUsed: z.number().int(), contextWindow: z.number().int(), cost: z.number().nullable().optional(), currency: z.string().optional(), inputTokens: z.number().int(), outputTokens: z.number().int(), totalTokens: z.number().int()}); export const conversationSnapshotResponse = z.object({account: conversationAccountPayload.optional(), activeBranchId: z.string().optional(), activities: z.array(conversationActivityResponse), afterSequence: z.number().int().optional(), batchedDeliveries: z.array(domainConversationBatchedDelivery).optional(), branchMaterialization: conversationBranchMaterializationResponse.optional(), branchPoints: z.array(conversationBranchPointResponse).optional(), branchedFromEarlierMessage: z.boolean(), capabilities: z.array(z.string()).optional(), compactedAt: z.string().nullable().optional(), continueTurnId: z.string(), controller: z.enum(["connecting", "ready", "busy", "recovering", "hibernated", "stopped"]), conversationId: z.string(), harness: z.string().optional(), hasMoreBefore: z.boolean(), latestSequence: z.number().int(), mcpServers: z.array(conversationMCPServerPayload).optional(), messages: z.array(conversationMessageResponse), mode: z.enum(["chat", "tui"]), modelReroute: conversationModelReroutePayload.optional(), nativeForkAvailableAfterSequence: z.number().int(), oldestSequence: z.number().int().optional(), rateLimits: conversationRateLimitsPayload.optional(), sessionId: z.string(), settings: conversationTurnSettingsPayload, supportsExcerpts: z.boolean().optional(), supportsFileReferences: z.boolean().optional(), threadState: conversationThreadStatePayload.optional(), title: z.string().optional(), turns: z.array(conversationTurnResponse), usage: conversationUsagePayload.optional()}); export const validateResponse = async ( schema: { readonly '~standard': { readonly validate: (value: unknown) => ({ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }) | Promise<{ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }> } }, value: unknown ): Promise => { const result = await schema['~standard'].validate(value) if (result.issues !== undefined) { const detail = result.issues .map(({ message, path }) => path?.length ? `${path.map((segment) => String(typeof segment === 'object' ? segment.key : segment)).join('.')}: ${message}` : message ) .join('; ') throw new Error(`Response does not match the schema: ${detail}`, { cause: { issues: result.issues } }) } return result.value }; /** * Load a read-only transcript page around a find result * * GET /api/v1/conversations/{conversationId}/find-window */ export const getApiApiV1ConversationsConversationIdFindWindow = async (args: GetApiApiV1ConversationsConversationIdFindWindowArgs, options?: GetApiApiV1ConversationsConversationIdFindWindowOptions) => { const {baseUrl = "http://127.0.0.1:3001", fetch: fetchFn = fetch} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args.sequence != null) query.append("sequence", String(args.sequence)) const url = `${baseUrl.replace(/\/+$/, '')}/api/v1/conversations/${encodeURIComponent(String(args.conversationId))}/find-window${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "GET", headers}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(conversationSnapshotResponse, await res.json()) };