import {z} from 'zod' export type ScipotApiSchemasSearchSearchFiltersRequest = {domain?: (string | null) | undefined, level?: (Array | null) | undefined, tags?: (Array | null) | undefined}; export type AskContextLimits = {counterparts?: number | undefined, gaps?: number | undefined, curations?: number | undefined}; export type AskContextRequest = {query: string, top_k?: number | undefined, min_pot_score?: number | undefined, min_similarity?: (number | null) | undefined, relative_cutoff?: (number | null) | undefined, filters?: (ScipotApiSchemasSearchSearchFiltersRequest | null) | undefined, as_of?: (string | null) | undefined, include_content?: boolean | undefined, language?: (string | null) | undefined, limits?: AskContextLimits | undefined}; export type CreateApiPotsPotIdAskContextArgs = {pot_id: string, body: AskContextRequest}; export type CreateApiPotsPotIdAskContextOptions = {baseUrl: string, fetch?: typeof fetch | undefined}; export const axiomKind = z.enum(["fact", "rule", "scope"]); export const constitutionFactResponse = z.object({id: z.string(), content: z.string(), title: z.string().nullable().optional(), pot_score: z.number().gte(0).lte(1), level: z.string(), rationale: z.string().nullable().optional(), keywords: z.array(z.string()).optional(), active: z.boolean().optional(), deactivated_at: z.string().nullable().optional(), deactivation_reason: z.string().nullable().optional(), kind: axiomKind.optional()}); export const constitutionResponse = z.object({facts: z.array(constitutionFactResponse), version: z.string().optional(), last_updated: z.string(), approved_by: z.string(), fact_count: z.number().int(), active_count: z.number().int().optional()}); export const pOTAboutView = z.object({text: z.string().nullable().optional(), source: z.enum(["generated", "manual"]).nullable().optional(), updated_at: z.string().nullable().optional(), suggestion_pending: z.boolean().optional()}); export const pOTResponse = z.object({id: z.string(), slug: z.string(), workspace_id: z.string(), name: z.string(), description: z.string(), domain: z.string().optional(), constitution: constitutionResponse, about: pOTAboutView.nullable().optional(), created_at: z.string(), updated_at: z.string()}); export const restatedByRef = z.object({fact_id: z.string(), document_id: z.string().nullable().optional(), source_type: z.string().nullable().optional(), document_date: z.string().nullable().optional(), locator: z.string().nullable().optional(), partial: z.boolean().optional()}); export const potScoreLevel = z.enum(["CONSTITUTION", "VERIFIED", "SUPPORTED", "INFERRED", "HYPOTHESIS", "SPECULATION"]); export const provenance = z.object({type: z.string(), sources: z.array(z.record(z.string(), z.unknown())).optional(), derivation: z.record(z.string(), z.unknown()).nullable().optional(), profile_id: z.string().nullable().optional(), profile_version: z.number().int().gte(1).nullable().optional()}); export const classification = z.object({domain: z.string().optional(), subdomain: z.string().nullable().optional(), tags: z.array(z.string()).optional(), entity_mentions: z.array(z.string()).optional()}); export const documentLocation = z.object({page_number: z.number().int().gte(1).nullable().optional(), section_path: z.string().nullable().optional(), source_text: z.string().max(500).nullable().optional(), sheet_name: z.string().nullable().optional(), row_number: z.number().int().gte(1).nullable().optional(), cell_ref: z.string().nullable().optional()}); export const factPii = z.object({applied: z.boolean(), mode: z.enum(["off", "anonymize", "block"]), entities: z.record(z.string(), z.number().int()).optional(), coverage: z.enum(["full", "partial", "none"]).optional(), language: z.string().nullable().optional(), unmasked_content: z.string().nullable().optional()}); export const factWarning = z.object({pattern: z.string(), message: z.string(), detail: z.string().nullable().optional(), probability: z.number().nullable().optional()}); export const edgeTypeCounts = z.object({in: z.number().int().gte(0).optional(), out: z.number().int().gte(0).optional()}); export const edgeSummary = z.object({total_in: z.number().int().gte(0).optional(), total_out: z.number().int().gte(0).optional(), by_type: z.record(z.string(), edgeTypeCounts).optional()}); export const factRead = z.object({restated_by: z.array(restatedByRef).optional(), restates: z.string().nullable().optional(), restates_all: z.array(z.string()).optional(), currency: z.enum(["current", "pending", "future", "not_current"]).optional(), valid_until: z.string().nullable().optional(), superseded_at: z.string().nullable().optional(), currency_reason: z.record(z.string(), z.unknown()).nullable().optional(), id: z.string(), pot_id: z.string(), workspace_id: z.string().nullable().optional(), content: z.string().min(1), title: z.string().max(80).nullable().optional(), content_hash: z.string().nullable().optional(), pot_score: z.number().gte(0).lte(1), original_pot_score: z.number().gte(0).lte(1).nullable().optional(), level: potScoreLevel, embedding_model: z.string().nullable().optional(), provenance: provenance, classification: classification.optional(), status: z.string().optional(), validation_status: z.string().optional(), created_at: z.string().optional(), updated_at: z.string().optional(), valid_from: z.string().nullable().optional(), valid_from_source: z.enum(["document_effective", "document_date", "contributor", "imported", "curator"]).nullable().optional(), document_id: z.string().nullable().optional(), language: z.string().nullable().optional(), location: documentLocation.nullable().optional(), scope_inferred: z.enum(["own", "third_party", "mixed_context", "unknown"]).nullable().optional(), scope_confidence: z.number().gte(0).lte(1).nullable().optional(), scope_reason: z.string().max(500).nullable().optional(), context_attachment_ids_used: z.array(z.string()).nullable().optional(), pii: factPii.nullable().optional(), version: z.number().int().optional(), flags: z.array(z.string()).optional(), notes: z.string().nullable().optional(), warnings: z.array(factWarning).optional(), edge_summary: edgeSummary.optional(), superseded: z.boolean().optional(), superseded_by: z.array(z.string()).optional()}).and(z.record(z.string(), z.unknown())); export const edgeType = z.enum(["supports", "contradicts", "resolved_contradiction", "refines", "derives_from", "is_part_of", "extends", "cites", "related_to", "supersedes", "restates"]); export const edge = z.object({id: z.string(), pot_id: z.string(), workspace_id: z.string(), from_id: z.string(), to_id: z.string(), type: edgeType, weight: z.number().gte(0).lte(1), rationale: z.string().optional(), detected_by: z.string().optional(), companion_of: z.string().nullable().optional(), episode_id: z.string().nullable().optional(), confidence: z.number().gte(0).lte(1).optional(), judge: z.string().max(200).nullable().optional(), partial: z.boolean().nullable().optional(), shared_figures: z.number().int().gte(0).nullable().optional(), similarity: z.number().gte(0).lte(1).nullable().optional(), validation_status: z.string().optional(), decided_by: z.string().nullable().optional(), decided_at: z.string().nullable().optional(), resolution_type: z.string().nullable().optional(), resolved_by_name: z.string().nullable().optional(), resolved_by_role: z.string().nullable().optional(), resolved_by_contributor_id: z.string().nullable().optional(), resolved_at: z.string().nullable().optional(), resolution_notes: z.string().nullable().optional(), resolution_score_shifts: z.record(z.string(), z.number()).nullable().optional(), kind: z.enum(["express", "tacit", "partial", "hierarchy", "suspension", "extension", "manual"]).nullable().optional(), basis: z.string().nullable().optional(), scope_section: z.string().max(300).nullable().optional(), effective_at: z.string().nullable().optional(), resume_at: z.string().nullable().optional(), applied_at: z.string().nullable().optional(), axiom_conflict: z.array(z.string()).nullable().optional(), axiom_hold: z.enum(["conflict", "unverified"]).nullable().optional(), created_at: z.string().nullable().optional(), updated_at: z.string().nullable().optional()}).and(z.record(z.string(), z.unknown())); export const blockedSupersessionRef = z.object({edge_id: z.string(), from_id: z.string(), to_id: z.string(), validation_status: z.string(), reason: z.string(), from_pot_score: z.number().nullable().optional(), to_pot_score: z.number().nullable().optional(), axiom_conflict: z.array(z.string()).optional()}); export const edgeListResponse = z.object({edges: z.array(edge), total: z.number().int(), pot_id: z.string(), blocked_supersedes: z.array(blockedSupersessionRef).optional()}); export const sourceType = z.object({key: z.string(), label: z.string().min(1).max(60), weight: z.number().gte(0.2).lte(0.79), description: z.string().max(300).optional(), active: z.boolean().optional(), priority: z.number().int().gte(1).lte(15).nullable().optional(), updated_at: z.string().nullable().optional(), updated_by: z.string().nullable().optional()}); export const sourceTypeList = z.object({source_types: z.array(sourceType), template: z.boolean(), max_active: z.number().int().optional(), weight_min: z.number().optional(), weight_max: z.number().optional()}); export const documentCard = z.object({id: z.string(), filename: z.string(), original_filename: z.string().nullable().optional(), description: z.string().nullable().optional(), source_url: z.string().nullable().optional(), type: z.string().nullable().optional(), source_authority: z.string().nullable().optional(), pot_source_authorities: z.record(z.string(), z.string()).optional(), pot_original_dates: z.record(z.string(), z.string()).optional(), original_date: z.string().nullable().optional(), effective_from: z.string().nullable().optional(), created_at: z.string()}); export const curationAction = z.enum(["approve", "disapprove"]); export const seniorityLevel = z.enum(["junior", "mid", "senior", "lead", "principal", "executive"]); export const contributorProfile = z.object({name: z.string().min(1).max(200), role: z.string().min(1).max(200), seniority_level: seniorityLevel, department: z.string().max(200).nullable().optional(), expertise_areas: z.array(z.string()).optional(), bio: z.string().max(1000).nullable().optional()}); export const expertiseEvaluation = z.object({relevance_score: z.number().gte(0).lte(1), method: z.string(), matched_areas: z.array(z.string()).optional(), reasoning: z.string().nullable().optional()}); export const curationRecord = z.object({id: z.string().optional(), pot_id: z.string(), fact_id: z.string(), action: curationAction, contributor: contributorProfile, contributor_id: z.string().nullable().optional(), expertise_evaluation: expertiseEvaluation, rationale: z.string().max(2000).nullable().optional(), score_delta: z.number(), score_before: z.number(), score_after: z.number(), influence_factor: z.number().nullable().optional(), created_at: z.string().optional(), revoked_at: z.string().nullable().optional()}); export const curationListResponse = z.object({fact_id: z.string(), curations: z.array(curationRecord), total: z.number().int(), approve_count: z.number().int().optional(), disapprove_count: z.number().int().optional()}); export const gapTransition = z.object({from_state: z.enum(["open", "routed", "ingested", "resolved", "expired", "dismissed", "duplicate", "reopened"]), to_state: z.enum(["open", "routed", "ingested", "resolved", "expired", "dismissed", "duplicate", "reopened"]), actor: z.string(), at: z.string().optional(), note: z.string().max(1000).nullable().optional(), evidence_ref: z.string().max(200).nullable().optional()}); export const gapAnswer = z.object({answer_id: z.string().optional(), actor: z.string().min(1).max(200), contributor_id: z.string().nullable().optional(), completeness: z.enum(["partial", "complete"]), fact_ids: z.array(z.string()), note: z.string().max(1000).nullable().optional(), at: z.string().optional()}); export const knowledgeGap = z.object({gap_id: z.string().optional(), workspace_id: z.string(), pot_id: z.string(), query_text: z.string().min(1).max(4000), context: z.string().max(4000).nullable().optional(), requester_id: z.string().min(1).max(200), domain: z.string().min(1).max(200), trigger: z.enum(["low_confidence", "no_coverage", "manual"]).optional(), trigger_score: z.number().gte(0).lte(1).nullable().optional(), state: z.enum(["open", "routed", "ingested", "resolved", "expired", "dismissed", "duplicate", "reopened"]).optional(), assigned_to: z.string().max(200).nullable().optional(), resolved_cluster_id: z.string().nullable().optional(), capsule_id: z.string().nullable().optional(), idempotency_key: z.string().max(200).nullable().optional(), transitions: z.array(gapTransition).optional(), answers: z.array(gapAnswer).optional(), timeout_at: z.string().nullable().optional(), created_at: z.string().optional(), updated_at: z.string().optional(), resolved_at: z.string().nullable().optional()}); export const relatedGap = z.object({gap: knowledgeGap, score: z.number(), exact: z.boolean()}); export const relatedGaps = z.object({related: z.array(relatedGap).optional(), min_score: z.number(), scanned: z.number().int(), complete: z.boolean()}); export const askContextLimits = z.object({counterparts: z.number().int().gte(0).lte(16).optional(), gaps: z.number().int().gte(0).lte(10).optional(), curations: z.number().int().gte(0).lte(32).optional()}); export const askContextMeta = z.object({partial: z.array(z.string()).optional(), as_of: z.string(), latency_ms: z.number().int(), limits: askContextLimits}); export const askContextResponse = z.object({pot: pOTResponse, search: z.record(z.string(), z.unknown()), facts: z.record(z.string(), factRead), edges: z.array(edge), counterparts: z.array(z.string()), supersedes: edgeListResponse.nullable().optional(), source_types: sourceTypeList.nullable().optional(), documents: z.record(z.string(), documentCard).optional(), curations: z.record(z.string(), curationListResponse).optional(), gaps: relatedGaps.nullable().optional(), meta: askContextMeta}); 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 }; /** * Everything a client reads to answer one question, in one request * * POST /pots/{pot_id}/ask-context */ export const createApiPotsPotIdAskContext = async (args: CreateApiPotsPotIdAskContextArgs, options: CreateApiPotsPotIdAskContextOptions) => { const {baseUrl, fetch: fetchFn = fetch} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json") const url = `${baseUrl.replace(/\/+$/, '')}/pots/${encodeURIComponent(String(args.pot_id))}/ask-context${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "POST", headers, body: JSON.stringify(args.body)}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(askContextResponse, await res.json()) };