import type { EmailStatusExtractorConfig } from './email-status'; import type { DeeplineGetterValueMap } from './extractor-targets'; import type { PlayDataset, SerializedPlayDataset } from '../plays/dataset'; export type ToolResultExecutionMetadata = { idempotent: true; cached: boolean; source: 'live' | 'checkpoint' | 'cache' | 'in_flight'; cacheKey?: string; receiptRole?: 'owner' | 'follower'; receiptKey?: string; attachedToReceiptKey?: string; }; export type ToolResultTargetMetadata = { value: unknown; path: string; }; export type ToolResultListMetadata = { path: string; count: number | null; keys: Record; }; export type ToolResultExtractorDescriptor = { paths: readonly string[]; transforms?: readonly string[]; enum?: readonly string[]; overrides?: readonly ToolResultExtractorOverride[]; emailStatus?: EmailStatusExtractorConfig; }; export type ToolResultExtractorOverride = { paths: readonly string[]; equals?: string | number | boolean | null; value: string | number | boolean | null; }; export type ToolResultMetadata = { toolId: string; execution: ToolResultExecutionMetadata; targets: Record; lists: Record; /** Original declarations preserve semantic accessor names across replay. */ listExtractorPaths?: readonly string[]; extractors?: Record; }; export type ToolResultTargetAccessor = ToolResultTargetMetadata & { get(): T | null; }; export type ToolResultListAccessor< T = Record, TKey extends string = string, > = Omit & { keys: Partial> & Record; get(): PlayDataset; }; export type ToolResultMetadataInput = { toolId: string; extractors?: Record; targetGetters?: Record; listExtractorPaths?: readonly string[]; listIdentityGetters?: Record; }; export type ToolResultEnvelope< TData = unknown, TMeta = Record, > = { data: TData; meta?: TMeta; }; export type SerializedToolExecuteResultV1 = { __kind: 'deepline.tool_execute_result.v1'; status: string; job_id?: string; /** Deepline-owned execution/result metadata. */ meta?: Record; toolResponse: { /** * Raw provider/tool data with declared row-list payloads clipped to bounded * previews. Use list getters for row-shaped data. */ raw: unknown; meta?: Record; }; listDatasets?: Record>>; /** Full declared list rows used to rehydrate list Dataset Handles. */ listRows?: Record>>; /** Computed scalar/object getters preserved before raw list previews are clipped. */ targetValues?: Record; metadata: ToolResultMetadataInput; execution: ToolResultExecutionMetadata; }; /** * Canonical receipt form. Provider data is stored once as `rawV2`; the legacy * raw/meta view is recreated from the payload-free projection descriptor. */ export type SerializedToolExecuteResultV2 = Omit< SerializedToolExecuteResultV1, '__kind' | 'toolResponse' > & { __kind: 'deepline.tool_execute_result.v2'; toolResponse: { rawV2: unknown; view: 'data' | 'rawV2'; /** Deepline-owned additions not already represented in `rawV2.meta`. */ responseMeta?: Record; }; }; export type SerializedToolExecuteResult = | SerializedToolExecuteResultV1 | SerializedToolExecuteResultV2; export type ToolResponseEnvelope< TData = unknown, TMeta = Record, > = { raw: TData; /** Complete parsed and scrubbed provider response, materialized from raw-v2. */ rawV2?: unknown; /** Durable descriptor for deriving the legacy raw view from `rawV2`. */ view?: 'data' | 'rawV2'; meta?: TMeta; }; export type ToolExecuteResultBase< TResult = unknown, TMeta = Record, > = { status: string; job_id?: string; /** Deepline-owned execution/result metadata. */ meta?: Record; toolResponse: ToolResponseEnvelope; extractedValues: Record; extractedLists: Record; /** Convenience alias for play code. Serialized output uses toolResponse. */ toolOutput: ToolResponseEnvelope; _metadata: { toolId: string; execution: ToolResultExecutionMetadata; targets: Record; extractors?: Record; lists: Record< string, { path: string; count: number | null; keys: Record; } >; /** Original declarations preserve semantic accessor names across replay. */ listExtractorPaths?: readonly string[]; }; }; export type ToolExecuteResultAccessors< TExtracted extends Record = Partial, TLists extends Record> = Record< string, Record >, > = { extractedValues: { [K in keyof TExtracted]: ToolResultTargetAccessor; }; extractedLists: { [K in keyof TLists]: ToolResultListAccessor; }; }; /** * Canonical result returned by Deepline tool execution. * * The top-level object is Deepline-owned execution metadata and semantic * extraction state. The canonical provider response lives under * `toolResponse.rawV2`; `toolResponse.raw` remains the legacy compatibility * projection. Response metadata lives under `toolResponse.meta`. Semantic single-value * getters live under `extractedValues..get()`, and list getters live * under `extractedLists..get()`. * * Use extractors first when a tool contract exposes them. Use list getters for * row-shaped data. Drop to `toolResponse.raw` only for provider-specific scalar * fields or bounded debugging context; persisted rows may clip declared lists to * previews. * * @sdkReference runtime 200 */ export type ToolExecuteResult< TResult = unknown, TMeta = Record, TExtracted extends Record = Partial, TLists extends Record> = Record< string, Record >, > = ToolExecuteResultBase & ToolExecuteResultAccessors;